ZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkzMGNiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzM2U1NjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZTMzYjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNNb24gTWFyIDA5IDIwOjM2OjQ1IEdNVCAyMDA5Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWQxN2Y5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmU7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1FY2xpcHNlLUJ1ZGR5UG9saWN5OiByZWdpc3RlcmVkCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmFwdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjEwMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IsCi0gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZVBsdWdpbgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI2YTAzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMTksIDIwMDk8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMWE3N2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzY2hlbWEvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzhlMWU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UgYW5kIG90aGVycwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jcHJvcGVydGllcyBmaWxlIGZvciBBbm5vdGF0aW9ucyBDb3JlCi1wbHVnaW5OYW1lPSBBbm5vdGF0aW9ucyBDb3JlCi1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzIzZmVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iYW5ub3RhdGlvbkNhdGVnb3J5IiBuYW1lPSJBbm5vdGF0aW9uIENhdGVnb3J5IiBzY2hlbWE9InNjaGVtYS9hbm5vdGF0aW9uQ2F0ZWdvcnkuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iYW5ub3RhdGlvbkRlZmluaXRpb24iIG5hbWU9IkFubm90YXRpb24gRGVmaW5pdGlvbiIgc2NoZW1hPSJzY2hlbWEvYW5ub3RhdGlvbkRlZmluaXRpb24uZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iYW5ub3RhdGlvbkluaXRpYWxpemVyIiBuYW1lPSJBbm5vdGF0aW9uIEluaXRpYWxpemVyIiBzY2hlbWE9InNjaGVtYS9hbm5vdGF0aW9uSW5pdGlhbGl6ZXIuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iYW5ub3RhdGlvblByb2Nlc3NvciIgbmFtZT0iQW5ub3RhdGlvbiBQcm9jZXNzb3IiIHNjaGVtYT0ic2NoZW1hL2Fubm90YXRpb25Qcm9jZXNzb3IuZXhzZCIvPgotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qZHQuYXB0LmNvcmUuYW5ub3RhdGlvblByb2Nlc3NvckZhY3RvcnkiPgotICAgICAgPGZhY3RvcmllcyBlbmFibGVEZWZhdWx0PSJ0cnVlIj4KLSAgICAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLkFubm90YXRpb25zQ29yZVByb2Nlc3NvckZhY3RvcnkiPgotICAgICAgICAgPC9mYWN0b3J5PgotICAgICAgPC9mYWN0b3JpZXM+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NjaGVtYS9hbm5vdGF0aW9uQ2F0ZWdvcnkuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc2NoZW1hL2Fubm90YXRpb25DYXRlZ29yeS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjYxNTJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc2NoZW1hL2Fubm90YXRpb25DYXRlZ29yeS5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIiBpZD0iYW5ub3RhdGlvbkNhdGVnb3J5IiBuYW1lPSJBbm5vdGF0aW9uIENhdGVnb3J5Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gY29udHJpYnV0ZSBhbiBhbm5vdGF0aW9uIGNhdGVnb3J5LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY2F0ZWdvcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iY2F0ZWdvcnkiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIEFuIGFubm90YXRpb24gY2F0ZWdvcnkgY29udHJpYnV0aW9uIGRlZmluZXMgY2F0ZWdvcmllcyBvZiBhbm5vdGF0aW9ucyB1c2VkIHRvIGdyb3VwIHRoZW0gaW4gdGhlIFVJLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYW5ub3RhdGlvbiBjYXRlZ29yeS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgdW5pcXVyZSBhbm5vdGF0aW9uIGNhdGVvZ29yeSBuYW1lLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGFuIGFubm90YXRpb24gY2F0ZWdvcnkgY29udHJpYnV0aW9uOgotCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25DYXRlZ29yeSZxdW90OyZndDsKLSAgICAgICZsdDtjYXRlZ29yeQotICAgICAgICAgICAgaWQ9JnF1b3Q7amF4d3MuY2F0ZWdvcnkmcXVvdDsKLSAgICAgICAgICAgIG5hbWU9JnF1b3Q7SkFYLVdTJnF1b3Q7Jmd0OwotICAgICAgJmx0Oy9jYXRlZ29yeSZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLQotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4gJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2FocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc2NoZW1hL2Fubm90YXRpb25EZWZpbml0aW9uLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NjaGVtYS9hbm5vdGF0aW9uRGVmaW5pdGlvbi5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWEwM2Q1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc2NoZW1hL2Fubm90YXRpb25EZWZpbml0aW9uLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiIGlkPSJhbm5vdGF0aW9uRGVmaW5pdGlvbiIgbmFtZT0iQW5ub3RhdGlvbiBEZWZpbml0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBjbGllbnRzIHRvIGNvbnRyaWJ1dGUgYW5ub3RhdGlvbnMgJmx0Oz8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uJmd0OyB3aGljaCBhcmUgaW4gdHVybiBjb25zdW1lZCBieSB0aGUgVUkuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCAvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJhbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImFubm90YXRpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ0YXJnZXRGaWx0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSI3Ii8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgZnVsbHkgcXVhbGlmaWVkIGFubm90YXRpb24gY2xhc3MgbmFtZSB0aGF0IGV4dGVuZHMgJmx0O2NvZGUmZ3Q7amF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbiZsdDsvY29kZSZndDsKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249ImphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb246Ii8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2F0ZWdvcnkiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIGlkIG9mIGEgJmx0O3R0Jmd0O2Fubm90YXRpb25DYXRlZ29yeSZsdDsvdHQmZ3Q7Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJpZGVudGlmaWVyIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uQ2F0ZWdvcnkvY2F0ZWdvcnkvQGlkIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgc2ltcGxlIG5hbWUgb2YgdGhlIGFubm90YXRpb24gY2xhc3MuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVzdHJpY3RlZFRvIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBVc2VkIGluIGFkZGl0aW9uIHRvIHRoZSBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZShzKSB0aGF0IGFyZSBzcGVjaWZpZWQgaW4gdGhlIHZhbHVlIGVsZW1lbnQgb2YgdGhlICBAVGFyZ2V0IGFubm90YXRpb24gb24gdGhlIGNvbnRyaWJ1dGVkIGFubm90YXRpb24gdG8gYWRkIGZ1cnRoZXIgcmVzdHJpY3Rpb25zLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgICAgPHNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iQ0xBU1NfT05MWSI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJJTlRFUkZBQ0VfT05MWSI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJFTlVNX09OTFkiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgIDwvcmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICA8L3NpbXBsZVR5cGU+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InRhcmdldEZpbHRlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InRhcmdldCIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGFubm90YXRpb25zIGNvcmUgYXV0b21hdGljYWxseSBrbm93cyB3aGVyZSB0byBwZXJtaXQgYW5ub3RhdGlvbnMgYXMgaXQgaW5zcGVjdHMgdGhlIGNvbnRyaWJ1dGVkIGFubm90YXRpb24gYW5kCi0gICAgICAgICAgICAgICAgICByZWFkcyB0aGUgQFRhcmdldCB0aGF0IGhhcyBiZWVuIGRlZmluZWQgZm9yIGl0LiBUaGVzZSBmaWx0ZXJzIGFyZSBvbmx5IHVzZWQgd2hlbiB0aGVyZSBtaWdodCBiZSBhbiBleHRyYSByZXN0cmljdGlvbgotICAgICAgICAgICAgICAgICAgeW91IHdhbnQgdG8gYWRkLCBmb3IgZXhhbXBsZSwgaWYgdmVyc2lvbiAyIG9mIGFuIGFubm90YXRpb24gYWxsb3dzIGFkZGluZyB0aGUgYW5ub3RhdGlvbiB0byBhIGZpZWxkLCBhbmQgdGhlbiB2ZXJzaW9uCi0gICAgICAgICAgICAgICAgICAzIGRlcHJlY2F0ZXMgdGhhdCB1c2FnZSwgeW91IGNhbiBhZGQgYSBmaWx0ZXIgaGVyZSB0byBkaXNhbGxvdyB0aGUgdXNhZ2UgaW4gdGhlIFVJLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgICAgPHNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iVFlQRSI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJGSUVMRCI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJNRVRIT0QiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iUEFSQU1FVEVSIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkNPTlNUUlVDVE9SIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkxPQ0FMX1ZBUklBQkxFIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkFOTk9UQVRJT05fVFlQRSI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJQQUNLQUdFIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICA8L3Jlc3RyaWN0aW9uPgotICAgICAgICAgICAgPC9zaW1wbGVUeXBlPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGFuIGFubm90YXRpb24gZGVmaW5pdGlvbiBjb250cmlidXRpb246Ci0KLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkRlZmluaXRpb24mcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9JnF1b3Q7amF4d3MuY2F0ZWdvcnkmcXVvdDsKLSAgICAgICAgICAgIGNsYXNzPSZxdW90O2phdmF4Lmp3cy5XZWJTZXJ2aWNlJnF1b3Q7Ci0gICAgICAgICAgICBuYW1lPSZxdW90O1dlYlNlcnZpY2UmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7L2Fubm90YXRpb24mZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuICZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zY2hlbWEvYW5ub3RhdGlvbkluaXRpYWxpemVyLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NjaGVtYS9hbm5vdGF0aW9uSW5pdGlhbGl6ZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ0ZDBhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NjaGVtYS9hbm5vdGF0aW9uSW5pdGlhbGl6ZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSIgaWQ9ImFubm90YXRpb25Jbml0aWFsaXplciIgbmFtZT0iQW5ub3RhdGlvbiBJbml0aWFsaXplciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgY2xpZW50cyB0byBhc3NvY2lhdGUgYW4gYW5ub3RhdGlvbiBpbml0aWFsaXplciB3aXRoIGFuIGFubm90YXRpb24gZGVmaW5pdGlvbi4KLQotVGhlIGFubm90YXRpb24gaW5pdGlhbGl6ZXJzIHJvbGUgaXMgdG8gY29uc3RydWN0IHZhbHVlcyBmb3IgdGhlIGFubm90YXRpb25zIG1lbWJlciB2YWx1ZSBwYWlycy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImluaXRpYWxpemVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImluaXRpYWxpemVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYW5ub3RhdGlvbiIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgYW5ub3RhdGlvbiBkZWZpbml0aW9uIHRoYXQgdGhpcyBpbml0aWFsaXplcnMgaGFuZGxlcy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImlkZW50aWZpZXIiIGJhc2VkT249Im9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25EZWZpbml0aW9uL2Fubm90YXRpb24vQGNsYXNzIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgY29udHJpYnV0ZWQgaW5pdGlhbGl6ZXIuIFRoZQotY2xhc3MgbXVzdCBiZSBhIHB1YmxpYyBhbmQgZXh0ZW5kCi0mbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbi5Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXImbHQ7L2NvZGUmZ3Q7IHdpdGggYSBwdWJsaWMgMC1hcmd1bWVudCBjb25zdHJ1Y3Rvci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uLkFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjoiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhbiBhbm5vdGF0aW9uIGluaXRpYWxpemVyIGNvbnRyaWJ1dGlvbjoKLQotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uSW5pdGlhbGl6ZXImcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7aW5pdGlhbGl6ZXIKLSAgICAgICAgICAgIGFubm90YXRpb249JnF1b3Q7amF2YXguandzLldlYlNlcnZpY2UmcXVvdDsKLSAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLmluaXRpYWxpemF0aW9uLldlYlNlcnZpY2VBdHRyaWJ1dGVJbml0aWFsaXplciZxdW90OyZndDsKLSAgICAgICZsdDsvaW5pdGlhbGl6ZXImZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuICZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zY2hlbWEvYW5ub3RhdGlvblByb2Nlc3Nvci5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zY2hlbWEvYW5ub3RhdGlvblByb2Nlc3Nvci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzZkYWE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc2NoZW1hL2Fubm90YXRpb25Qcm9jZXNzb3IuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSIgaWQ9ImFubm90YXRpb25Qcm9jZXNzb3IiIG5hbWU9IkFubm90YXRpb24gUHJvY2Vzc29yIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBjbGllbnRzIHRvIGNvbnRyaWJ1dGUgYW5ub3RhdGlvbiBwcm9jZXNvb3JzLiBUaGVzZSBwcm9jZXNzb3JzIGFyZSBhc3NvY2lhdGVkIHdpdGggY29udHJpYnV0ZWQgYW5ub3RhdGlvbiBkZWZpbml0aW9ucy4KLQotVGhlIGdvYWwgb2YgdGhlIHByb2Nlc3NvciBpcyB0byB2YWxpZGF0ZSBhbm5vdGF0aW9uIHJ1bGVzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icHJvY2Vzc29yIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InByb2Nlc3NvciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImRlc2NyaXB0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYW5ub3RhdGlvbiIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgYW5ub3RhdGlvbiBkZWZpbml0aW9uIHRoYXQgdGhpcyBwcm9jZXNzb3IgaGFuZGxlcy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImlkZW50aWZpZXIiIGJhc2VkT249Im9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25EZWZpbml0aW9uL2Fubm90YXRpb24vQGNsYXNzIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgY29udHJpYnV0ZWQgcHJvY2Vzb3IuIFRoZQotY2xhc3MgbXVzdCBiZSBhIHB1YmxpYyBzdWJjbGFzcyBvZgotJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvciZsdDsvY29kZSZndDthbmQgbXVzdCBoYXZlIGEgcHVibGljIDAtYXJndW1lbnQgY29uc3RydWN0b3IuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yOiIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBBbiBvcHRpb25hbCBhdHRyaWJ1dGUgdG8gaG9sZCBhIHNob3J0IHRleHQgZGVzY3JpYmluZyB3aGF0ICZxdW90O3J1bGUmcXVvdDsgdGhlIHByb2Nlc3NvciBoYW5kbGVzLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGFuIGFubm90YXRpb24gcHJvY2Vzc29yIGNvbnRyaWJ1dGlvbjoKLQotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uUHJvY2Vzc29yJnF1b3Q7Jmd0OwotICAgICAgJmx0O3Byb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0mcXVvdDtqYXZheC5qd3MuV2ViU2VydmljZSZxdW90OwotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5XZWJTZXJ2aWNlU0VJUHJlc2VudE5vV2ViTWV0aG9kUnVsZSZxdW90OyZndDsKLSAgICAgICAgICZsdDtkZXNjcmlwdGlvbiZndDsKLSAgICAgICAgICAgICVXRUJTRVJWSUNFX1NFSV9OT19XRUJNRVRIT1NfUlVMRQotICAgICAgICAgJmx0Oy9kZXNjcmlwdGlvbiZndDsKLSAgICAgICZsdDsvcHJvY2Vzc29yJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotCi0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLiAmbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjI4MThmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24uSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjsKLQotLyoqCi0gKiBBbiA8Y29kZT5Bbm5vdGF0aW9uRGVmaW5pdGlvbjwvY29kZT4gaXMgYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5mb3JtYXRpb24gY29udHJpYnV0ZWQgdGhyb3VnaCB0aGUKLSAqIDxjb2RlPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25EZWZpbml0aW9uPC9jb2RlPiwKLSAqIDxjb2RlPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25DYXRlZ29yeTwvY29kZT4gYW5kCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uSW5pdGlhbGl6ZXI8L2NvZGU+IGV4dGVuc2lvbiBwb2ludHMuCi0gKiBmb3IgYSA8Y29kZT5qYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPC9jb2RlPiBjbGFzcy4KLSAqIDxwPgotICogSXQgc3VwcGxpZXMgdGhlIGFubm90YXRpb24gY2xhc3MgbmFtZSwgaXRzIGFubm90YXRpb24gY2F0ZWdvcnksIHRoZSBhcHBsaWNhYmxlIHRhcmdldHMgZm9yIHRoZSBhbm5vdGF0aW9uCi0gKiBhbmQgYW4gPGNvZGU+SUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjwvY29kZT4gdG8gaW5pdGlhbGl6ZSB0aGUgYW5ub3RhdGlvbnMgZWxlbWVudC12YWx1ZSBwYWlycy4KLSAqIDwvcD4KLSAqIDxzdHJvbmc+UHJvdmlzaW9uYWwgQVBJOjwvc3Ryb25nPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIKLSAqIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdAotICogdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcwotICogdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQW5ub3RhdGlvbkRlZmluaXRpb24gewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9SRVNUUklDVEVEX1RPID0gInJlc3RyaWN0ZWRUbyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNUUklDVEVEX1RPX0NMQVNTX09OTFkgPSAiQ0xBU1NfT05MWSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1RSSUNURURfVE9fSU5URVJGQUNFX09OTFkgPSAiSU5URVJGQUNFX09OTFkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNUUklDVEVEX1RPX0VOVU1fT05MWSA9ICJFTlVNX09OTFkiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fVEFSR0VUX0ZJTFRFUiA9ICJ0YXJnZXRGaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9UQVJHRVQgPSAidGFyZ2V0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY2F0ZWdvcnk7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgYW5ub3RhdGlvbkNsYXNzTmFtZTsKLSAgICBwcml2YXRlIENsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3M7Ci0gICAgcHJpdmF0ZSBMaXN0PEVsZW1lbnRUeXBlPiB0YXJnZXRzOwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgcHJpdmF0ZSBJQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyIGFubm90YXRpb25Jbml0aWFsaXplcjsKLSAgICBwcml2YXRlIFN0cmluZyByZXN0aWN0ZWRUbzsKLSAgICBwcml2YXRlIGJvb2xlYW4gaW50ZXJmYWNlT25seTsKLSAgICBwcml2YXRlIGJvb2xlYW4gY2xhc3NPbmx5OwotICAgIHByaXZhdGUgYm9vbGVhbiBlbnVtT25seTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gPGNvZGU+QW5ub3RhdGlvbkRlZmluaXRpb248L2NvZGU+IHVzaW5nIGluZm9ybWF0aW9uIGZyb20gdGhlCi0gICAgICogPGNvZGU+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkRlZmluaXRpb248L2NvZGU+IGV4dGVuc2lvbiBwb2ludCBhbmQgY2F0ZWdvcnkgbmFtZS4KLSAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbkVsZW1lbnQgdGhlIDxjb2RlPmFubm90YXRpb248L2NvZGU+IGVsZW1lbnQgZnJvbSB0aGUgPGNvZGU+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkRlZmluaXRpb248L2NvZGU+IGV4dGVuc2lvbiBwb2ludAotICAgICAqIEBwYXJhbSBjYXRlZ29yeSB0aGUgY2F0ZWdvcnkgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlndXJhdGlvbkVsZW1lbnQsIFN0cmluZyBjYXRlZ29yeSkgewotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25FbGVtZW50ID0gY29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0gICAgICAgIHRoaXMuY2F0ZWdvcnkgPSBjYXRlZ29yeTsKLQotICAgICAgICB0aGlzLmFubm90YXRpb25DbGFzc05hbWUgPSBBbm5vdGF0aW9uc01hbmFnZXIuZ2V0QXR0cmlidXRlVmFsdWUoY29uZmlndXJhdGlvbkVsZW1lbnQsIEFUVF9DTEFTUyk7Ci0gICAgICAgIHRoaXMubmFtZSA9IEFubm90YXRpb25zTWFuYWdlci5nZXRBdHRyaWJ1dGVWYWx1ZShjb25maWd1cmF0aW9uRWxlbWVudCwgQVRUX05BTUUpOwotICAgICAgICB0aGlzLnJlc3RpY3RlZFRvID0gQW5ub3RhdGlvbnNNYW5hZ2VyLmdldEF0dHJpYnV0ZVZhbHVlKGNvbmZpZ3VyYXRpb25FbGVtZW50LAotICAgICAgICAgICAgICAgIEFUVF9SRVNUUklDVEVEX1RPKTsKLSAgICAgICAgdGhpcy5jbGFzc09ubHkgPSByZXN0aWN0ZWRUby5lcXVhbHMoUkVTVFJJQ1RFRF9UT19DTEFTU19PTkxZKTsKLSAgICAgICAgdGhpcy5pbnRlcmZhY2VPbmx5ID0gcmVzdGljdGVkVG8uZXF1YWxzKFJFU1RSSUNURURfVE9fSU5URVJGQUNFX09OTFkpOwotICAgICAgICB0aGlzLmVudW1Pbmx5ID0gcmVzdGljdGVkVG8uZXF1YWxzKFJFU1RSSUNURURfVE9fRU5VTV9PTkxZKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhbm5vdGF0aW9uIG5hbWUuCi0gICAgICogQHJldHVybiB0aGUgYW5ub3RhdGlvbiBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2F0ZWdvcnkgdGhlIGFubm90YXRpb24gYmVsb25ncyB0by4KLSAgICAgKiBAcmV0dXJuIHRoZSBhbm5vdGF0aW9uIGNhdGVnb3J5LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7Ci0gICAgICAgIHJldHVybiBjYXRlZ29yeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgYW5ub3RhdGlvbi4KLSAgICAgKiBAcmV0dXJuIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgYW5ub3RhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25DbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uQ2xhc3NOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgYW5ub3RhdGlvbiBpcyByZXN0cmljdGVkIHRvIGNsYXNzIHR5cGVzLgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFubm90YXRpb24gaXMgcmVzdHJpY3RlZCB0byBjbGFzc2VzIG9ubHkuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNDbGFzc09ubHkoKSB7Ci0gICAgICAgIHJldHVybiBjbGFzc09ubHk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBhbm5vdGF0aW9uIGlzIHJlc3RyaWN0ZWQgdG8gaW50ZXJmYWNlIHR5cGVzLgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFubm90YXRpb24gaXMgcmVzdHJpY3RlZCB0byBpbnRlcmZhY2VzIG9ubHkuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNJbnRlcmZhY2VPbmx5KCkgewotICAgICAgICByZXR1cm4gaW50ZXJmYWNlT25seTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGFubm90YXRpb24gaXMgcmVzdHJpY3RlZCB0byBlbnVtIHR5cGVzLgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFubm90YXRpb24gaXMgcmVzdHJpY3RlZCB0byBlbnVtcyBvbmx5LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRW51bU9ubHkoKSB7Ci0gICAgICAgIHJldHVybiBlbnVtT25seTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhbm5vdGF0aW9uIGNsYXNzIGFzIHNwZWNpZmllZCBieSB0aGUgPGNvZGU+Y2xhc3M8L2NvZGU+IGF0dHJpYnV0ZSBvZiB0aGUKLSAgICAgKiA8Y29kZT5hbm5vdGF0aW9uPGFubm90YXRpb24+IGVsZW1lbnQgaW4gdGhlIDxjb2RlPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25EZWZpbml0aW9uPC9jb2RlPgotICAgICAqIGV4dGVuc2lvbiBwb2ludC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGFubm90YXRpb24gY2xhc3MKLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24+IGdldEFubm90YXRpb25DbGFzcygpIHsKLSAgICAgICAgaWYgKGFubm90YXRpb25DbGFzcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIENsYXNzPD8+IGFDbGFzcyA9IENsYXNzLmZvck5hbWUoYW5ub3RhdGlvbkNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGFDbGFzcy5pc0Fubm90YXRpb24oKSkgewotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uQ2xhc3MgPSAoQ2xhc3M8amF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbj4pQ2xhc3MuZm9yTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uQ2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSkgewotICAgICAgICAgICAgICAgIEFubm90YXRpb25zQ29yZVBsdWdpbi5sb2coY25mZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25DbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB7QGxpbmsgRWxlbWVudFR5cGV9IHRoYXQgc3BlY2lmeSB0aGUgSmF2YSBlbGVtZW50cyB0byB3aGljaCB0aGUgYW5ub3RhdGlvbgotICAgICAqIGNhbiBiZSBhcHBsaWVkLgotICAgICAqIDxwPgotICAgICAqIFRoZSBlbGVtZW50IHR5cGVzIGFyZSByZXRyaWV2ZWQgZnJvbSB0aGUgYW5ub3RhdGlvbnMKLSAgICAgKiB7QGxpbmsgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0fSBtZXRhLWFubm90YXRpb24gdHlwZS4gVGhpcyBsaXN0IGNhbiBiZSBmaWx0ZXJlZCB1c2luZwotICAgICAqIHRoZSA8Y29kZT50YXJnZXRGaWx0ZXI8L2NvZGU+IGVsZW1lbnQgb24gdGhlCi0gICAgICogPGNvZGU+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkRlZmluaXRpb248L2NvZGU+IGV4dGVuc2lvbiBwb2ludCB3aGVuIGRlZmluaW5nCi0gICAgICogdGhlIGFubm90YXRpb24uCi0gICAgICogPC9wPgotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGVsZW1lbnQgdHlwZXMuCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8RWxlbWVudFR5cGU+IGdldFRhcmdldHMoKSB7Ci0gICAgICAgIGlmICh0YXJnZXRzID09IG51bGwpIHsKLSAgICAgICAgCXRhcmdldHMgPSBuZXcgTGlua2VkTGlzdDxFbGVtZW50VHlwZT4oKTsKLQotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24+IGFubm90YXRpb24gPSBnZXRBbm5vdGF0aW9uQ2xhc3MoKTsKLSAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIAlUYXJnZXQgdGFyZ2V0ID0gYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uKFRhcmdldC5jbGFzcyk7Ci0gICAgICAgICAgICAJaWYgKHRhcmdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAJICAgIHRhcmdldHMuYWRkQWxsKEFycmF5cy5hc0xpc3QodGFyZ2V0LnZhbHVlKCkpKTsKLQotICAgICAgICAgICAgICAgICAgICBMaXN0PEVsZW1lbnRUeXBlPiBmaWx0ZXJlZFRhcmdldHMgPSBnZXRGaWx0ZXJlZFRhcmdldHMoY29uZmlndXJhdGlvbkVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0cy5jb250YWluc0FsbChmaWx0ZXJlZFRhcmdldHMpICYmIGZpbHRlcmVkVGFyZ2V0cy5zaXplKCkgPCB0YXJnZXRzLnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0cy5yZW1vdmVBbGwoZmlsdGVyZWRUYXJnZXRzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgCX0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGFyZ2V0czsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhbm5vdGF0aW9ucyBhdHRyaWJ1dGUgaW5pdGlhbGl6ZXIgYXMgc3BlY2lmaWVkIGluIHRoZQotICAgICAqIDxjb2RlPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25Jbml0aWFsaXplcjwvY29kZT4gZXh0ZW5zaW9uIHBvaW50IG9yIG51bGwgaWYgbm8KLSAgICAgKiBpbml0aWFsaXplciBjYW4gYmUgZm91bmQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBJQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyIGdldEFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcigpIHsKLSAgICAgICAgaWYgKGFubm90YXRpb25Jbml0aWFsaXplciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWd1cmF0aW9uRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25zTWFuYWdlci5nZXRBbm5vdGF0aW9uSW5pdGlhbGl6ZXJDYWNoZSgpLmdldChnZXRBbm5vdGF0aW9uQ2xhc3NOYW1lKCkpOwotICAgICAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uRWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Jbml0aWFsaXplciA9IChJQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyKWNvbmZpZ3VyYXRpb25FbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRfQ0xBU1MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICBBbm5vdGF0aW9uc0NvcmVQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbkluaXRpYWxpemVyOwotICAgIH0KLQotCSAgcHJpdmF0ZSBMaXN0PEVsZW1lbnRUeXBlPiBnZXRGaWx0ZXJlZFRhcmdldHMoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ3VyYXRpb25FbGVtZW50KSB7Ci0JCSAgTGlzdDxFbGVtZW50VHlwZT4gdGFyZ2V0cyA9IG5ldyBBcnJheUxpc3Q8RWxlbWVudFR5cGU+KDcpOwotCQkgIHRyeSB7Ci0JCQkgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGRlcHJlY2F0ZWRUYXJnZXRzID0gY29uZmlndXJhdGlvbkVsZW1lbnQuZ2V0Q2hpbGRyZW4oRUxFTV9UQVJHRVRfRklMVEVSKTsKLQkJCSAgZm9yIChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZGVwcmVjYXRlZFRhcmdldEVsZW1lbnQgOiBkZXByZWNhdGVkVGFyZ2V0cykgewotCQkJCSAgU3RyaW5nIHRhcmdldCA9IEFubm90YXRpb25zTWFuYWdlci5nZXRBdHRyaWJ1dGVWYWx1ZShkZXByZWNhdGVkVGFyZ2V0RWxlbWVudCwgQVRUX1RBUkdFVCk7Ci0JCQkJICB0YXJnZXRzLmFkZChFbGVtZW50VHlwZS52YWx1ZU9mKHRhcmdldCkpOwotCQkJICB9Ci0JCSAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgewotCQkJICBBbm5vdGF0aW9uc0NvcmVQbHVnaW4ubG9nKGlhZSk7Ci0JCSAgfQotCQkgIHJldHVybiB0YXJnZXRzOwotCSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM4MjA4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFycmF5SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJvb2xlYW5MaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NYXJrZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk51bWJlckxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlF1YWxpZmllZFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbXBsZU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN0cmluZ0xpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVMaXRlcmFsOwotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciBjcmVhdGluZyBhbm5vdGF0aW9ucyBhbmQgbWVtYmVyIHZhbHVlIHBhaXJzLgotICogPHA+Ci0gKiA8c3Ryb25nPlByb3Zpc2lvbmFsIEFQSTo8L3N0cm9uZz4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyCi0gKiBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQKLSAqIHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMKLSAqIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFubm90YXRpb25zQ29yZSB7Ci0KLSAgICBwcml2YXRlIEFubm90YXRpb25zQ29yZSgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBOb3JtYWxBbm5vdGF0aW9ufS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhc3QgdGhlIHtAbGluayBBU1R9IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgYW5ub3RhdGlvbi4KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbk5hbWUgdGhlIG5hbWUgb2YgdGhlIGFubm90YXRpb24uCi0gICAgICogQHBhcmFtIG1lbWJlclZhbHVlUGFpcnMgYSBsaXN0IG9mIHtAbGluayBNZW1iZXJWYWx1ZVBhaXJ9IHRvIGFkZCB0byB0aGUgbm9ybWFsIGFubm90YXRpb24uCi0gICAgICogQHJldHVybiBhIG5vcm1hbCBhbm5vdGF0aW9uIHdpdGggdGhlIGdpdmVuIG1lbWJlciB2YWx1ZSBwYWlycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE5vcm1hbEFubm90YXRpb24gY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihBU1QgYXN0LCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUsIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzKSB7Ci0gICAgICAgIE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFzdC5uZXdOb3JtYWxBbm5vdGF0aW9uKCk7Ci0KLSAgICAgICAgTmFtZSBhbm5vdGF0aW9uVHlwZU5hbWUgPSBhc3QubmV3TmFtZShhbm5vdGF0aW9uTmFtZSk7Ci0KLSAgICAgICAgYW5ub3RhdGlvbi5zZXRUeXBlTmFtZShhbm5vdGF0aW9uVHlwZU5hbWUpOwotCi0gICAgICAgIGlmIChtZW1iZXJWYWx1ZVBhaXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpciA6IG1lbWJlclZhbHVlUGFpcnMpIHsKLSAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gYW5ub3RhdGlvblZhbHVlcyA9IGFubm90YXRpb24udmFsdWVzKCk7Ci0gICAgICAgICAgICAgICAgYW5ub3RhdGlvblZhbHVlcy5hZGQobWVtYmVyVmFsdWVQYWlyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBTaW5nbGVNZW1iZXJBbm5vdGF0aW9ufS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhc3QgdGhlIHtAbGluayBBU1R9IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgYW5ub3RhdGlvbi4KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbk5hbWUgdGhlIG5hbWUgb2YgdGhlIGFubm90YXRpb24uCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSB7QGxpbmsgRXhwcmVzc2lvbn0gdG8gc2V0IGFzIHRoZSBzaW5nbGUgbWVtYmVyIGFubm90YXRpb24gdmFsdWUuCi0gICAgICogQHJldHVybiBhIHNpbmdsZSBtZW1iZXIgYW5ub3RhdGlvbiB3aXRoIHRoZSBnaXZlbiB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNpbmdsZU1lbWJlckFubm90YXRpb24gY3JlYXRlU2luZ2xlTWVtYmVyQW5ub3RhdGlvbihBU1QgYXN0LCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUsIEV4cHJlc3Npb24gdmFsdWUpIHsKLSAgICAgICAgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYXN0Lm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oKTsKLQotICAgICAgICBOYW1lIGFubm90YXRpb25UeXBlTmFtZSA9IGFzdC5uZXdOYW1lKGFubm90YXRpb25OYW1lKTsKLQotICAgICAgICBhbm5vdGF0aW9uLnNldFR5cGVOYW1lKGFubm90YXRpb25UeXBlTmFtZSk7Ci0KLSAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHZhbHVlID0gKEV4cHJlc3Npb24pRXhwcmVzc2lvbi5jb3B5U3VidHJlZShhc3QsIHZhbHVlKTsKLSAgICAgICAgICAgIGFubm90YXRpb24uc2V0VmFsdWUodmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgTWFya2VyQW5ub3RhdGlvbn0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXN0IHRoZSB7QGxpbmsgQVNUfSB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIGFubm90YXRpb24uCi0gICAgICogQHBhcmFtIGFubm90YXRpb25OYW1lIHRoZSBuYW1lIG9mIHRoZSBhbm5vdGF0aW9uLgotICAgICAqIEByZXR1cm4gYSBtYXJrZXIgYW5ub3RhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1hcmtlckFubm90YXRpb24gY3JlYXRlTWFya2VyQW5ub3RhdGlvbihBU1QgYXN0LCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLSAgICAgICAgTWFya2VyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYXN0Lm5ld01hcmtlckFubm90YXRpb24oKTsKLQotICAgICAgICBOYW1lIGFubm90YXRpb25UeXBlTmFtZSA9IGFzdC5uZXdOYW1lKGFubm90YXRpb25OYW1lKTsKLQotICAgICAgICBhbm5vdGF0aW9uLnNldFR5cGVOYW1lKGFubm90YXRpb25UeXBlTmFtZSk7Ci0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgTWVtYmVyVmFsdWVQYWlyfS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhc3QgdGhlIHtAbGluayBBU1R9IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgbWVtYmVyIHZhbHVlIHBhaXIuCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIHtAbGluayBNZW1iZXJWYWx1ZVBhaXJ9ICJuYW1lIi4KLSAgICAgKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUge0BsaW5rIEV4cHJlc3Npb259ICJ2YWx1ZSIgb2YgdGhlIG1lbWJlciB2YWx1ZSBwYWlyLgotICAgICAqIEByZXR1cm4gYSBuZXcgbWVtYmVyIHZhbHVlIHBhaXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZW1iZXJWYWx1ZVBhaXIgY3JlYXRlTWVtYmVyVmFsdWVQYWlyKEFTVCBhc3QsIFN0cmluZyBuYW1lLCBFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpciA9IGFzdC5uZXdNZW1iZXJWYWx1ZVBhaXIoKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlyLnNldE5hbWUoYXN0Lm5ld1NpbXBsZU5hbWUobmFtZSkpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXIuc2V0VmFsdWUoZXhwcmVzc2lvbik7Ci0gICAgICAgIHJldHVybiBtZW1iZXJWYWx1ZVBhaXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgTWVtYmVyVmFsdWVQYWlyfSB3aXRoIGEge0BsaW5rIFN0cmluZ0xpdGVyYWx9IHZhbHVlLgotICAgICAqCi0gICAgICogQHBhcmFtIGFzdCB0aGUge0BsaW5rIEFTVH0gdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBtZW1iZXIgdmFsdWUgcGFpci4KLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbWVtYmVyIHZhbHVlIHBhaXIgIm5hbWUiLgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPiAidmFsdWUiLgotICAgICAqIEByZXR1cm4gYSBuZXcgbWVtYmVyIHZhbHVlIHBhaXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZW1iZXJWYWx1ZVBhaXIgY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKEFTVCBhc3QsIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHN0cmluZ01lbWJlclZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVNZW1iZXJWYWx1ZVBhaXIoYXN0LCBuYW1lLAotICAgICAgICAgICAgICAgIEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdMaXRlcmFsKGFzdCwgdmFsdWUudG9TdHJpbmcoKSkpOwotCi0gICAgICAgIHJldHVybiBzdHJpbmdNZW1iZXJWYWx1ZVBhaXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgTWVtYmVyVmFsdWVQYWlyfSB3aXRoIGEge0BsaW5rIEJvb2xlYW5MaXRlcmFsfSB2YWx1ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhc3QgdGhlIHtAbGluayBBU1R9IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgbWVtYmVyIHZhbHVlIHBhaXIuCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG1lbWJlciB2YWx1ZSBwYWlyICJuYW1lIi4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIDxjb2RlPkJvb2xlYW48L2NvZGU+ICJ2YWx1ZSIuCi0gICAgICogQHJldHVybiBhIG5ldyBtZW1iZXIgdmFsdWUgcGFpciB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lbWJlclZhbHVlUGFpciBjcmVhdGVCb29sZWFuTWVtYmVyVmFsdWVQYWlyKEFTVCBhc3QsIFN0cmluZyBuYW1lLCBCb29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIE1lbWJlclZhbHVlUGFpciBib29sZWFuVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU1lbWJlclZhbHVlUGFpcihhc3QsIG5hbWUsIEFubm90YXRpb25zQ29yZQotICAgICAgICAgICAgICAgIC5jcmVhdGVCb29sZWFuTGl0ZXJhbChhc3QsIHZhbHVlLmJvb2xlYW5WYWx1ZSgpKSk7Ci0KLSAgICAgICAgcmV0dXJuIGJvb2xlYW5WYWx1ZVBhaXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgTWVtYmVyVmFsdWVQYWlyfSB3aXRoIGEge0BsaW5rIE51bWJlckxpdGVyYWx9IHZhbHVlLgotICAgICAqCi0gICAgICogQHBhcmFtIGFzdCB0aGUge0BsaW5rIEFTVH0gdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBtZW1iZXIgdmFsdWUgcGFpci4KLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbWVtYmVyIHZhbHVlIHBhaXIgIm5hbWUiLgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPiAidmFsdWUiIHJlcHJlc2VudGluZyB0aGUgbnVtYmVyLgotICAgICAqIEByZXR1cm4gYSBuZXcgbWVtYmVyIHZhbHVlIHBhaXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZW1iZXJWYWx1ZVBhaXIgY3JlYXRlTnVtYmVyTWVtYmVyVmFsdWVQYWlyKEFTVCBhc3QsIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHByaW1pdGl2ZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVNZW1iZXJWYWx1ZVBhaXIoYXN0LCBuYW1lLAotICAgICAgICAgICAgICAgIEFubm90YXRpb25zQ29yZS5jcmVhdGVOdW1iZXJMaXRlcmFsKGFzdCwgdmFsdWUudG9TdHJpbmcoKSkpOwotICAgICAgICByZXR1cm4gcHJpbWl0aXZlVmFsdWVQYWlyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIE1lbWJlclZhbHVlUGFpcn0gd2l0aCBhIHtAbGluayBOYW1lfSB2YWx1ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhc3QgdGhlIHtAbGluayBBU1R9IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgbWVtYmVyIHZhbHVlIHBhaXIuCi0gICAgICogQHBhcmFtIGNsYXNzTmFtZSB0aGUgZW5jbG9zaW5nIGNsYXNzIG5hbWUuCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG1lbWJlciB2YWx1ZSBwYWlyICJuYW1lIi4KLSAgICAgKiBAcGFyYW0gdmFsdWUgYW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgPGNvZGU+ZW51bTwvY29kZT4gdmFsdWUuCi0gICAgICogQHJldHVybiBhIG5ldyBtZW1iZXIgdmFsdWUgcGFpciB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lbWJlclZhbHVlUGFpciBjcmVhdGVFbnVtTWVtYmVyVmFsdWVQYWlyKEFTVCBhc3QsIFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBuYW1lLAotICAgICAgICAgICAgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTWVtYmVyVmFsdWVQYWlyKGFzdCwgbmFtZSwgY3JlYXRlRW51bUxpdGVyYWwoYXN0LCBjbGFzc05hbWUsIHZhbHVlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgTWVtYmVyVmFsdWVQYWlyfSB3aXRoIGEge0BsaW5rIFR5cGVMaXRlcmFsfSB2YWx1ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhc3QgdGhlIHtAbGluayBBU1R9IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgbWVtYmVyIHZhbHVlIHBhaXIuCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG1lbWJlciB2YWx1ZSBwYWlyICJuYW1lIi4KLSAgICAgKiBAcGFyYW0gdmFsdWUgYW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgdHlwZSB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIGEgbmV3IG1lbWJlciB2YWx1ZSBwYWlyIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWVtYmVyVmFsdWVQYWlyIGNyZWF0ZVR5cGVNZW1iZXJWYWx1ZVBhaXIoQVNUIGFzdCwgU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU1lbWJlclZhbHVlUGFpcihhc3QsIG5hbWUsCi0gICAgICAgICAgICAgICAgY3JlYXRlVHlwZUxpdGVyYWwoYXN0LCB2YWx1ZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIE1lbWJlclZhbHVlUGFpcn0gd2l0aCBhbiB7QGxpbmsgQXJyYXlJbml0aWFsaXplcn0gdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXN0IHRoZSB7QGxpbmsgQVNUfSB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIG1lbWJlciB2YWx1ZSBwYWlyLgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBtZW1iZXIgdmFsdWUgcGFpciAibmFtZSIuCi0gICAgICogQHBhcmFtIHZhbHVlcyBhbiBhcnJheSBvZiA8Y29kZT5PYmplY3Q8L2NvZGU+IHZhbHVlcy4gU3VwcG9ydHMgIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSwge0BsaW5rIGphdmEubGFuZy5Cb29sZWFufSwge0BsaW5rIGphdmEubGFuZy5DbGFzc30gdmFsdWVzLgotICAgICAqIEByZXR1cm4gYSBuZXcgbWVtYmVyIHZhbHVlIHBhaXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgYXJyYXkgb2YgdmFsdWVzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWVtYmVyVmFsdWVQYWlyIGNyZWF0ZUFycmF5TWVtYmVyVmFsdWVQYWlyKEFTVCBhc3QsIFN0cmluZyBuYW1lLCBPYmplY3RbXSB2YWx1ZXMpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVNZW1iZXJWYWx1ZVBhaXIoYXN0LCBuYW1lLCBjcmVhdGVBcnJheVZhbHVlTGl0ZXJhbChhc3QsIHZhbHVlcykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIEFycmF5SW5pdGlhbGl6ZXJ9LgotICAgICAqIEBwYXJhbSBhc3QgdGhlIHtAbGluayBBU1R9IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUge0BsaW5rIEFycmF5SW5pdGlhbGl6ZXJ9LgotICAgICAqIEBwYXJhbSB2YWx1ZXMgYW4gYXJyYXkgb2YgPGNvZGU+T2JqZWN0PC9jb2RlPiB2YWx1ZXMuIFN1cHBvcnRzICB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sIHtAbGluayBqYXZhLmxhbmcuQm9vbGVhbn0sIHtAbGluayBqYXZhLmxhbmcuQ2xhc3N9IHZhbHVlcy4KLSAgICAgKiBAcmV0dXJuIGEgbmV3IHNycmF5IGluaXRpYWxpemVyLgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBzdGF0aWMgQXJyYXlJbml0aWFsaXplciBjcmVhdGVBcnJheVZhbHVlTGl0ZXJhbChBU1QgYXN0LCBPYmplY3RbXSB2YWx1ZXMpIHsKLSAgICAgICAgQXJyYXlJbml0aWFsaXplciBhcnJheUluaXRpYWxpemVyID0gYXN0Lm5ld0FycmF5SW5pdGlhbGl6ZXIoKTsKLSAgICAgICAgZm9yIChPYmplY3QgdmFsdWUgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgIGlmICh2YWx1ZS5lcXVhbHMoQ2xhc3MuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgYXJyYXlJbml0aWFsaXplci5leHByZXNzaW9ucygpLmFkZChjcmVhdGVUeXBlTGl0ZXJhbChhc3QsIHZhbHVlLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHN0cmluZ1ZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RyaW5nVmFsdWUuZW5kc1dpdGgoIi5jbGFzcyIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgYXJyYXlJbml0aWFsaXplci5leHByZXNzaW9ucygpLmFkZChjcmVhdGVUeXBlTGl0ZXJhbChhc3QsIHN0cmluZ1ZhbHVlLnN1YnN0cmluZygwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1ZhbHVlLmxhc3RJbmRleE9mKCIuIikpKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhcnJheUluaXRpYWxpemVyLmV4cHJlc3Npb25zKCkuYWRkKGNyZWF0ZVN0cmluZ0xpdGVyYWwoYXN0LCBzdHJpbmdWYWx1ZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHZhbHVlLmVxdWFscyhCb29sZWFuLlRZUEUpKSB7Ci0gICAgICAgICAgICAgICAgYXJyYXlJbml0aWFsaXplci5leHByZXNzaW9ucygpLmFkZChjcmVhdGVCb29sZWFuTGl0ZXJhbChhc3QsIChCb29sZWFuKSB2YWx1ZSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFycmF5SW5pdGlhbGl6ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgUXVhbGlmaWVkTmFtZX0gdG8gcmVwcmVzZW50IGFuIDxjb2RlPmVudW08L2NvZGU+IGxpdGVyYWwgdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXN0IHRoZSB7QGxpbmsgQVNUfSB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIHF1YWxpZmllZCBuYW1lLgotICAgICAqIEBwYXJhbSBjbGFzc05hbWUgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBlbmNsb3NpbmcgY2xhc3MuCi0gICAgICogQHBhcmFtIHZhbHVlIHNuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIDxjb2RlPmVudW08L2NvZGU+IHZhbHVlLgotICAgICAqIEByZXR1cm4gYSBuZXcgcXVhbGlmaWVkIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBRdWFsaWZpZWROYW1lIGNyZWF0ZUVudW1MaXRlcmFsKEFTVCBhc3QsIFN0cmluZyBjbGFzc05hbWUsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBRdWFsaWZpZWROYW1lIGVudW1OYW1lID0gbnVsbDsKLSAgICAgICAgU2ltcGxlTmFtZSBlbnVtQ2xhc3NOYW1lID0gYXN0Lm5ld1NpbXBsZU5hbWUodmFsdWUuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotICAgICAgICBTaW1wbGVOYW1lIGVudW1MaXRlcmFsID0gYXN0Lm5ld1NpbXBsZU5hbWUodmFsdWUudG9TdHJpbmcoKSk7Ci0gICAgICAgIGlmICh2YWx1ZS5nZXRDbGFzcygpLmlzTWVtYmVyQ2xhc3MoKSkgewotICAgICAgICAgICAgTmFtZSBlbnVtRW5jbG9zaW5nQ2xhc3NOYW1lID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyBlbmNsb3NpbmdDbGFzc05hbWUgPSB2YWx1ZS5nZXRDbGFzcygpLmdldEVuY2xvc2luZ0NsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpOwotICAgICAgICAgICAgaWYgKGVuY2xvc2luZ0NsYXNzTmFtZS5lcXVhbHMoY2xhc3NOYW1lKSkgewotICAgICAgICAgICAgICAgIGVudW1FbmNsb3NpbmdDbGFzc05hbWUgPSBhc3QubmV3U2ltcGxlTmFtZSh2YWx1ZS5nZXRDbGFzcygpLmdldEVuY2xvc2luZ0NsYXNzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTaW1wbGVOYW1lKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlbnVtRW5jbG9zaW5nQ2xhc3NOYW1lID0gYXN0Lm5ld05hbWUoZW5jbG9zaW5nQ2xhc3NOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFF1YWxpZmllZE5hbWUgcXVhbGlmaWVkTmFtZSA9IGFzdC5uZXdRdWFsaWZpZWROYW1lKGVudW1FbmNsb3NpbmdDbGFzc05hbWUsIGVudW1DbGFzc05hbWUpOwotICAgICAgICAgICAgZW51bU5hbWUgPSBhc3QubmV3UXVhbGlmaWVkTmFtZShxdWFsaWZpZWROYW1lLCBlbnVtTGl0ZXJhbCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBOYW1lIHF1YWxpZmllZE5hbWUgPSBhc3QubmV3TmFtZSh2YWx1ZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7Ci0gICAgICAgICAgICBlbnVtTmFtZSA9IGFzdC5uZXdRdWFsaWZpZWROYW1lKHF1YWxpZmllZE5hbWUsIGVudW1MaXRlcmFsKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZW51bU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgVHlwZUxpdGVyYWx9LgotICAgICAqCi0gICAgICogQHBhcmFtIGFzdCB0aGUge0BsaW5rIEFTVH0gdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSB7QGxpbmsgVHlwZUxpdGVyYWx9LgotICAgICAqIEBwYXJhbSB2YWx1ZSBhIDxjb2RlPkNsYXNzPC9jb2RlPiBvciBhIDxjb2RlPlN0cmluZzwvY29kZT4gZnJvbSB3aGljaCB0byBjcmVhdGUgdGhlIHR5cGUgbGl0ZXJhbC4KLSAgICAgKiBAcmV0dXJuIGEgbmV3IHR5cGUgbGl0ZXJhbCBvciBudWxsIGl0IHRoZSB2YWx1ZSBpcyBub3Qgb2YgdHlwZSA8Y29kZT5DbGFzczwvY29kZT4gb3IgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFR5cGVMaXRlcmFsIGNyZWF0ZVR5cGVMaXRlcmFsKEFTVCBhc3QsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBUeXBlTGl0ZXJhbCB0eXBlTGl0ZXJhbCA9IG51bGw7Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENsYXNzPD8+KSB7Ci0gICAgICAgICAgICB0eXBlTGl0ZXJhbCA9IGNyZWF0ZVR5cGVMaXRlcmFsKGFzdCwgKENsYXNzPD8+KSB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICB0eXBlTGl0ZXJhbCA9IGNyZWF0ZVR5cGVMaXRlcmFsKGFzdCwgKFN0cmluZykgdmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0eXBlTGl0ZXJhbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBUeXBlTGl0ZXJhbH0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXN0IHRoZSB7QGxpbmsgQVNUfSB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIHR5cGUgbGl0ZXJhbC4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGNsYXNzIHZhbHVlLgotICAgICAqIEByZXR1cm4gYSBuZXcgdHlwZSBsaXRlcmFsLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVHlwZUxpdGVyYWwgY3JlYXRlVHlwZUxpdGVyYWwoQVNUIGFzdCwgQ2xhc3M8Pz4gdmFsdWUpIHsKLSAgICAgICAgVHlwZUxpdGVyYWwgdHlwZUxpdGVyYWwgPSBhc3QubmV3VHlwZUxpdGVyYWwoKTsKLQotICAgICAgICBDbGFzczw/PiBhQ2xhc3MgPSB2YWx1ZTsKLSAgICAgICAgU2ltcGxlTmFtZSBjbGFzc05hbWUgPSBhc3QubmV3U2ltcGxlTmFtZShhQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsKLQotICAgICAgICBpZiAoYUNsYXNzLmlzTWVtYmVyQ2xhc3MoKSkgewotICAgICAgICAgICAgTmFtZSBlbmNsb3NpbmdDbGFzc05hbWUgPSBhc3QubmV3TmFtZShhQ2xhc3MuZ2V0RW5jbG9zaW5nQ2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOwotICAgICAgICAgICAgUXVhbGlmaWVkVHlwZSBxdWFsaWZpZWRUeXBlID0gYXN0Lm5ld1F1YWxpZmllZFR5cGUoYXN0Lm5ld1NpbXBsZVR5cGUoZW5jbG9zaW5nQ2xhc3NOYW1lKSwgY2xhc3NOYW1lKTsKLSAgICAgICAgICAgIHR5cGVMaXRlcmFsLnNldFR5cGUocXVhbGlmaWVkVHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gdHlwZUxpdGVyYWw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZVR5cGVMaXRlcmFsKGFzdCwgdmFsdWUuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBUeXBlTGl0ZXJhbH0KLSAgICAgKgotICAgICAqIEBwYXJhbSBhc3QgdGhlIHtAbGluayBBU1R9IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgdHlwZSBsaXRlcmFsLgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmFtZSBvZiB0aGUgY2xhc3MuCi0gICAgICogQHJldHVybiBhIG5ldyB0eXBlIGxpdGVyYWwuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUeXBlTGl0ZXJhbCBjcmVhdGVUeXBlTGl0ZXJhbChBU1QgYXN0LCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgVHlwZUxpdGVyYWwgdHlwZUxpdGVyYWwgPSBhc3QubmV3VHlwZUxpdGVyYWwoKTsKLQotICAgICAgICBpZiAodmFsdWUuaW5kZXhPZigiLiIpID09IC0xKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHR5cGVMaXRlcmFsLnNldFR5cGUoYXN0Lm5ld1NpbXBsZVR5cGUoYXN0Lm5ld1NpbXBsZU5hbWUodmFsdWUpKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmcgcXVhbGlmaWVyID0gdmFsdWUuc3Vic3RyaW5nKDAsIHZhbHVlLmxhc3RJbmRleE9mKCIuIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBTdHJpbmcgaWRlbnRpZmllciA9IHZhbHVlLnN1YnN0cmluZyh2YWx1ZS5sYXN0SW5kZXhPZigiLiIpICsgMSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGlmIChxdWFsaWZpZXIuZXF1YWxzKCJqYXZhLmxhbmciKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgdHlwZUxpdGVyYWwuc2V0VHlwZShhc3QubmV3U2ltcGxlVHlwZShhc3QubmV3U2ltcGxlTmFtZShpZGVudGlmaWVyKSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0eXBlTGl0ZXJhbC5zZXRUeXBlKGFzdC5uZXdRdWFsaWZpZWRUeXBlKGFzdC5uZXdTaW1wbGVUeXBlKGFzdC5uZXdOYW1lKHF1YWxpZmllcikpLCBhc3QKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uZXdTaW1wbGVOYW1lKGlkZW50aWZpZXIpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHR5cGVMaXRlcmFsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFN0cmluZ0xpdGVyYWx9LgotICAgICAqIEBwYXJhbSBhc3QgdGhlIHtAbGluayBBU1R9IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgc3RyaW5nIGxpdGVyYWwuCi0gICAgICogQHBhcmFtIGxpdGVyYWxWYWx1ZSB0aGUgc3RyaW5nIHZhbHVlLgotICAgICAqIEByZXR1cm4gYSBuZXcgc3RyaW5nIGxpdGVyYWwuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmdMaXRlcmFsIGNyZWF0ZVN0cmluZ0xpdGVyYWwoQVNUIGFzdCwgU3RyaW5nIGxpdGVyYWxWYWx1ZSkgewotICAgICAgICBTdHJpbmdMaXRlcmFsIHN0cmluZ0xpdGVyYWwgPSBhc3QubmV3U3RyaW5nTGl0ZXJhbCgpOwotICAgICAgICBzdHJpbmdMaXRlcmFsLnNldExpdGVyYWxWYWx1ZShsaXRlcmFsVmFsdWUpOwotICAgICAgICByZXR1cm4gc3RyaW5nTGl0ZXJhbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBCb29sZWFuTGl0ZXJhbH0uCi0gICAgICogQHBhcmFtIGFzdCB0aGUge0BsaW5rIEFTVH0gdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBib29sZWFuIGxpdGVyYWwuCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBib29sZWFuIHZhbHVlLgotICAgICAqIEByZXR1cm4gYSBuZXcgYm9vbGVhbiBsaXRlcmFsLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQm9vbGVhbkxpdGVyYWwgY3JlYXRlQm9vbGVhbkxpdGVyYWwoQVNUIGFzdCwgYm9vbGVhbiB2YWx1ZSkgewotICAgICAgICBCb29sZWFuTGl0ZXJhbCBib29sZWFuTGl0ZXJhbCA9IGFzdC5uZXdCb29sZWFuTGl0ZXJhbCh2YWx1ZSk7Ci0gICAgICAgIHJldHVybiBib29sZWFuTGl0ZXJhbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBOdW1iZXJMaXRlcmFsfS4KLSAgICAgKiBAcGFyYW0gYXN0IHRoZSB7QGxpbmsgQVNUfSB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIHtAbGluayBOdW1iZXJMaXRlcmFsfS4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG51bWJlciB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIGEgbmV3IG51bWJlciBsaXRlcmFsLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTnVtYmVyTGl0ZXJhbCBjcmVhdGVOdW1iZXJMaXRlcmFsKEFTVCBhc3QsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBOdW1iZXJMaXRlcmFsIHByaW1pdGl2ZUxpdGVyYWwgPSBhc3QubmV3TnVtYmVyTGl0ZXJhbCgpOwotICAgICAgICBwcmltaXRpdmVMaXRlcmFsLnNldFRva2VuKHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHByaW1pdGl2ZUxpdGVyYWw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQwNDY3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiAKLSAqIDxwPgotICogPHN0cm9uZz5Qcm92aXNpb25hbCBBUEk6PC9zdHJvbmc+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciAKLSAqIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCAKLSAqIHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgCi0gKiB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbnNDb3JlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotICAgIHByaXZhdGUgc3RhdGljIEFubm90YXRpb25zQ29yZVBsdWdpbiBwbHVnaW47Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uc0NvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLSAgICAgIHJldHVybiBwbHVnaW47Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnN0YXJ0KGNvbnRleHQpOwotICAgICAgICBwbHVnaW4gPSB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcGx1Z2luID0gbnVsbDsKLSAgICAgICAgc3VwZXIuc3RvcChjb250ZXh0KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZ01lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBBbm5vdGF0aW9uc0NvcmVQbHVnaW4ubG9nKG5ldyBTdGF0dXMoc2V2ZXJpdHksIEFubm90YXRpb25zQ29yZVBsdWdpbi5QTFVHSU5fSUQsIG1lc3NhZ2UpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgIEFubm90YXRpb25zQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0gICAgICAgIEFubm90YXRpb25zQ29yZVBsdWdpbi5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBbm5vdGF0aW9uc0NvcmVQbHVnaW4uUExVR0lOX0lELCBleGNlcHRpb24KLSAgICAgICAgICAgICAgICAuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBleGNlcHRpb24pKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc01hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTkzZDE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZTsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTG9jYWxWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW1wbGVOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uLklBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI7Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgYW5ub3RhdGlvbiBjYXRlZ29yaWVzLCBkZWZpbml0aW9ucywgcHJvY2Vzc29ycyBhbmQgaW5pdGlhbGl6ZXJzIGNvbnRyaWJ1dGVkIHRocm91Z2ggdGhlCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uRGVmaW5pdGlvbjwvY29kZT4sCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uQ2F0ZWdvcnk8L2NvZGU+LAotICogPGNvZGU+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkluaXRpYWxpemVyPC9jb2RlPiBhbmQKLSAqIDxjb2RlPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25Qcm9jZXNzb3I8L2NvZGU+IGV4dGVuc2lvbiBwb2ludHMuCi0gKiA8cD4KLSAqIDxzdHJvbmc+UHJvdmlzaW9uYWwgQVBJOjwvc3Ryb25nPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIKLSAqIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdAotICogdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcwotICogdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQW5ub3RhdGlvbnNNYW5hZ2VyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5OT1RBVElPTl9ERUZJTklUSU9OID0gImFubm90YXRpb25EZWZpbml0aW9uIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTk5PVEFUSU9OX0NBVEVHT1JZID0gImFubm90YXRpb25DYXRlZ29yeSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5OT1RBVElPTl9JTklUSUFMSVpFUiA9ICJhbm5vdGF0aW9uSW5pdGlhbGl6ZXIiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFOTk9UQVRJT05fUFJPQ0VTU09SID0gImFubm90YXRpb25Qcm9jZXNzb3IiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFOTk9UQVRJT04gPSAiYW5ub3RhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGFubm90YXRpb25DYWNoZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBhbm5vdGF0aW9uQ2F0ZWdvcnlDYWNoZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgSUNvbmZpZ3VyYXRpb25FbGVtZW50PiBhbm5vdGF0aW9uSW5pdGlhbGl6ZXJDYWNoZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgTGlzdDxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+PiBhbm5vdGF0aW9uUHJvY2Vzc29yQ2FjaGUgPSBudWxsOwotICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIExpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+PiBhbm5vdGF0aW9uc0J5Q2F0ZWdvcnlNYXAgPSBudWxsOwotICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIEFubm90YXRpb25EZWZpbml0aW9uPiBhbm5vdGF0aW9uQ2xhc3NOYW1lVG9EZWZpbml0aW9uTWFwOwotICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIEFubm90YXRpb25EZWZpbml0aW9uPiBhbm5vdGF0aW9uU2ltcGxlTmFtZVRvRGVmaW5pdGlvbk1hcDsKLSAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBBbm5vdGF0aW9uRGVmaW5pdGlvbj4gYW5ub3RhdGlvblF1YWxpZmllZE5hbWVUb0RlZmluaXRpb25NYXA7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQ0FURUdPUlkgPSAiY2F0ZWdvcnkiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9UQVJHRVRfRklMVEVSID0gInRhcmdldEZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLSAgICAvLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1RBUkdFVCA9ICJ0YXJnZXQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIEFubm90YXRpb25zTWFuYWdlcigpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB7QGxpbmsgQW5ub3RhdGlvbkRlZmluaXRpb259IGNvbnN0cnVjdGVkIGZyb20gY29udHJpYnV0aW9ucyB0byB0aGUKLSAgICAgKiA8Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uRGVmaW5pdGlvbjwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LgotICAgICAqCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgYW5ub3RhdGlvbiBkZWZpbml0aW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPiBnZXRBbm5vdGF0aW9ucygpIHsKLSAgICAgICAgaWYgKGFubm90YXRpb25DYWNoZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhbm5vdGF0aW9uQ2FjaGUgPSBuZXcgQXJyYXlMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPigpOwotCi0gICAgICAgICAgICBJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KAotICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uc0NvcmVQbHVnaW4uUExVR0lOX0lELCBBTk5PVEFUSU9OX0RFRklOSVRJT04pOwotICAgICAgICAgICAgaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IGV4dGVuc2lvblBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhBTk5PVEFUSU9OKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24gPSBuZXcgQW5ub3RhdGlvbkRlZmluaXRpb24oZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QW5ub3RhdGlvbkNhdGVnb3J5KGdldEF0dHJpYnV0ZVZhbHVlKGVsZW1lbnQsIEFUVF9DQVRFR09SWSkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25DYWNoZS5hZGQoYW5ub3RhdGlvbkRlZmluaXRpb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uQ2FjaGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIHRoZSBjb250cmlidXRlZCB7QGxpbmsgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbn0gdGhhdCB0YXJnZXQgdGhlIGdpdmVuIGphdmEgZWxlbWVudCB0eXBlLgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnQgb25lIG9mCi0gICAgICogPGxpPm9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRGVjbGFyYXRpb248L2xpPgotICAgICAqIDxsaT5vcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTwvbGk+Ci0gICAgICogPGxpPm9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDwvbGk+Ci0gICAgICogPGxpPm9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q8L2xpPgotICAgICAqIDxsaT5vcmcuZWNsaXBzZS5qZHQuY29yZS5JTG9jYWxWYXJpYWJsZTwvbGk+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBhbm5vdGF0aW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8Q2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+PiBnZXRBbm5vdGF0aW9ucyhJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQpIHsKLSAgICAgICAgTGlzdDxDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4+IGFubm90YXRpb25zID0gbmV3IEFycmF5TGlzdDxDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4+KCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIExpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGFubm90YXRpb25EZWZpbml0aW9ucyA9IGdldEFsbEFubm90YXRpb25zRm9yRWxlbWVudChqYXZhRWxlbWVudCk7Ci0KLSAgICAgICAgICAgIGZpbHRlckFubm90YXRpb25zTGlzdChqYXZhRWxlbWVudCwgYW5ub3RhdGlvbkRlZmluaXRpb25zKTsKLQotICAgICAgICAgICAgZm9yIChBbm5vdGF0aW9uRGVmaW5pdGlvbiBhbm5vdGF0aW9uRGVmaW5pdGlvbiA6IGFubm90YXRpb25EZWZpbml0aW9ucykgewotICAgICAgICAgICAgICAgIGFubm90YXRpb25zLmFkZChhbm5vdGF0aW9uRGVmaW5pdGlvbi5nZXRBbm5vdGF0aW9uQ2xhc3MoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIEFubm90YXRpb25zQ29yZVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbnM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIE1hcDxTdHJpbmcsIEFubm90YXRpb25EZWZpbml0aW9uPiBnZXRBbm5vdGF0aW9uVG9DbGFzc05hbWVEZWZpbml0aW9uTWFwKCkgewotCi0gICAgICAgIGlmIChhbm5vdGF0aW9uQ2xhc3NOYW1lVG9EZWZpbml0aW9uTWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIExpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGFubm90YXRpb25EZWZpbml0aW9ucyA9IGdldEFubm90YXRpb25zKCk7Ci0KLSAgICAgICAgICAgIGFubm90YXRpb25DbGFzc05hbWVUb0RlZmluaXRpb25NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEFubm90YXRpb25EZWZpbml0aW9uPigpOwotCi0gICAgICAgICAgICBmb3IgKEFubm90YXRpb25EZWZpbml0aW9uIGFubm90YXRpb25EZWZpbml0aW9uIDogYW5ub3RhdGlvbkRlZmluaXRpb25zKSB7Ci0gICAgICAgICAgICAJaWYgKGFubm90YXRpb25EZWZpbml0aW9uLmdldEFubm90YXRpb25DbGFzcygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkNsYXNzTmFtZVRvRGVmaW5pdGlvbk1hcC5wdXQoYW5ub3RhdGlvbkRlZmluaXRpb24uZ2V0QW5ub3RhdGlvbkNsYXNzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q2Fub25pY2FsTmFtZSgpLCBhbm5vdGF0aW9uRGVmaW5pdGlvbik7Ci0gICAgICAgICAgICAJfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uQ2xhc3NOYW1lVG9EZWZpbml0aW9uTWFwOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBNYXA8U3RyaW5nLCBBbm5vdGF0aW9uRGVmaW5pdGlvbj4gZ2V0U2ltcGxlTmFtZVRvRGVmaW5pdGlvbk1hcCgpIHsKLSAgICAgICAgaWYgKGFubm90YXRpb25TaW1wbGVOYW1lVG9EZWZpbml0aW9uTWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIExpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGFubm90YXRpb25EZWZpbml0aW9ucyA9IGdldEFubm90YXRpb25zKCk7Ci0KLSAgICAgICAgICAgIGFubm90YXRpb25TaW1wbGVOYW1lVG9EZWZpbml0aW9uTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBBbm5vdGF0aW9uRGVmaW5pdGlvbj4oKTsKLQotICAgICAgICAgICAgZm9yIChBbm5vdGF0aW9uRGVmaW5pdGlvbiBhbm5vdGF0aW9uRGVmaW5pdGlvbiA6IGFubm90YXRpb25EZWZpbml0aW9ucykgewotICAgICAgICAgICAgICAgIGFubm90YXRpb25TaW1wbGVOYW1lVG9EZWZpbml0aW9uTWFwLnB1dChhbm5vdGF0aW9uRGVmaW5pdGlvbi5nZXROYW1lKCksIGFubm90YXRpb25EZWZpbml0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvblNpbXBsZU5hbWVUb0RlZmluaXRpb25NYXA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIE1hcDxTdHJpbmcsIEFubm90YXRpb25EZWZpbml0aW9uPiBnZXRRdWFsaWZpZWROYW1lVG9EZWZpbml0aW9uTWFwKCkgewotICAgICAgICBpZiAoYW5ub3RhdGlvblF1YWxpZmllZE5hbWVUb0RlZmluaXRpb25NYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgTGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gYW5ub3RhdGlvbkRlZmluaXRpb25zID0gZ2V0QW5ub3RhdGlvbnMoKTsKLQotICAgICAgICAgICAgYW5ub3RhdGlvblF1YWxpZmllZE5hbWVUb0RlZmluaXRpb25NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEFubm90YXRpb25EZWZpbml0aW9uPigpOwotCi0gICAgICAgICAgICBmb3IgKEFubm90YXRpb25EZWZpbml0aW9uIGFubm90YXRpb25EZWZpbml0aW9uIDogYW5ub3RhdGlvbkRlZmluaXRpb25zKSB7Ci0gICAgICAgICAgICAgICAgYW5ub3RhdGlvblF1YWxpZmllZE5hbWVUb0RlZmluaXRpb25NYXAucHV0KGFubm90YXRpb25EZWZpbml0aW9uLmdldEFubm90YXRpb25DbGFzc05hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25EZWZpbml0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvblF1YWxpZmllZE5hbWVUb0RlZmluaXRpb25NYXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUge0BsaW5rIEFubm90YXRpb25EZWZpbml0aW9ufSBmb3IgdGhlIGdpdmVuIHtAbGluayBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9ufSBjbGFzcwotICAgICAqIG9yIG51bGwgaWYgbm8gYW5ub3RhdGlvbiBkZWZpbml0aW9uIGNhbiBiZSBmb3VuZC4KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbkNsYXNzIHRoZSA8Y29kZT5qYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPC9jb2RlPiBjbGFzcy4KLSAgICAgKiBAcmV0dXJuIHRoZSBhbm5vdGF0aW9uIGRlZmluaXRpb24gZm9yIHRoZSA8Y29kZT5qYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPC9jb2RlPiBjbGFzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGdldEFubm90YXRpb25EZWZpbml0aW9uRm9yQ2xhc3MoQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFubm90YXRpb25DbGFzcykgewotICAgICAgICByZXR1cm4gZ2V0QW5ub3RhdGlvblRvQ2xhc3NOYW1lRGVmaW5pdGlvbk1hcCgpLmdldChhbm5vdGF0aW9uQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQW5ub3RhdGlvbkRlZmluaXRpb259IGZvciB0aGUgZ2l2ZW4gZnVsbHkgcXVhbGlmaWVkIHtAbGluayBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9ufSBjbGFzcwotICAgICAqIG5hbWUgb3IgbnVsbCBpZiBubyBhbm5vdGF0aW9uIGRlZmluaXRpb24gY2FuIGJlIGZvdW5kLgotICAgICAqIEBwYXJhbSBjYW5vbmljYWxOYW1lIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgPGNvZGU+amF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjwvY29kZT4gY2xhc3MuCi0gICAgICogQHJldHVybiB0aGUgYW5ub3RhdGlvbiBkZWZpbml0aW9uIGZvciB0aGUgZnVsbHkgcXVhbGlmaWVkIDxjb2RlPmphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb248L2NvZGU+IGNsYXNzIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBnZXRBbm5vdGF0aW9uRGVmaW5pdGlvbkZvckNsYXNzKFN0cmluZyBjYW5vbmljYWxOYW1lKSB7Ci0gICAgICAgIHJldHVybiBnZXRBbm5vdGF0aW9uVG9DbGFzc05hbWVEZWZpbml0aW9uTWFwKCkuZ2V0KGNhbm9uaWNhbE5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHtAbGluayBJQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyfSBmb3IgdGhlIGdpdmVuIHtAbGluayBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZX0KLSAgICAgKiBvciBudWxsIGlmIG5vbmUgY2FuIGJlIGZvdW5kLgotICAgICAqIEBwYXJhbSBuYW1lIGEge0BsaW5rIFNpbXBsZU5hbWV9IG9yIHtAbGluayBRdWFsaWZpZWROYW1lfSBmb3IgdGhlIGFubm90YXRpb24gdG8gc2VhcmNoIGZvci4KLSAgICAgKiBAcmV0dXJuIGFuIDxjb2RlPklBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI8L2NvZGU+IGZvciB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgZ2V0QW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyRm9yTmFtZShOYW1lIG5hbWUpIHsKLSAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG5hbWUuaXNTaW1wbGVOYW1lKCkgJiYgZ2V0U2ltcGxlTmFtZVRvRGVmaW5pdGlvbk1hcCgpLmNvbnRhaW5zS2V5KCgoU2ltcGxlTmFtZSkgbmFtZSkuZ2V0SWRlbnRpZmllcigpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBnZXRTaW1wbGVOYW1lVG9EZWZpbml0aW9uTWFwKCkuZ2V0KCgoU2ltcGxlTmFtZSkgbmFtZSkuZ2V0SWRlbnRpZmllcigpKS5nZXRBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5pc1F1YWxpZmllZE5hbWUoKSAmJiBnZXRRdWFsaWZpZWROYW1lVG9EZWZpbml0aW9uTWFwKCkuY29udGFpbnNLZXkobmFtZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UXVhbGlmaWVkTmFtZVRvRGVmaW5pdGlvbk1hcCgpLmdldChuYW1lLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKS5nZXRBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhlIHtAbGluayBBbm5vdGF0aW9uRGVmaW5pdGlvbn0gd2l0aCB0aGUgZ2l2ZW4gYW5ub3RhdGlvbiBjYXRlZ29yeSBuYW1lLgotICAgICAqIEBwYXJhbSBjYXRlZ29yeU5hbWUgdGhlIGFubm90YXRpb24gY2F0ZWdvcnkgbmFtZS4KLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBhbm5vdGF0aW9uIGRlZmluaXRpb25zLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIExpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGdldEFubm90YXRpb25zQnlDYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnlOYW1lKSB7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uc0J5Q2F0ZWdvcnlNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgYW5ub3RhdGlvbnNCeUNhdGVnb3J5TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPj4oKTsKLSAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24gOiBnZXRBbm5vdGF0aW9ucygpKSB7Ci0KLSAgICAgICAgICAgICAgICBMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPiBhbm5vdGF0aW9uRGVmaW5pdGlvbkxpc3QgPSBhbm5vdGF0aW9uc0J5Q2F0ZWdvcnlNYXAuZ2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkRlZmluaXRpb24uZ2V0Q2F0ZWdvcnkoKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYW5ub3RhdGlvbkRlZmluaXRpb25MaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkRlZmluaXRpb25MaXN0ID0gbmV3IEFycmF5TGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4oKTsKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkRlZmluaXRpb25MaXN0LmFkZChhbm5vdGF0aW9uRGVmaW5pdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zQnlDYXRlZ29yeU1hcC5wdXQoYW5ub3RhdGlvbkRlZmluaXRpb24uZ2V0Q2F0ZWdvcnkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uRGVmaW5pdGlvbkxpc3QpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbkRlZmluaXRpb25MaXN0LmFkZChhbm5vdGF0aW9uRGVmaW5pdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25zQnlDYXRlZ29yeU1hcC5nZXQoY2F0ZWdvcnlOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB0aGUgYW5ub3RhdGlvbiBjYXRlZ29yaWVzLgotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGFubm90YXRpb24gY2F0ZWdvcmllcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRBbm5vdGF0aW9uQ2F0ZWdvcmllcygpIHsKLSAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoZ2V0QW5ub3RhdGlvbkNhdGVnb3J5Q2FjaGUoKS52YWx1ZXMoKS50b0FycmF5KAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbZ2V0QW5ub3RhdGlvbkNhdGVnb3J5Q2FjaGUoKS5zaXplKCldKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEFubm90YXRpb25DYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnlJZCkgewotICAgICAgICByZXR1cm4gZ2V0QW5ub3RhdGlvbkNhdGVnb3J5Q2FjaGUoKS5nZXQoY2F0ZWdvcnlJZCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0QW5ub3RhdGlvbkNhdGVnb3J5Q2FjaGUoKSB7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uQ2F0ZWdvcnlDYWNoZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbkNhdGVnb3J5Q2FjaGU7Ci0gICAgICAgIH0KLQotICAgICAgICBhbm5vdGF0aW9uQ2F0ZWdvcnlDYWNoZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCi0gICAgICAgIElFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbnNDb3JlUGx1Z2luLlBMVUdJTl9JRCwgQU5OT1RBVElPTl9DQVRFR09SWSk7Ci0gICAgICAgIGlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IGV4dGVuc2lvblBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbkNhdGVnb3J5Q2FjaGUucHV0KGdldEF0dHJpYnV0ZVZhbHVlKGVsZW1lbnQsIEFUVF9JRCksCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRBdHRyaWJ1dGVWYWx1ZShlbGVtZW50LCBBVFRfTkFNRSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uQ2F0ZWdvcnlDYWNoZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIHN5bmNocm9uaXplZCBNYXA8U3RyaW5nLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQ+IGdldEFubm90YXRpb25Jbml0aWFsaXplckNhY2hlKCkgewotICAgICAgICBpZiAoYW5ub3RhdGlvbkluaXRpYWxpemVyQ2FjaGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb25Jbml0aWFsaXplckNhY2hlOwotICAgICAgICB9Ci0KLSAgICAgICAgYW5ub3RhdGlvbkluaXRpYWxpemVyQ2FjaGUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElDb25maWd1cmF0aW9uRWxlbWVudD4oKTsKLQotICAgICAgICBJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KAotICAgICAgICAgICAgICAgIEFubm90YXRpb25zQ29yZVBsdWdpbi5QTFVHSU5fSUQsIEFOTk9UQVRJT05fSU5JVElBTElaRVIpOwotICAgICAgICBpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBleHRlbnNpb25Qb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotICAgICAgICAgICAgICAgIGFubm90YXRpb25Jbml0aWFsaXplckNhY2hlLnB1dChnZXRBdHRyaWJ1dGVWYWx1ZShlbGVtZW50LCBBTk5PVEFUSU9OKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uSW5pdGlhbGl6ZXJDYWNoZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBNYXA8U3RyaW5nLCBMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4+IGdldEFubm90YXRpb25Qcm9jZXNzb3JzQ2FjaGUoKSB7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uUHJvY2Vzc29yQ2FjaGUgPT0gbnVsbCkgewotICAgICAgICAgICAgYW5ub3RhdGlvblByb2Nlc3NvckNhY2hlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4+KCk7Ci0KLSAgICAgICAgICAgIElFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0gICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25zQ29yZVBsdWdpbi5QTFVHSU5fSUQsIEFOTk9UQVRJT05fUFJPQ0VTU09SKTsKLSAgICAgICAgICAgIGlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBleHRlbnNpb25Qb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJwcm9jZXNzb3IiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFubm90YXRpb25LZXkgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbGVtZW50LCBBTk5PVEFUSU9OKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8SUNvbmZpZ3VyYXRpb25FbGVtZW50PiBjb25maWd1cmF0aW9uRWxlbWVudHMgPSBhbm5vdGF0aW9uUHJvY2Vzc29yQ2FjaGUuZ2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uS2V5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uRWxlbWVudHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25FbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8SUNvbmZpZ3VyYXRpb25FbGVtZW50PigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25FbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2Nlc3NvckNhY2hlLnB1dChhbm5vdGF0aW9uS2V5LCBjb25maWd1cmF0aW9uRWxlbWVudHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbkVsZW1lbnRzLmFkZChlbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvblByb2Nlc3NvckNhY2hlOwotICAgIH0KLQotICAgIHN0YXRpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ3VyYXRpb25FbGVtZW50LCBTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gY29uZmlndXJhdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpOwotICAgICAgICBpZiAoYXR0cmlidXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gZ2V0QWxsQW5ub3RhdGlvbnNGb3JFbGVtZW50KElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCkKLSAgICB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJUGFja2FnZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0QW5ub3RhdGlvbnNGb3JFbGVtZW50VHlwZShFbGVtZW50VHlwZS5QQUNLQUdFKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElUeXBlKSB7Ci0gICAgICAgICAgICBJVHlwZSB0eXBlID0gKElUeXBlKSBqYXZhRWxlbWVudDsKLSAgICAgICAgICAgIGlmICh0eXBlLmlzQW5ub3RhdGlvbigpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEFubm90YXRpb25zRm9yRWxlbWVudFR5cGUoRWxlbWVudFR5cGUuQU5OT1RBVElPTl9UWVBFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBnZXRBbm5vdGF0aW9uc0ZvckVsZW1lbnRUeXBlKEVsZW1lbnRUeXBlLlRZUEUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSUZpZWxkKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0QW5ub3RhdGlvbnNGb3JFbGVtZW50VHlwZShFbGVtZW50VHlwZS5GSUVMRCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJTWV0aG9kKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0QW5ub3RhdGlvbnNGb3JFbGVtZW50VHlwZShFbGVtZW50VHlwZS5NRVRIT0QpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSUxvY2FsVmFyaWFibGUpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRBbm5vdGF0aW9uc0ZvckVsZW1lbnRUeXBlKEVsZW1lbnRUeXBlLlBBUkFNRVRFUik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJQW5ub3RhdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGdldEFubm90YXRpb25zRm9yRWxlbWVudFR5cGUoRWxlbWVudFR5cGUuQU5OT1RBVElPTl9UWVBFKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPiBnZXRBbm5vdGF0aW9uc0ZvckVsZW1lbnRUeXBlKEVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlKSB7Ci0gICAgICAgIExpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGFubm90YXRpb25EZWZpbml0aW9ucyA9IG5ldyBBcnJheUxpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+KCk7Ci0KLSAgICAgICAgaWYgKGFubm90YXRpb25DYWNoZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBnZXRBbm5vdGF0aW9ucygpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChBbm5vdGF0aW9uRGVmaW5pdGlvbiBhbm5vdGF0aW9uRGVmaW5pdGlvbiA6IGFubm90YXRpb25DYWNoZSkgewotICAgICAgICAgICAgaWYgKGFubm90YXRpb25EZWZpbml0aW9uLmdldFRhcmdldHMoKS5jb250YWlucyhlbGVtZW50VHlwZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgIWlzRGVwcmVjYXRlZChhbm5vdGF0aW9uRGVmaW5pdGlvbikpIHsKLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9uRGVmaW5pdGlvbnMuYWRkKGFubm90YXRpb25EZWZpbml0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbkRlZmluaXRpb25zOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZmlsdGVyQW5ub3RhdGlvbnNMaXN0KElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwKLSAgICAgICAgICAgIExpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGFubm90YXRpb25EZWZpbml0aW9ucykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIEl0ZXJhdG9yPEFubm90YXRpb25EZWZpbml0aW9uPiBhbm5vdGF0aW9uSXRlciA9IGFubm90YXRpb25EZWZpbml0aW9ucy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoYW5ub3RhdGlvbkl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uRGVmaW5pdGlvbiBhbm5vdGF0aW9uRGVmaW5pdGlvbiA9IGFubm90YXRpb25JdGVyLm5leHQoKTsKLQotICAgICAgICAgICAgaWYgKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSVR5cGUpIHsKLSAgICAgICAgICAgICAgICBJVHlwZSB0eXBlID0gKElUeXBlKSBqYXZhRWxlbWVudDsKLSAgICAgICAgICAgICAgICBpZiAoaXNDbGFzc1Jlc3RyaWN0ZWQodHlwZSwgYW5ub3RhdGlvbkRlZmluaXRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBpc0ludGVyZmFjZVJlc3RyaWN0ZWQodHlwZSwgYW5ub3RhdGlvbkRlZmluaXRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBpc0VudW1SZXN0cmljdGVkKHR5cGUsIGFubm90YXRpb25EZWZpbml0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uSXRlci5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJTWV0aG9kKSB7Ci0gICAgICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSAoSU1ldGhvZCkgamF2YUVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgaWYgKG1ldGhvZC5pc01haW5NZXRob2QoKSkgewotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uSXRlci5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmICFhbm5vdGF0aW9uRGVmaW5pdGlvbi5nZXRUYXJnZXRzKCkuY29udGFpbnMoRWxlbWVudFR5cGUuQ09OU1RSVUNUT1IpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25JdGVyLnJlbW92ZSgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc0NsYXNzUmVzdHJpY3RlZChtZXRob2QsIGFubm90YXRpb25EZWZpbml0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgaXNJbnRlcmZhY2VSZXN0cmljdGVkKG1ldGhvZCwgYW5ub3RhdGlvbkRlZmluaXRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBpc0VudW1SZXN0cmljdGVkKG1ldGhvZCwgYW5ub3RhdGlvbkRlZmluaXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25JdGVyLnJlbW92ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSUZpZWxkKSB7Ci0gICAgICAgICAgICAgICAgaWYoaXNDbGFzc1Jlc3RyaWN0ZWQoamF2YUVsZW1lbnQsIGFubm90YXRpb25EZWZpbml0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgaXNJbnRlcmZhY2VSZXN0cmljdGVkKGphdmFFbGVtZW50LCBhbm5vdGF0aW9uRGVmaW5pdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8aXNFbnVtUmVzdHJpY3RlZChqYXZhRWxlbWVudCwgYW5ub3RhdGlvbkRlZmluaXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25JdGVyLnJlbW92ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDbGFzc1Jlc3RyaWN0ZWQoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LAotICAgICAgICAgICAgQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuVFlQRSkgewotICAgICAgICAgICAgcmV0dXJuICEoKElUeXBlKWphdmFFbGVtZW50KS5pc0NsYXNzKCkgJiYgYW5ub3RhdGlvbkRlZmluaXRpb24uaXNDbGFzc09ubHkoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuTUVUSE9EKSB7Ci0gICAgICAgICAgICBJVHlwZSB0eXBlID0gKElUeXBlKWphdmFFbGVtZW50LmdldFBhcmVudCgpOwotICAgICAgICAgICAgcmV0dXJuICF0eXBlLmlzQ2xhc3MoKSAmJiBhbm5vdGF0aW9uRGVmaW5pdGlvbi5pc0NsYXNzT25seSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5GSUVMRCkgewotICAgICAgICAgICAgSVR5cGUgdHlwZSA9IChJVHlwZSlqYXZhRWxlbWVudC5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgIHJldHVybiAhdHlwZS5pc0NsYXNzKCkgJiYgYW5ub3RhdGlvbkRlZmluaXRpb24uaXNDbGFzc09ubHkoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0ludGVyZmFjZVJlc3RyaWN0ZWQoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LAotICAgICAgICAgICAgQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuVFlQRSkgewotICAgICAgICAgICAgcmV0dXJuICEoKElUeXBlKWphdmFFbGVtZW50KS5pc0ludGVyZmFjZSgpICYmIGFubm90YXRpb25EZWZpbml0aW9uLmlzSW50ZXJmYWNlT25seSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5NRVRIT0QpIHsKLSAgICAgICAgICAgIElUeXBlIHR5cGUgPSAoSVR5cGUpamF2YUVsZW1lbnQuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICByZXR1cm4gIXR5cGUuaXNJbnRlcmZhY2UoKSAgJiYgYW5ub3RhdGlvbkRlZmluaXRpb24uaXNJbnRlcmZhY2VPbmx5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkZJRUxEKSB7Ci0gICAgICAgICAgICBJVHlwZSB0eXBlID0gKElUeXBlKWphdmFFbGVtZW50LmdldFBhcmVudCgpOwotICAgICAgICAgICAgcmV0dXJuICF0eXBlLmlzSW50ZXJmYWNlKCkgJiYgYW5ub3RhdGlvbkRlZmluaXRpb24uaXNJbnRlcmZhY2VPbmx5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNFbnVtUmVzdHJpY3RlZChJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsCi0gICAgICAgICAgICBBbm5vdGF0aW9uRGVmaW5pdGlvbiBhbm5vdGF0aW9uRGVmaW5pdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5UWVBFKSB7Ci0gICAgICAgICAgICByZXR1cm4gISgoSVR5cGUpamF2YUVsZW1lbnQpLmlzRW51bSgpICYmIGFubm90YXRpb25EZWZpbml0aW9uLmlzRW51bU9ubHkoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuTUVUSE9EKSB7Ci0gICAgICAgICAgICBJVHlwZSB0eXBlID0gKElUeXBlKWphdmFFbGVtZW50LmdldFBhcmVudCgpOwotICAgICAgICAgICAgcmV0dXJuICF0eXBlLmlzRW51bSgpICYmIGFubm90YXRpb25EZWZpbml0aW9uLmlzRW51bU9ubHkoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuRklFTEQpIHsKLSAgICAgICAgICAgIElUeXBlIHR5cGUgPSAoSVR5cGUpamF2YUVsZW1lbnQuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICByZXR1cm4gIXR5cGUuaXNFbnVtKCkgJiYgYW5ub3RhdGlvbkRlZmluaXRpb24uaXNFbnVtT25seSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvL1RPRE8gTW92ZSB0aGUgRGVwcmVjYXRlZCBvcHRpb24gdG8gcHJlZmVyZW5jZXMKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRGVwcmVjYXRlZChBbm5vdGF0aW9uRGVmaW5pdGlvbiBhbm5vdGF0aW9uRGVmaW5pdGlvbikgewotICAgICAgICBDbGFzczw/PiBhbm5vdGF0aW9uQ2xhc3MgPSBhbm5vdGF0aW9uRGVmaW5pdGlvbi5nZXRBbm5vdGF0aW9uQ2xhc3MoKTsKLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25DbGFzcy5nZXRBbm5vdGF0aW9uKGphdmEubGFuZy5EZXByZWNhdGVkLmNsYXNzKSAhPSBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0YzVkMjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBpbml0aWFsaXplcnMgY29udHJpYnV0ZWQgdG8gdGhlCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uSW5pdGlhbGl6ZXI8L2NvZGU+IGV4dGVuc2lvbiBwb2ludC4KLSAqIDxwPgotICogUHJvdmlkZXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgZm9yIGFsbCBtZXRob2RzLgotICogPC9wPgotICogPHA+Ci0gKiA8c3Ryb25nPlByb3Zpc2lvbmFsIEFQSTo8L3N0cm9uZz4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZAotICogZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZQotICogdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbAotICogYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgaW1wbGVtZW50cyBJQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1JU1NJTkdfSURFTlRJRkVSID0gIiRtaXNzaW5nJCI7Ci0KLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyKCkgewotCi0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24uSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciNnZXRNZW1iZXJWYWx1ZVBhaXJzKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCwgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVCwgamF2YS5sYW5nLkNsYXNzKQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PE1lbWJlclZhbHVlUGFpcj4gZ2V0TWVtYmVyVmFsdWVQYWlycyhJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsIEFTVCBhc3QsCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYW5ub3RhdGlvbkNsYXNzKSB7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbi5JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyI2dldENvbXBsZXRpb25Qcm9wb3NhbHNGb3JNZW1iZXJWYWx1ZVBhaXIob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50LCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyKQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IGdldENvbXBsZXRpb25Qcm9wb3NhbHNGb3JNZW1iZXJWYWx1ZVBhaXIoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LAotICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpcikgewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24uSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciNnZXRDb21wbGV0aW9uUHJvcG9zYWxzRm9yU2luZ2xlTWVtYmVyQW5ub3RhdGlvbihvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IGdldENvbXBsZXRpb25Qcm9wb3NhbHNGb3JTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwKLSAgICAgICAgICAgIFNpbmdsZU1lbWJlckFubm90YXRpb24gc2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENvbXBsZXRpb25Qcm9wb3NhbCBjcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwoU3RyaW5nIHByb3Bvc2FsLCBFeHByZXNzaW9uIHZhbHVlKSB7Ci0gICAgICAgIEltYWdlIGltYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzLklNR19PQkpfRklMRSk7Ci0gICAgICAgIHJldHVybiBjcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwocHJvcG9zYWwsIHZhbHVlLCBpbWFnZSwgcHJvcG9zYWwpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBDb21wbGV0aW9uUHJvcG9zYWwgY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsKFN0cmluZyBwcm9wb3NhbCwgRXhwcmVzc2lvbiB2YWx1ZSwgSW1hZ2UgaW1hZ2UsCi0gICAgICAgICAgICBTdHJpbmcgZGlzcGxheVN0cmluZykgewotICAgICAgICBpbnQgcmVwbGFjZW1lbnRPZmZzZXQgPSB2YWx1ZS5nZXRTdGFydFBvc2l0aW9uKCk7Ci0gICAgICAgIGludCByZXBsYWNlbWVudExlbmd0aCA9IDA7Ci0gICAgICAgIGlmICh2YWx1ZS50b1N0cmluZygpLmVxdWFscyhNSVNTSU5HX0lERU5USUZFUikpIHsKLSAgICAgICAgICAgIGlmIChwcm9wb3NhbC5jaGFyQXQoMCkgIT0gJ1wiJykgewotICAgICAgICAgICAgICAgIHByb3Bvc2FsID0gIlwiIiArIHByb3Bvc2FsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHByb3Bvc2FsLmNoYXJBdChwcm9wb3NhbC5sZW5ndGgoKSAtIDEpICE9ICdcIicpIHsKLSAgICAgICAgICAgICAgICBwcm9wb3NhbCA9IHByb3Bvc2FsICsgIlwiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlcGxhY2VtZW50T2Zmc2V0ICs9IDE7Ci0gICAgICAgICAgICByZXBsYWNlbWVudExlbmd0aCA9IHZhbHVlLmdldExlbmd0aCgpIC0gMjsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgQ29tcGxldGlvblByb3Bvc2FsKHByb3Bvc2FsLCByZXBsYWNlbWVudE9mZnNldCwgcmVwbGFjZW1lbnRMZW5ndGgsIHByb3Bvc2FsLmxlbmd0aCgpLAotICAgICAgICAgICAgICAgIGltYWdlLCBkaXNwbGF5U3RyaW5nLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0RlZmF1bHRzQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9EZWZhdWx0c0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmI1YmFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0RlZmF1bHRzQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci0KLS8qKgotICogQ29uc3RydWN0cyB7QGxpbmsgTWVtYmVyVmFsdWVQYWlyfSBmcm9tIHRoZSBkZWZhdWx0cyBmb3VuZCBpbiB0aGUgZ2l2ZW4ge0BsaW5rIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb259LgotICogPHA+Ci0gKiA8c3Ryb25nPlByb3Zpc2lvbmFsIEFQSTo8L3N0cm9uZz4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyCi0gKiBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQKLSAqIHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMKLSAqIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRzQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyIGV4dGVuZHMgQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyIHsKLQotICAgIHB1YmxpYyBEZWZhdWx0c0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcigpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbGlzdCBvZiB7QGxpbmsgTWVtYmVyVmFsdWVQYWlyfSB1c2luZyB0aGUgZGVjbGFyZWQgbWV0aG9kIG5hbWVzIGFuZCBkZWZhdWx0IHZhbHVlcyBpbgotICAgICAqIHRoZSBnaXZlbiB7QGxpbmsgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbn0uCi0gICAgICogIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24uSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciNnZXRNZW1iZXJWYWx1ZVBhaXJzKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCwgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVCwgamF2YS5sYW5nLkNsYXNzKQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PE1lbWJlclZhbHVlUGFpcj4gZ2V0TWVtYmVyVmFsdWVQYWlycyhJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsIEFTVCBhc3QsCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYW5ub3RhdGlvbkNsYXNzKSB7Ci0gICAgICAgIHJldHVybiBnZXRNZW1iZXJWYWx1ZVBhaXJzKGFzdCwgYW5ub3RhdGlvbkNsYXNzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBnZXRNZW1iZXJWYWx1ZVBhaXJzKEFTVCBhc3QsCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYW5ub3RhdGlvbkNsYXNzKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgTWV0aG9kW10gZGVjbGFyZWRNZXRob2RzID0gYW5ub3RhdGlvbkNsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpOwotICAgICAgICBmb3IgKE1ldGhvZCBtZXRob2QgOiBkZWNsYXJlZE1ldGhvZHMpIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbWV0aG9kLmdldE5hbWUoKTsKLSAgICAgICAgICAgIENsYXNzPD8+IHJldHVyblR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotICAgICAgICAgICAgT2JqZWN0IGRlZmF1bHRWYWx1ZSA9IG1ldGhvZC5nZXREZWZhdWx0VmFsdWUoKTsKLQotICAgICAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuZXF1YWxzKFN0cmluZy5jbGFzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgZGVmYXVsdFZhbHVlLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoQm9vbGVhbi5UWVBFKSkgewotICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChBbm5vdGF0aW9uc0NvcmUuY3JlYXRlQm9vbGVhbk1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgQm9vbGVhbi5wYXJzZUJvb2xlYW4oZGVmYXVsdFZhbHVlLnRvU3RyaW5nKCkpKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuaXNQcmltaXRpdmUoKSAmJiAocmV0dXJuVHlwZS5lcXVhbHMoQnl0ZS5UWVBFKSB8fCByZXR1cm5UeXBlLmVxdWFscyhTaG9ydC5UWVBFKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgcmV0dXJuVHlwZS5lcXVhbHMoSW50ZWdlci5UWVBFKSB8fCByZXR1cm5UeXBlLmVxdWFscyhMb25nLlRZUEUpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCByZXR1cm5UeXBlLmVxdWFscyhGbG9hdC5UWVBFKSB8fCByZXR1cm5UeXBlLmVxdWFscyhEb3VibGUuVFlQRSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKEFubm90YXRpb25zQ29yZS5jcmVhdGVOdW1iZXJNZW1iZXJWYWx1ZVBhaXIoYXN0LCBuYW1lLCBkZWZhdWx0VmFsdWUudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChBbm5vdGF0aW9uc0NvcmUuY3JlYXRlQXJyYXlNZW1iZXJWYWx1ZVBhaXIoYXN0LCBtZXRob2QuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPYmplY3RbXSkgZGVmYXVsdFZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuaXNFbnVtKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSwgbmFtZSwgZGVmYXVsdFZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuZXF1YWxzKENsYXNzLmNsYXNzKSkgewotICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChBbm5vdGF0aW9uc0NvcmUuY3JlYXRlVHlwZU1lbWJlclZhbHVlUGFpcihhc3QsIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtZW1iZXJWYWx1ZVBhaXJzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0lBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0lBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FiZWYyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci0KLS8qKgotICogQmFzZSBpbnRlcmZhY2UgZm9yIGFubm90YXRpb24gYXR0cmlidXRlIGluaXRpYWxpemVycy4KLSAqIDxwPgotICogPHN0cm9uZz5Qcm92aXNpb25hbCBBUEk6PC9zdHJvbmc+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlcgotICogZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0Ci0gKiB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzCi0gKiB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiBAbm9leHRlbmQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGV4dGVuZGVkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB7QGxpbmsgTWVtYmVyVmFsdWVQYWlyfSB0aGF0IG1heSBiZSBhZGRlZCB0byBhIHtAbGluayBOb3JtYWxBbm5vdGF0aW9ufS4KLSAgICAgKiBAcGFyYW0gamF2YUVsZW1lbnQgdGhlIGphdmEgZWxlbWVudCBvbiB3aGljaCB0aGUgYW5ub3RhdGlvbiBpcyBkZWNsYXJlZC4KLSAgICAgKiBAcGFyYW0gYXN0IHRoZSA8Y29kZT5BU1Q8L2NvZGU+IHdpdGggd2hpY2ggdG8gY3JlYXRlIHRoZSBtZW1iZXIgdmFsdWUgcGFpcnMuCi0gICAgICogQHBhcmFtIGFubm90YXRpb25DbGFzcyB0aGUge0BsaW5rIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb259IGNsYXNzIHdoaWNoIG1heSBiZQotICAgICAqIHVzZWQgdG8gcXVlcnkgdGhlIGRlY2xhcmVkIG1lbWJlcnMgb2YgdGhlIGFubm90YXRpb24gdHlwZSBhbmQgdGhlIG1lbWJlcnMgZGVmYXVsdCB2YWx1ZXMuCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgbWVtYmVyIHZhbHVlIHBhaXJzLgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PE1lbWJlclZhbHVlUGFpcj4gZ2V0TWVtYmVyVmFsdWVQYWlycyhJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsIEFTVCBhc3QsCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbj4gYW5ub3RhdGlvbkNsYXNzKTsKLQotICAgIC8qKgotICAgICAqIFVzZWQgdG8gcHJvdmlkZSBhIGxpc3Qgb2Yge0BsaW5rIElDb21wbGV0aW9uUHJvcG9zYWx9IGZvciBhIHtAbGluayBNZW1iZXJWYWx1ZVBhaXJ9IHZhbHVlLgotICAgICAqIEBwYXJhbSBqYXZhRWxlbWVudCB0aGUgamF2YSBlbGVtZW50IG9uIHdoaWNoIHRoZSBhbm5vdGF0aW9uIGlzIGRlY2xhcmVkLgotICAgICAqIEBwYXJhbSBtZW1iZXJWYWx1ZVBhaXIgdGhlIG1lbWJlciB2YWx1ZSBwYWlyIGluIHdoaWNoIGNvbnRlbnQgYXNzaXN0IHdhcyBpbnZva2VkLgotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGNvbXBsZXRpb24gcHJvcG9zYWxzLgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IGdldENvbXBsZXRpb25Qcm9wb3NhbHNGb3JNZW1iZXJWYWx1ZVBhaXIoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LAotICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpcik7Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIHRvIHByb3ZpZGUgYSBsaXN0IG9mIHtAbGluayBJQ29tcGxldGlvblByb3Bvc2FsfSBmb3IgYSB7QGxpbmsgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbn0gdmFsdWUuCi0gICAgICogQHBhcmFtIGphdmFFbGVtZW50IHRoZSBqYXZhIGVsZW1lbnQgb24gd2hpY2ggdGhlIGFubm90YXRpb24gaXMgZGVjbGFyZWQuCi0gICAgICogQHBhcmFtIHNpbmdsZU1lbWJlckFubm90YXRpb24gdGhlIHNpbmdsZSBtZW1iZXIgYW5ub3RhdGlvbiBpbiB3aGljaCBjb250ZW50IGFzc2lzdCB3YXMgaW52b2tlZC4KLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBjb21wbGV0aW9uIHByb3Bvc2Fscy4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBnZXRDb21wbGV0aW9uUHJvcG9zYWxzRm9yU2luZ2xlTWVtYmVyQW5ub3RhdGlvbihJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsCi0gICAgICAgICAgICBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIHNpbmdsZU1lbWJlckFubm90YXRpb24pOwotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE1NDc5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3NvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZS51dGlsLkVjbGlwc2VNZXNzYWdlcjsKLQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmFwdC5Bbm5vdGF0aW9uUHJvY2Vzc29yOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmFwdC5Bbm5vdGF0aW9uUHJvY2Vzc29yRW52aXJvbm1lbnQ7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IudXRpbC5Tb3VyY2VQb3NpdGlvbjsKLQotLyoqCi0gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBwcm9jZXNzb3JzIGNvbnRyaWJ1dGVkIHRvIHRoZQotICogPGNvZGU+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvblByb2Nlc3NvcjwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LgotICoKLSAqIDxwPgotICogPHN0cm9uZz5Qcm92aXNpb25hbCBBUEk6PC9zdHJvbmc+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlcgotICogZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0Ci0gKiB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzCi0gKiB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIGltcGxlbWVudHMgQW5ub3RhdGlvblByb2Nlc3NvciB7Ci0KLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50IGVudmlyb25tZW50OwotCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcigpIHsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUge0BsaW5rIEFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudH0gZW52aXJvbm1lbnQgdG8gdXNlIGR1cmluZyBwcm9jZXNzaW5nLgotICAgICAqIEBwYXJhbSBlbnZpcm9ubWVudCB0aGUgYW5ub3RhdGlvbiBwcm9jZXNzb3IgZW52aXJvbm1lbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50KEFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewotICAgICAgICB0aGlzLmVudmlyb25tZW50ID0gZW52aXJvbm1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2VzcyBhbGwgcHJvZ3JhbSBlbGVtZW50cyBzdXBwb3J0ZWQgYnkgdGhpcyBhbm5vdGF0aW9uIHByb2Nlc3Nvci4KLSAgICAgKiAKLSAgICAgKiBAc2VlIGNvbS5zdW4ubWlycm9yLmFwdC5Bbm5vdGF0aW9uUHJvY2Vzc29yCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgcHJvY2VzcygpOwotCi0gICAgLyoqCi0gICAgICogUHJpbnRzIGFuIGVycm9yIG1lc3NhZ2UuCi0gICAgICogQHBhcmFtIHBvc2l0aW9uIHRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgZXJyb3Igb2NjdXJlZCwgb3IgbnVsbCBpZiBpdCBpcyB1bmtub3duIG9yIG5vdCBhcHBsaWNhYmxlCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UsIG9yIGFuIGVtcHR5IHN0cmluZyBpZiBub25lCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRFcnJvcihTb3VyY2VQb3NpdGlvbiBwb3NpdGlvbiwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgZW52aXJvbm1lbnQuZ2V0TWVzc2FnZXIoKS5wcmludEVycm9yKHBvc2l0aW9uLCBtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludHMgYW4gZXJyb3IgbWVzc2FnZS4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIG5vbmUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludEVycm9yKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIGVudmlyb25tZW50LmdldE1lc3NhZ2VyKCkucHJpbnRFcnJvcihtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludHMgYSB3YXJuaW5nIG1lc3NhZ2UuCi0gICAgICogQHBhcmFtIHBvc2l0aW9uIHRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgd2FybmluZyBvY2N1cmVkLCBvciBudWxsIGlmIGl0IGlzIHVua25vd24gb3Igbm90IGFwcGxpY2FibGUKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIG5vbmUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludFdhcm5pbmcoU291cmNlUG9zaXRpb24gcG9zaXRpb24sIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIGVudmlyb25tZW50LmdldE1lc3NhZ2VyKCkucHJpbnRXYXJuaW5nKHBvc2l0aW9uLCBtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludHMgYSB3YXJuaW5nIG1lc3NhZ2UuCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UsIG9yIGFuIGVtcHR5IHN0cmluZyBpZiBub25lCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRXYXJuaW5nKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIGVudmlyb25tZW50LmdldE1lc3NhZ2VyKCkucHJpbnRXYXJuaW5nKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50cyBhIG5vdGljZS4KLSAgICAgKiBAcGFyYW0gcG9zaXRpb24gdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBub3RpY2Ugb2NjdXJlZCwgb3IgbnVsbCBpZiBpdCBpcyB1bmtub3duIG9yIG5vdCBhcHBsaWNhYmxlCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UsIG9yIGFuIGVtcHR5IHN0cmluZyBpZiBub25lCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJpbnROb3RpY2UoU291cmNlUG9zaXRpb24gcG9zaXRpb24sIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIGVudmlyb25tZW50LmdldE1lc3NhZ2VyKCkucHJpbnROb3RpY2UocG9zaXRpb24sIG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50cyBhIG5vdGljZS4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIG5vbmUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludE5vdGljZShTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBlbnZpcm9ubWVudC5nZXRNZXNzYWdlcigpLnByaW50Tm90aWNlKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50IGFuIGVycm9yIGluY2x1ZGluZyB0aGUgZ2l2ZW4gYXJndW1lbnRzIGZvciB1c2UgaW4gcXVpY2stZml4ZXMuCi0gICAgICogQHBhcmFtIHBvc2l0aW9uIHBvc2l0aW9uIG9mIHRoZSBlcnJvcgotICAgICAqIEBwYXJhbSBtZXNzYWdlIG1lc3NhZ2UgdG8gZGlzcGxheSB0byB0aGUgdXNlcgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByaW50Rml4YWJsZUVycm9yKFNvdXJjZVBvc2l0aW9uIHBvc2l0aW9uLCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBpZiAoZW52aXJvbm1lbnQuZ2V0TWVzc2FnZXIoKSBpbnN0YW5jZW9mIEVjbGlwc2VNZXNzYWdlcikgewotICAgICAgICAgICAgRWNsaXBzZU1lc3NhZ2VyIG1lc3NhZ2VyID0gKEVjbGlwc2VNZXNzYWdlcikgZW52aXJvbm1lbnQuZ2V0TWVzc2FnZXIoKTsKLSAgICAgICAgICAgIG1lc3NhZ2VyLnByaW50Rml4YWJsZUVycm9yKHBvc2l0aW9uLCBtZXNzYWdlLCAiIiwgbWVzc2FnZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwcmludEVycm9yKHBvc2l0aW9uLCBtZXNzYWdlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50IGFuIGVycm9yIGluY2x1ZGluZyB0aGUgZ2l2ZW4gYXJndW1lbnRzIGZvciB1c2UgaW4gcXVpY2stZml4ZXMuCi0gICAgICogQHBhcmFtIHBvc2l0aW9uIHBvc2l0aW9uIG9mIHRoZSBlcnJvcgotICAgICAqIEBwYXJhbSBtZXNzYWdlIG1lc3NhZ2UgdG8gZGlzcGxheSB0byB0aGUgdXNlcgotICAgICAqIEBwYXJhbSBwbHVnaW5JZCBwbHVnLWluIHdoaWNoIHdpbGwgcHJvdmlkZSBhIGphdmEgcXVpY2sgZml4IHByb2Nlc3NvciBmb3IgdGhpcyBlcnJvci4gQ2Fubm90IGJlIG51bGwuCi0gICAgICogQHBhcmFtIGVycm9ySWQgYSBwbHVnLWluIHByb3ZpZGVkIGVycm9yIGNvZGUgd2hpY2ggd2lsbCBiZSBtZWFuaW5nZnVsIHRvIHRoZSBqYXZhIHF1aWNrIGZpeCBwcm9jZXNzb3IuIENhbm5vdCBiZSBudWxsLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByaW50Rml4YWJsZUVycm9yKFNvdXJjZVBvc2l0aW9uIHBvc2l0aW9uLCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgZXJyb3JJZCkgewotICAgICAgICBpZiAoZW52aXJvbm1lbnQuZ2V0TWVzc2FnZXIoKSBpbnN0YW5jZW9mIEVjbGlwc2VNZXNzYWdlcikgewotICAgICAgICAgICAgRWNsaXBzZU1lc3NhZ2VyIG1lc3NhZ2VyID0gKEVjbGlwc2VNZXNzYWdlcikgZW52aXJvbm1lbnQuZ2V0TWVzc2FnZXIoKTsKLSAgICAgICAgICAgIG1lc3NhZ2VyLnByaW50Rml4YWJsZUVycm9yKHBvc2l0aW9uLCBtZXNzYWdlLCBwbHVnaW5JZCwgZXJyb3JJZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwcmludEVycm9yKHBvc2l0aW9uLCBtZXNzYWdlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50IGFuIGVycm9yIGluY2x1ZGluZyB0aGUgZ2l2ZW4gYXJndW1lbnRzIGZvciB1c2UgaW4gcXVpY2stZml4ZXMuCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgbWVzc2FnZSB0byBkaXNwbGF5IHRvIHRoZSB1c2VyCi0gICAgICogQHBhcmFtIHBsdWdpbklkIHBsdWctaW4gd2hpY2ggd2lsbCBwcm92aWRlIGEgamF2YSBxdWljayBmaXggcHJvY2Vzc29yIGZvciB0aGlzIGVycm9yLiBDYW5ub3QgYmUgbnVsbC4KLSAgICAgKiBAcGFyYW0gZXJyb3JJZCBhIHBsdWctaW4gcHJvdmlkZWQgZXJyb3IgY29kZSB3aGljaCB3aWxsIGJlIG1lYW5pbmdmdWwgdG8gdGhlIGphdmEgcXVpY2sgZml4IHByb2Nlc3Nvci4gQ2Fubm90IGJlIG51bGwuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRGaXhhYmxlRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBwbHVnaW5JZCwgU3RyaW5nIGVycm9ySWQpIHsKLSAgICAgICAgaWYgKGVudmlyb25tZW50LmdldE1lc3NhZ2VyKCkgaW5zdGFuY2VvZiBFY2xpcHNlTWVzc2FnZXIpIHsKLSAgICAgICAgICAgIEVjbGlwc2VNZXNzYWdlciBtZXNzYWdlciA9IChFY2xpcHNlTWVzc2FnZXIpIGVudmlyb25tZW50LmdldE1lc3NhZ2VyKCk7Ci0gICAgICAgICAgICBtZXNzYWdlci5wcmludEZpeGFibGVFcnJvcihtZXNzYWdlLCBwbHVnaW5JZCwgZXJyb3JJZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwcmludEVycm9yKG1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgYSB3YXJuaW5nIGluY2x1ZGluZyB0aGUgZ2l2ZW4gYXJndW1lbnRzIGZvciB1c2UgaW4gcXVpY2stZml4ZXMuCi0gICAgICogQHBhcmFtIHBvc2l0aW9uIHBvc2l0aW9uIG9mIHRoZSB3YXJuaW5nCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgbWVzc2FnZSB0byBkaXNwbGF5IHRvIHRoZSB1c2VyCi0gICAgICogQHBhcmFtIHBsdWdpbklkIHBsdWctaW4gd2hpY2ggd2lsbCBwcm92aWRlIGEgamF2YSBxdWljayBmaXggcHJvY2Vzc29yIGZvciB0aGlzIGVycm9yLiBDYW5ub3QgYmUgbnVsbC4KLSAgICAgKiBAcGFyYW0gZXJyb3JJZCBhIHBsdWctaW4gcHJvdmlkZWQgZXJyb3IgY29kZSB3aGljaCB3aWxsIGJlIG1lYW5pbmdmdWwgdG8gdGhlIGphdmEgcXVpY2sgZml4IHByb2Nlc3Nvci4gQ2Fubm90IGJlIG51bGwuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRGaXhhYmxlV2FybmluZyhTb3VyY2VQb3NpdGlvbiBwb3NpdGlvbiwgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBwbHVnaW5JZCwgU3RyaW5nIGVycm9ySWQpIHsKLSAgICAgICAgaWYgKGVudmlyb25tZW50LmdldE1lc3NhZ2VyKCkgaW5zdGFuY2VvZiBFY2xpcHNlTWVzc2FnZXIpIHsKLSAgICAgICAgICAgIEVjbGlwc2VNZXNzYWdlciBtZXNzYWdlciA9IChFY2xpcHNlTWVzc2FnZXIpIGVudmlyb25tZW50LmdldE1lc3NhZ2VyKCk7Ci0gICAgICAgICAgICBtZXNzYWdlci5wcmludEZpeGFibGVXYXJuaW5nKHBvc2l0aW9uLCBtZXNzYWdlLCBwbHVnaW5JZCwgZXJyb3JJZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwcmludFdhcm5pbmcocG9zaXRpb24sIG1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgYSB3YXJuaW5nIGluY2x1ZGluZyB0aGUgZ2l2ZW4gYXJndW1lbnRzIGZvciB1c2UgaW4gcXVpY2stZml4ZXMuCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgbWVzc2FnZSB0byBkaXNwbGF5IHRvIHRoZSB1c2VyCi0gICAgICogQHBhcmFtIHBsdWdpbklkIHBsdWctaW4gd2hpY2ggd2lsbCBwcm92aWRlIGEgamF2YSBxdWljayBmaXggcHJvY2Vzc29yIGZvciB0aGlzIGVycm9yLiBDYW5ub3QgYmUgbnVsbC4KLSAgICAgKiBAcGFyYW0gZXJyb3JJZCBhIHBsdWctaW4gcHJvdmlkZWQgZXJyb3IgY29kZSB3aGljaCB3aWxsIGJlIG1lYW5pbmdmdWwgdG8gdGhlIGphdmEgcXVpY2sgZml4IHByb2Nlc3Nvci4gQ2Fubm90IGJlIG51bGwuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRGaXhhYmxlV2FybmluZyhTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgZXJyb3JJZCkgewotICAgICAgICBpZiAoZW52aXJvbm1lbnQuZ2V0TWVzc2FnZXIoKSBpbnN0YW5jZW9mIEVjbGlwc2VNZXNzYWdlcikgewotICAgICAgICAgICAgRWNsaXBzZU1lc3NhZ2VyIG1lc3NhZ2VyID0gKEVjbGlwc2VNZXNzYWdlcikgZW52aXJvbm1lbnQuZ2V0TWVzc2FnZXIoKTsKLSAgICAgICAgICAgIG1lc3NhZ2VyLnByaW50Rml4YWJsZVdhcm5pbmcobWVzc2FnZSwgcGx1Z2luSWQsIGVycm9ySWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJpbnRXYXJuaW5nKG1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgYSBub3RpY2UgaW5jbHVkaW5nIHRoZSBnaXZlbiBhcmd1bWVudHMgZm9yIHVzZSBpbiBxdWljay1maXhlcy4KLSAgICAgKiBAcGFyYW0gcG9zaXRpb24gcG9zaXRpb24gb2YgdGhlIG5vdGljZQotICAgICAqIEBwYXJhbSBtZXNzYWdlIG1lc3NhZ2UgdG8gZGlzcGxheSB0byB0aGUgdXNlcgotICAgICAqIEBwYXJhbSBwbHVnaW5JZCBwbHVnLWluIHdoaWNoIHdpbGwgcHJvdmlkZSBhIGphdmEgcXVpY2sgZml4IHByb2Nlc3NvciBmb3IgdGhpcyBlcnJvci4gQ2Fubm90IGJlIG51bGwuCi0gICAgICogQHBhcmFtIGVycm9ySWQgYSBwbHVnLWluIHByb3ZpZGVkIGVycm9yIGNvZGUgd2hpY2ggd2lsbCBiZSBtZWFuaW5nZnVsIHRvIHRoZSBqYXZhIHF1aWNrIGZpeCBwcm9jZXNzb3IuIENhbm5vdCBiZSBudWxsLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByaW50Rml4YWJsZU5vdGljZShTb3VyY2VQb3NpdGlvbiBwb3NpdGlvbiwgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBwbHVnaW5JZCwgU3RyaW5nIGVycm9ySWQpIHsKLSAgICAgICAgaWYgKGVudmlyb25tZW50LmdldE1lc3NhZ2VyKCkgaW5zdGFuY2VvZiBFY2xpcHNlTWVzc2FnZXIpIHsKLSAgICAgICAgICAgIEVjbGlwc2VNZXNzYWdlciBtZXNzYWdlciA9IChFY2xpcHNlTWVzc2FnZXIpIGVudmlyb25tZW50LmdldE1lc3NhZ2VyKCk7Ci0gICAgICAgICAgICBtZXNzYWdlci5wcmludEZpeGFibGVOb3RpY2UocG9zaXRpb24sIG1lc3NhZ2UsIHBsdWdpbklkLCBlcnJvcklkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHByaW50Tm90aWNlKHBvc2l0aW9uLCBtZXNzYWdlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50IGEgbm90aWNlIGluY2x1ZGluZyB0aGUgZ2l2ZW4gYXJndW1lbnRzIGZvciB1c2UgaW4gcXVpY2stZml4ZXMuCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgbWVzc2FnZSB0byBkaXNwbGF5IHRvIHRoZSB1c2VyCi0gICAgICogQHBhcmFtIHBsdWdpbklkIHBsdWctaW4gd2hpY2ggd2lsbCBwcm92aWRlIGEgamF2YSBxdWljayBmaXggcHJvY2Vzc29yIGZvciB0aGlzIGVycm9yLiBDYW5ub3QgYmUgbnVsbC4KLSAgICAgKiBAcGFyYW0gZXJyb3JJZCBhIHBsdWctaW4gcHJvdmlkZWQgZXJyb3IgY29kZSB3aGljaCB3aWxsIGJlIG1lYW5pbmdmdWwgdG8gdGhlIGphdmEgcXVpY2sgZml4IHByb2Nlc3Nvci4gQ2Fubm90IGJlIG51bGwuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRGaXhhYmxlTm90aWNlKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgcGx1Z2luSWQsIFN0cmluZyBlcnJvcklkKSB7Ci0gICAgICAgIGlmIChlbnZpcm9ubWVudC5nZXRNZXNzYWdlcigpIGluc3RhbmNlb2YgRWNsaXBzZU1lc3NhZ2VyKSB7Ci0gICAgICAgICAgICBFY2xpcHNlTWVzc2FnZXIgbWVzc2FnZXIgPSAoRWNsaXBzZU1lc3NhZ2VyKSBlbnZpcm9ubWVudC5nZXRNZXNzYWdlcigpOwotICAgICAgICAgICAgbWVzc2FnZXIucHJpbnRGaXhhYmxlTm90aWNlKG1lc3NhZ2UsIHBsdWdpbklkLCBlcnJvcklkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHByaW50Tm90aWNlKG1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODEwMzNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQywgU2hhbmUgQ2xhcmtlCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgU2hhbmUgQ2xhcmtlIC0gUmV3cm90ZSBBUEkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlsczsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUxvY2FsVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQWJzdHJhY3RUeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb25UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJvZHlEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQm9vbGVhbkxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FbnVtRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkZpZWxkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklFeHRlbmRlZE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5QYWNrYWdlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN0cmluZ0xpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5yZXdyaXRlLkFTVFJld3JpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLnJld3JpdGUuSW1wb3J0UmV3cml0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20ucmV3cml0ZS5MaXN0UmV3cml0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuQ29kZVN0eWxlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuU2hhcmVkQVNUUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuSVVuZG9NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5UZXh0RmlsZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKLQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25NaXJyb3I7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblZhbHVlOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlBhcmFtZXRlckRlY2xhcmF0aW9uOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIGFkZGluZywgcmVtb3ZpbmcgYW5kIHVwZGF0aW5nIGFubm90YXRpb25zIGFuZCBtZW1iZXIgdmFsdWUgcGFpcnMuCi0gKiA8cD4KLSAqIDxzdHJvbmc+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+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4OTRmOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jRnJpIE5vdiAwNyAyMzo1ODo1MiBFU1QgMjAwOAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDE3MGYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5DWEZDb25zdW1wdGlvbkNvcmVQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmRzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkiCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LndzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjMwNCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMS4zLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmU7YnVuZGxlLXZlcnNpb249IjAuNC4zIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gamF2YXgud3NkbDtidW5kbGUtdmVyc2lvbj0iWzEuNi4yLDEuNy4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4zLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDEuMS4wKSIKLUFudC1WZXJzaW9uOiBBcGFjaGUgQW50IDEuNy4wCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUNyZWF0ZWQtQnk6IDEuNS4wXzE0LWIwMyAoU3VuIE1pY3Jvc3lzdGVtcyBJbmMuKQotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDE2OWJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+U2VwdGVtYmVyIDEyLCAyMDA4PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvYW50L2N4Zl9idWphdmEucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2FudC9jeGZfYnVqYXZhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NjY0YTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvYW50L2N4Zl9idWphdmEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIFNoYW5lIENsYXJrZSAtIEFwYWNoZSBDWEYgc3VwcG9ydAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIS0tIFNjZW5hcmlvVHlwZSBSRVFVSVJFRC4gRGlmZmVyZW50aWF0ZXMgZnJvbSAiY2xpZW50IiBzY2VuYXJpby4KLVNjZW5hcmlvVHlwZT1zZXJ2aWNlCi0KLSEtLSBJbml0aWFsU2VsZWN0aW9uIFJFUVVJUkVELiAgV29ya3NwYWNlIHJlbGF0aXZlIFVSSSB0byB0aGUgaW5wdXQgV1NETCBvciBKYXZhCi1Jbml0aWFsU2VsZWN0aW9uPS9keW5hbWljV2ViUHJvamVjdE5hbWUvc3JjL3BhY2thZ2VuYW1lL215U2VydmljZS5qYXZhCi0KLSEtLVV0aWxpdHkgcHJvcGVydHkgdmFsdWVzIC0gdXNlIHRoZXNlIHRvIGxpc3QgdmFsaWQgdmFsdWVzIGZvciB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6Ci0hLS0gU2VydmljZS5SdW50aW1lSWQsIFNlcnZpY2UuU2VydmVySWQgCi1MaXN0UnVudGltZXM9dHJ1ZQotTGlzdFNlcnZlcnM9dHJ1ZQotIS0tIFZlcmJvc2Ugd2lsbCBsaXN0IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMgYXMgd2VsbCBhcyBlcnJvcnMgaWYgc2V0IHRvIHRydWUKLVZlcmJvc2U9dHJ1ZQotCi0hLS0gIFNlcnZpY2UuUnVudGltZUlkIC0gSUQgb2Ygd2ViIHNlcnZpY2UgcnVudGltZSAKLVNlcnZpY2UuUnVudGltZUlkPW9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3hmV2ViU2VydmljZVJUCi0hLS0gU2VydmljZS5TZXJ2ZXJJZCAtICBJRCBvZiB0YXJnZXQgc2VydmVyIAotU2VydmljZS5TZXJ2ZXJJZD1vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC42MAotIS0tIFNlcnZpY2UuVHlwZUlkIC0gSmF2YSBCZWFuIGlzIGRlZmF1bHQgZm9yIGJvdGggVG9wIERvd24gYW5kIEJvdHRvbSBVcAotIS0tIFNlcnZpY2UuVHlwZUlkPUphdmEgQmVhbgotCi0hLS0gU2VydmljZVByb2plY3ROYW1lIC0gIS0tdHlwZTpTdHJpbmcgLSBuYW1lIG9mIFNlcnZpY2UgcHJvamVjdCAtIHRoaXMgcHJvcGVydHkgY2FuIGJlIHVzZWQgdG8gZ2l2ZSB0aGUgc2VydmljZSBwcm9qZWN0IGEgZGlmZmVyZW50IG5hbWUgdGhhbiB0aGUgcHJvamVjdCBjb250YWluaW5nIHRoZSBpbml0aWFsIHNlbGVjdGlvbi4gIHR5cGU6IFN0cmluZyAgICAKLSEtLVNlcnZpY2VQcm9qZWN0TmFtZT1zZXJ2aWNlUHJvamVjdE5hbWUKLSEtLSBTZXJ2aWNlRWFyUHJvamVjdE5hbWUgLSAhLS10eXBlOlN0cmluZyAtIG5hbWUgb2YgU2VydmljZSBFQVIgcHJvamVjdCAtIHRoaXMgcHJvcGVydHkgY2FuIGJlIHVzZWQgdG8gZ2l2ZSB0aGUgc2VydmljZSBFQVIgcHJvamVjdCBhIGRpZmZlcmVudCBuYW1lIHRoYW4gdGhlIEVBUiBwcm9qZWN0IGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXJ2aWNlIHByb2plY3QuICB0eXBlOiBTdHJpbmcKLSEtLVNlcnZpY2VFYXJQcm9qZWN0TmFtZT1zZXJ2aWNlRWFyUHJvamVjdE5hbWUKLQotIS0tIEdlbmVyYXRlIGEgY2xpZW50IG1haW5saW5lIHVzaW5nIEpBWC1XUyBBUElzCi0hLS1HZW5DbGllbnQ9ZmFsc2UKLSEtLSBHZW5lcmF0ZSBhIHNlcnZlciBtYWlubGluZSB1c2luZyBKQVgtV1MgQVBJcwotIS0tR2VuU2VydmVyPWZhbHNlCi0hLS0gU3BlY2lmeSB0byBnZW5lcmF0ZSB0aGUgd3JhcHBlciBhbmQgZmF1bHQgYmVhbnMKLSEtLUdlbldyYXBwZXJGYXVsdEJlYW5zPXRydWUKLSEtLSBTcGVjaWZ5IHRvIGdlbmVyYXRlIHRoZSBXU0RMIGZpbGUKLSEtLUdlbldTREw9dHJ1ZQotIS0tIE91dHB1dCBzY2hlbWFzIHRvIHNlcGFyYXRlIGZpbGVzIGFuZCB1c2UgaW1wb3J0cyB0byBsb2FkIHRoZW0gaW5zdGVhZCBvZiBpbmxpbmluZyB0aGVtIGludG8gdGhlIHdzZGwKLSEtLUdlblhTREltcG9ydHM9dHJ1ZQotIS0tU3BlY2lmaWVzIHRoYXQgdGhlIGdlbmVyYXRlZCBXU0RMIGlzIHRvIGluY2x1ZGUgYSBTT0FQIDEuMiBiaW5kaW5nCi0hLS1Vc2VTT0FQMTJCaW5kaW5nPWZhbHNlCi0hLS1TZXQgdGhlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCBXU0RMIGZpbGUKLSEtLVdzZGxGaWxlTmFtZT1teVdTRExGaWxlTmFtZS53c2RsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9hbnQvY3hmX2J1amF2YS54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9hbnQvY3hmX2J1amF2YS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNWY4YjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvYW50L2N4Zl9idWphdmEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IGRlZmF1bHQ9Im1haW4iIGJhc2VkaXI9Ii4iPgotCi08ZWNobyBtZXNzYWdlPSJwdWxsaW5nIGluIHByb3BlcnR5IGZpbGVzIi8+Ci08cHJvcGVydHkgZmlsZT0iY3hmX2J1amF2YS5wcm9wZXJ0aWVzIi8+Ci0JCi08ZWNobyBtZXNzYWdlPSJjYWxsaW5nIHRoZSB3ZWIgc2VydmljZXMgZ2VuZXJhdGlvbiBhbnQgdGFzazogY3hmX2J1amF2YSIvPgotIDx0YXJnZXQgbmFtZT0ibWFpbiIgPgotICAJIDx3c2dlbi8+Ci0gIDwvdGFyZ2V0PgotICAKLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2FudC9jeGZfY2xpZW50LnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9hbnQvY3hmX2NsaWVudC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDI5MmNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2FudC9jeGZfY2xpZW50LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBTaGFuZSBDbGFya2UgLSBBcGFjaGUgQ1hGIHN1cHBvcnQKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSEtLVNjZW5hcmlvVHlwZSBSRVFVSVJFRC4gRGlmZmVyZW50aWF0ZXMgZnJvbSAic2VydmljZSIgc2NlbmFyaW8uCi1TY2VuYXJpb1R5cGU9Y2xpZW50Ci0KLSEtLUluaXRpYWxTZWxlY3Rpb24gUkVRVUlSRUQuICBXb3Jrc3BhY2UgcmVsYXRpdmUgVVJJIHRvIHRoZSBpbnB1dCBXU0RMIG9yIEphdmEuCi1Jbml0aWFsU2VsZWN0aW9uPS9keW5hbWljV2ViUHJvamVjdE5hbWUvV2ViQ29udGVudC93c2RsL215U2VydmljZS53c2RsCi0KLSEtLVV0aWxpdHkgcHJvcGVydHkgdmFsdWVzIC0gdXNlIHRoZXNlIHRvIGxpc3QgdmFsdWVzIGZvciB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6Ci0hLS0gQ2xpZW50LlJ1bnRpbWVJZCwgQ2xpZW50LlNlcnZlcklkIAotTGlzdFJ1bnRpbWVzPXRydWUKLUxpc3RTZXJ2ZXJzPXRydWUKLSEtLSBWZXJib3NlIHdpbGwgbGlzdCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzIGFzIHdlbGwgYXMgZXJyb3JzIGlmIHNldCB0byB0cnVlCi1WZXJib3NlPXRydWUKLSAKLSEtLUNsaWVudC5SdW50aW1lSWQgLSBJRCBvZiB3ZWIgc2VydmljZSBydW50aW1lIAotQ2xpZW50LlJ1bnRpbWVJZD1vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmN4ZldlYlNlcnZpY2VSVAotIS0tQ2xpZW50LlNlcnZlcklkIC0gSUQgb2YgdGFyZ2V0IHNlcnZlciAKLUNsaWVudC5TZXJ2ZXJJZD1vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC42MAotCi0hLS1DbGllbnRQcm9qZWN0TmFtZSAtIG5hbWUgb2YgQ2xpZW50IHByb2plY3QgLSB0aGlzIHByb3BlcnR5IGNhbiBiZSB1c2VkIHRvIGdpdmUgdGhlIGNsaWVudCBwcm9qZWN0IGEgCi0hLS0gZGlmZmVyZW50IG5hbWUgdGhhbiB0aGUgcHJvamVjdCBjb250YWluaW5nIHRoZSBpbml0aWFsIHNlbGVjdGlvbgotIS0tQ2xpZW50UHJvamVjdE5hbWU9Y2xpZW50UHJvamVjdE5hbWUKLQotIS0tQ2xpZW50RWFyUHJvamVjdE5hbWUtIG5hbWUgb2YgQ2xpZW50IEVBUiBwcm9qZWN0IC0gc2V0IG9ubHkgaWYgYXBwbGljYWJsZSBmb3Igc2VsZWN0ZWQgc2VydmVyIHR5cGUKLSEtLUNsaWVudEVhclByb2plY3ROYW1lPWNsaWVudEVBUlByb2plY3ROYW1lCi0KLSEtLUNsaWVudENvbXBvbmVudFR5cGUgLSB0eXBlIG9mIENsaWVudCBwcm9qZWN0Ci0hLS1DbGllbnRDb21wb25lbnRUeXBlPXRlbXBsYXRlLmN4Zi5jb3JlCi0KLSEtLSBKYXZhT3V0cHV0Ci0hLS0gVG9wIGRvd24gLSBTdHJpbmc6IHRoZSB3b3Jrc3BhY2UgcmVsYXRpdmUgVVJJIGZvciBhIEphdmEgc291cmNlIGZvbGRlciBmb3IgdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUgLSBtdXN0IGJlIGV4aXN0aW5nIHdvcmtzcGFjZSBzb3VyY2UgZm9sZGVyCi0hLS1KYXZhT3V0cHV0PS9wcm9qZWN0TmFtZS9KYXZhU291cmNlCi0KLSEtLUdlbmVyYXRlIENsaWVudCA6IFJFUVVJUkVECi1HZW5DbGllbnQ9dHJ1ZQotCi0hLS1HZW5lcmF0ZSBhIHNlcnZlciBtYWlubGluZSB1c2luZyBKQVgtV1MgQVBJcwotIS0tR2VuU2VydmVyPWZhbHNlCi0hLS1HZW5lcmF0ZSBzdGFydGluZyBwb2ludCBjb2RlIGZvciBhbiBpbXBsZW1lbnRhdGlvbiBvYmplY3QKLSEtLUdlbkltcGw9dHJ1ZQotIS0tR2VuZXJhdGUgZGVmYXVsdCB2YWx1ZXMgaW4gdGhlIGltcGxlbWVudGF0aW9uIGFuZCBjbGllbnQuIElnbm9yZWQgaWYgaW1wbGVtZW50YXRpb24gb3IgY2xpZW50IGlzIG5vdCBiZWluZyBnZW5lcmF0ZWQKLSEtLURlZmF1bHRWYWx1ZXM9dHJ1ZQotIS0tRW5hYmxlcyBvciBkaXNhYmxlcyBwcm9jZXNzaW5nIG9mIGV4dGVuZGVkIHNvYXAgaGVhZGVyIG1lc3NhZ2UgYmluZGluZwotIS0tRXh0U09BUEhlYWRlcnM9ZmFsc2UKLSEtLUVuYWJsZXMgb3IgZGlzYWJsZXMgbG9hZGluZyBvZiB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgcGFja2FnZSBuYW1lIG1hcHBpbmcKLSEtLURlZmF1bHROYW1lc3BhY2U9dHJ1ZQotIS0tRW5hYmxlcyBvciBkaXNhYmxlcyBsb2FkaW5nIG9mIHRoZSBkZWZhdWx0IGV4Y2x1ZGVzIG5hbWVzcGFjZSBtYXBwaW5nCi0hLS1EZWZhdWx0RXhjbHVkZXNOYW1lc3BhY2U9dHJ1ZQotIS0tRW5hYmxlIEF1dG8gTmFtZSBSZXNvbHV0aW9uCi0hLS1BdXRvTmFtZVJlc29sdXRpb249ZmFsc2UKLQotIS0tU3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgV1NETCBzZXJ2aWNlIGZvciB3aGljaCBjb2RlIGlzIHRvIGJlIGdlbmVyYXRlZC4gVGhlIGRlZmF1bHQgaXMgdG8gZ2VuZXJhdGUgY29kZSBmb3IgZXZlcnkgc2VydmljZSBpbiB0aGUgV1NETCBkb2N1bWVudAotIS0tU2VydmljZU5hbWU9bXlTZXJ2aWNlCi0KLSEtLVhKQyBBcmdzOiBTcGVjaWZ5IHRoZSBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIGRpcmVjdGx5IHRvIHRoZSBYSkMKLQotIS0tSW5pdGlhbGlzZSBmaWVsZHMgbWFwcGVkIGZyb20gZWxlbWVudHMgd2l0aCB0aGVpciBkZWZhdWx0IHZhbHVlcwotIS0teGpjX2R2PWZhbHNlCi0hLS1BY3RpdmF0ZSBwbHVnaW4gdG8gYWRkIGEgdG9TdHJpbmcoKSBtZXRob2QgdG8gZ2VuZXJhdGVkIGNsYXNzZXMKLSEtLXhqY190cz1mYWxzZQotIS0tSGF2ZSB0b1N0cmluZyBwcm9kdWNlIG11bHRpIGxpbmUgb3V0cHV0Ci0hLS14amNfdHNfbXVsdGk9ZmFsc2UKLSEtLUhhdmUgdG9TdHJpbmcgcHJvZHVjZSBzaW5nbGUgbGluZSB0ZXJzZSBvdXRwdXQKLSEtLXhqY190c19zaW1wbGU9ZmFsc2UKLSEtLUVuYWJsZSBzb3VyY2UgbG9jYXRpb24gc3VwcG9ydCBmb3IgZ2VuZXJhdGVkIGNvZGUKLSEtLXhqY19sb2NhdG9yPWZhbHNlCi0hLS1HZW5lcmF0ZSBhY2Nlc3NvciBtZXRob2RzIHdpdGggdGhlICdzeW5jaHJvbml6ZWQnIGtleXdvcmQKLSEtLXhqY19zeW5jX21ldGhvZHM9ZmFsc2UKLSEtLUFkZCBAR2VuZXJhdGVkIGFubm90YXRpb25zIHRvIHRoZSBnZW5lcmF0ZWQgY29kZQotIS0teGpjX21hcmtfZ2VuZXJhdGVkPWZhbHNlCi0KLSEtLSBNYXBwaW5ncwotIS0tIFRvcCBkb3duIHNjZW5hcmlvLiBXb3Jrc3BhY2UgcmVsYXRpdmUgVVJJIHRvIHByb3BlcnR5IGZpbGUgY29udGFpbmluZyBtYXBwaW5ncy4KLSEtLSBNYXBwaW5ncyBhcmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBwYWNrYWdlIG5hbWVzIG9mIHRoZSBnZW5lcmF0ZWQgSmF2YSB0ZW1wbGF0ZSBjbGFzc2VzLgotIS0tIFRoZSBjb250ZW50IG9mIHRoZSBwcm9wZXJ0aWVzIGZpbGUgbXVzdCBiZSBvZiB0aGUgZm9ybWF0IG5hbWVzcGFjZT1wYWNrYWdlICAKLSEtLU1hcHBpbmdzPS9keW5hbWljV2ViUHJvamVjdE5hbWUvbWFwcGluZ3MudHh0Ci0KLSEtLUJpbmRpbmcgRmlsZXMuIENvbW1hIGRlbGltaXRlZCBzdHJpbmcgb2YgYWJzb2x1dGUgcGF0aHMgaW4gdGhlIGxvY2FsIGZpbGUgc3lzdGVtIG9mIEpBWFdTIG9yIEpBWEIgYmluZGluZyBmaWxlcy4KLSEtLUJpbmRpbmdzPUM6L3dvcmtzcGFjZTEvZHluYW1pY1dlYlByb2plY3ROYW1lL2JpbmRpbmcxLnhtbCxDOi93b3Jrc3BhY2UxL2R5bmFtaWNXZWJQcm9qZWN0TmFtZS9iaW5kaW5nMi54bWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9hbnQvY3hmX2NsaWVudC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9hbnQvY3hmX2NsaWVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkM2E1NjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvYW50L2N4Zl9jbGllbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IGRlZmF1bHQ9Im1haW4iIGJhc2VkaXI9Ii4iPgotCi08ZWNobyBtZXNzYWdlPSJwdWxsaW5nIGluIHByb3BlcnR5IGZpbGVzIi8+Ci08cHJvcGVydHkgZmlsZT0iY3hmX2NsaWVudC5wcm9wZXJ0aWVzIi8+Ci0JCi08ZWNobyBtZXNzYWdlPSJjYWxsaW5nIHRoZSB3ZWIgc2VydmljZXMgZ2VuZXJhdGlvbiBhbnQgdGFzazogY3hmX2NsaWVudCIvPgotIDx0YXJnZXQgbmFtZT0ibWFpbiIgPgotICAJIDx3c2dlbi8+Ci0gIDwvdGFyZ2V0PgotICAKLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2FudC9jeGZfdGRqYXZhLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9hbnQvY3hmX3RkamF2YS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTZlODg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2FudC9jeGZfdGRqYXZhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBTaGFuZSBDbGFya2UgLSBBcGFjaGUgQ1hGIHN1cHBvcnQKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSEtLSBTY2VuYXJpb1R5cGUgUkVRVUlSRUQuIERpZmZlcmVudGlhdGVzIGZyb20gImNsaWVudCIgc2NlbmFyaW8uCi1TY2VuYXJpb1R5cGU9c2VydmljZQotCi0hLS0gSW5pdGlhbFNlbGVjdGlvbiBSRVFVSVJFRC4gIFdvcmtzcGFjZSByZWxhdGl2ZSBVUkkgdG8gdGhlIGlucHV0IFdTREwgb3IgSmF2YQotSW5pdGlhbFNlbGVjdGlvbj0vZHluYW1pY1dlYlByb2plY3ROYW1lL1dlYkNvbnRlbnQvd3NkbC9teVNlcnZpY2Uud3NkbAotCi0hLS1VdGlsaXR5IHByb3BlcnR5IHZhbHVlcyAtIHVzZSB0aGVzZSB0byBsaXN0IHZhbGlkIHZhbHVlcyBmb3IgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgotIS0tIFNlcnZpY2UuUnVudGltZUlkLCBTZXJ2aWNlLlNlcnZlcklkIAotTGlzdFJ1bnRpbWVzPXRydWUKLUxpc3RTZXJ2ZXJzPXRydWUKLSEtLSBWZXJib3NlIHdpbGwgbGlzdCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzIGFzIHdlbGwgYXMgZXJyb3JzIGlmIHNldCB0byB0cnVlCi1WZXJib3NlPXRydWUKLQotIS0tICBTZXJ2aWNlLlJ1bnRpbWVJZCAtIElEIG9mIHdlYiBzZXJ2aWNlIHJ1bnRpbWUgCi1TZXJ2aWNlLlJ1bnRpbWVJZD1vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmN4ZldlYlNlcnZpY2VSVAotIS0tIFNlcnZpY2UuU2VydmVySWQgLSAgSUQgb2YgdGFyZ2V0IHNlcnZlciAKLVNlcnZpY2UuU2VydmVySWQ9b3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNjAKLSEtLSBTZXJ2aWNlLlR5cGVJZCAtIEphdmEgQmVhbiBpcyBkZWZhdWx0IGZvciBib3RoIFRvcCBEb3duIGFuZCBCb3R0b20gVXAKLSEtLSBTZXJ2aWNlLlR5cGVJZD1KYXZhIEJlYW4KLQotIS0tIFNlcnZpY2VQcm9qZWN0TmFtZSAtICEtLXR5cGU6U3RyaW5nIC0gbmFtZSBvZiBTZXJ2aWNlIHByb2plY3QgLSB0aGlzIHByb3BlcnR5IGNhbiBiZSB1c2VkIHRvIGdpdmUgdGhlIHNlcnZpY2UgcHJvamVjdCBhIGRpZmZlcmVudCBuYW1lIHRoYW4gdGhlIHByb2plY3QgY29udGFpbmluZyB0aGUgaW5pdGlhbCBzZWxlY3Rpb24uICB0eXBlOiBTdHJpbmcgICAgCi0hLS1TZXJ2aWNlUHJvamVjdE5hbWU9c2VydmljZVByb2plY3ROYW1lCi0hLS0gU2VydmljZUVhclByb2plY3ROYW1lIC0gIS0tdHlwZTpTdHJpbmcgLSBuYW1lIG9mIFNlcnZpY2UgRUFSIHByb2plY3QgLSB0aGlzIHByb3BlcnR5IGNhbiBiZSB1c2VkIHRvIGdpdmUgdGhlIHNlcnZpY2UgRUFSIHByb2plY3QgYSBkaWZmZXJlbnQgbmFtZSB0aGFuIHRoZSBFQVIgcHJvamVjdCBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VydmljZSBwcm9qZWN0LiAgdHlwZTogU3RyaW5nCi0hLS1TZXJ2aWNlRWFyUHJvamVjdE5hbWU9c2VydmljZUVhclByb2plY3ROYW1lCi0KLSEtLSBKYXZhT3V0cHV0Ci0hLS0gVG9wIGRvd24gLSBTdHJpbmc6IHRoZSB3b3Jrc3BhY2UgcmVsYXRpdmUgVVJJIGZvciBhIEphdmEgc291cmNlIGZvbGRlciBmb3IgdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUgLSBtdXN0IGJlIGV4aXN0aW5nIHdvcmtzcGFjZSBzb3VyY2UgZm9sZGVyCi0hLS1KYXZhT3V0cHV0PS9wcm9qZWN0TmFtZS9KYXZhU291cmNlCi0KLSEtLVNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIFdTREwgc2VydmljZSBmb3Igd2hpY2ggY29kZSBpcyB0byBiZSBnZW5lcmF0ZWQuIFRoZSBkZWZhdWx0IGlzIHRvIGdlbmVyYXRlIGNvZGUgZm9yIGV2ZXJ5IHNlcnZpY2UgaW4gdGhlIFdTREwgZG9jdW1lbnQKLSEtLVNlcnZpY2VOYW1lPW15U2VydmljZQotCi0hLS1HZW5lcmF0ZSBhIHNlcnZlciBtYWlubGluZSB1c2luZyBKQVgtV1MgQVBJcwotIS0tR2VuU2VydmVyPWZhbHNlCi0hLS1HZW5lcmF0ZSBzdGFydGluZyBwb2ludCBjb2RlIGZvciBhbiBpbXBsZW1lbnRhdGlvbiBvYmplY3QKLSEtLUdlbkltcGw9dHJ1ZQotIS0tR2VuZXJhdGUgZGVmYXVsdCB2YWx1ZXMgaW4gdGhlIGltcGxlbWVudGF0aW9uIGFuZCBjbGllbnQuIElnbm9yZWQgaWYgaW1wbGVtZW50YXRpb24gb3IgY2xpZW50IGlzIG5vdCBiZWluZyBnZW5lcmF0ZWQKLSEtLURlZmF1bHRWYWx1ZXM9dHJ1ZQotIS0tRW5hYmxlcyBvciBkaXNhYmxlcyBwcm9jZXNzaW5nIG9mIGV4dGVuZGVkIHNvYXAgaGVhZGVyIG1lc3NhZ2UgYmluZGluZwotIS0tRXh0U09BUEhlYWRlcnM9ZmFsc2UKLSEtLUVuYWJsZXMgb3IgZGlzYWJsZXMgbG9hZGluZyBvZiB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgcGFja2FnZSBuYW1lIG1hcHBpbmcKLSEtLURlZmF1bHROYW1lc3BhY2U9dHJ1ZQotIS0tRW5hYmxlcyBvciBkaXNhYmxlcyBsb2FkaW5nIG9mIHRoZSBkZWZhdWx0IGV4Y2x1ZGVzIG5hbWVzcGFjZSBtYXBwaW5nCi0hLS1EZWZhdWx0RXhjbHVkZXNOYW1lc3BhY2U9dHJ1ZQotIS0tRW5hYmxlIEF1dG8gTmFtZSBSZXNvbHV0aW9uCi0hLS1BdXRvTmFtZVJlc29sdXRpb249ZmFsc2UKLQotIS0tWEpDIEFyZ3M6IFNwZWNpZnkgdGhlIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlIFhKQwotCi0hLS1Jbml0aWFsaXNlIGZpZWxkcyBtYXBwZWQgZnJvbSBlbGVtZW50cyB3aXRoIHRoZWlyIGRlZmF1bHQgdmFsdWVzCi0hLS14amNfZHY9ZmFsc2UKLSEtLUFjdGl2YXRlIHBsdWdpbiB0byBhZGQgYSB0b1N0cmluZygpIG1ldGhvZCB0byBnZW5lcmF0ZWQgY2xhc3NlcwotIS0teGpjX3RzPWZhbHNlCi0hLS1IYXZlIHRvU3RyaW5nIHByb2R1Y2UgbXVsdGkgbGluZSBvdXRwdXQKLSEtLXhqY190c19tdWx0aT1mYWxzZQotIS0tSGF2ZSB0b1N0cmluZyBwcm9kdWNlIHNpbmdsZSBsaW5lIHRlcnNlIG91dHB1dAotIS0teGpjX3RzX3NpbXBsZT1mYWxzZQotIS0tRW5hYmxlIHNvdXJjZSBsb2NhdGlvbiBzdXBwb3J0IGZvciBnZW5lcmF0ZWQgY29kZQotIS0teGpjX2xvY2F0b3I9ZmFsc2UKLSEtLUdlbmVyYXRlIGFjY2Vzc29yIG1ldGhvZHMgd2l0aCB0aGUgJ3N5bmNocm9uaXplZCcga2V5d29yZAotIS0teGpjX3N5bmNfbWV0aG9kcz1mYWxzZQotIS0tQWRkIEBHZW5lcmF0ZWQgYW5ub3RhdGlvbnMgdG8gdGhlIGdlbmVyYXRlZCBjb2RlCi0hLS14amNfbWFya19nZW5lcmF0ZWQ9ZmFsc2UKLQotIS0tIE1hcHBpbmdzCi0hLS0gVG9wIGRvd24gc2NlbmFyaW8uIFdvcmtzcGFjZSByZWxhdGl2ZSBVUkkgdG8gcHJvcGVydHkgZmlsZSBjb250YWluaW5nIG1hcHBpbmdzLgotIS0tIE1hcHBpbmdzIGFyZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHBhY2thZ2UgbmFtZXMgb2YgdGhlIGdlbmVyYXRlZCBKYXZhIHRlbXBsYXRlIGNsYXNzZXMuCi0hLS0gVGhlIGNvbnRlbnQgb2YgdGhlIHByb3BlcnRpZXMgZmlsZSBtdXN0IGJlIG9mIHRoZSBmb3JtYXQgbmFtZXNwYWNlPXBhY2thZ2UgIAotIS0tTWFwcGluZ3M9L2R5bmFtaWNXZWJQcm9qZWN0TmFtZS9tYXBwaW5ncy50eHQKLQotIS0tQmluZGluZyBGaWxlcy4gQ29tbWEgZGVsaW1pdGVkIHN0cmluZyBvZiBhYnNvbHV0ZSBwYXRocyBpbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0gb2YgSkFYV1Mgb3IgSkFYQiBiaW5kaW5nIGZpbGVzLgotIS0tQmluZGluZ3M9Qzovd29ya3NwYWNlMS9keW5hbWljV2ViUHJvamVjdE5hbWUvYmluZGluZzEueG1sLEM6L3dvcmtzcGFjZTEvZHluYW1pY1dlYlByb2plY3ROYW1lL2JpbmRpbmcyLnhtbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2FudC9jeGZfdGRqYXZhLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2FudC9jeGZfdGRqYXZhLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM3OWM2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9hbnQvY3hmX3RkamF2YS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPHByb2plY3QgZGVmYXVsdD0ibWFpbiIgYmFzZWRpcj0iLiI+Ci0KLTxlY2hvIG1lc3NhZ2U9InB1bGxpbmcgaW4gcHJvcGVydHkgZmlsZXMiLz4KLTxwcm9wZXJ0eSBmaWxlPSJjeGZfdGRqYXZhLnByb3BlcnRpZXMiLz4KLQkKLTxlY2hvIG1lc3NhZ2U9ImNhbGxpbmcgdGhlIHdlYiBzZXJ2aWNlcyBnZW5lcmF0aW9uIGFudCB0YXNrOiBjeGZfdGRqYXZhIi8+Ci0gPHRhcmdldCBuYW1lPSJtYWluIiA+Ci0gIAkgPHdzZ2VuLz4KLSAgPC90YXJnZXQ+Ci0gIAotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYWQ1Y2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYW50LwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY4MTRhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPUNYRiBXZWIgU2VydmljZXMgQ29uc3VtcHRpb24gQ29yZQotcGx1Z2luUHJvdmlkZXI9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotV0VCX1NFUlZJQ0VfTE9DQVRPUl9DWEY9QXBhY2hlIENYRiBXZWIgU2VydmljZSBMb2NhdG9yCi1XRUJfU0VSVklDRV9MT0NBVE9SX0NBVEVHT1JZX0NYRj1BcGFjaGUgQ1hGIENvbXBvbmVudHMKLQotTEFCRUxfUlVOVElNRV9DWEY9QXBhY2hlIENYRgotTEFCRUxfQk9UVE9NX1VQX0pBVkFfQkVBTj1Cb3R0b20gdXAgSmF2YSBiZWFuIFdlYiBTZXJ2aWNlCi1MQUJFTF9UT1BfRE9XTl9KQVZBX0JFQU49VG9wIGRvd24gSmF2YSBiZWFuIFdlYiBTZXJ2aWNlCi1MQUJFTF9DTElFTlQ9Q2xpZW50CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEzNzQ3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Qud3MubG9jYXRvciI+Ci0gICAgICA8d2ViU2VydmljZUxvY2F0b3JDYXRlZ29yeQotICAgICAgICAgaWQ9IndzLmxvY2F0b3IuY2F0ZWdvcnkuY3hmIgotICAgICAgICAgbGFiZWw9IiVXRUJfU0VSVklDRV9MT0NBVE9SX0NBVEVHT1JZX0NYRiIvPgotCi0gICAgICA8d2ViU2VydmljZUxvY2F0b3IKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmUubG9jYXRvci5DWEZXZWJTZXJ2aWNlTG9jYXRvciIKLSAgICAgICAgIGlkPSJ3cy5sb2NhdG9yLmN4ZiIKLSAgICAgICAgIGNhdGVnb3J5PSJ3cy5sb2NhdG9yLmNhdGVnb3J5LmN4ZiIKLSAgICAgICAgIGxhYmVsPSIlV0VCX1NFUlZJQ0VfTE9DQVRPUl9DWEYiPgotICAgICAgPC93ZWJTZXJ2aWNlTG9jYXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkuYW50ZmlsZXMiPgotICAgICAgPGFudGZpbGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jeGZXZWJTZXJ2aWNlUlRCVUphdmEiCi0gICAgCSBydW50aW1laWQ9ImN4ZiIKLSAgICAJIHBsdWdpbmxvY2F0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUiCi0gICAgCSBwYXRoPSJhbnQvY3hmX2J1amF2YS5wcm9wZXJ0aWVzIgotICAgIAkgd3NnZW5wYXRoPSJhbnQvY3hmX2J1amF2YS54bWwiCi0gICAgCSBydW50aW1lbGFiZWw9IiVMQUJFTF9SVU5USU1FX0NYRiIKLSAgICAJIHNjZW5hcmlvbGFiZWw9IiVMQUJFTF9CT1RUT01fVVBfSkFWQV9CRUFOIj4KLSAgCSAgPC9hbnRmaWxlcz4KLSAgICAgIDxhbnRmaWxlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY3hmV2ViU2VydmljZVJUVG9wSmF2YSIKLSAgICAgICAgIHJ1bnRpbWVpZD0iY3hmIgotICAgICAgICAgcGx1Z2lubG9jYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZSIKLSAgICAgICAgIHBhdGg9ImFudC9jeGZfdGRqYXZhLnByb3BlcnRpZXMiCi0gICAgICAgICB3c2dlbnBhdGg9ImFudC9jeGZfdGRqYXZhLnhtbCIKLSAgICAgICAgIHJ1bnRpbWVsYWJlbD0iJUxBQkVMX1JVTlRJTUVfQ1hGIgotICAgICAgICAgc2NlbmFyaW9sYWJlbD0iJUxBQkVMX1RPUF9ET1dOX0pBVkFfQkVBTiI+Ci0gIAkgIDwvYW50ZmlsZXM+Ci0gIAkgIDxhbnRmaWxlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY3hmV2ViU2VydmljZVJUWkNsaWVudCIKLSAgICAgICAgIHJ1bnRpbWVpZD0iY3hmIgotICAgICAgICAgcGx1Z2lubG9jYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZSIKLSAgICAgICAgIHBhdGg9ImFudC9jeGZfY2xpZW50LnByb3BlcnRpZXMiCi0gICAgICAgICB3c2dlbnBhdGg9ImFudC9jeGZfY2xpZW50LnhtbCIKLSAgICAgICAgIHJ1bnRpbWVsYWJlbD0iJUxBQkVMX1JVTlRJTUVfQ1hGIgotICAgICAgICAgc2NlbmFyaW9sYWJlbD0iJUxBQkVMX0NMSUVOVCI+Ci0gICAgICA8L2FudGZpbGVzPgotICAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL2NvcmUvQ1hGQ29uc3VtcHRpb25Db3JlTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL2NvcmUvQ1hGQ29uc3VtcHRpb25Db3JlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNlYjAwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi9jb3JlL0NYRkNvbnN1bXB0aW9uQ29yZU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgQ1hGQ29uc3VtcHRpb25Db3JlTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9IAotICAgICAgICAib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLkNYRkNvbnN1bXB0aW9uQ29yZU1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgc3RhdGljIHsKLSAgICAgICAgLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLSAgICAgICAgTkxTLmluaXRpYWxpemVNZXNzYWdlcyhDWEZDb25zdW1wdGlvbkNvcmVNZXNzYWdlcy5CVU5ETEVfTkFNRSwgQ1hGQ29uc3VtcHRpb25Db3JlTWVzc2FnZXMuY2xhc3MpOwotICAgIH0KLQotICAgIHByaXZhdGUgQ1hGQ29uc3VtcHRpb25Db3JlTWVzc2FnZXMoKSB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vY29yZS9DWEZDb25zdW1wdGlvbkNvcmVNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vY29yZS9DWEZDb25zdW1wdGlvbkNvcmVNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDk4MGJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL2NvcmUvQ1hGQ29uc3VtcHRpb25Db3JlTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL2NvcmUvQ1hGQ29uc3VtcHRpb25Db3JlUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi9jb3JlL0NYRkNvbnN1bXB0aW9uQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTIwZmU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL2NvcmUvQ1hGQ29uc3VtcHRpb25Db3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZS4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1hGQ29uc3VtcHRpb25Db3JlUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0gICAgLy8gVGhlIHBsdWctaW4gSUQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotICAgIHByaXZhdGUgc3RhdGljIENYRkNvbnN1bXB0aW9uQ29yZVBsdWdpbiBwbHVnaW47Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIENYRkNvbnN1bXB0aW9uQ29yZVBsdWdpbigpIHsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ1hGQ29uc3VtcHRpb25Db3JlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0gICAgICAgIHJldHVybiBwbHVnaW47Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zdGFydChjb250ZXh0KTsKLSAgICAgICAgcGx1Z2luID0gdGhpczsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBwbHVnaW4gPSBudWxsOwotICAgICAgICBzdXBlci5zdG9wKGNvbnRleHQpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIENYRkNvbnN1bXB0aW9uQ29yZVBsdWdpbi5sb2cobmV3IFN0YXR1cyhzZXZlcml0eSwgQ1hGQ29uc3VtcHRpb25Db3JlUGx1Z2luLlBMVUdJTl9JRCwgCi0gICAgICAgICAgICBtZXNzYWdlKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotICAgICAgICBDWEZDb25zdW1wdGlvbkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotICAgICAgICBDWEZDb25zdW1wdGlvbkNvcmVQbHVnaW4ubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ29uc3VtcHRpb25Db3JlUGx1Z2luLlBMVUdJTl9JRCwgCi0gICAgICAgICAgICBleGNlcHRpb24udG9TdHJpbmcoKSwgZXhjZXB0aW9uKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vY29yZS9jb21tYW5kcy9XU0RMMkphdmFDbGllbnRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi9jb3JlL2NvbW1hbmRzL1dTREwySmF2YUNsaWVudENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUyNWZmNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi9jb3JlL2NvbW1hbmRzL1dTREwySmF2YUNsaWVudENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5DWEZDb25zdW1wdGlvbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUucmVzb3VyY2VzLkphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5Db21tYW5kTGluZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkxhdW5jaFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci0KLS8qKgotICogRXhlY3V0ZXMgdGhlIDxjb2RlPm9yZy5hcGFjaGUuY3hmLnRvb2xzLndzZGx0by5XU0RMVG9KYXZhPC9jb2RlPiBjb21tYW5kIHdpdGggdGhlIGFyZ3VtZW50cwotICogbmVjZXNzYXJ5IHRvIGdlbmVyYXRlIGEgY2xpZW50LgotICoKLSAqLwotcHVibGljIGNsYXNzIFdTREwySmF2YUNsaWVudENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1hGX1RPT0xfQ0xBU1NfTkFNRSA9ICJvcmcuYXBhY2hlLmN4Zi50b29scy53c2RsdG8uV1NETFRvSmF2YSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsOwotCi0gICAgcHJpdmF0ZSBKYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBqYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSA8Y29kZT5XU0RMMkphdmFDbGllbnRDb21tYW5kPC9jb2RlPiBvYmplY3QuCi0gICAgICogQHBhcmFtIG1vZGVsIHRoZSA8Y29kZT5XU0RMMkphdmFEYXRhTW9kZWw8L2NvZGU+IHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbgotICAgICAqIGJldHdlZW4gY29tbWFuZHMuCi0gICAgICovCi0gICAgcHVibGljIFdTREwySmF2YUNsaWVudENvbW1hbmQoV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICBqYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9IG5ldyBKYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihuZXcgUGF0aChtb2RlbC5nZXRKYXZhU291cmNlRm9sZGVyKCkpKTsKLSAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoamF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotCi0gICAgICAgIFN0cmluZ1tdIHByb2dBcmdzID0gQ29tbWFuZExpbmVVdGlscy5nZXRXU0RMMkphdmFHZW5lcmF0ZUNsaWVudEFyZ3VtZW50cyhtb2RlbCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IG1vZGVsLmdldFByb2plY3ROYW1lKCk7Ci0KLSAgICAgICAgICAgIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEpEVFV0aWxzLmdldEphdmFQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgICAgIExhdW5jaFV0aWxzLmxhdW5jaChqYXZhUHJvamVjdCwgV1NETDJKYXZhQ2xpZW50Q29tbWFuZC5DWEZfVE9PTF9DTEFTU19OQU1FLCBwcm9nQXJncyk7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY29weVcySkZpbGVzRnJvbVRtcCh0aGlzLm1vZGVsKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgc3RhdHVzID0gY2UuZ2V0U3RhdHVzKCk7Ci0gICAgICAgICAgICBDWEZDb25zdW1wdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgIH0KLQotICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihqYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgTGlzdDxJUmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PElSZXNvdXJjZT4oKTsKLSAgICAgICAgY2hhbmdlZFJlc291cmNlcy5hZGRBbGwoamF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIuZ2V0Q2hhbmdlZFJlc291cmNlcygpKTsKLSAgICAgICAgaWYgKGNoYW5nZWRSZXNvdXJjZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgZm9yIChJUmVzb3VyY2UgcmVzb3VyY2UgOiBjaGFuZ2VkUmVzb3VyY2VzKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UuZGVsZXRlKHRydWUsIG1vbml0b3IpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gY2UuZ2V0U3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIENYRkNvbnN1bXB0aW9uQ29yZVBsdWdpbi5sb2coc3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICAvL0FOVCBFbnZpcm9ubWVudCBNYXBwaW5ncwotICAgIHB1YmxpYyB2b2lkIHNldEphdmFTb3VyY2VGb2xkZXIoU3RyaW5nIGphdmFTb3VyY2VGb2xkZXIpIHsKLSAgICAgICAgbW9kZWwuc2V0SmF2YVNvdXJjZUZvbGRlcihqYXZhU291cmNlRm9sZGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlTmFtZShTdHJpbmcgc2VydmljZU5hbWUpIHsKLSAgICAgICAgbW9kZWwuc2V0U2VydmljZU5hbWUoc2VydmljZU5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlU2VydmVyKGJvb2xlYW4gZ2VuZXJhdGVTZXJ2ZXIpIHsKLSAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVTZXJ2ZXIoZ2VuZXJhdGVTZXJ2ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlQ2xpZW50KGJvb2xlYW4gZ2VuZXJhdGVDbGllbnQpIHsKLSAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVDbGllbnQoZ2VuZXJhdGVDbGllbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlSW1wbGVtZW50YXRpb24oYm9vbGVhbiBnZW5lcmF0ZUltcGxlbWVudGF0aW9uKSB7Ci0gICAgICAgIG1vZGVsLnNldEdlbmVyYXRlSW1wbGVtZW50YXRpb24oZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXNlRGVmYXVsdFZhbHVlcyhib29sZWFuIHVzZURlZmF1bHRWYWx1ZXMpIHsKLSAgICAgICAgbW9kZWwuc2V0VXNlRGVmYXVsdFZhbHVlcyh1c2VEZWZhdWx0VmFsdWVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9jZXNzU09BUEhlYWRlcnMoYm9vbGVhbiBwcm9jZXNzU09BUEhlYWRlcnMpIHsKLSAgICAgICAgbW9kZWwuc2V0UHJvY2Vzc1NPQVBIZWFkZXJzKHByb2Nlc3NTT0FQSGVhZGVycyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoYm9vbGVhbiBsb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZykgewotICAgICAgICBtb2RlbC5zZXRMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyhsb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoYm9vbGVhbiBsb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZykgewotICAgICAgICBtb2RlbC5zZXRMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyhsb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXV0b05hbWVSZXNvbHV0aW9uKGJvb2xlYW4gYXV0b05hbWVSZXNvbHV0aW9uKSB7Ci0gICAgICAgIG1vZGVsLnNldEF1dG9OYW1lUmVzb2x1dGlvbihhdXRvTmFtZVJlc29sdXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFhqY1VzZURlZmF1bHRWYWx1ZXMoYm9vbGVhbiB4amNVc2VEZWZhdWx0VmFsdWVzKSB7Ci0gICAgICAgIG1vZGVsLnNldFhqY1VzZURlZmF1bHRWYWx1ZXMoeGpjVXNlRGVmYXVsdFZhbHVlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WGpjVG9TdHJpbmcoYm9vbGVhbiB4amNUb1N0cmluZykgewotICAgICAgICBtb2RlbC5zZXRYamNUb1N0cmluZ1NpbXBsZSh4amNUb1N0cmluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WGpjVG9TdHJpbmdTaW1wbGUoYm9vbGVhbiB4amNUb1N0cmluZ1NpbXBsZSkgewotICAgICAgICBtb2RlbC5zZXRYamNUb1N0cmluZ1NpbXBsZSh4amNUb1N0cmluZ1NpbXBsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WGpjVG9TdHJpbmdNdWx0aUxpbmUoYm9vbGVhbiB4amNUb1N0cmluZ011bHRpTGluZSkgewotICAgICAgICBtb2RlbC5zZXRYamNUb1N0cmluZ011bHRpTGluZSh4amNUb1N0cmluZ011bHRpTGluZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WGpjTG9jYXRvcihib29sZWFuIHhqY0xvY2F0b3IpIHsKLSAgICAgICAgbW9kZWwuc2V0WGpjTG9jYXRvcih4amNMb2NhdG9yKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNTeW5jTWV0aG9kcyhib29sZWFuIHhqY1N5bmNNZXRob2RzKSB7Ci0gICAgICAgIG1vZGVsLnNldFhqY1N5bmNNZXRob2RzKHhqY1N5bmNNZXRob2RzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNNYXJrR2VuZXJhdGVkKGJvb2xlYW4geGpjTWFya0dlbmVyYXRlZCkgewotICAgICAgICBtb2RlbC5zZXRYamNNYXJrR2VuZXJhdGVkKHhqY01hcmtHZW5lcmF0ZWQpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVkTmFtZXNwYWNlcyhNYXAgdmFsdWUpIHsKLSAgICAgICAgbW9kZWwuc2V0SW5jbHVkZWROYW1lc3BhY2VzKHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCaW5kaW5nRmlsZXMoTGlzdDxTdHJpbmc+IGJpbmRpbmdGaWxlcykgewotICAgICAgICBmb3IgKFN0cmluZyBwYXRoIDogYmluZGluZ0ZpbGVzKSB7Ci0gICAgICAgICAgICBtb2RlbC5nZXRCaW5kaW5nRmlsZXMoKS5hZGQocGF0aCk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vY29yZS9jb21tYW5kcy9XU0RMMkphdmFDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vY29yZS9jb21tYW5kcy9XU0RMMkphdmFDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGI0ODAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL2NvcmUvY29tbWFuZHMvV1NETDJKYXZhQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5DWEZDb25zdW1wdGlvbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLmNvbnRleHQuV1NETDJKYXZhUGVyc2lzdGVudENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5KRFRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5XU0RMVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLQotLyoqCi0gKiBMb2FkcyB0aGUgPGNvZGU+V1NETDJKYXZhRGF0YU1vZGVsPC9jb2RlPiB3aXRoIHRoZSBwZXJzaXN0ZWQgZGVmYXVsdHMKLSAqIGZyb20gdGhlIHByZWZlcmVuY2VzIGFuZCB3aXRoIHRoZSBpbml0aWFsIHJ1bnRpbWUgaW5mb3JtYXRpb24gc3VjaCBhcyB0aGUKLSAqIHN0YXJ0aW5nIHBvaW50IFdTREwgVVJMLgotICoKLSAqLwotcHVibGljIGNsYXNzIFdTREwySmF2YUNsaWVudERlZmF1bHRpbmdDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gewotICAgIHByaXZhdGUgV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsOwotICAgIHByaXZhdGUgU3RyaW5nIHByb2plY3ROYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIGlucHV0VVJMOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIFdTREwySmF2YUNsaWVudERlZmF1bHRpbmdDb21tYW5kIG9iamVjdC4KLSAgICAgKiBAcGFyYW0gbW9kZWwgdGhlIDxjb2RlPldTREwySmF2YURhdGFNb2RlbDwvY29kZT4gdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uCi0gICAgICogICAgICAgICAgICAgIGJldHdlZW4gY29tbWFuZHMuCi0gICAgICovCi0gICAgcHVibGljIFdTREwySmF2YUNsaWVudERlZmF1bHRpbmdDb21tYW5kKFdTREwySmF2YURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgaW5wdXRVUkwpIHsKLSAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgICAgICB0aGlzLnByb2plY3ROYW1lID0gcHJvamVjdE5hbWU7Ci0gICAgICAgIHRoaXMuaW5wdXRVUkwgPSBpbnB1dFVSTDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICBXU0RMMkphdmFQZXJzaXN0ZW50Q29udGV4dCBjb250ZXh0ID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V1NETDJKYXZhQ29udGV4dCgpOwotICAgICAgICBtb2RlbC5zZXREZWZhdWx0UnVudGltZVZlcnNpb24oY29udGV4dC5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKSk7Ci0gICAgICAgIG1vZGVsLnNldERlZmF1bHRSdW50aW1lVHlwZShjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVHlwZSgpKTsKLSAgICAgICAgbW9kZWwuc2V0UHJvamVjdE5hbWUocHJvamVjdE5hbWUpOwotCi0gICAgICAgIG1vZGVsLnNldEluY2x1ZGVkTmFtZXNwYWNlcyhuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKSk7Ci0gICAgICAgIG1vZGVsLnNldEV4Y2x1ZGVkTmFtZXNwYWNlcyhuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKSk7Ci0KLSAgICAgICAgLy8gWEpDCi0gICAgICAgIG1vZGVsLnNldFhqY1VzZURlZmF1bHRWYWx1ZXMoY29udGV4dC5pc1hqY1VzZURlZmF1bHRWYWx1ZXMoKSk7Ci0gICAgICAgIG1vZGVsLnNldFhqY1RvU3RyaW5nKGNvbnRleHQuaXNYamNUb1N0cmluZygpKTsKLSAgICAgICAgbW9kZWwuc2V0WGpjVG9TdHJpbmdNdWx0aUxpbmUoY29udGV4dC5pc1hqY1RvU3RyaW5nTXVsdGlMaW5lKCkpOwotICAgICAgICBtb2RlbC5zZXRYamNUb1N0cmluZ1NpbXBsZShjb250ZXh0LmlzWGpjVG9TdHJpbmdTaW1wbGUoKSk7Ci0gICAgICAgIG1vZGVsLnNldFhqY0xvY2F0b3IoY29udGV4dC5pc1hqY0xvY2F0b3IoKSk7Ci0gICAgICAgIG1vZGVsLnNldFhqY1N5bmNNZXRob2RzKGNvbnRleHQuaXNYamNTeW5jTWV0aG9kcygpKTsKLSAgICAgICAgbW9kZWwuc2V0WGpjTWFya0dlbmVyYXRlZChjb250ZXh0LmlzWGpjTWFya0dlbmVyYXRlZCgpKTsKLQotICAgICAgICBtb2RlbC5zZXRWYWxpZGF0ZShjb250ZXh0LmlzVmFsaWRhdGUoKSk7Ci0gICAgICAgIG1vZGVsLnNldFByb2Nlc3NTT0FQSGVhZGVycyhjb250ZXh0LmlzUHJvY2Vzc1NPQVBIZWFkZXJzKCkpOwotICAgICAgICBtb2RlbC5zZXRMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyhjb250ZXh0LmlzTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoKSk7Ci0gICAgICAgIG1vZGVsLnNldExvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKGNvbnRleHQuaXNMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZygpKTsKLSAgICAgICAgbW9kZWwuc2V0VXNlRGVmYXVsdFZhbHVlcyhjb250ZXh0LmlzVXNlRGVmYXVsdFZhbHVlcygpKTsKLSAgICAgICAgbW9kZWwuc2V0Tm9BZGRyZXNzQmluZGluZyhjb250ZXh0LmlzTm9BZGRyZXNzQmluZGluZygpKTsKLSAgICAgICAgbW9kZWwuc2V0QXV0b05hbWVSZXNvbHV0aW9uKGNvbnRleHQuaXNBdXRvTmFtZVJlc29sdXRpb24oKSk7Ci0KLSAgICAgICAgbW9kZWwuc2V0SmF2YVNvdXJjZUZvbGRlcihKRFRVdGlscy5nZXRKYXZhUHJvamVjdFNvdXJjZURpcmVjdG9yeVBhdGgobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSkudG9PU1N0cmluZygpKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgVVJMIHdzZGxVcmwgPSBuZXcgVVJMKGlucHV0VVJMKTsKLSAgICAgICAgICAgIG1vZGVsLnNldFdzZGxVUkwod3NkbFVybCk7Ci0KLSAgICAgICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IFdTRExVdGlscy5yZWFkV1NETChtb2RlbC5nZXRXc2RsVVJMKCkpOwotICAgICAgICAgICAgaWYgKGRlZmluaXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IFdTRExVdGlscy5nZXRQYWNrYWdlTmFtZUZyb21OYW1lc3BhY2UodGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRUYXJnZXROYW1lc3BhY2UodGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBtb2RlbC5nZXRJbmNsdWRlZE5hbWVzcGFjZXMoKS5wdXQodGFyZ2V0TmFtZXNwYWNlLCBwYWNrYWdlTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uID0gV1NETFV0aWxzLmdldFdTRExMb2NhdGlvbihkZWZpbml0aW9uKTsKLSAgICAgICAgICAgICAgICBpZiAod3NkbExvY2F0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbW9kZWwuc2V0V3NkbExvY2F0aW9uKHdzZGxMb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbW9kZWwuc2V0V3NkbERlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11cmxlKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNvbnN1bXB0aW9uQ29yZVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgIG11cmxlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBDWEZDb25zdW1wdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDb25zdW1wdGlvbkNvcmVQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICBpb2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgICAgIENYRkNvbnN1bXB0aW9uQ29yZVBsdWdpbi5sb2coc3RhdHVzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHB1YmxpYyBXU0RMMkphdmFEYXRhTW9kZWwgZ2V0V1NETDJKYXZhRGF0YU1vZGVsKCkgewotICAgICAgICByZXR1cm4gbW9kZWw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vY29yZS9sb2NhdG9yL0NYRldlYlNlcnZpY2VMb2NhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi9jb3JlL2xvY2F0b3IvQ1hGV2ViU2VydmljZUxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE1MGRlYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi9jb3JlL2xvY2F0b3IvQ1hGV2ViU2VydmljZUxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5sb2NhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NmaW5kZXIuQWJzdHJhY3RXZWJTZXJ2aWNlTG9jYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBDWEZXZWJTZXJ2aWNlTG9jYXRvciBleHRlbmRzIEFic3RyYWN0V2ViU2VydmljZUxvY2F0b3IgewotCi0gICAgQE92ZXJyaWRlCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIExpc3QgZ2V0V2ViU2VydmljZUNsaWVudHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRXZWJTZXJ2aWNlQ2xpZW50cyhtb25pdG9yKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgTGlzdCBnZXRXZWJTZXJ2aWNlQ2xpZW50cyhJUHJvamVjdFtdIHByb2plY3RzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFdlYlNlcnZpY2VDbGllbnRzKHByb2plY3RzLCBtb25pdG9yKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgTGlzdCBnZXRXZWJTZXJ2aWNlcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICAgICAgSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLSAgICAgICAgcmV0dXJuIGdldFdlYlNlcnZpY2VzKHByb2plY3RzLCBtb25pdG9yKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgTGlzdCBnZXRXZWJTZXJ2aWNlcyhJUHJvamVjdFtdIHByb2plY3RzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICAgICAgTGlzdCB3ZWJTZXJ2aWNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChJUHJvamVjdCBwcm9qZWN0IDogcHJvamVjdHMpIHsKLSAgICAgICAgICAgIGlmIChKMkVFVXRpbHMuaXNXZWJDb21wb25lbnQocHJvamVjdCkpIHsKLSAgICAgICAgICAgICAgICB3ZWJTZXJ2aWNlcy5hZGRBbGwoZ2V0V2ViU2VydmljZXNGcm9tUHJvamVjdChwcm9qZWN0KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHdlYlNlcnZpY2VzOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHByaXZhdGUgTGlzdCBnZXRXZWJTZXJ2aWNlc0Zyb21Qcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzIxZDBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NzIxZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMzNThjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jRnJpIE5vdiAwNyAyMzo1ODo1MyBFU1QgMjAwOAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NWY3ODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWk7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLnVpLkNYRkNvbnN1bXB0aW9uVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi51aS53c3J0O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkiCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4yMDQsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjMwNCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMy4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Qud3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudjtidW5kbGUtdmVyc2lvbj0iWzEuMC4zMDUsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5jeGYudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwxLjEuMCkiLAotIGphdmF4LndzZGw7YnVuZGxlLXZlcnNpb249IlsxLjYuMiwxLjcuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMS4xLjApIgotQW50LVZlcnNpb246IEFwYWNoZSBBbnQgMS43LjAKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotQ3JlYXRlZC1CeTogMS41LjBfMTQtYjAzIChTdW4gTWljcm9zeXN0ZW1zIEluYy4pCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QxNjliZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5TZXB0ZW1iZXIgMTIsIDIwMDg8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzRiOGViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDI3NTA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPUNYRiBXZWIgU2VydmljZXMgQ29uc3VtcHRpb24gVUkKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLUpBWFdTX1dFQlNFUlZJQ0VUWVBFPVBPSk8gV2ViIFNlcnZpY2UKLQotSkFYV1NfQ0xJRU5UPUpBWC1XUyBTdHViClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk5ODFhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkud3NJbXBsIj4KLSAgICAgICAgPHdlYlNlcnZpY2VJbXBsCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi53c0ltcGwuamF2YSIKLSAgICAgICAgICAgIGxhYmVsPSIlSkFYV1NfV0VCU0VSVklDRVRZUEUiCi0gICAgICAgICAgICByZXNvdXJjZVR5cGVNZXRhZGF0YT0iRmlsZSBJUmVzb3VyY2UgQ29tcGlsYXRpb25Vbml0IgotICAgICAgICAgICAgZXh0ZW5zaW9uTWV0YWRhdGE9Ii5qYXZhIC5jbGFzcyIKLSAgICAgICAgICAgIG9iamVjdFNlbGVjdGlvbldpZGdldD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5DWEZKQVhXU1NlbGVjdGlvbldpZGdldCIKLSAgICAgICAgICAgIG1lcmdlckNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLkphdmFNZXJnZXIiPgotICAgICAgICA8L3dlYlNlcnZpY2VJbXBsPgotICAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICAgPCEtLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS53c0NsaWVudEltcGwiPgotICAgICAgPHdlYlNlcnZpY2VDbGllbnRJbXBsCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jbGllbnQudHlwZS5qYXZhIgotICAgICAgICAgICAgbGFiZWw9IiVKQVhXU19DTElFTlQiPgotICAgICAgPC93ZWJTZXJ2aWNlQ2xpZW50SW1wbD4KLSAgICA8L2V4dGVuc2lvbj4tLT4KLSAgIAotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5vYmplY3RTZWxlY3Rpb25XaWRnZXQiPgotICAgICAgICA8b2JqZWN0U2VsZWN0aW9uV2lkZ2V0Ci0gICAgICAgICAgICBjbGFzcz0iIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24udWkud2lkZ2V0cy5DWEZKQVhXU1NlbGVjdGlvbkxhdW5jaGFibGUiCi0gICAgICAgICAgICBleHRlcm5hbF9tb2RpZnk9InRydWUiCi0gICAgICAgICAgICBpZD0iIG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuQ1hGSkFYV1NTZWxlY3Rpb25XaWRnZXQiCi0gICAgICAgICAgICB0cmFuc2Zvcm1lcj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5KQVhXU1NlbGVjdGlvblRyYW5zZm9ybWVyIj4KLSAgICAgICAgPC9vYmplY3RTZWxlY3Rpb25XaWRnZXQ+Ci0gICAgPC9leHRlbnNpb24+Ci0gICAKLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0UmVnaXN0cnkiPgotICAgICAgICA8d2lkZ2V0RmFjdG9yeQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24udWkud2lkZ2V0cy5XU0RMMkphdmFDbGllbnRDb25maWdXaWRnZXRGYWN0b3J5IgotICAgICAgICAgICAgaWQ9IldTREwySmF2YUNsaWVudENvbmZpZyIKLSAgICAgICAgICAgICBpbnNlcnRCZWZvcmVDb21tYW5kSWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIj4KLSAgICAgICAgPC93aWRnZXRGYWN0b3J5PgotICAgIDwvZXh0ZW5zaW9uPgotCi0gICAgPCEtLSBXU0RMMkphdmEgLS0+Ci0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmFudERhdGFNYXBwaW5nIj4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJNYXBwaW5ncyIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJJbmNsdWRlZE5hbWVzcGFjZXMiCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuZW52LmFudC5NYXBwaW5nc1RyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0iQmluZGluZ3MiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ2xpZW50Q29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iQmluZGluZ0ZpbGVzIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLmVudi5hbnQuQmluZGluZ3NUcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9IkphdmFPdXRwdXQiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ2xpZW50Q29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iSmF2YVNvdXJjZUZvbGRlciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9IlNlcnZpY2VOYW1lIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNsaWVudENvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IlNlcnZpY2VOYW1lIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0iR2VuQ2xpZW50IgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNsaWVudENvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IkdlbmVyYXRlQ2xpZW50IgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0iR2VuU2VydmVyIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNsaWVudENvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IkdlbmVyYXRlU2VydmVyIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0iR2VuSW1wbCIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJHZW5lcmF0ZUltcGxlbWVudGF0aW9uIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0iRGVmYXVsdFZhbHVlcyIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJVc2VEZWZhdWx0VmFsdWVzIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0iRXh0U09BUEhlYWRlcnMiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ2xpZW50Q29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iUHJvY2Vzc1NPQVBIZWFkZXJzIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0iRGVmYXVsdE5hbWVzcGFjZSIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9IkRlZmF1bHRFeGNsdWRlc05hbWVzcGFjZSIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9IkF1dG9OYW1lUmVzb2x1dGlvbiIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJBdXRvTmFtZVJlc29sdXRpb24iCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJ4amNfZHYiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ2xpZW50Q29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iWGpjVXNlRGVmYXVsdFZhbHVlcyIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9InhqY190cyIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJYamNUb1N0cmluZyIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9InhqY190c19tdWx0aSIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJYamNUb1N0cmluZ011bHRpTGluZSIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9InhqY190c19zaW1wbGUiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ2xpZW50Q29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iWGpjVG9TdHJpbmdTaW1wbGUiCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJ4amNfbG9jYXRvciIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJYamNMb2NhdG9yIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0ieGpjX3N5bmNfbWV0aG9kcyIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJYamNTeW5jTWV0aG9kcyIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9InhqY19tYXJrX2dlbmVyYXRlZCIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJYamNNYXJrR2VuZXJhdGVkIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgPC9leHRlbnNpb24+Ci0gIDwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS9DWEZDb25zdW1wdGlvblVJTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS9DWEZDb25zdW1wdGlvblVJTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY4NDdiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvQ1hGQ29uc3VtcHRpb25VSU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIENYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gCi0gICAgICAgICJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLnVpLkNYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDWEZKQVhXU1NFTEVDVElPTkxBVU5DSEFCTEVfU0VMRUNUSU9OX0RJQUxPR19NRVNTQUdFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRkpBWFdTU0VMRUNUSU9OTEFVTkNIQUJMRV9TRUxFQ1RJT05fRElBTE9HX1RJVExFOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9DTElFTlRfUEFHRV9USVRMRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfQ0xJRU5UX1BBR0VfREVTQ1JJUFRJT047Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX0NsSUVOVF9ERUZBVUxUU19QQUdFX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9DTElFTlRfREVGQVVMVFNfUEFHRV9ERVNDUklQVElPTjsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfR1JPVVBfTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1hKQ19BUkdfR1JPVVBfTEFCRUw7Ci0gICAgCi0gICAgc3RhdGljIHsKLSAgICAgICAgLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLSAgICAgICAgTkxTLmluaXRpYWxpemVNZXNzYWdlcyhDWEZDb25zdW1wdGlvblVJTWVzc2FnZXMuQlVORExFX05BTUUsIENYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDWEZDb25zdW1wdGlvblVJTWVzc2FnZXMoKSB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL0NYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL0NYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDA2YjU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS9DWEZDb25zdW1wdGlvblVJTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1DWEZKQVhXU1NFTEVDVElPTkxBVU5DSEFCTEVfU0VMRUNUSU9OX0RJQUxPR19USVRMRT1Ccm93c2UgV29ya3NwYWNlIENsYXNzZXMgYW5kIEludGVyZmFjZXMKLUNYRkpBWFdTU0VMRUNUSU9OTEFVTkNIQUJMRV9TRUxFQ1RJT05fRElBTE9HX01FU1NBR0U9U2VsZWN0IHRoZSBKYXZhIENsYXNzIG9yIEludGVyZmFjZSB3aGljaCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBXZWIgU2VydmljZQotCi0jV1NETDJKYXZhIENsaWVudCBDb25naWggV2lkZ2V0IEZhY3RvcnkKLVdTREwySkFWQV9DTElFTlRfUEFHRV9USVRMRT17MH0gezF9IFdlYiBTZXJ2aWNlIFdTREwySmF2YSBDbGllbnQgQ29uZmlndXJhdGlvbgotV1NETDJKQVZBX0NMSUVOVF9QQUdFX0RFU0NSSVBUSU9OPUN1c3RvbWlzZSB5b3VyIFdlYiBTZXJ2aWNlIGdlbmVyYXRpb24gYnkgc2VsZWN0aW5nIG9wdGlvbnMgb24gdGhpcyBwYWdlCi0KLVdTREwySkFWQV9DbElFTlRfREVGQVVMVFNfUEFHRV9USVRMRT17MH0gezF9IFdlYiBTZXJ2aWNlIFdTREwySmF2YSBDbGllbnQgQ29uZmlndXJhdGlvbgotV1NETDJKQVZBX0NMSUVOVF9ERUZBVUxUU19QQUdFX0RFU0NSSVBUSU9OPUN1c3RvbWlzZSB5b3VyIFdlYiBTZXJ2aWNlIGdlbmVyYXRpb24gYnkgc2VsZWN0aW5nIG9wdGlvbnMgb24gdGhpcyBwYWdlCi0KLSNXU0RMMkphdmEgQ2xpZW50IERlZmF1bHRzIENvbmZpZyBXaWRnZXQKLVdTREwySkFWQV9HUk9VUF9MQUJFTD1XU0RMMkphdmEgR2VuZXJhdGlvbiBPcHRpb25zCi1XU0RMMkpBVkFfWEpDX0FSR19HUk9VUF9MQUJFTD1YSkMgQXJndW1lbnRzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL0NYRkNvbnN1bXB0aW9uVUlQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS9DWEZDb25zdW1wdGlvblVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2OWI1ZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL0NYRkNvbnN1bXB0aW9uVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24udWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDWEZDb25zdW1wdGlvblVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLSAgICAvLyBUaGUgcGx1Zy1pbiBJRAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotICAgIHByaXZhdGUgc3RhdGljIENYRkNvbnN1bXB0aW9uVUlQbHVnaW4gcGx1Z2luOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIENYRkNvbnN1bXB0aW9uVUlQbHVnaW4oKSB7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zdGFydChjb250ZXh0KTsKLSAgICAgICAgcGx1Z2luID0gdGhpczsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBwbHVnaW4gPSBudWxsOwotICAgICAgICBzdXBlci5zdG9wKGNvbnRleHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ1hGQ29uc3VtcHRpb25VSVBsdWdpbiBnZXREZWZhdWx0KCkgewotICAgICAgICByZXR1cm4gcGx1Z2luOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2dNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgQ1hGQ29uc3VtcHRpb25VSVBsdWdpbi5sb2cobmV3IFN0YXR1cyhzZXZlcml0eSwgQ1hGQ29uc3VtcHRpb25VSVBsdWdpbi5QTFVHSU5fSUQsIG1lc3NhZ2UpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgIENYRkNvbnN1bXB0aW9uVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSBleGNlcHRpb24pIHsKLSAgICAgICAgQ1hGQ29uc3VtcHRpb25VSVBsdWdpbi5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDb25zdW1wdGlvblVJUGx1Z2luLlBMVUdJTl9JRCwgCi0gICAgICAgICAgICBleGNlcHRpb24udG9TdHJpbmcoKSwgZXhjZXB0aW9uKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQ1hGSkFYV1NTZWxlY3Rpb25MYXVuY2hhYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9DWEZKQVhXU1NlbGVjdGlvbkxhdW5jaGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUzZDFkOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9DWEZKQVhXU1NlbGVjdGlvbkxhdW5jaGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFFbGVtZW50TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuU3RhbmRhcmRKYXZhRWxlbWVudENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLkFic3RyYWN0T2JqZWN0U2VsZWN0aW9uTGF1bmNoYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLnVpLkNYRkNvbnN1bXB0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLnVpLkNYRkNvbnN1bXB0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNlbGVjdGlvblNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIENYRkpBWFdTU2VsZWN0aW9uTGF1bmNoYWJsZSBleHRlbmRzIEFic3RyYWN0T2JqZWN0U2VsZWN0aW9uTGF1bmNoYWJsZSB7Ci0gICAgcHJpdmF0ZSBJU3RhdHVzIHZhbGlkYXRpb25TdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgIAotICAgIHByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLSAgICBwcml2YXRlIFN0cmluZyBzZXJ2ZXJDb21wb25lbnROYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZSA9ICIiOwotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbikgewotICAgICAgICBpZiAoaW5pdGlhbFNlbGVjdGlvbiAhPSBudWxsICYmICFpbml0aWFsU2VsZWN0aW9uLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgT2JqZWN0IGZpcnN0RWxlbWVudCA9IGluaXRpYWxTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgICAgICBpZiAoZmlyc3RFbGVtZW50IGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gZmlyc3RFbGVtZW50LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGxhdW5jaChTaGVsbCBzaGVsbCkgewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nIHNlbGVjdGlvbkRpYWxvZyA9IG5ldyBFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyhzaGVsbCwKLSAgICAgICAgICAgICAgICBuZXcgSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyKCksIG5ldyBTdGFuZGFyZEphdmFFbGVtZW50Q29udGVudFByb3ZpZGVyKCkpOwotICAgICAgICBzZWxlY3Rpb25EaWFsb2cuc2V0VGl0bGUoQ1hGQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkNYRkpBWFdTU0VMRUNUSU9OTEFVTkNIQUJMRV9TRUxFQ1RJT05fRElBTE9HX1RJVExFKTsKLSAgICAgICAgc2VsZWN0aW9uRGlhbG9nCi0gICAgICAgICAgICAgICAgLnNldE1lc3NhZ2UoQ1hGQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkNYRkpBWFdTU0VMRUNUSU9OTEFVTkNIQUJMRV9TRUxFQ1RJT05fRElBTE9HX01FU1NBR0UpOwotICAgICAgICBzZWxlY3Rpb25EaWFsb2cuc2V0QWxsb3dNdWx0aXBsZShmYWxzZSk7Ci0gICAgICAgIHNlbGVjdGlvbkRpYWxvZy5zZXRJbnB1dChKYXZhQ29yZS5jcmVhdGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSkpOwotICAgICAgICBzZWxlY3Rpb25EaWFsb2cuYWRkRmlsdGVyKG5ldyBKYXZhVmlld2VyRmlsdGVyKCkpOwotCi0gICAgICAgIHNlbGVjdGlvbkRpYWxvZy5zZXRWYWxpZGF0b3IobmV3IEphdmFTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3IoKSk7Ci0KLSAgICAgICAgaW50IHJldHVybkNvZGUgPSBzZWxlY3Rpb25EaWFsb2cub3BlbigpOwotICAgICAgICBpZiAocmV0dXJuQ29kZSA9PSBXaW5kb3cuT0spIHsKLSAgICAgICAgICAgIElDb21waWxhdGlvblVuaXQgc2VsZWN0ZWRDb21waWxhdGlvblVuaXQgPSAoSUNvbXBpbGF0aW9uVW5pdCkgc2VsZWN0aW9uRGlhbG9nLmdldEZpcnN0UmVzdWx0KCk7Ci0gICAgICAgICAgICBJVHlwZSB0eXBlID0gc2VsZWN0ZWRDb21waWxhdGlvblVuaXQuZmluZFByaW1hcnlUeXBlKCk7Ci0gICAgICAgICAgICBjbGFzc05hbWUgPSB0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBJUmVzb3VyY2UgdHlwZVJlc291cmNlID0gdHlwZS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKLSAgICAgICAgICAgICAgICBpZiAodHlwZVJlc291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9qZWN0ID0gdHlwZVJlc291cmNlLmdldFByb2plY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IFJlc291cmNlVXRpbHMuZ2V0Q29tcG9uZW50T2YodHlwZVJlc291cmNlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyQ29tcG9uZW50TmFtZSA9IGNvbXAuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZlckNvbXBvbmVudE5hbWUgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzLmdldFNldmVyaXR5KCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICAgICAgcHJvamVjdCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgc2VydmVyQ29tcG9uZW50TmFtZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gam1lLmdldFN0YXR1cygpOwotICAgICAgICAgICAgICAgIENYRkNvbnN1bXB0aW9uVUlQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1cy5nZXRTZXZlcml0eSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIElTdGF0dXMuQ0FOQ0VMOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRPYmplY3RTZWxlY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihjbGFzc05hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZlckNvbXBvbmVudE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0gICAgICAgICAgICBJU2VsZWN0aW9uU2VydmljZSBzZWxlY3Rpb25TZXJ2aWNlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotICAgICAgICAgICAgICAgIC5nZXRTZWxlY3Rpb25TZXJ2aWNlKCk7Ci0gICAgICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHNlbGVjdGlvblNlcnZpY2UuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBUcmVlU2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgVHJlZVNlbGVjdGlvbiB0cmVlU2VsZWN0aW9uID0gKFRyZWVTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLSAgICAgICAgICAgICAgICBPYmplY3QgZmlyc3RFbGVtZW50ID0gdHJlZVNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlyc3RFbGVtZW50IGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCkgewotICAgICAgICAgICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChJQ29tcGlsYXRpb25Vbml0KSBmaXJzdEVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIHByb2plY3QgPSBjb21waWxhdGlvblVuaXQuZ2V0UmVzb3VyY2UoKS5nZXRQcm9qZWN0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICByZXR1cm4gcHJvamVjdDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBvYmplY3RTZWxlY3Rpb24pIHsKLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdGF0dXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRPYmplY3RTZWxlY3Rpb25EaXNwbGF5YWJsZVN0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZShTdHJpbmcgc3RyaW5nVG9WYWxpZGF0ZSkgewotICAgICAgICBjbGFzc05hbWUgPSBzdHJpbmdUb1ZhbGlkYXRlOwotCi0gICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0gICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHZhbGlkYXRpb25TdGF0dXMgPSBKRFRVdGlscy52YWxpZGF0ZUphdmFUeXBlTmFtZShwcm9qZWN0LmdldE5hbWUoKSwgY2xhc3NOYW1lKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHZhbGlkYXRpb25TdGF0dXMgPSBKRFRVdGlscy52YWxpZGF0ZUphdmFUeXBlTmFtZShjbGFzc05hbWUpOwotICAgICAgICB9Ci0KLS8vICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotLy8gICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwpIHsKLS8vICAgICAgICAgICAgSVR5cGUgdHlwZSA9IEpEVFV0aWxzLmdldFR5cGUocHJvamVjdCwgY2xhc3NOYW1lKTsKLS8vICAgICAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCB8fCAhdHlwZS5leGlzdHMoKSkgewotLy8gICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ29uc3VtcHRpb25VSVBsdWdpbi5QTFVHSU5fSUQsICIiKTsKLS8vICAgICAgICAgICAgfSBlbHNlIHsKLS8vICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdGF0dXMgPSBKRFRVdGlscy52YWxpZGF0ZUphdmFUeXBlTmFtZShwcm9qZWN0LmdldE5hbWUoKSwgY2xhc3NOYW1lKTsKLS8vICAgICAgICAgICAgfQotLy8gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0YXR1cy5pc09LKCk7Ci0vLyAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0YXR1cy5pc09LKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEphdmFWaWV3ZXJGaWx0ZXIgZXh0ZW5kcyBWaWV3ZXJGaWx0ZXIgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50Um9vdCkgewotICAgICAgICAgICAgICAgICAgICBJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KSBlbGVtZW50OwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFja2FnZUZyYWdtZW50Um9vdC5nZXRLaW5kKCkgPT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudCkgewotICAgICAgICAgICAgICAgICAgICBJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA9IChJUGFja2FnZUZyYWdtZW50KSBlbGVtZW50OwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFja2FnZUZyYWdtZW50Lmhhc0NoaWxkcmVuKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCkgewotICAgICAgICAgICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChJQ29tcGlsYXRpb25Vbml0KSBlbGVtZW50OwotICAgICAgICAgICAgICAgICAgICBJVHlwZSB0eXBlID0gY29tcGlsYXRpb25Vbml0LmZpbmRQcmltYXJ5VHlwZSgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZS5pc0NsYXNzKCkgfHwgdHlwZS5pc0ludGVyZmFjZSgpOwotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgICAgIENYRkNvbnN1bXB0aW9uVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSmF2YVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvciBpbXBsZW1lbnRzIElTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3IgewotICAgICAgICBwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShPYmplY3RbXSBzZWxlY3Rpb24pIHsKLSAgICAgICAgICAgIGlmIChzZWxlY3Rpb24ubGVuZ3RoID09IDEpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uWzBdIGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBDWEZDb25zdW1wdGlvblVJUGx1Z2luLlBMVUdJTl9JRCwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ29uc3VtcHRpb25VSVBsdWdpbi5QTFVHSU5fSUQsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvV1NETDJKYXZhQ2xpZW50Q29uZmlnV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XU0RMMkphdmFDbGllbnRDb25maWdXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ5NGY4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XU0RMMkphdmFDbGllbnRDb25maWdXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS52aWV3ZXJzLlBhY2thZ2VOYW1lRWRpdGluZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS52aWV3ZXJzLlBhY2thZ2VOYW1lVGFibGVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aWRnZXRzLldTREwySmF2YVdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBXU0RMMkphdmFDbGllbnRDb25maWdXaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IgewotICAgIHByaXZhdGUgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgIHByaXZhdGUgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXI7Ci0KLSAgICBwcml2YXRlIFdTREwySmF2YURhdGFNb2RlbCBtb2RlbDsKLQotICAgIHByaXZhdGUgQ29tcG9zaXRlIG5hbWVzcGFjZUNvbXBvc2l0ZUhvbGRlcjsKLSAgICBwcml2YXRlIENvbXBvc2l0ZSBuYW1lc3BhY2VDb21wb3NpdGU7Ci0gICAgcHJpdmF0ZSBpbnQgbmFtZXNwYWNlQ29tcG9zaXRlSGVpZ2h0ID0gLTE7Ci0KLSAgICBwdWJsaWMgV1NETDJKYXZhQ2xpZW50Q29uZmlnV2lkZ2V0KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFdTREwySmF2YURhdGFNb2RlbChXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyKSB7Ci0gICAgICAgIHRoaXMuc3RhdHVzTGlzdGVuZXIgPSBzdGF0dXNMaXN0ZW5lcjsKLQotICAgICAgICBmaW5hbCBDb21wb3NpdGUgbWFpbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLSAgICAgICAgbWFpbkNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgbWFpbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICAvLyBPdXRwdXQgRGlyCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlT3V0cHV0RGlyZWN0b3J5TGFiZWwobWFpbkNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgQ29tYm8gb3V0cHV0RGlyQ29tYm8gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZU91dHB1dERpcmVjdG9yeUNvbWJvKG1haW5Db21wb3NpdGUsIG1vZGVsKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBvdXRwdXREaXJDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICAvLyBQYWNrYWdlIE5hbWU6Ci0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlUGFja2FnZU5hbWVMYWJlbChtYWluQ29tcG9zaXRlKTsKLQotICAgICAgICBmaW5hbCBUZXh0IHBhY2thZ2VOYW1lVGV4dCA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlUGFja2FnZU5hbWVUZXh0KG1haW5Db21wb3NpdGUsIG1vZGVsKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBwYWNrYWdlTmFtZVRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgcGFja2FnZU5hbWVUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lVGV4dC5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gSkRUVXRpbHMudmFsaWRhdGVQYWNrYWdlTmFtZShtb2RlbC5nZXRQcm9qZWN0TmFtZSgpLCBwYWNrYWdlTmFtZSk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzTGlzdGVuZXIuaGFuZGxlRXZlbnQobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGZpbmFsIEJ1dHRvbiBuYW1lc3BhY2VNYXBwaW5nQnV0dG9uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVOYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbihtYWluQ29tcG9zaXRlKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgbmFtZXNwYWNlTWFwcGluZ0J1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgbmFtZXNwYWNlTWFwcGluZ0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VNYXBwaW5nQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VDb21wb3NpdGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSA3OwotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlSG9sZGVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlSG9sZGVyLnBhY2soKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlID0gZ2V0TmFtZXNwYWNlTWFwcGluZ0NvbXBvc2l0ZShuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZUNvbXBvc2l0ZUhlaWdodCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50IGdyb3VwU2l6ZSA9IG5hbWVzcGFjZUNvbXBvc2l0ZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZUhlaWdodCA9IGdyb3VwU2l6ZS55OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgU2hlbGwgc2hlbGwgPSBwYXJlbnQuZ2V0U2hlbGwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50IHNoZWxsU2l6ZSA9IHNoZWxsLmdldFNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNoZWxsLnNldFNpemUoc2hlbGxTaXplLngsIHNoZWxsU2l6ZS55ICsgbmFtZXNwYWNlQ29tcG9zaXRlSGVpZ2h0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlSG9sZGVyLmxheW91dCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZUNvbXBvc2l0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIucGFjaygpOwotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIubGF5b3V0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTaGVsbCBzaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnQgc2hlbGxTaXplID0gc2hlbGwuZ2V0U2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2hlbGwuc2V0U2l6ZShzaGVsbFNpemUueCwgc2hlbGxTaXplLnkgLSBuYW1lc3BhY2VDb21wb3NpdGVIZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIgPSBuZXcgQ29tcG9zaXRlKG1haW5Db21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlSG9sZGVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIC8vIFNlcnZpY2UgTmFtZToKLSAgICAgICAgLy8gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlU2VydmljZU5hbWVMYWJlbChtYWluQ29tcG9zaXRlKTsKLSAgICAgICAgLy8KLSAgICAgICAgLy8gICAgICAgIENvbWJvIHNlcnZpY2VOYW1lQ29tYm8gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVNlcnZpY2VOYW1lQ29tYm8obWFpbkNvbXBvc2l0ZSwgbW9kZWwpOwotICAgICAgICAvLyAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIC8vICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIC8vICAgICAgICBzZXJ2aWNlTmFtZUNvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIExhYmVsIGJpbmRpbmdGaWxlc0xhYmVsID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVCaW5kaW5nRmlsZXNMYWJlbChtYWluQ29tcG9zaXRlKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSAzOwotICAgICAgICBiaW5kaW5nRmlsZXNMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBMaXN0IGJpbmRpbmdGaWxlc0xpc3QgPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZUJpbmRpbmdGaWxlc0xpc3QobWFpbkNvbXBvc2l0ZSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSAzOwotICAgICAgICBiaW5kaW5nRmlsZXNMaXN0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIEJ1dHRvbiBhZGRCaW5kaW5nRmlsZUJ1dHRvbiA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlQWRkQmluZGluZ0ZpbGVCdXR0b24obWFpbkNvbXBvc2l0ZSwgbW9kZWwsCi0gICAgICAgICAgICAgICAgYmluZGluZ0ZpbGVzTGlzdCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgYWRkQmluZGluZ0ZpbGVCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgQnV0dG9uIHJlbW92ZUJpbmRpbmdGaWxlQnV0dG9uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVSZW1vdmVCaW5kaW5nRmlsZUJ1dHRvbihtYWluQ29tcG9zaXRlLAotICAgICAgICAgICAgICAgIG1vZGVsLCBiaW5kaW5nRmlsZXNMaXN0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICByZW1vdmVCaW5kaW5nRmlsZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVBhZGRpbmdMYWJlbChtYWluQ29tcG9zaXRlKTsKLQotICAgICAgICAvKgotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhNTENhdGFsb2dMYWJlbChtYWluQ29tcG9zaXRlKTsKLQotICAgICAgICBUZXh0IHhtbENhdGFsb2dUZXh0ID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYTUxDYXRhbG9nVGV4dChtYWluQ29tcG9zaXRlLCBtb2RlbCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB4bWxDYXRhbG9nVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhNTENhdGFsb2dCcm93c2VCdXR0b24obWFpbkNvbXBvc2l0ZSk7Ci0gICAgICAgICAqLwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGFibGUgY3JlYXRlTmFtZXNwYWNlTWFwcGluZ1RhYmxlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgVGFibGVWaWV3ZXIgcGFja2FnZU5hbWVUYWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihwYXJlbnQsIFNXVC5DSEVDSyB8IFNXVC5NVUxUSSB8IFNXVC5CT1JERVIKLSAgICAgICAgICAgICAgICB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0KLSAgICAgICAgZmluYWwgVGFibGUgcGFja2FnZU5hbWVUYWJsZSA9IHBhY2thZ2VOYW1lVGFibGVWaWV3ZXIuZ2V0VGFibGUoKTsKLSAgICAgICAgcGFja2FnZU5hbWVUYWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0gICAgICAgIHBhY2thZ2VOYW1lVGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQotICAgICAgICBUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotICAgICAgICBwYWNrYWdlTmFtZVRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0KLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVXU0RMTmFtZXNwYWNlVmlld2VyQ29sdW1uKHBhY2thZ2VOYW1lVGFibGVWaWV3ZXIpOwotCi0gICAgICAgIENvbHVtbldlaWdodERhdGEgY29sdW1uV2VpZ2h0RGF0YSA9IG5ldyBDb2x1bW5XZWlnaHREYXRhKDEwMCwgMTAwLCB0cnVlKTsKLSAgICAgICAgdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShjb2x1bW5XZWlnaHREYXRhKTsKLQotICAgICAgICBUYWJsZVZpZXdlckNvbHVtbiBwYWNrYWdlTmFtZVZpZXdlckNvbHVtbiA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlUGFja2FnZU5hbWVDb2x1bW4oCi0gICAgICAgICAgICAgICAgcGFja2FnZU5hbWVUYWJsZVZpZXdlciwgbW9kZWwpOwotCi0gICAgICAgIFRleHRDZWxsRWRpdG9yIHRleHRDZWxsRWRpdG9yID0gbmV3IFRleHRDZWxsRWRpdG9yKHBhY2thZ2VOYW1lVGFibGVWaWV3ZXIuZ2V0VGFibGUoKSk7Ci0gICAgICAgIHRleHRDZWxsRWRpdG9yLmFkZExpc3RlbmVyKCBuZXcgSUNlbGxFZGl0b3JMaXN0ZW5lcigpIHsKLQotICAgICAgICAgICAgcHVibGljIHZvaWQgZWRpdG9yVmFsdWVDaGFuZ2VkKGJvb2xlYW4gb2xkVmFsaWRTdGF0ZSwgYm9vbGVhbiBuZXdWYWxpZFN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzTGlzdGVuZXIuaGFuZGxlRXZlbnQobnVsbCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNhbmNlbEVkaXRvcigpIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgYXBwbHlFZGl0b3JWYWx1ZSgpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgdGV4dENlbGxFZGl0b3Iuc2V0VmFsaWRhdG9yKG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBpc1ZhbGlkKE9iamVjdCBwYWNrYWdlTmFtZSkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IEpEVFV0aWxzLnZhbGlkYXRlUGFja2FnZU5hbWUobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSwgcGFja2FnZU5hbWUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0spIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXMuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBwYWNrYWdlTmFtZVZpZXdlckNvbHVtbi5zZXRFZGl0aW5nU3VwcG9ydChuZXcgUGFja2FnZU5hbWVFZGl0aW5nU3VwcG9ydChwYWNrYWdlTmFtZVRhYmxlVmlld2VyLAotICAgICAgICAgICAgICAgIHRleHRDZWxsRWRpdG9yLCBtb2RlbCkpOwotCi0gICAgICAgIGNvbHVtbldlaWdodERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxMDAsIDEwMCwgdHJ1ZSk7Ci0gICAgICAgIHRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoY29sdW1uV2VpZ2h0RGF0YSk7Ci0KLSAgICAgICAgcGFja2FnZU5hbWVUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFBhY2thZ2VOYW1lVGFibGVDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgICAgIHBhY2thZ2VOYW1lVGFibGVWaWV3ZXIuc2V0SW5wdXQobW9kZWwuZ2V0V3NkbERlZmluaXRpb24oKSk7Ci0KLSAgICAgICAgVGFibGVJdGVtW10gdGFibGVJdGVtcyA9IHBhY2thZ2VOYW1lVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlSXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFRhYmxlSXRlbSB0YWJsZUl0ZW0gPSB0YWJsZUl0ZW1zW2ldOwotICAgICAgICAgICAgaWYgKG1vZGVsLmdldEluY2x1ZGVkTmFtZXNwYWNlcygpLmNvbnRhaW5zS2V5KHRhYmxlSXRlbS5nZXRUZXh0KDApKSkgewotICAgICAgICAgICAgICAgIHRhYmxlSXRlbS5zZXRDaGVja2VkKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYWNrYWdlTmFtZVRhYmxlOwotICAgIH0KLQotICAgIHByaXZhdGUgQ29tcG9zaXRlIGdldE5hbWVzcGFjZU1hcHBpbmdDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIFRhYmxlIHBhY2thZ2VOYW1lVGFibGUgPSBjcmVhdGVOYW1lc3BhY2VNYXBwaW5nVGFibGUobmFtZXNwYWNlQ29tcG9zaXRlKTsKLQotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIGdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IDY7Ci0gICAgICAgIHBhY2thZ2VOYW1lVGFibGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZUNvbXBvc2l0ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XU0RMMkphdmFDbGllbnRDb25maWdXaWRnZXRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XU0RMMkphdmFDbGllbnRDb25maWdXaWRnZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ODI4YTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvV1NETDJKYXZhQ2xpZW50Q29uZmlnV2lkZ2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNsaWVudERlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24udWkuQ1hGQ29uc3VtcHRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLklOYW1lZFdpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLklOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgV1NETDJKYXZhQ2xpZW50Q29uZmlnV2lkZ2V0RmFjdG9yeSBpbXBsZW1lbnRzIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSB7Ci0gICAgcHJpdmF0ZSBTaW1wbGVXaWRnZXRDb250cmlidXRvciB3c2RsMkphdmFDbGllbnRXaWRnZXRDb250cmlidXRvcjsKLSAgICBwcml2YXRlIFNpbXBsZVdpZGdldENvbnRyaWJ1dG9yIHdzZGwySmF2YUNsaWVudERlZmF1bHRzV2lkZ2V0Q29udHJpYnV0b3I7Ci0KLSAgICBwcml2YXRlIFdTREwySmF2YUNsaWVudENvbmZpZ1dpZGdldCB3c2RsMkphdmFDb25maWdXaWRnZXQgPSBuZXcgV1NETDJKYXZhQ2xpZW50Q29uZmlnV2lkZ2V0KCk7Ci0gICAgcHJpdmF0ZSBXU0RMMkphdmFDbGllbnREZWZhdWx0c0NvbmZpZ1dpZGdldCB3c2RsMkphdmFDbGllbnREZWZhdWx0c0NvbmZpZ1dpZGdldCA9IG5ldyBXU0RMMkphdmFDbGllbnREZWZhdWx0c0NvbmZpZ1dpZGdldCgpOwotCi0gICAgcHVibGljIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIGdldEZpcnN0TmFtZWRXaWRnZXQoKSB7Ci0gICAgICAgIGlmICh3c2RsMkphdmFDbGllbnRXaWRnZXRDb250cmlidXRvciA9PSBudWxsCi0gICAgICAgICAgICAgICAgfHwgd3NkbDJKYXZhQ2xpZW50RGVmYXVsdHNXaWRnZXRDb250cmlidXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbml0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHdzZGwySmF2YUNsaWVudFdpZGdldENvbnRyaWJ1dG9yOwotICAgIH0KLQotICAgIHB1YmxpYyBJTmFtZWRXaWRnZXRDb250cmlidXRvciBnZXROZXh0TmFtZWRXaWRnZXQoSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3Igd2lkZ2V0Q29udHJpYnV0b3IpIHsKLSAgICAgICAgaWYgKHdpZGdldENvbnRyaWJ1dG9yID09IHdzZGwySmF2YUNsaWVudFdpZGdldENvbnRyaWJ1dG9yKSB7Ci0gICAgICAgICAgICByZXR1cm4gd3NkbDJKYXZhQ2xpZW50RGVmYXVsdHNXaWRnZXRDb250cmlidXRvcjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkgewotICAgICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMMkphdmFDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywKLSAgICAgICAgICAgICAgICAiV1NETDJKYXZhRGF0YU1vZGVsIiwgV1NETDJKYXZhQ2xpZW50Q29uZmlnV2lkZ2V0RmFjdG9yeS5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXU0RMMkphdmFEYXRhTW9kZWwoV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHdzZGwySmF2YUNvbmZpZ1dpZGdldC5zZXRXU0RMMkphdmFEYXRhTW9kZWwobW9kZWwpOwotICAgICAgICB3c2RsMkphdmFDbGllbnREZWZhdWx0c0NvbmZpZ1dpZGdldC5zZXRXU0RMMkphdmFEYXRhTW9kZWwobW9kZWwpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0KCkgewotICAgICAgICB3c2RsMkphdmFDbGllbnRXaWRnZXRDb250cmlidXRvciA9IG5ldyBTaW1wbGVXaWRnZXRDb250cmlidXRvcigpOwotICAgICAgICBDWEZDb250ZXh0IGNvbnRleHQgPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXU0RMMkphdmFDb250ZXh0KCk7Ci0gICAgICAgIFN0cmluZyB3c2RsMkphdmFDbGllbnRQYWdlVGl0bGUgPSBDWEZDb25zdW1wdGlvblVJTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICBDWEZDb25zdW1wdGlvblVJTWVzc2FnZXMuV1NETDJKQVZBX0NMSUVOVF9QQUdFX1RJVExFLCBuZXcgT2JqZWN0W117Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVHlwZSgpLCBjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVmVyc2lvbigpfSk7Ci0gICAgICAgIHdzZGwySmF2YUNsaWVudFdpZGdldENvbnRyaWJ1dG9yLnNldFRpdGxlKHdzZGwySmF2YUNsaWVudFBhZ2VUaXRsZSk7Ci0gICAgICAgIHdzZGwySmF2YUNsaWVudFdpZGdldENvbnRyaWJ1dG9yCi0gICAgICAgIC5zZXREZXNjcmlwdGlvbihDWEZDb25zdW1wdGlvblVJTWVzc2FnZXMuV1NETDJKQVZBX0NMSUVOVF9QQUdFX0RFU0NSSVBUSU9OKTsKLSAgICAgICAgd3NkbDJKYXZhQ2xpZW50V2lkZ2V0Q29udHJpYnV0b3Iuc2V0RmFjdG9yeShuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkgewotICAgICAgICAgICAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gd3NkbDJKYXZhQ29uZmlnV2lkZ2V0OwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB3c2RsMkphdmFDbGllbnREZWZhdWx0c1dpZGdldENvbnRyaWJ1dG9yID0gbmV3IFNpbXBsZVdpZGdldENvbnRyaWJ1dG9yKCk7Ci0gICAgICAgIFN0cmluZyB3c2RsMkphdmFDbGllbnREZWZhdWx0c1BhZ2VUaXRsZSA9IENYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgIENYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5XU0RMMkpBVkFfQ2xJRU5UX0RFRkFVTFRTX1BBR0VfVElUTEUsIG5ldyBPYmplY3RbXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVHlwZSgpLCBjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVmVyc2lvbigpfSk7Ci0gICAgICAgIHdzZGwySmF2YUNsaWVudERlZmF1bHRzV2lkZ2V0Q29udHJpYnV0b3Iuc2V0VGl0bGUod3NkbDJKYXZhQ2xpZW50RGVmYXVsdHNQYWdlVGl0bGUpOwotICAgICAgICB3c2RsMkphdmFDbGllbnREZWZhdWx0c1dpZGdldENvbnRyaWJ1dG9yCi0gICAgICAgIC5zZXREZXNjcmlwdGlvbihDWEZDb25zdW1wdGlvblVJTWVzc2FnZXMuV1NETDJKQVZBX0NMSUVOVF9ERUZBVUxUU19QQUdFX0RFU0NSSVBUSU9OKTsKLSAgICAgICAgd3NkbDJKYXZhQ2xpZW50RGVmYXVsdHNXaWRnZXRDb250cmlidXRvci5zZXRGYWN0b3J5KG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkgewotICAgICAgICAgICAgICAgIHJldHVybiB3c2RsMkphdmFDbGllbnREZWZhdWx0c0NvbmZpZ1dpZGdldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XU0RMMkphdmFDbGllbnREZWZhdWx0c0NvbmZpZ1dpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvV1NETDJKYXZhQ2xpZW50RGVmYXVsdHNDb25maWdXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM0OWY2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XU0RMMkphdmFDbGllbnREZWZhdWx0c0NvbmZpZ1dpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi51aS5DWEZDb25zdW1wdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuQ1hGTW9kZWxVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHMuV1NETDJKYXZhV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBXU0RMMkphdmFDbGllbnREZWZhdWx0c0NvbmZpZ1dpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvciB7Ci0KLSAgICBwcml2YXRlIFdTREwySmF2YURhdGFNb2RlbCBtb2RlbDsKLQotICAgIHB1YmxpYyBXU0RMMkphdmFDbGllbnREZWZhdWx0c0NvbmZpZ1dpZGdldCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXU0RMMkphdmFEYXRhTW9kZWwoV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyhmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcikgewotICAgICAgICBmaW5hbCBDb21wb3NpdGUgbWFpbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKTsKLSAgICAgICAgbWFpbkNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgbWFpbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBHcm91cCB3c2RsMmphdmFHcm91cCA9IG5ldyBHcm91cChtYWluQ29tcG9zaXRlLCBTV1QuU0hBRE9XX0lOKTsKLSAgICAgICAgd3NkbDJqYXZhR3JvdXAuc2V0VGV4dChDWEZDb25zdW1wdGlvblVJTWVzc2FnZXMuV1NETDJKQVZBX0dST1VQX0xBQkVMKTsKLSAgICAgICAgR3JpZExheW91dCB3c2RsMmphdmFsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgd3NkbDJqYXZhR3JvdXAuc2V0TGF5b3V0KHdzZGwyamF2YWxheW91dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB3c2RsMmphdmFHcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICAvLyAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVHZW5lcmF0ZVNlcnZlckJ1dHRvbih3c2RsMmphdmFHcm91cCwgbW9kZWwpOwotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZUdlbmVyYXRlSW1wbGVtZW50YXRpb25CdXR0b24od3NkbDJqYXZhR3JvdXAsIG1vZGVsKTsKLQotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZURlZmF1bHRWYWx1ZXNCdXR0b24od3NkbDJqYXZhR3JvdXAsIG1vZGVsKTsKLQotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbih3c2RsMmphdmFHcm91cCwgbW9kZWwpOwotCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlTmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b24od3NkbDJqYXZhR3JvdXAsIG1vZGVsKTsKLQotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZUV4Y2x1ZGVzTmFtZXNwYWNlTWFwcGluZ0J1dHRvbih3c2RsMmphdmFHcm91cCwgbW9kZWwpOwotCi0gICAgICAgIGlmIChDWEZNb2RlbFV0aWxzLmlzQXV0b05hbWVSZXNvbHV0aW9uUGVybWl0dGVkKCkpIHsKLSAgICAgICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlQXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uKHdzZGwyamF2YUdyb3VwLCBtb2RlbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobW9kZWwuZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCkuY29tcGFyZVRvKENYRkNvcmVQbHVnaW4uQ1hGX1ZFUlNJT05fMl8xKSA+PSAwKSB7Ci0gICAgICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZU5vQWRkcmVzc0JpbmRpbmdCdXR0b24od3NkbDJqYXZhR3JvdXAsIG1vZGVsKTsKLSAgICAgICAgfQotCi0gICAgICAgIEdyb3VwIHhqY0FyZ0dyb3VwID0gbmV3IEdyb3VwKG1haW5Db21wb3NpdGUsIFNXVC5TSEFET1dfSU4pOwotICAgICAgICB4amNBcmdHcm91cC5zZXRUZXh0KENYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5XU0RMMkpBVkFfWEpDX0FSR19HUk9VUF9MQUJFTCk7Ci0gICAgICAgIEdyaWRMYXlvdXQgeGpjQXJnTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIHhqY0FyZ0dyb3VwLnNldExheW91dCh4amNBcmdMYXlvdXQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgeGpjQXJnR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgVGFibGUgeGpjQXJnc1RhYmxlID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNBcmdUYWJsZSh4amNBcmdHcm91cCwgbW9kZWwpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIGdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IDY7Ci0gICAgICAgIHhqY0FyZ3NUYWJsZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ0RlZmF1bHRWYWx1ZXNUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBtb2RlbCk7Ci0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDVG9TdHJpbmdUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBtb2RlbCk7Ci0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDVG9TdHJpbmdNdWx0aUxpbmVUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBtb2RlbCk7Ci0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDVG9TdHJpbmdTaW1wbGVUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBtb2RlbCk7Ci0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDTG9jYXRvclRhYmxlSXRlbSh4amNBcmdzVGFibGUsIG1vZGVsKTsKLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNTeW5jTWV0aG9kc1RhYmxlSXRlbSh4amNBcmdzVGFibGUsIG1vZGVsKTsKLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNNYXJrR2VuZXJhdGVkVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgbW9kZWwpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9KQVhXU1NlbGVjdGlvblRyYW5zZm9ybWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvSkFYV1NTZWxlY3Rpb25UcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDE3ZTc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9KQVhXU1NlbGVjdGlvblRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24udWkuQ1hGQ29uc3VtcHRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLlRyYW5zZm9ybWVyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIEpBWFdTU2VsZWN0aW9uVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lciB7Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHRyYW5zZm9ybShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLSAgICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZhbHVlOwotICAgICAgICAgICAgT2JqZWN0IHNlbGVjdGlvbiA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSUZpbGUpIHsKLSAgICAgICAgICAgICAgICBJRmlsZSBmaWxlID0gKElGaWxlKSBzZWxlY3Rpb247Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkSmF2YU5hbWUgPSB0aGlzLmdldEZ1bGx5UXVhbGlmaWVkSmF2YU5hbWUoZmlsZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGZ1bGx5UXVhbGlmaWVkSmF2YU5hbWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KSB7Ci0gICAgICAgICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gKChJQ29tcGlsYXRpb25Vbml0KSBzZWxlY3Rpb24pLmdldFJlc291cmNlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgSUZpbGUgZmlsZSA9IChJRmlsZSkgcmVzb3VyY2U7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBmdWxseVF1YWxpZmllZEphdmFOYW1lID0gdGhpcy5nZXRGdWxseVF1YWxpZmllZEphdmFOYW1lKGZpbGUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZnVsbHlRdWFsaWZpZWRKYXZhTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgIHJldHVybiBzdHJ1Y3R1cmVkU2VsZWN0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZEphdmFOYW1lKElGaWxlIHJlc291cmNlKSB7Ci0gICAgICAgIElQcm9qZWN0IHByb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0KLSAgICAgICAgSVBhdGggcGF0aCA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCk7Ci0KLSAgICAgICAgaWYgKHBhdGguZ2V0RmlsZUV4dGVuc2lvbigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBhdGggPSBwYXRoLnJlbW92ZUZpbGVFeHRlbnNpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBqYXZhRmlsZU5hbWUgPSBwYXRoLmxhc3RTZWdtZW50KCk7Ci0KLSAgICAgICAgaWYgKHBhdGguaXNBYnNvbHV0ZSgpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElQYXRoIGphdmFGb2xkZXJQYXRoID0gcGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0gICAgICAgICAgICAgICAgSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCkuZmluZFBhY2thZ2VGcmFnbWVudCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmFGb2xkZXJQYXRoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcGFja2FnZUZyYWdtZW50LmdldEVsZW1lbnROYW1lKCkgKyAiLiIgKyBqYXZhRmlsZU5hbWU7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgICAgICBDWEZDb25zdW1wdGlvblVJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBqYXZhRmlsZU5hbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL3dzcnQvQ1hGV2ViU2VydmljZUNsaWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL3dzcnQvQ1hGV2ViU2VydmljZUNsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDA4NmMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS93c3J0L0NYRldlYlNlcnZpY2VDbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczogCi0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLnVpLndzcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNsaWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNsaWVudERlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuSUNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LkFic3RyYWN0V2ViU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LldlYlNlcnZpY2VDbGllbnRJbmZvOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIENYRldlYlNlcnZpY2VDbGllbnQgZXh0ZW5kcyBBYnN0cmFjdFdlYlNlcnZpY2VDbGllbnQgewotCi0gICAgcHVibGljIENYRldlYlNlcnZpY2VDbGllbnQoV2ViU2VydmljZUNsaWVudEluZm8gaW5mbykgewotICAgICAgICBzdXBlcihpbmZvKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGFzc2VtYmxlKElFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsIFN0cmluZyBwcm9qZWN0LAotICAgICAgICAgICAgU3RyaW5nIGVhclByb2plY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElDb21tYW5kRmFjdG9yeSBkZXBsb3koSUVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwgU3RyaW5nIHByb2plY3QsCi0gICAgICAgICAgICBTdHJpbmcgZWFyUHJvamVjdCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGRldmVsb3AoSUVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwgU3RyaW5nIHByb2plY3ROYW1lLAotICAgICAgICAgICAgU3RyaW5nIGVhclByb2plY3QpIHsKLQotICAgICAgICBWZWN0b3IgY29tbWFuZHMgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICAgICAgV1NETDJKYXZhRGF0YU1vZGVsIHdzZGwySmF2YU1vZGVsID0gQ1hGRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV1NETDJKYXZhRGF0YU1vZGVsKCk7Ci0gICAgICAgIGNvbW1hbmRzLmFkZChuZXcgV1NETDJKYXZhQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQod3NkbDJKYXZhTW9kZWwsIHByb2plY3ROYW1lLCAKLSAgICAgICAgCQlnZXRXZWJTZXJ2aWNlQ2xpZW50SW5mbygpLmdldFdzZGxVUkwoKSkpOwotICAgICAgICBjb21tYW5kcy5hZGQobmV3IFdTREwySmF2YUNsaWVudENvbW1hbmQod3NkbDJKYXZhTW9kZWwpKTsKLQotICAgICAgICByZXR1cm4gbmV3IFNpbXBsZUNvbW1hbmRGYWN0b3J5KGNvbW1hbmRzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGluc3RhbGwoSUVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwgU3RyaW5nIHByb2plY3QsCi0gICAgICAgICAgICBTdHJpbmcgZWFyUHJvamVjdCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IHJ1bihJRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLCBTdHJpbmcgcHJvamVjdCwKLSAgICAgICAgICAgIFN0cmluZyBlYXJQcm9qZWN0KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzI4MDgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUwMjMyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNGU4ZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jRnJpIE5vdiAwNyAyMzo1ODo1NCBFU1QgMjAwOAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWRkZGU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZTsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aSwKLSAgIG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWksCi0gICBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpLAotICAgb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuY29udGV4dDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpLG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZSxvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5lbnYuYW50O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpLAotICAgb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlLAotICAgb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aSwKLSAgIG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWksCi0gICBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnJlc291cmNlczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUsb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHM7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYudWksCi0gICBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpLAotICAgb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlLAotICAgb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aSwKLSAgIG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZSIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWk7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLmplbTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDIuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52O2J1bmRsZS12ZXJzaW9uPSJbMS4wLjMwNSwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cztidW5kbGUtdmVyc2lvbj0iWzEuMC4zMDQsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuY29kZWdlbjtidW5kbGUtdmVyc2lvbj0iWzIuNC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmc7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMy4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBqYXZheC53c2RsO2J1bmRsZS12ZXJzaW9uPSJbMS42LjIsMS43LjApIiwKLSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuY29uc29sZTtidW5kbGUtdmVyc2lvbj0iWzMuMy4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMi40LjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuYXB0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjMuMTAwLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4yMDQsMS4xLjApIiwKLSBqYXZheC5qd3M7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwyLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDEuMS4wKSIKLUFudC1WZXJzaW9uOiBBcGFjaGUgQW50IDEuNy4wCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUNyZWF0ZWQtQnk6IDEuNS4wXzE0LWIwMyAoU3VuIE1pY3Jvc3lzdGVtcyBJbmMuKQotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUltcG9ydC1QYWNrYWdlOiBqYXZheC54bWwud3M7dmVyc2lvbj0iMi4xLjAiLAotIG9yZy5qZG9tO3ZlcnNpb249IjEuMC4wIiwKLSBvcmcuamRvbS5pbnB1dDt2ZXJzaW9uPSIxLjAuMCIsCi0gb3JnLmpkb20ub3V0cHV0O3ZlcnNpb249IjEuMC4wIgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMTY5YmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5TZXB0ZW1iZXIgMTIsIDIwMDg8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9hYm91dC5pbmkgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYjkzZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yIGZlYXR1cmUgZGV0YWlscyBpbiB0aGUgIkFib3V0IiAKLSMgZGlhbG9nICh0cmFuc2xhdGVkKS4gIE1heGltdW0gMTUgbGluZXMgYW5kIDc1IGNoYXJhY3RlcnMgcGVyIGxpbmUuCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9hYm91dC5tYXBwaW5ncyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvYWJvdXQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZTkyNDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9Q1hGIFdlYiBTZXJ2aWNlc1xuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA4LCAyMDEwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvXG5cCi1cbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0N2JhMjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgam1lcmdlci8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGljb25zLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL2ljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMDljMmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL2ljb25zL3ZpZXcxNi9jb25zb2xlX3ZpZXcuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvaWNvbnMvdmlldzE2L2NvbnNvbGVfdmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1OThmNjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvaWNvbnMvdmlldzE2L2NvbnNvbGVfdmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9qbWVyZ2VyL21lcmdlLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL2ptZXJnZXIvbWVyZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDJkZDMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL2ptZXJnZXIvbWVyZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gTWVyZ2UgcnVsZXMgdXNlZCBieSBKTWVyZ2VyIC0tPgotPG1lcmdlOm9wdGlvbnMgCi0JeG1sbnM6bWVyZ2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2VjbGlwc2UvZW1mL2NvZGVnZW4vam1lcmdlL09wdGlvbnMiPgotCQotCTwhLS0gaWYgdGFyZ2V0IGlzIGdlbmVyYXRlZCwgdHJhbnNmZXIgLS0+Ci0gICAgPCEtLSBjaGFuZ2UgdG8gc291cmNlTWFya3VwIGlmIHRoZSBzb3VyY2UgaXMgdGhlIHN0YW5kYXJkIC0tPgotICAgIDxtZXJnZTpwdWxsIAotICAgICAgICBzb3VyY2VHZXQ9Ik1ldGhvZC9nZXRCb2R5IgotICAgICAgICBzb3VyY2VUcmFuc2Zlcj0iKFxzKi8vXHMqYmVnaW4tdXNlci1jb2RlLio/Ly9ccyplbmQtdXNlci1jb2RlXHMqKVxuIgotICAgICAgICB0YXJnZXRQdXQ9Ik1ldGhvZC9zZXRCb2R5Ii8+Ci0JCi0JPG1lcmdlOnB1bGwgCi0JCXNvdXJjZUdldD0iTWV0aG9kL2dldFJldHVyblR5cGUiIAotCQl0YXJnZXRQdXQ9Ik1ldGhvZC9zZXRSZXR1cm5UeXBlIi8+Ci0JPG1lcmdlOnB1bGwgCi0JCXNvdXJjZUdldD0iTWV0aG9kL2dldEV4Y2VwdGlvbnMiIAotCQl0YXJnZXRQdXQ9Ik1ldGhvZC9hZGRFeGNlcHRpb24iLz4KLQkKLSAgICA8bWVyZ2U6cHVsbAotICAgICAgc291cmNlR2V0PSJNZW1iZXIvZ2V0Q29tbWVudCIKLSAgICAgIHRhcmdldFB1dD0iTWVtYmVyL3NldENvbW1lbnQiLz4KLSAgICA8bWVyZ2U6cHVsbAotICAgICAgIHNvdXJjZUdldD0iSW1wb3J0L2dldE5hbWUiCi0gICAgICAgdGFyZ2V0UHV0PSJJbXBvcnQvc2V0TmFtZSIvPgotICAgIDxtZXJnZTpwdWxsCi0gICAgICAgc291cmNlR2V0PSJDb21waWxhdGlvblVuaXQvZ2V0SGVhZGVyIgotICAgICAgIHRhcmdldFB1dD0iQ29tcGlsYXRpb25Vbml0L3NldEhlYWRlciIvPgotCi08IS0tIE1lcmdlIHJ1bGVzIHRvIGhhbmRsZSBhbm5vdGF0aW9uOgotCS0gV2l0aCB0aGlzIHB1bGwgcnVsZSwgYW5ub3RhdGlvbnMgaW4gdGhlIHRhcmdldCBpcyByZXBsYWNlZCBieSBhbm5vdGF0aW9ucyBvZiB0aGUgCi0Jc2FtZSBuYW1lIGluIHRoZSBzb3VyY2UuCi0JLSBXaXRoIHRoaXMgc3dlZXAgcnVsZSwgYW55IGFubm90YXRpb24gaW4gdGhlIHRhcmdldCB0aGF0IGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIAotICAJc291cmNlIGlzIGNvbW1lbnRlZCBvdXQuIAotICAJLSBCeSBkZWZhdWx0LCBhbnkgYW5ub3RhdGlvbiBpbiB0aGUgc291cmNlIHRoYXQgaXMgbm90IGluIHRoZSB0YXJnZXQgYXJlIHB1bGxlZCBpbnRvIHRoZSB0YXJnZXQuCi0tLT4KLQotCTxtZXJnZTpwdWxsIAotICAgIAlzb3VyY2VHZXQ9IkFubm90YXRpb24vZ2V0Q29udGVudHMiCi0gICAgCXRhcmdldFB1dD0iQW5ub3RhdGlvbi9zZXRDb250ZW50cyIvPgotICAgCi0gIAk8bWVyZ2U6c3dlZXAgc2VsZWN0PSJBbm5vdGF0aW9uIiBhY3Rpb249ImNvbW1lbnQiLz4KLQkJCi08L21lcmdlOm9wdGlvbnM+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9tb2RlbC9DWEYuZWNvcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9tb2RlbC9DWEYuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNzlmMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvbW9kZWwvQ1hGLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9Im1vZGVsIgotICAgIG5zVVJJPSJodHRwOi8vL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC5lY29yZSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbCI+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ1hGQ29udGV4dCIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRSdW50aW1lTG9jYXRpb24iCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdFJ1bnRpbWVUeXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRSdW50aW1lVmVyc2lvbiIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZXJib3NlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJnZW5lcmF0ZUFudEJ1aWxkRmlsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImdlbmVyYXRlQ2xpZW50IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ2VuZXJhdGVTZXJ2ZXIiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkYXRhYmluZGluZyIgZVR5cGU9IiMvL0RhdGFCaW5kaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJqYXhiIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZyb250ZW5kIiBlVHlwZT0iIy8vRnJvbnRlbmQiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImpheHdzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbnN0YWxsYXRpb25zIiB0cmFuc2llbnQ9InRydWUiPgotICAgICAgPGVHZW5lcmljVHlwZSBlQ2xhc3NpZmllcj0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FTWFwIj4KLSAgICAgICAgPGVUeXBlQXJndW1lbnRzIGVDbGFzc2lmaWVyPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPGVUeXBlQXJndW1lbnRzIGVDbGFzc2lmaWVyPSIjLy9DWEZJbnN0YWxsIi8+Ci0gICAgICA8L2VHZW5lcmljVHlwZT4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNYRkRhdGFNb2RlbCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9DWEZDb250ZXh0Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvamVjdE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzb3VyY2VEaXJlY3RvcnkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2xhc3NEaXJlY3RvcnkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id3NkbEZpbGVOYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndzZGxVUkwiIGVUeXBlPSIjLy9VUkwiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29uZmlnV3NkbExvY2F0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbmZpZ0lkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhcmdldE5hbWVzcGFjZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbmRwb2ludE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2VydmljZU5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id3NkbERlZmluaXRpb24iIGVUeXBlPSIjLy9EZWZpbml0aW9uIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndzZGxMb2NhdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKYXZhMldTQ29udGV4dCIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9DWEZDb250ZXh0Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic29hcDEyQmluZGluZyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImdlbmVyYXRlWFNESW1wb3J0cyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ2VuZXJhdGVXU0RMIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJnZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJnZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24iCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJnZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbiIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImdlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSmF2YTJXU0RhdGFNb2RlbCIgZVN1cGVyVHlwZXM9IiMvL0NYRkRhdGFNb2RlbCAjLy9KYXZhMldTQ29udGV4dCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNsYXNzcGF0aCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJqYXZhU3RhcnRpbmdQb2ludCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1c2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dHJhY3RJbnRlcmZhY2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWV0aG9kTWFwIj4KLSAgICAgIDxlR2VuZXJpY1R5cGUgZUNsYXNzaWZpZXI9IiMvL01hcCI+Ci0gICAgICAgIDxlVHlwZUFyZ3VtZW50cyBlQ2xhc3NpZmllcj0iIy8vSU1ldGhvZCIvPgotICAgICAgICA8ZVR5cGVBcmd1bWVudHMgZUNsYXNzaWZpZXI9IiMvL01hcCI+Ci0gICAgICAgICAgPGVUeXBlQXJndW1lbnRzIGVDbGFzc2lmaWVyPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgICA8ZVR5cGVBcmd1bWVudHMgZUNsYXNzaWZpZXI9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiLz4KLSAgICAgICAgPC9lVHlwZUFyZ3VtZW50cz4KLSAgICAgIDwvZUdlbmVyaWNUeXBlPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYW5ub3RhdGlvbk1hcCI+Ci0gICAgICA8ZUdlbmVyaWNUeXBlIGVDbGFzc2lmaWVyPSIjLy9NYXAiPgotICAgICAgICA8ZVR5cGVBcmd1bWVudHMgZUNsYXNzaWZpZXI9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8ZVR5cGVBcmd1bWVudHMgZUNsYXNzaWZpZXI9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiLz4KLSAgICAgIDwvZUdlbmVyaWNUeXBlPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic291cmNlRGlyZWN0b3J5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBvcnROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldTREwySmF2YUNvbnRleHQiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vQ1hGQ29udGV4dCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImdlbmVyYXRlSW1wbGVtZW50YXRpb24iCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb2Nlc3NTT0FQSGVhZGVycyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsaWRhdGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndzZGxWZXJzaW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIxLjEiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXNlRGVmYXVsdFZhbHVlcyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ieGpjQXJncyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJub0FkZHJlc3NCaW5kaW5nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ieGpjVXNlRGVmYXVsdFZhbHVlcyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InhqY1RvU3RyaW5nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ieGpjVG9TdHJpbmdNdWx0aUxpbmUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ4amNUb1N0cmluZ1NpbXBsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InhqY0xvY2F0b3IiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ4amNTeW5jTWV0aG9kcyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InhqY01hcmtHZW5lcmF0ZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ4amNFcGlzb2RlRmlsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdXRvTmFtZVJlc29sdXRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXU0RMMkphdmFEYXRhTW9kZWwiIGVTdXBlclR5cGVzPSIjLy9DWEZEYXRhTW9kZWwgIy8vV1NETDJKYXZhQ29udGV4dCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImluY2x1ZGVkTmFtZXNwYWNlcyI+Ci0gICAgICA8ZUdlbmVyaWNUeXBlIGVDbGFzc2lmaWVyPSIjLy9NYXAiPgotICAgICAgICA8ZVR5cGVBcmd1bWVudHMgZUNsYXNzaWZpZXI9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8ZVR5cGVBcmd1bWVudHMgZUNsYXNzaWZpZXI9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgPC9lR2VuZXJpY1R5cGU+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiaW5kaW5nRmlsZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4Y2x1ZGVkTmFtZXNwYWNlcyI+Ci0gICAgICA8ZUdlbmVyaWNUeXBlIGVDbGFzc2lmaWVyPSIjLy9NYXAiPgotICAgICAgICA8ZVR5cGVBcmd1bWVudHMgZUNsYXNzaWZpZXI9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8ZVR5cGVBcmd1bWVudHMgZUNsYXNzaWZpZXI9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgPC9lR2VuZXJpY1R5cGU+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYXRhbG9nRmlsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJqYXZhU291cmNlRm9sZGVyIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iRnJvbnRlbmQiPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iSkFYV1MiIGxpdGVyYWw9ImpheHdzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iRGF0YUJpbmRpbmciPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iSkFYQiIgbGl0ZXJhbD0iamF4YiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJVUkwiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm5ldC5VUkwiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEZWZpbml0aW9uIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgud3NkbC5EZWZpbml0aW9uIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iTWFwIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLk1hcCI+Ci0gICAgPGVUeXBlUGFyYW1ldGVycyBuYW1lPSJUIi8+Ci0gICAgPGVUeXBlUGFyYW1ldGVycyBuYW1lPSJUMSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJJTWV0aG9kIiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNYRkluc3RhbGwiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZXJzaW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxvY2F0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvbW9kZWwvQ1hGLmVjb3JlX2RpYWdyYW0gYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9tb2RlbC9DWEYuZWNvcmVfZGlhZ3JhbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMzMjNmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9tb2RlbC9DWEYuZWNvcmVfZGlhZ3JhbQorKysgL2Rldi9udWxsCkBAIC0xLDM3OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG5vdGF0aW9uOkRpYWdyYW0geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgeG1sbnM6bm90YXRpb249Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mL3J1bnRpbWUvMS4wLjEvbm90YXRpb24iIHhtaTppZD0iX3lyVU4wZXVrRWQycGZJbVQxalQ3dlEiIHR5cGU9IkVjb3JlIiBtZWFzdXJlbWVudFVuaXQ9IlBpeGVsIj4KLSAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96SnRhQU91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSIyMDAxIj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pKM0xBT3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjUwMDEiLz4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pKM0xBZXVrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjcwMDEiPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96Uzgxa091a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSIzMDAxIj4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkNYRi5lY29yZSMvL0NYRkNvbnRleHQvY3hmUnVudGltZUxvY2F0aW9uIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfelM4MWtldWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfelM4MWt1dWtFZDJwZkltVDFqVDd2USIgdHlwZT0iMzAwMSI+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBocmVmPSJDWEYuZWNvcmUjLy9DWEZDb250ZXh0L2N4ZlJ1bnRpbWVFZGl0aW9uIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfelM4MWstdWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfelM4MWxPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iMzAwMSI+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBocmVmPSJDWEYuZWNvcmUjLy9DWEZDb250ZXh0L2N4ZlJ1bnRpbWVWZXJzaW9uIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfelM4MWxldWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfelM4MWx1dWtFZDJwZkltVDFqVDd2USIgdHlwZT0iMzAwMSI+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBocmVmPSJDWEYuZWNvcmUjLy9DWEZDb250ZXh0L3ZlcmJvc2UiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il96UzgxbC11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96UzgxbU91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSIzMDAxIj4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkNYRi5lY29yZSMvL0NYRkNvbnRleHQvZ2VuZXJhdGVBbnRCdWlsZEZpbGUiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il96UzgxbWV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96UzgxbXV1a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSIzMDAxIj4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkNYRi5lY29yZSMvL0NYRkNvbnRleHQvZ2VuZXJhdGVDbGllbnQiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il96UzgxbS11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96Uzgxbk91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSIzMDAxIj4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkNYRi5lY29yZSMvL0NYRkNvbnRleHQvZ2VuZXJhdGVTZXJ2ZXIiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il96UzgxbmV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96UzgxbnV1a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSIzMDAxIj4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkNYRi5lY29yZSMvL0NYRkNvbnRleHQvZGF0YWJpbmRpbmciLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il96Uzgxbi11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96Uzgxb091a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSIzMDAxIj4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkNYRi5lY29yZSMvL0NYRkNvbnRleHQvZnJvbnRlbmQiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il96Uzgxb2V1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96Uzgxb3V1a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSIzMDAxIj4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkNYRi5lY29yZSMvL0NYRkNvbnRleHQvdXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0Ii8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfelM4MW8tdWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfLUlod29PdW5FZDJwZkltVDFqVDd2USIgdHlwZT0iMzAwMSI+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBocmVmPSJDWEYuZWNvcmUjLy9DWEZDb250ZXh0L2V4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lciIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXy1JaHdvZXVuRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEcmF3ZXJTdHlsZSIgeG1pOmlkPSJfekozTEF1dWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il96SjNMQS11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfekozTEJPdWtFZDJwZkltVDFqVDd2USIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96SjNMQmV1a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI3MDAyIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRyYXdlclN0eWxlIiB4bWk6aWQ9Il96SjNMQnV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX3pKM0xCLXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il96SjNMQ091a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pKM0xDZXVrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjcwMDMiPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RHJhd2VyU3R5bGUiIHhtaTppZD0iX3pKM0xDdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfekozTEMtdWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX3pKM0xET3VrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX3pKdGFBZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUNsYXNzIiBocmVmPSJDWEYuZWNvcmUjLy9DWEZDb250ZXh0Ii8+Ci0gICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfekp0YUF1dWtFZDJwZkltVDFqVDd2USIgeD0iNDY1IiB5PSIxNSIvPgotICA8L2NoaWxkcmVuPgotICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pKM0xEZXVrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjIwMDEiPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfekozTEVPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNTAwMSIvPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfekozTEVldWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNzAwMSI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEcmF3ZXJTdHlsZSIgeG1pOmlkPSJfekozTEV1dWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il96SjNMRS11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfekozTEZPdWtFZDJwZkltVDFqVDd2USIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96SjNMRmV1a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI3MDAyIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRyYXdlclN0eWxlIiB4bWk6aWQ9Il96SjNMRnV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX3pKM0xGLXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il96SjNMR091a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pKM0xHZXVrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjcwMDMiPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RHJhd2VyU3R5bGUiIHhtaTppZD0iX3pKM0xHdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfekozTEctdWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX3pKM0xIT3VrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX3pKM0xEdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUNsYXNzIiBocmVmPSJDWEYuZWNvcmUjLy9DWEZEYXRhTW9kZWwiLz4KLSAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il96SjNMRC11a0VkMnBmSW1UMWpUN3ZRIiB4PSI0NjUiIHk9IjI5MCIvPgotICA8L2NoaWxkcmVuPgotICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pKM0xIZXVrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjIwMDEiPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfekozTElPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNTAwMSIvPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfekozTElldWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNzAwMSI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEcmF3ZXJTdHlsZSIgeG1pOmlkPSJfekozTEl1dWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il96SjNMSS11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfekozTEpPdWtFZDJwZkltVDFqVDd2USIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96SjNMSmV1a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI3MDAyIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRyYXdlclN0eWxlIiB4bWk6aWQ9Il96SjNMSnV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX3pKM0xKLXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il96SjNMS091a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pKM0xLZXVrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjcwMDMiPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RHJhd2VyU3R5bGUiIHhtaTppZD0iX3pKM0xLdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfekozTEstdWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX3pKM0xMT3VrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX3pKM0xIdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUNsYXNzIiBocmVmPSJDWEYuZWNvcmUjLy9KYXZhMldTQ29udGV4dCIvPgotICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3pKM0xILXVrRWQycGZJbVQxalQ3dlEiIHg9IjE4NSIgeT0iMjkwIi8+Ci0gIDwvY2hpbGRyZW4+Ci0gIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfekozTExldWtFZDJwZkltVDFqVDd2USIgdHlwZT0iMjAwMSI+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96SjNMTU91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI1MDAxIi8+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96SjNMTWV1a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI3MDAxIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRyYXdlclN0eWxlIiB4bWk6aWQ9Il96SjNMTXV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX3pKM0xNLXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il96SjNMTk91a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pKM0xOZXVrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjcwMDIiPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RHJhd2VyU3R5bGUiIHhtaTppZD0iX3pKM0xOdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfekozTE4tdWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX3pKM0xPT3VrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektBVThPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNzAwMyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEcmF3ZXJTdHlsZSIgeG1pOmlkPSJfektBVThldWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il96S0FVOHV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfektBVTgtdWtFZDJwZkltVDFqVDd2USIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfekozTEx1dWtFZDJwZkltVDFqVDd2USIvPgotICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQ2xhc3MiIGhyZWY9IkNYRi5lY29yZSMvL0phdmEyV1NEYXRhTW9kZWwiLz4KLSAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il96SjNMTC11a0VkMnBmSW1UMWpUN3ZRIiB4PSIyMzAiIHk9IjYyMCIvPgotICA8L2NoaWxkcmVuPgotICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pLQVU5T3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjIwMDEiPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektBVTktdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNTAwMSIvPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektBVS1PdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNzAwMSI+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX2N3ZXpJQjkyRWQ2STVzd2xyc24zN2ciIHR5cGU9IjMwMDEiPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC9nZW5lcmF0ZUltcGxlbWVudGF0aW9uIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfY3dleklSOTJFZDZJNXN3bHJzbjM3ZyIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfY3dlekloOTJFZDZJNXN3bHJzbjM3ZyIgdHlwZT0iMzAwMSI+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBocmVmPSJDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L3Byb2Nlc3NTT0FQSGVhZGVycyIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2N3ZmFNQjkyRWQ2STVzd2xyc24zN2ciLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX2N3ZmFNUjkyRWQ2STVzd2xyc24zN2ciIHR5cGU9IjMwMDEiPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC9sb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2N3ZmFNaDkyRWQ2STVzd2xyc24zN2ciLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX2N3ZmFNeDkyRWQ2STVzd2xyc24zN2ciIHR5cGU9IjMwMDEiPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC9sb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2N3ZmFOQjkyRWQ2STVzd2xyc24zN2ciLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX2N3ZmFOUjkyRWQ2STVzd2xyc24zN2ciIHR5cGU9IjMwMDEiPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC92YWxpZGF0ZSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2N3Z0JRQjkyRWQ2STVzd2xyc24zN2ciLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX2N3Z0JRUjkyRWQ2STVzd2xyc24zN2ciIHR5cGU9IjMwMDEiPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC93c2RsVmVyc2lvbiIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2N3Z0JRaDkyRWQ2STVzd2xyc24zN2ciLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX2N3Z0JReDkyRWQ2STVzd2xyc24zN2ciIHR5cGU9IjMwMDEiPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC91c2VEZWZhdWx0VmFsdWVzIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfY3dnQlJCOTJFZDZJNXN3bHJzbjM3ZyIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfY3dnQlJSOTJFZDZJNXN3bHJzbjM3ZyIgdHlwZT0iMzAwMSI+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBocmVmPSJDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L3hqY0FyZ3MiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9jd2dCUmg5MkVkNkk1c3dscnNuMzdnIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9jd2dvVUI5MkVkNkk1c3dscnNuMzdnIiB0eXBlPSIzMDAxIj4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkNYRi5lY29yZSMvL1dTREwySmF2YUNvbnRleHQvbm9BZGRyZXNzQmluZGluZyIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2N3Z29VUjkyRWQ2STVzd2xyc24zN2ciLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX2N3Z29VaDkyRWQ2STVzd2xyc24zN2ciIHR5cGU9IjMwMDEiPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC94amNVc2VEZWZhdWx0VmFsdWVzIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfY3dnb1V4OTJFZDZJNXN3bHJzbjM3ZyIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfY3doUFlCOTJFZDZJNXN3bHJzbjM3ZyIgdHlwZT0iMzAwMSI+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBocmVmPSJDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L3hqY1RvU3RyaW5nIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfY3doUFlSOTJFZDZJNXN3bHJzbjM3ZyIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfY3doUFloOTJFZDZJNXN3bHJzbjM3ZyIgdHlwZT0iMzAwMSI+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBocmVmPSJDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L3hqY1RvU3RyaW5nTXVsdGlMaW5lIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfY3doUFl4OTJFZDZJNXN3bHJzbjM3ZyIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfY3doUFpCOTJFZDZJNXN3bHJzbjM3ZyIgdHlwZT0iMzAwMSI+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBocmVmPSJDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L3hqY1RvU3RyaW5nU2ltcGxlIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfY3doUFpSOTJFZDZJNXN3bHJzbjM3ZyIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfY3doMmNCOTJFZDZJNXN3bHJzbjM3ZyIgdHlwZT0iMzAwMSI+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBocmVmPSJDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L3hqY0xvY2F0b3IiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9jd2gyY1I5MkVkNkk1c3dscnNuMzdnIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9jd2gyY2g5MkVkNkk1c3dscnNuMzdnIiB0eXBlPSIzMDAxIj4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkNYRi5lY29yZSMvL1dTREwySmF2YUNvbnRleHQveGpjU3luY01ldGhvZHMiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9jd2gyY3g5MkVkNkk1c3dscnNuMzdnIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9jd2gyZEI5MkVkNkk1c3dscnNuMzdnIiB0eXBlPSIzMDAxIj4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkNYRi5lY29yZSMvL1dTREwySmF2YUNvbnRleHQveGpjTWFya0dlbmVyYXRlZCIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2N3aDJkUjkyRWQ2STVzd2xyc24zN2ciLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX2N3aWRnQjkyRWQ2STVzd2xyc24zN2ciIHR5cGU9IjMwMDEiPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC94amNFcGlzb2RlRmlsZSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2N3aWRnUjkyRWQ2STVzd2xyc24zN2ciLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX2pWaDBnQjkyRWQ2STVzd2xyc24zN2ciIHR5cGU9IjMwMDEiPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC9hdXRvTmFtZVJlc29sdXRpb24iLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9qVmgwZ1I5MkVkNkk1c3dscnNuMzdnIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RHJhd2VyU3R5bGUiIHhtaTppZD0iX3pLQVUtZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfektBVS11dWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX3pLQVUtLXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektBVV9PdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNzAwMiI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEcmF3ZXJTdHlsZSIgeG1pOmlkPSJfektBVV9ldWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il96S0FVX3V1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfektBVV8tdWtFZDJwZkltVDFqVDd2USIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0FWQU91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI3MDAzIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRyYXdlclN0eWxlIiB4bWk6aWQ9Il96S0FWQWV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX3pLQVZBdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il96S0FWQS11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il96S0FVOWV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVDbGFzcyIgaHJlZj0iQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dCIvPgotICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3pLQVU5dXVrRWQycGZJbVQxalQ3dlEiIHg9IjcyNSIgeT0iMjkwIi8+Ci0gIDwvY2hpbGRyZW4+Ci0gIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektBVkJPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iMjAwMSI+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0FWQi11a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI1MDAxIi8+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0FWQ091a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI3MDAxIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRyYXdlclN0eWxlIiB4bWk6aWQ9Il96S0FWQ2V1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX3pLQVZDdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il96S0FWQy11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pLQVZET3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjcwMDIiPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RHJhd2VyU3R5bGUiIHhtaTppZD0iX3pLQVZEZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfektBVkR1dWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX3pLQVZELXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektBVkVPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNzAwMyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEcmF3ZXJTdHlsZSIgeG1pOmlkPSJfektBVkVldWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il96S0FWRXV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfektBVkUtdWtFZDJwZkltVDFqVDd2USIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfektBVkJldWtFZDJwZkltVDFqVDd2USIvPgotICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQ2xhc3MiIGhyZWY9IkNYRi5lY29yZSMvL1dTREwySmF2YURhdGFNb2RlbCIvPgotICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3pLQVZCdXVrRWQycGZJbVQxalQ3dlEiIHg9Ijc1MCIgeT0iNjcwIi8+Ci0gIDwvY2hpbGRyZW4+Ci0gIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektBVkZPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iMjAwNSI+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0FWRi11a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI1MDA1Ii8+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0FWR091a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI3MDExIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRyYXdlclN0eWxlIiB4bWk6aWQ9Il96S0FWR2V1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX3pLQVZHdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il96S0FWRy11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pLQVZIT3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjcwMTIiPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RHJhd2VyU3R5bGUiIHhtaTppZD0iX3pLQVZIZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfektBVkh1dWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX3pLQVZILXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX3pLQVZGZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUVudW0iIGhyZWY9IkNYRi5lY29yZSMvL0Zyb250ZW5kIi8+Ci0gICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfektBVkZ1dWtFZDJwZkltVDFqVDd2USIgeD0iNzM1IiB5PSIxNSIgd2lkdGg9IjkxIi8+Ci0gIDwvY2hpbGRyZW4+Ci0gIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektBVklPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iMjAwNSI+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0FWSS11a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI1MDA1Ii8+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0FWSk91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI3MDExIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRyYXdlclN0eWxlIiB4bWk6aWQ9Il96S0FWSmV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX3pLQVZKdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il96S0FWSi11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pLQVZLT3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjcwMTIiPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RHJhd2VyU3R5bGUiIHhtaTppZD0iX3pLQVZLZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfektBVkt1dWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX3pLQVZLLXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX3pLQVZJZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUVudW0iIGhyZWY9IkNYRi5lY29yZSMvL0RhdGFCaW5kaW5nIi8+Ci0gICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfektBVkl1dWtFZDJwZkltVDFqVDd2USIgeD0iNzM1IiB5PSI3NSIgd2lkdGg9IjkxIi8+Ci0gIDwvY2hpbGRyZW4+Ci0gIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektBVkxPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iMjAwNCI+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0FWTC11a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI1MDA0Ii8+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0FWTU91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI3MDEwIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRyYXdlclN0eWxlIiB4bWk6aWQ9Il96S0FWTWV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX3pLQVZNdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il96S0FWTS11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il96S0FWTGV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iQ1hGLmVjb3JlIy8vVVJMIi8+Ci0gICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfektBVkx1dWtFZDJwZkltVDFqVDd2USIgeD0iMTg1IiB5PSIxNSIgd2lkdGg9Ijc2Ii8+Ci0gIDwvY2hpbGRyZW4+Ci0gIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektBVk5PdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iMjAwNCI+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0tGOE91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI1MDA0Ii8+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0tGOGV1a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI3MDEwIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRyYXdlclN0eWxlIiB4bWk6aWQ9Il96S0tGOHV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX3pLS0Y4LXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il96S0tGOU91a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il96S0FWTmV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iQ1hGLmVjb3JlIy8vRGVmaW5pdGlvbiIvPgotICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3pLQVZOdXVrRWQycGZJbVQxalQ3dlEiIHg9IjE4NSIgeT0iNjAiIHdpZHRoPSI3NiIvPgotICA8L2NoaWxkcmVuPgotICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pLS0Y5ZXVrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjIwMDQiPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektLRi1PdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNTAwNCIvPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektLRi1ldWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNzAxMCI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEcmF3ZXJTdHlsZSIgeG1pOmlkPSJfektLRi11dWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il96S0tGLS11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfektLRl9PdWtFZDJwZkltVDFqVDd2USIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfektLRjl1dWtFZDJwZkltVDFqVDd2USIvPgotICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9IkNYRi5lY29yZSMvL01hcCIvPgotICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3pLS0Y5LXVrRWQycGZJbVQxalQ3dlEiIHg9IjE4NSIgeT0iMTEwIiB3aWR0aD0iNzYiLz4KLSAgPC9jaGlsZHJlbj4KLSAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0tGX2V1a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSIyMDA0Ij4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pLS0dBT3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjUwMDQiLz4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pLS0dBZXVrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjcwMTAiPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RHJhd2VyU3R5bGUiIHhtaTppZD0iX3pLS0dBdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfektLR0EtdWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX3pLS0dCT3VrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX3pLS0ZfdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJDWEYuZWNvcmUjLy9JTWV0aG9kIi8+Ci0gICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfektLRl8tdWtFZDJwZkltVDFqVDd2USIgeD0iMTg1IiB5PSIxNTUiIHdpZHRoPSI3NiIvPgotICA8L2NoaWxkcmVuPgotICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtU3R5bGUiIHhtaTppZD0iX3lyVU4wdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVQYWNrYWdlIiBocmVmPSJDWEYuZWNvcmUjLyIvPgotICA8ZWRnZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkVkZ2UiIHhtaTppZD0iX3pVbDBVT3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjQwMDQiIHNvdXJjZT0iX3pKM0xEZXVrRWQycGZJbVQxalQ3dlEiIHRhcmdldD0iX3pKdGFBT3VrRWQycGZJbVQxalQ3dlEiPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il96VWwwVWV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il96VWwwVXV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX3pVbDBVLXVrRWQycGZJbVQxalQ3dlEiIHBvaW50cz0iWzQsIC0xLCAxLCA3M10kWzQsIC03MywgMSwgMV0iLz4KLSAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfeldYOUNPdWtFZDJwZkltVDFqVDd2USIgaWQ9IigwLjQ2LDAuMDA3NDkwNjM3KSIvPgotICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il96V1g5Q2V1a0VkMnBmSW1UMWpUN3ZRIiBpZD0iKDAuNTAyNzAyNywwLjk4NTIyMTcpIi8+Ci0gIDwvZWRnZXM+Ci0gIDxlZGdlcyB4bWk6dHlwZT0ibm90YXRpb246RWRnZSIgeG1pOmlkPSJfelZDZ1FPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNDAwNCIgc291cmNlPSJfekozTEhldWtFZDJwZkltVDFqVDd2USIgdGFyZ2V0PSJfekp0YUFPdWtFZDJwZkltVDFqVDd2USI+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX3pWQ2dRZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX3pWQ2dRdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfelZDZ1EtdWtFZDJwZkltVDFqVDd2USIgcG9pbnRzPSJbMCwgMSwgLTQxLCAzMThdJFs0MSwgLTMxNywgMCwgMF0iLz4KLSAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfeldYOUFPdWtFZDJwZkltVDFqVDd2USIgaWQ9IigwLjg5OTU4MTYsMC4wNDI3ODA3NSkiLz4KLSAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfeldYOUFldWtFZDJwZkltVDFqVDd2USIgaWQ9IigwLjEwODEwODExLDAuOTk1MDczOSkiLz4KLSAgPC9lZGdlcz4KLSAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpFZGdlIiB4bWk6aWQ9Il96VkNnUk91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI0MDA0IiBzb3VyY2U9Il96SjNMTGV1a0VkMnBmSW1UMWpUN3ZRIiB0YXJnZXQ9Il96SjNMRGV1a0VkMnBmSW1UMWpUN3ZRIj4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfelZDZ1JldWtFZDJwZkltVDFqVDd2USIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfelZDZ1J1dWtFZDJwZkltVDFqVDd2USIvPgotICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il96VkNnUi11a0VkMnBmSW1UMWpUN3ZRIiBwb2ludHM9IlswLCAwLCAtNjAsIC0xMjBdJFs2MCwgMTIwLCAwLCAwXSIvPgotICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il96V1g5Q3V1a0VkMnBmSW1UMWpUN3ZRIiBpZD0iKDAuOTA4MTYzMjUsMC4wMDUzNDc1OTM3KSIvPgotICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il96V1g5Qy11a0VkMnBmSW1UMWpUN3ZRIiBpZD0iKDAuMjU1LDAuOTg4NzY0MDUpIi8+Ci0gIDwvZWRnZXM+Ci0gIDxlZGdlcyB4bWk6dHlwZT0ibm90YXRpb246RWRnZSIgeG1pOmlkPSJfelZDZ1NPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNDAwNCIgc291cmNlPSJfekozTExldWtFZDJwZkltVDFqVDd2USIgdGFyZ2V0PSJfekozTEhldWtFZDJwZkltVDFqVDd2USI+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX3pWQ2dTZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX3pWQ2dTdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfelZDZ1MtdWtFZDJwZkltVDFqVDd2USIgcG9pbnRzPSJbMCwgMCwgLTYwLCA2Ml0kWzYwLCAtNjEsIDAsIDFdIi8+Ci0gICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX3pXWDlET3VrRWQycGZJbVQxalQ3dlEiIGlkPSIoMC4zODc3NTUxLDAuMDA1MzQ3NTkzNykiLz4KLSAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfeldYOURldWtFZDJwZkltVDFqVDd2USIgaWQ9IigwLjUxMDQ2MDI2LDAuOTg5MzA0ODQpIi8+Ci0gIDwvZWRnZXM+Ci0gIDxlZGdlcyB4bWk6dHlwZT0ibm90YXRpb246RWRnZSIgeG1pOmlkPSJfelZDZ1RPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNDAwNCIgc291cmNlPSJfektBVTlPdWtFZDJwZkltVDFqVDd2USIgdGFyZ2V0PSJfekp0YUFPdWtFZDJwZkltVDFqVDd2USI+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX3pWQ2dUZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX3pWQ2dUdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfelZDZ1QtdWtFZDJwZkltVDFqVDd2USIgcG9pbnRzPSJbMCwgMCwgLTYwLCAzMDFdJFs2MCwgLTMwMCwgMCwgMV0iLz4KLSAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfeldYOUJ1dWtFZDJwZkltVDFqVDd2USIgaWQ9IigxLjAsMC40OTg0MTI3KSIvPgotICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il96V1g5Qi11a0VkMnBmSW1UMWpUN3ZRIiBpZD0iKDAuODQ4NjQ4NjcsMC45NjU1MTcyKSIvPgotICA8L2VkZ2VzPgotICA8ZWRnZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkVkZ2UiIHhtaTppZD0iX3pWQ2dVT3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjQwMDQiIHNvdXJjZT0iX3pLQVZCT3VrRWQycGZJbVQxalQ3dlEiIHRhcmdldD0iX3pKM0xEZXVrRWQycGZJbVQxalQ3dlEiPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il96VkNnVWV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il96VkNnVXV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX3pWQ2dVLXVrRWQycGZJbVQxalQ3dlEiIHBvaW50cz0iWy01NiwgLTMwLCAzNzQsIDIwMl0kWy0yNjUsIC0xNDMsIDE2NSwgODldIi8+Ci0gICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX3pXWDlBdXVrRWQycGZJbVQxalQ3dlEiIGlkPSIoMC4wNTUxNzI0MTQsMC4wMDgxMzAwODEpIi8+Ci0gICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX3pXWDlBLXVrRWQycGZJbVQxalQ3dlEiIGlkPSIoMC4wLDAuNjY2NjY2NykiLz4KLSAgPC9lZGdlcz4KLSAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpFZGdlIiB4bWk6aWQ9Il96VkNnVk91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI0MDA0IiBzb3VyY2U9Il96S0FWQk91a0VkMnBmSW1UMWpUN3ZRIiB0YXJnZXQ9Il96S0FVOU91a0VkMnBmSW1UMWpUN3ZRIj4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfelZDZ1ZldWtFZDJwZkltVDFqVDd2USIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfelZDZ1Z1dWtFZDJwZkltVDFqVDd2USIvPgotICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il96VkNnVi11a0VkMnBmSW1UMWpUN3ZRIiBwb2ludHM9IlswLCAwLCAtMTExLCAwXSRbMTExLCAwLCAwLCAwXSIvPgotICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il96V1g5Qk91a0VkMnBmSW1UMWpUN3ZRIiBpZD0iKDAuNTg2MjA2OSwwLjApIi8+Ci0gICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX3pXWDlCZXVrRWQycGZJbVQxalQ3dlEiIGlkPSIoMC40MDI5MzA0LDAuOTkzNjUwOCkiLz4KLSAgPC9lZGdlcz4KLTwvbm90YXRpb246RGlhZ3JhbT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL21vZGVsL0NYRi5nZW5tb2RlbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL21vZGVsL0NYRi5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJkOWQ1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9tb2RlbC9DWEYuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnZW5tb2RlbDpHZW5Nb2RlbCB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIGNvcHlyaWdodFRleHQ9IkNvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMmI3hEOyYjeEE7QWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyYjeEQ7JiN4QTthcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAmI3hEOyYjeEE7d2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQmI3hEOyYjeEE7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmI3hEOyYjeEE7ICYjeEQ7JiN4QTtDb250cmlidXRvcnM6JiN4RDsmI3hBO0lPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIKLSAgICBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMiIG1vZGVsUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZSIKLSAgICBtb2RlbE5hbWU9IkNYRiIgcm9vdEV4dGVuZHNJbnRlcmZhY2U9IiIgcm9vdEltcGxlbWVudHNJbnRlcmZhY2U9IiIgc3VwcHJlc3NFTUZUeXBlcz0idHJ1ZSIKLSAgICBpbXBvcnRlcklEPSJvcmcuZWNsaXBzZS5lbWYuaW1wb3J0ZXIuZWNvcmUiIGNvbXBsaWFuY2VMZXZlbD0iNS4wIiBjb3B5cmlnaHRGaWVsZHM9ImZhbHNlIgotICAgIGxhbmd1YWdlPSIiPgotICA8Zm9yZWlnbk1vZGVsPkNYRi5lY29yZTwvZm9yZWlnbk1vZGVsPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJDWEYiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCi0gICAgICBlY29yZVBhY2thZ2U9IkNYRi5lY29yZSMvIj4KLSAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0iQ1hGLmVjb3JlIy8vRnJvbnRlbmQiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJDWEYuZWNvcmUjLy9Gcm9udGVuZC9KQVhXUyIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09IkNYRi5lY29yZSMvL0RhdGFCaW5kaW5nIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iQ1hGLmVjb3JlIy8vRGF0YUJpbmRpbmcvSkFYQiIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJDWEYuZWNvcmUjLy9VUkwiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9IkNYRi5lY29yZSMvL0RlZmluaXRpb24iLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9IkNYRi5lY29yZSMvL01hcCI+Ci0gICAgICA8Z2VuVHlwZVBhcmFtZXRlcnMgZWNvcmVUeXBlUGFyYW1ldGVyPSJDWEYuZWNvcmUjLy9NYXAvVCIvPgotICAgICAgPGdlblR5cGVQYXJhbWV0ZXJzIGVjb3JlVHlwZVBhcmFtZXRlcj0iQ1hGLmVjb3JlIy8vTWFwL1QxIi8+Ci0gICAgPC9nZW5EYXRhVHlwZXM+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJDWEYuZWNvcmUjLy9JTWV0aG9kIi8+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJDWEYuZWNvcmUjLy9DWEZDb250ZXh0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9DWEZDb250ZXh0L2N4ZlJ1bnRpbWVMb2NhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0NYRkNvbnRleHQvY3hmUnVudGltZUVkaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9DWEZDb250ZXh0L2N4ZlJ1bnRpbWVWZXJzaW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vQ1hGQ29udGV4dC92ZXJib3NlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vQ1hGQ29udGV4dC9nZW5lcmF0ZUFudEJ1aWxkRmlsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0NYRkNvbnRleHQvZ2VuZXJhdGVDbGllbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9DWEZDb250ZXh0L2dlbmVyYXRlU2VydmVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vQ1hGQ29udGV4dC9kYXRhYmluZGluZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0NYRkNvbnRleHQvZnJvbnRlbmQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9DWEZDb250ZXh0L3VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0NYRkNvbnRleHQvZXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vQ1hGQ29udGV4dC9jeGZJbnN0YWxsTG9jYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iQ1hGLmVjb3JlIy8vQ1hGRGF0YU1vZGVsIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9DWEZEYXRhTW9kZWwvcHJvamVjdE5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9DWEZEYXRhTW9kZWwvcmVzb3VyY2VEaXJlY3RvcnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9DWEZEYXRhTW9kZWwvY2xhc3NEaXJlY3RvcnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9DWEZEYXRhTW9kZWwvd3NkbEZpbGVOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vQ1hGRGF0YU1vZGVsL3dzZGxVUkwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9DWEZEYXRhTW9kZWwvY29uZmlnV3NkbExvY2F0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vQ1hGRGF0YU1vZGVsL2Z1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0NYRkRhdGFNb2RlbC9mdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vQ1hGRGF0YU1vZGVsL2NvbmZpZ0lkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vQ1hGRGF0YU1vZGVsL3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0NYRkRhdGFNb2RlbC9lbmRwb2ludE5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9DWEZEYXRhTW9kZWwvc2VydmljZU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9DWEZEYXRhTW9kZWwvd3NkbERlZmluaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9DWEZEYXRhTW9kZWwvd3NkbExvY2F0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iQ1hGLmVjb3JlIy8vSmF2YTJXU0NvbnRleHQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0phdmEyV1NDb250ZXh0L3NvYXAxMkJpbmRpbmciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9KYXZhMldTQ29udGV4dC9nZW5lcmF0ZVhTREltcG9ydHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9KYXZhMldTQ29udGV4dC9nZW5lcmF0ZVdTREwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9KYXZhMldTQ29udGV4dC9nZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vSmF2YTJXU0NvbnRleHQvYW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vSmF2YTJXU0NvbnRleHQvZ2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vSmF2YTJXU0NvbnRleHQvZ2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9KYXZhMldTQ29udGV4dC9nZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0phdmEyV1NDb250ZXh0L2dlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJDWEYuZWNvcmUjLy9KYXZhMldTRGF0YU1vZGVsIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9KYXZhMldTRGF0YU1vZGVsL2NsYXNzcGF0aCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0phdmEyV1NEYXRhTW9kZWwvamF2YVN0YXJ0aW5nUG9pbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9KYXZhMldTRGF0YU1vZGVsL3VzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0phdmEyV1NEYXRhTW9kZWwvZXh0cmFjdEludGVyZmFjZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0phdmEyV1NEYXRhTW9kZWwvc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0phdmEyV1NEYXRhTW9kZWwvbWV0aG9kTWFwIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vSmF2YTJXU0RhdGFNb2RlbC9hbm5vdGF0aW9uTWFwIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vSmF2YTJXU0RhdGFNb2RlbC9zb3VyY2VEaXJlY3RvcnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9KYXZhMldTRGF0YU1vZGVsL3BvcnROYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC9nZW5lcmF0ZUltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC9wcm9jZXNzU09BUEhlYWRlcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L2xvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC9sb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL1dTREwySmF2YUNvbnRleHQvdmFsaWRhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L3dzZGxWZXJzaW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC91c2VEZWZhdWx0VmFsdWVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC94amNBcmdzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC9ub0FkZHJlc3NCaW5kaW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC94amNVc2VEZWZhdWx0VmFsdWVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC94amNUb1N0cmluZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL1dTREwySmF2YUNvbnRleHQveGpjVG9TdHJpbmdNdWx0aUxpbmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L3hqY1RvU3RyaW5nU2ltcGxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC94amNMb2NhdG9yIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC94amNTeW5jTWV0aG9kcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL1dTREwySmF2YUNvbnRleHQveGpjTWFya0dlbmVyYXRlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL1dTREwySmF2YUNvbnRleHQveGpjRXBpc29kZUZpbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L2F1dG9OYW1lUmVzb2x1dGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJDWEYuZWNvcmUjLy9XU0RMMkphdmFEYXRhTW9kZWwiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL1dTREwySmF2YURhdGFNb2RlbC9pbmNsdWRlZE5hbWVzcGFjZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9XU0RMMkphdmFEYXRhTW9kZWwvYmluZGluZ0ZpbGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vV1NETDJKYXZhRGF0YU1vZGVsL2V4Y2x1ZGVkTmFtZXNwYWNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL1dTREwySmF2YURhdGFNb2RlbC9jYXRhbG9nRmlsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL1dTREwySmF2YURhdGFNb2RlbC9qYXZhU291cmNlRm9sZGVyIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICA8L2dlblBhY2thZ2VzPgotPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0Nzk3OTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZT1DWEYgV2ViIFNlcnZpY2VzIENvcmUKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLUNYRl9GQUNFVF9DT1JFX0xBQkVMPUNYRiAyLnggV2ViIFNlcnZpY2VzCi1DWEZfRkFDRVRfQ09SRV9ESVNDUklQVElPTj1FbmFibGVzIFdlYiBTZXJ2aWNlcyBnZW5lcmF0aW9uIHRocm91Z2ggQ1hGIDIueAotQ1hGX0NPUkVfVEVNUExBVEVfTEFCRUw9Q1hGIFdlYiBTZXJ2aWNlcyBQcm9qZWN0Ci1DWEZfRkFDRVRfSlNUX1dFQjI0X1BSRVNFVF9MQUJFTD1DWEYgV2ViIFNlcnZpY2VzIFByb2plY3QgdjIuNAotQ1hGX0ZBQ0VUX0pTVF9XRUIyNV9QUkVTRVRfTEFCRUw9Q1hGIFdlYiBTZXJ2aWNlcyBQcm9qZWN0IHYyLjUKLUNYRl9GQUNFVF9KU1RfV0VCMjRfUFJFU0VUX0RFU0NSSVBUSU9OPUNvbmZpZ3VyZXMgYSBEeW5hbWljIFdlYiBQcm9qZWN0IHdpdGggQ1hGIHVzaW5nIFdlYiBNb2R1bGUgdjIuNCBhbmQgSmF2YSB2NS4wCi1DWEZfRkFDRVRfSlNUX1dFQjI1X1BSRVNFVF9ERVNDUklQVElPTj1Db25maWd1cmVzIGEgRHluYW1pYyBXZWIgUHJvamVjdCB3aXRoIENYRiB1c2luZyBXZWIgTW9kdWxlIHYyLjUgYW5kIEphdmEgdjUuMApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZTE4MjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotCi0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KLSAgICAgICA8cGFja2FnZSAKLSAgICAgICAgICB1cmkgPSAiaHR0cDovLy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwuZWNvcmUiIAotICAgICAgICAgIGNsYXNzID0gIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZQYWNrYWdlIgotICAgICAgICAgIGdlbk1vZGVsID0gIm1vZGVsL0NYRi5nZW5tb2RlbCIgLz4gCi0gICAgPC9leHRlbnNpb24+Ci0gICAgCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIj4KLSAgICAgICA8cHJvamVjdC1mYWNldCBpZD0iY3hmLmNvcmUiPgotICAgICAgICAgIDxsYWJlbD4lQ1hGX0ZBQ0VUX0NPUkVfTEFCRUw8L2xhYmVsPgotCSAgICAgIDxkZXNjcmlwdGlvbj4lQ1hGX0ZBQ0VUX0NPUkVfRElTQ1JJUFRJT048L2Rlc2NyaXB0aW9uPgotCSAgIDwvcHJvamVjdC1mYWNldD4KLSAgICAgICAKLQkgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJjeGYuY29yZSIgdmVyc2lvbj0iMS4wIj4KLQkgICAgICA8Y29uc3RyYWludD4KLQkJICAgICA8YW5kPgotICAgICAgCSAgICAgICAgPHJlcXVpcmVzIGZhY2V0PSJqc3Qud2ViIiB2ZXJzaW9uPSJbMi41Ii8+Ci0gICAgICAJICAgICAgICA8cmVxdWlyZXMgZmFjZXQ9ImpzdC5qYXZhIiB2ZXJzaW9uPSJbNS4wIi8+Ci0gICAgICAgICAgICAgICAgPGNvbmZsaWN0cyBmYWNldD0iYXhpczIuY29yZSIgdmVyc2lvbj0iWzEuMCIvPgotICAgICAgICAgICAgICAgIDxjb25mbGljdHMgZmFjZXQ9ImF4aXMyLmV4dCIgdmVyc2lvbj0iWzEuMCIvPgotICAgICAgICAgICAgIDwvYW5kPgotICAgICAgICAgIDwvY29uc3RyYWludD4KLSAgICAgICAgICAKLSAgICAgICAgICA8YWN0aW9uIGlkPSJjeGYuY29yZS5pbnN0YWxsIiB0eXBlPSJJTlNUQUxMIj4KLSAgICAgIAkgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5mYWNldC5DWEZGYWNldEluc3RhbGxEZWxlZ2F0ZSIvPgotICAgICAgICAgICAgIDxjb25maWctZmFjdG9yeSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5mYWNldC5DWEZGYWNldEluc3RhbGxBY3Rpb25Db25maWdGYWN0b3J5Ii8+Ci0gICAgCSAgPC9hY3Rpb24+Ci0gICAgICAgICAgCi0gICAgICAgICAgPGFjdGlvbiBpZD0iY3hmLmNvcmUudW5pbnN0YWxsIiB0eXBlPSJVTklOU1RBTEwiPgotICAgICAgICAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5mYWNldC5DWEZGYWNldFVuaW5zdGFsbERlbGVnYXRlIi8+Ci0gICAgICAgICAgPC9hY3Rpb24+Ci0gIAkgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLSAgICAgICA8dGVtcGxhdGUgaWQ9InRlbXBsYXRlLmN4Zi5jb3JlIj4KLSAgICAgICAgICA8bGFiZWw+JUNYRl9DT1JFX1RFTVBMQVRFX0xBQkVMPC9sYWJlbD4KLSAgICAgICAgICA8Zml4ZWQKLSAgICAgICAgICAgICAgIGZhY2V0PSJjeGYuY29yZSI+Ci0gICAgICAgICAgPC9maXhlZD4KLSAgICAgICAgICA8Zml4ZWQKLSAgICAgICAgICAgICAgIGZhY2V0PSJqc3Qud2ViIj4KLSAgICAgICAgICA8L2ZpeGVkPgotICAgICAgICAgIDxmaXhlZAotICAgICAgICAgICAgICAgZmFjZXQ9ImpzdC5qYXZhIj4KLSAgICAgICAgICA8L2ZpeGVkPgotICAgICAgICAgIDxwcmVzZXQKLSAgICAgICAgICAgICBpZD0iY3hmLmpzdC53ZWIyNS5wcmVzZXQiPgotICAgICAgICAgIDwvcHJlc2V0PgotICAgICAgIDwvdGVtcGxhdGU+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZXMiPgotICAgICAgIDxzdXBwb3J0ZWQ+Ci0gICAgICAgICAgPHJ1bnRpbWUtY29tcG9uZW50IGFueT0idHJ1ZSIvPgotICAgICAgICAgIDxmYWNldAotICAgICAgICAgICAgIGlkPSJjeGYuY29yZSIKLSAgICAgICAgICAgICB2ZXJzaW9uPSIxLjAiLz4KLSAgICAgICA8L3N1cHBvcnRlZD4KLSAgICA8L2V4dGVuc2lvbj4KLQotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByZXNldHMiPgotICAgICAgIDxzdGF0aWMtcHJlc2V0IGlkPSJjeGYuanN0LndlYjI1LnByZXNldCI+Ci0gICAgICAgICAgPGxhYmVsPiVDWEZfRkFDRVRfSlNUX1dFQjI1X1BSRVNFVF9MQUJFTDwvbGFiZWw+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPiVDWEZfRkFDRVRfSlNUX1dFQjI1X1BSRVNFVF9ERVNDUklQVElPTjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPGZhY2V0Ci0gICAgICAgICAgICAgaWQ9ImN4Zi5jb3JlIgotICAgICAgICAgICAgIHZlcnNpb249IjEuMCI+Ci0gICAgICAgICAgPC9mYWNldD4KLSAgICAgICAgICA8ZmFjZXQKLSAgICAgICAgICAgICBpZD0ianN0LndlYiIKLSAgICAgICAgICAgICB2ZXJzaW9uPSIyLjUiPgotICAgICAgICAgIDwvZmFjZXQ+Ci0gICAgICAgICAgPGZhY2V0Ci0gICAgICAgICAgICAgaWQ9ImpzdC5qYXZhIgotICAgICAgICAgICAgIHZlcnNpb249IjUuMCI+Ci0gICAgICAgICAgPC9mYWNldD4KLSAgICAgICA8L3N0YXRpYy1wcmVzZXQ+Ci0gICAgPC9leHRlbnNpb24+Ci0gICAgCi0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIiPgotICAgICAgIDxjbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIiCi0gICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS5DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUiI+Ci0gICAgICAgPC9jbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcj4KLSAgICA8L2V4dGVuc2lvbj4gICAgCi0gICAgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvQ1hGQ2xhc3NwYXRoQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL0NYRkNsYXNzcGF0aENvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDhjODRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvQ1hGQ2xhc3NwYXRoQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZJbnN0YWxsOwotCi1wdWJsaWMgY2xhc3MgQ1hGQ2xhc3NwYXRoQ29udGFpbmVyIGltcGxlbWVudHMgSUNsYXNzcGF0aENvbnRhaW5lciB7Ci0KLSAgICBwcml2YXRlIElQYXRoIHBhdGg7Ci0gICAgcHJpdmF0ZSBMaXN0PElDbGFzc3BhdGhFbnRyeT4gY2xhc3NwYXRoRW50cmllczsKLSAgICBwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgaW5zdGFsbGVkOwotCi0gICAgcHVibGljIENYRkNsYXNzcGF0aENvbnRhaW5lcihJUGF0aCBwYXRoLCBJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLSAgICAgICAgdGhpcy5wYXRoID0gcGF0aDsKLSAgICAgICAgdGhpcy5wcm9qZWN0ID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpOwotICAgICAgICBjbGFzc3BhdGhFbnRyaWVzID0gIG5ldyBBcnJheUxpc3Q8SUNsYXNzcGF0aEVudHJ5PigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJQ2xhc3NwYXRoRW50cnlbXSBnZXRDbGFzc3BhdGhFbnRyaWVzKCkgewotICAgICAgICBpZiAoIWluc3RhbGxlZC5lcXVhbHMoQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Q1hGUnVudGltZVZlcnNpb24ocHJvamVjdCkpKSB7Ci0gICAgICAgICAgICBjbGFzc3BhdGhFbnRyaWVzLmNsZWFyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY2xhc3NwYXRoRW50cmllcy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgRmlsZSBjeGZMaWJEaXJlY3RvcnkgPSBnZXRDWEZMaWJyYXJ5RGlyZWN0b3J5KCk7Ci0gICAgICAgICAgICBpZiAoY3hmTGliRGlyZWN0b3J5LmV4aXN0cygpICYmIGN4ZkxpYkRpcmVjdG9yeS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBjeGZMaWJEaXJlY3RvcnkubGlzdCgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoY3hmTGliRGlyZWN0b3J5LmdldFBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsgZmlsZXNbaV0pOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBmaWxlLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVOYW1lLmluZGV4T2YoIi4iKSAhPSAtMSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZmlsZU5hbWUuc3Vic3RyaW5nKGZpbGVOYW1lLmxhc3RJbmRleE9mKCIuIiksIGZpbGVOYW1lLmxlbmd0aCgpKS5lcXVhbHMoIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLmphciIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzcGF0aEVudHJpZXMuYWRkKEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShuZXcgUGF0aChmaWxlLmdldEFic29sdXRlUGF0aCgpKSwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFBhdGgoIi8iKSkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNsYXNzcGF0aEVudHJpZXMudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5W2NsYXNzcGF0aEVudHJpZXMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLSAgICAgICAgaWYgKGdldEN4ZlJ1bnRpbWVMb2NhdGlvbigpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgRmlsZSBjeGZMaWJEaXJlY3RvcnkgPSBnZXRDWEZMaWJyYXJ5RGlyZWN0b3J5KCk7Ci0gICAgICAgICAgICByZXR1cm4gY3hmTGliRGlyZWN0b3J5LmV4aXN0cygpICYmIGN4ZkxpYkRpcmVjdG9yeS5pc0RpcmVjdG9yeSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KENYRkNvcmVNZXNzYWdlcy5DWEZfQ09OVEFJTkVSX0xJQlJBUlksIGdldEN4ZlJ1bnRpbWVUeXBlKCksCi0gICAgICAgICAgICAgICAgZ2V0Q3hmUnVudGltZVZlcnNpb24oKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRLaW5kKCkgewotICAgICAgICByZXR1cm4gS19BUFBMSUNBVElPTjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVBhdGggZ2V0UGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIHBhdGg7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDWEZJbnN0YWxsIGdldEN4Zkluc3RhbGwoKSB7Ci0gICAgICAgIFN0cmluZyBpbnN0YWxsZWQgPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRDWEZSdW50aW1lVmVyc2lvbihwcm9qZWN0KTsKLSAgICAgICAgdGhpcy5pbnN0YWxsZWQgPSBpbnN0YWxsZWQ7Ci0gICAgICAgIENYRkNvbnRleHQgY29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCk7Ci0gICAgICAgIENYRkluc3RhbGwgY3hmSW5zdGFsbCA9IGNvbnRleHQuZ2V0SW5zdGFsbGF0aW9ucygpLmdldChpbnN0YWxsZWQpOwotICAgICAgICByZXR1cm4gY3hmSW5zdGFsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRDeGZSdW50aW1lTG9jYXRpb24oKSB7Ci0gICAgICAgIENYRkluc3RhbGwgY3hmSW5zdGFsbCA9IGdldEN4Zkluc3RhbGwoKTsKLSAgICAgICAgaWYgKGN4Zkluc3RhbGwgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGN4Zkluc3RhbGwuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKYXZhMldTQ29udGV4dCgpLmdldERlZmF1bHRSdW50aW1lTG9jYXRpb24oKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRDeGZSdW50aW1lVmVyc2lvbigpIHsKLSAgICAgICAgQ1hGSW5zdGFsbCBjeGZJbnN0YWxsID0gZ2V0Q3hmSW5zdGFsbCgpOwotICAgICAgICBpZiAoY3hmSW5zdGFsbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gY3hmSW5zdGFsbC5nZXRWZXJzaW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKS5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRDeGZSdW50aW1lVHlwZSgpIHsKLSAgICAgICAgQ1hGSW5zdGFsbCBjeGZJbnN0YWxsID0gZ2V0Q3hmSW5zdGFsbCgpOwotICAgICAgICBpZiAoY3hmSW5zdGFsbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gY3hmSW5zdGFsbC5nZXRUeXBlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKS5nZXREZWZhdWx0UnVudGltZVR5cGUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEZpbGUgZ2V0Q1hGTGlicmFyeURpcmVjdG9yeSgpIHsKLSAgICAgICAgSVBhdGggY3hmTGliUGF0aCA9IG5ldyBQYXRoKGdldEN4ZlJ1bnRpbWVMb2NhdGlvbigpKTsKLSAgICAgICAgaWYgKCFjeGZMaWJQYXRoLmhhc1RyYWlsaW5nU2VwYXJhdG9yKCkpIHsKLSAgICAgICAgICAgIGN4ZkxpYlBhdGggPSBjeGZMaWJQYXRoLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY3hmTGliUGF0aCA9IGN4ZkxpYlBhdGguYXBwZW5kKCJsaWIiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIEZpbGUgY3hmTGliRGlyZWN0b3J5ID0gbmV3IEZpbGUoY3hmTGliUGF0aC50b09TU3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gY3hmTGliRGlyZWN0b3J5OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvQ1hGQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvQ1hGQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNlOTQ2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL0NYRkNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci0KLXB1YmxpYyBjbGFzcyBDWEZDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciBleHRlbmRzIENsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyIHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoSVBhdGggY29udGFpbmVyUGF0aCwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIENYRkNsYXNzcGF0aENvbnRhaW5lciBjeGZDbGFzc3BhdGhDb250YWluZXIgPSBuZXcgQ1hGQ2xhc3NwYXRoQ29udGFpbmVyKGNvbnRhaW5lclBhdGgsIGphdmFQcm9qZWN0KTsKLQotICAgICAgICBpZiAoY3hmQ2xhc3NwYXRoQ29udGFpbmVyLmlzVmFsaWQoKSkgewotICAgICAgICAgICAgSmF2YUNvcmUuc2V0Q2xhc3NwYXRoQ29udGFpbmVyKGNvbnRhaW5lclBhdGgsIG5ldyBJSmF2YVByb2plY3RbXSB7IGphdmFQcm9qZWN0IH0sCi0gICAgICAgICAgICAgICAgICAgIG5ldyBJQ2xhc3NwYXRoQ29udGFpbmVyW10geyBjeGZDbGFzc3BhdGhDb250YWluZXIgfSwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5VcGRhdGVDbGFzc3BhdGhDb250YWluZXIoSVBhdGggY29udGFpbmVyUGF0aCwgSUphdmFQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVxdWVzdENsYXNzcGF0aENvbnRhaW5lclVwZGF0ZShJUGF0aCBjb250YWluZXJQYXRoLCBJSmF2YVByb2plY3QgamF2YVByb2plY3QsCi0gICAgICAgICAgICBJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lclN1Z2dlc3Rpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSmF2YUNvcmUuc2V0Q2xhc3NwYXRoQ29udGFpbmVyKGNvbnRhaW5lclBhdGgsIG5ldyBJSmF2YVByb2plY3RbXSB7amF2YVByb2plY3R9LAotICAgICAgICAgICAgICAgIG5ldyBJQ2xhc3NwYXRoQ29udGFpbmVyW10geyBjb250YWluZXJTdWdnZXN0aW9uIH0sIG51bGwpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9DWEZDb3JlTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvQ1hGQ29yZU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NjU5MmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9DWEZDb3JlTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBDWEZDb3JlTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9IAotICAgICAgICAib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVNZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9GQUNFVF9JTlNUQUxMX0RFTEVHQVRFX1JVTlRJTUVfTE9DQVRJT05fTk9UX1NFVDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9DT05UQUlORVJfTElCUkFSWTsKLSAgICAKLSAgICBzdGF0aWMgewotICAgICAgICAvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotICAgICAgICBOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBDWEZDb3JlTWVzc2FnZXMuY2xhc3MpOwotICAgIH0KLQotICAgIHByaXZhdGUgQ1hGQ29yZU1lc3NhZ2VzKCkgewotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9DWEZDb3JlTWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvQ1hGQ29yZU1lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZGFhNzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9DWEZDb3JlTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jSkRUVXRpbHMKLUNYRl9GQUNFVF9JTlNUQUxMX0RFTEVHQVRFX1JVTlRJTUVfTE9DQVRJT05fTk9UX1NFVD1DWEYgUnVudGltZSBsb2NhdGlvbiBub3Qgc2V0LiBQbGVhc2Ugc2V0IGxvY2F0aW9uIGluIFByZWZlcmVuY2VzID4gV2ViIFNlcnZpY2VzID4gQ1hmIDIueCBQcmVmZXJlbmNlcwotQ1hGX0NPTlRBSU5FUl9MSUJSQVJZPXswfSBMaWJyYXJ5IFt7MX1dClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9DWEZDb3JlUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL0NYRkNvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYzMWVmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL0NYRkNvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Qcm9qZWN0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuY29udGV4dC5KYXZhMldTUGVyc2lzdGVudENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLmNvbnRleHQuV1NETDJKYXZhUGVyc2lzdGVudENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5CYWNraW5nU3RvcmVFeGNlcHRpb247Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENYRkNvcmVQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotICAgIC8vIFRoZSBwbHVnLWluIElECi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vQ1hGIENsYXNzcGF0aCBjb250YWluZXIgSUQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUuQ1hGX0NMQVNTUEFUSF9DT05UQUlORVIiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDWEZfVkVSU0lPTl8yXzAgPSAiMi4wIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1hGX1ZFUlNJT05fMl8xID0gIjIuMSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLSAgICBwcml2YXRlIHN0YXRpYyBDWEZDb3JlUGx1Z2luIHBsdWdpbjsKLQotICAgIHByaXZhdGUgSmF2YTJXU1BlcnNpc3RlbnRDb250ZXh0IGphdmEyV1NDb250ZXh0OwotICAgIHByaXZhdGUgV1NETDJKYXZhUGVyc2lzdGVudENvbnRleHQgd3NkbDJKYXZhQ29udGV4dDsKLQotICAgIHByaXZhdGUgVmVyc2lvbiBjdXJyZW50UnVudGltZVZlcnNpb247Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgQ1hGQ29yZVBsdWdpbigpIHsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnN0YXJ0KGNvbnRleHQpOwotICAgICAgICBwbHVnaW4gPSB0aGlzOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHBsdWdpbiA9IG51bGw7Ci0gICAgICAgIHN1cGVyLnN0b3AoY29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDWEZDb3JlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0gICAgICAgIHJldHVybiBwbHVnaW47Ci0gICAgfQotCi0gICAgcHVibGljIEphdmEyV1NQZXJzaXN0ZW50Q29udGV4dCBnZXRKYXZhMldTQ29udGV4dCgpIHsKLSAgICAgICAgaWYgKGphdmEyV1NDb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGphdmEyV1NDb250ZXh0ID0gbmV3IEphdmEyV1NQZXJzaXN0ZW50Q29udGV4dCgpOwotICAgICAgICAgICAgamF2YTJXU0NvbnRleHQubG9hZCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBqYXZhMldTQ29udGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgV1NETDJKYXZhUGVyc2lzdGVudENvbnRleHQgZ2V0V1NETDJKYXZhQ29udGV4dCgpIHsKLSAgICAgICAgaWYgKHdzZGwySmF2YUNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgd3NkbDJKYXZhQ29udGV4dCA9IG5ldyBXU0RMMkphdmFQZXJzaXN0ZW50Q29udGV4dCgpOwotICAgICAgICAgICAgd3NkbDJKYXZhQ29udGV4dC5sb2FkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHdzZGwySmF2YUNvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFZlcnNpb24gZ2V0Q3VycmVudFJ1bnRpbWVWZXJzaW9uKCkgewotICAgICAgICAvL2lmIChjdXJyZW50UnVudGltZVZlcnNpb24gPT0gbnVsbCkgewotICAgICAgICBTdHJpbmcgY3hmUnVudGltZVZlcnNpb24gPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKYXZhMldTQ29udGV4dCgpLmdldERlZmF1bHRSdW50aW1lVmVyc2lvbigpOwotICAgICAgICBpZiAoY3hmUnVudGltZVZlcnNpb24ubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgY3hmUnVudGltZVZlcnNpb24gPSAiMC4wLjAiOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuY3VycmVudFJ1bnRpbWVWZXJzaW9uID0gbmV3IFZlcnNpb24oY3hmUnVudGltZVZlcnNpb24pOwotICAgICAgICAvL30KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRSdW50aW1lVmVyc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50UnVudGltZVZlcnNpb24oVmVyc2lvbiB2ZXJzaW9uKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudFJ1bnRpbWVWZXJzaW9uID0gdmVyc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDWEZSdW50aW1lVmVyc2lvbihJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgY3hmUnVudGltZVZlcnNpb24pIHsKLSAgICAgICAgSUVjbGlwc2VQcmVmZXJlbmNlcyBwcmVmcyA9IGdldFByb2plY3RQcmVmZXJlbmNlcyhwcm9qZWN0KTsKLSAgICAgICAgcHJlZnMucHV0KFBMVUdJTl9JRCArICIucnVudGltZS52ZXJzaW9uIiwgY3hmUnVudGltZVZlcnNpb24pOwotICAgICAgICBmbHVzaChwcmVmcyk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDWEZSdW50aW1lVmVyc2lvbihJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIElFY2xpcHNlUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXRQcm9qZWN0UHJlZmVyZW5jZXMocHJvamVjdCk7Ci0gICAgICAgIHJldHVybiBwcmVmcy5nZXQoUExVR0lOX0lEICsgIi5ydW50aW1lLnZlcnNpb24iLAotICAgICAgICAgICAgICAgIENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCkuZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZmx1c2goSUVjbGlwc2VQcmVmZXJlbmNlcyBwcmVmcykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJlZnMuZmx1c2goKTsKLSAgICAgICAgfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGJzZSkgewotICAgICAgICAgICAgbG9nKGJzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIENYRiBwcmVmZXJlbmNlcyBmb3IgdGhlIHNwZWNpZmllZCBFY2xpcHNlIHByb2plY3QuCi0gICAgICovCi0gICAgcHVibGljIElFY2xpcHNlUHJlZmVyZW5jZXMgZ2V0UHJvamVjdFByZWZlcmVuY2VzKElQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgSVNjb3BlQ29udGV4dCBjb250ZXh0ID0gbmV3IFByb2plY3RTY29wZShwcm9qZWN0KTsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0Tm9kZShQTFVHSU5fSUQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2dNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2cobmV3IFN0YXR1cyhzZXZlcml0eSwgQ1hGQ29yZVBsdWdpbi5QTFVHSU5fSUQsIG1lc3NhZ2UpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgIENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNvcmVQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgIGV4Y2VwdGlvbi50b1N0cmluZygpLCBleGNlcHRpb24pKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL2NvbnRleHQvQ1hGUGVyc2lzdGVudENvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvY29udGV4dC9DWEZQZXJzaXN0ZW50Q29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjA5MjhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvY29udGV4dC9DWEZQZXJzaXN0ZW50Q29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZJbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5DWEZNb2RlbFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb250ZXh0LlBlcnNpc3RlbnRDb250ZXh0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGFic3RyYWN0IGNsYXNzIENYRlBlcnNpc3RlbnRDb250ZXh0IGV4dGVuZHMgUGVyc2lzdGVudENvbnRleHQgaW1wbGVtZW50cyBDWEZDb250ZXh0IHsKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIENYRkluc3RhbGw+IGluc3RhbGxhdGlvbnM7Ci0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcgY29uc3RhbnQgdXNlZCB0byBsb29rdXAgdGhlIENYRiBydW50aW1lIGxvY2F0aW9uIGdlbmVyYWwKLSAgICAgKiBwcmVmZXJlbmNlIGZyb20gdGhlIHBsdWdpbnMgbG9jYWwgcHJlZmVyZW5jZXMgc3RvcmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfREVGQVVMVF9SVU5USU1FX0xPQ0FUSU9OID0gImRlZmF1bHRSdW50aW1lTG9jYXRpb24iOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcgY29uc3RhbnQgdXNlZCB0byBsb29rdXAgdGhlIENYRiBydW50aW1lIHR5cGUgZ2VuZXJhbCBwcmVmZXJlbmNlIGZyb20KLSAgICAgKiB0aGUgcGx1Z2lucyBsb2NhbCBwcmVmZXJlbmNlcyBzdG9yZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9ERUZBVUxUX1JVTlRJTUVfVFlQRSA9ICJkZWZhdWx0UnVudGltZVR5cGUiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcgY29uc3RhbnQgdXNlZCB0byBsb29rdXAgdGhlIENYRiB2ZXJzaW9uIGdlbmVyYWwgcHJlZmVyZW5jZSBmcm9tCi0gICAgICogdGhlIHBsdWdpbnMgbG9jYWwgcHJlZmVyZW5jZXMgc3RvcmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfREVGQVVMVF9SVU5USU1FX1ZFUlNJT04gPSAiZGVmYXVsdFJ1bnRpbWVWZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfQ1hGX1JVTlRJTUVfVkVSU0lPTlMgPSAiY3hmUnVudGltZVZlcnNpb25zIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0NYRl9SVU5USU1FX0xPQ0FUSU9OUyA9ICJjeGZSdW50aW1lTG9jYXRpb25zIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0NYRl9SVU5USU1FX1RZUEVTID0gImN4ZlJ1bnRpbWVUeXBlcyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0VYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUiA9ICJleHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9DWEZfVkVSQk9TRSA9ICJjeGZWZXJib3NlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfQ1hGX1VTRV9TUFJJTkdfQVBQX0NPTlRFWFQgPSAiY3hmVXNlU3ByaW5nQXBwQ29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBDWEZQZXJzaXN0ZW50Q29udGV4dChQbHVnaW4gcGx1Z2luKSB7Ci0gICAgICAgIHN1cGVyKENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBsb2FkKCkgewotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfREVGQVVMVF9SVU5USU1FX0xPQ0FUSU9OLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX0RFRkFVTFRfUlVOVElNRV9UWVBFLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX0RFRkFVTFRfUlVOVElNRV9WRVJTSU9OLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfQ1hGX1JVTlRJTUVfVkVSU0lPTlMsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfQ1hGX1JVTlRJTUVfTE9DQVRJT05TLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX0NYRl9SVU5USU1FX1RZUEVTLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSLCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVCwgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVF9fRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX0NYRl9WRVJCT1NFLCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5DWEZfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkNYRl9DT05URVhUX19WRVJCT1NFKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX0NYRl9VU0VfU1BSSU5HX0FQUF9DT05URVhULCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVCwgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVF9fVVNFX1NQUklOR19BUFBMSUNBVElPTl9DT05URVhUKSk7Ci0gICAgfQotCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIENYRkluc3RhbGw+IGdldEluc3RhbGxhdGlvbnMoKSB7Ci0gICAgICAgIGlmIChpbnN0YWxsYXRpb25zID09IG51bGwpIHsKLSAgICAgICAgICAgIGluc3RhbGxhdGlvbnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENYRkluc3RhbGw+KCk7Ci0gICAgICAgICAgICBTdHJpbmcgdmVyc2lvbnMgPSBnZXRWYWx1ZUFzU3RyaW5nKFBSRUZFUkVOQ0VfQ1hGX1JVTlRJTUVfVkVSU0lPTlMpLnRyaW0oKTsKLSAgICAgICAgICAgIFN0cmluZyBsb2N0aW9ucyA9IGdldFZhbHVlQXNTdHJpbmcoUFJFRkVSRU5DRV9DWEZfUlVOVElNRV9MT0NBVElPTlMpLnRyaW0oKTsKLSAgICAgICAgICAgIFN0cmluZyB0eXBlcyA9IGdldFZhbHVlQXNTdHJpbmcoUFJFRkVSRU5DRV9DWEZfUlVOVElNRV9UWVBFUykudHJpbSgpOwotICAgICAgICAgICAgaWYgKHZlcnNpb25zLnRyaW0oKS5sZW5ndGgoKSA+IDAgJiYgbG9jdGlvbnMudHJpbSgpLmxlbmd0aCgpID4gMCAmJiB0eXBlcy50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gY3hmVmVyc2lvbnMgPSB2ZXJzaW9ucy5zcGxpdCgiLCIpOwotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGN4ZkxvY2F0aW9ucyA9IGxvY3Rpb25zLnNwbGl0KCIsIik7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gY3hmVHlwZXMgPSB0eXBlcy5zcGxpdCgiLCIpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY3hmVmVyc2lvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgQ1hGSW5zdGFsbCBjeGZJbnN0YWxsID0gQ1hGRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ1hGSW5zdGFsbCgpOwotICAgICAgICAgICAgICAgICAgICBjeGZJbnN0YWxsLnNldFZlcnNpb24oY3hmVmVyc2lvbnNbaV0pOwotICAgICAgICAgICAgICAgICAgICBjeGZJbnN0YWxsLnNldExvY2F0aW9uKGN4ZkxvY2F0aW9uc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgIGN4Zkluc3RhbGwuc2V0VHlwZShjeGZUeXBlc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgIGluc3RhbGxhdGlvbnMucHV0KGN4ZlZlcnNpb25zW2ldLCBjeGZJbnN0YWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGluc3RhbGxhdGlvbnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW5zdGFsbGF0aW9ucyhNYXA8U3RyaW5nLCBDWEZJbnN0YWxsPiBpbnN0YWxsYXRpb25zKSB7Ci0gICAgICAgIHRoaXMuaW5zdGFsbGF0aW9ucyA9IGluc3RhbGxhdGlvbnM7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxDWEZJbnN0YWxsPiBpbnN0YWxscyA9IGluc3RhbGxhdGlvbnMudmFsdWVzKCk7Ci0KLSAgICAgICAgU3RyaW5nQnVpbGRlciB2ZXJzaW9ucyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgbG9jYXRpb25zID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgU3RyaW5nQnVpbGRlciB0eXBlcyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIEl0ZXJhdG9yPENYRkluc3RhbGw+IGluc3RhbGxJdGVyID0gaW5zdGFsbHMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGluc3RhbGxJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgQ1hGSW5zdGFsbCBjeGZJbnN0YWxsID0gaW5zdGFsbEl0ZXIubmV4dCgpOwotICAgICAgICAgICAgdmVyc2lvbnMuYXBwZW5kKGN4Zkluc3RhbGwuZ2V0VmVyc2lvbigpKTsKLSAgICAgICAgICAgIGxvY2F0aW9ucy5hcHBlbmQoY3hmSW5zdGFsbC5nZXRMb2NhdGlvbigpKTsKLSAgICAgICAgICAgIHR5cGVzLmFwcGVuZChjeGZJbnN0YWxsLmdldFR5cGUoKSk7Ci0gICAgICAgICAgICBpZiAoaW5zdGFsbEl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgdmVyc2lvbnMuYXBwZW5kKCIsIik7Ci0gICAgICAgICAgICAgICAgbG9jYXRpb25zLmFwcGVuZCgiLCIpOwotICAgICAgICAgICAgICAgIHR5cGVzLmFwcGVuZCgiLCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfQ1hGX1JVTlRJTUVfVkVSU0lPTlMsIHZlcnNpb25zLnRvU3RyaW5nKCkpOwotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX0NYRl9SVU5USU1FX0xPQ0FUSU9OUywgbG9jYXRpb25zLnRvU3RyaW5nKCkpOwotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX0NYRl9SVU5USU1FX1RZUEVTLCB0eXBlcy50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRSdW50aW1lTG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzU3RyaW5nKFBSRUZFUkVOQ0VfREVGQVVMVF9SVU5USU1FX0xPQ0FUSU9OKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0UnVudGltZUxvY2F0aW9uKFN0cmluZyBydW50aW1lTG9jYXRpb24pIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9ERUZBVUxUX1JVTlRJTUVfTE9DQVRJT04sIHJ1bnRpbWVMb2NhdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0UnVudGltZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzU3RyaW5nKFBSRUZFUkVOQ0VfREVGQVVMVF9SVU5USU1FX1RZUEUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRSdW50aW1lVHlwZShTdHJpbmcgcnVudGltZUVkaXRpb24pIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9ERUZBVUxUX1JVTlRJTUVfVFlQRSwgcnVudGltZUVkaXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc1N0cmluZyhQUkVGRVJFTkNFX0RFRkFVTFRfUlVOVElNRV9WRVJTSU9OKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0UnVudGltZVZlcnNpb24oU3RyaW5nIHJ1bnRpbWVWZXJzaW9uKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfREVGQVVMVF9SVU5USU1FX1ZFUlNJT04sIHJ1bnRpbWVWZXJzaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0V4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcigpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIoYm9vbGVhbiBleHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIpIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9FWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVIsIGV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNWZXJib3NlKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9DWEZfVkVSQk9TRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmVyYm9zZShib29sZWFuIHZlcmJvc2UpIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9DWEZfVkVSQk9TRSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX0NYRl9VU0VfU1BSSU5HX0FQUF9DT05URVhUKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoYm9vbGVhbiB1c2VTcHJpbmdBcHBDb250ZXh0KSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfQ1hGX1VTRV9TUFJJTkdfQVBQX0NPTlRFWFQsIHVzZVNwcmluZ0FwcENvbnRleHQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvY29udGV4dC9KYXZhMldTUGVyc2lzdGVudENvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvY29udGV4dC9KYXZhMldTUGVyc2lzdGVudENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQyMDkwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL2NvbnRleHQvSmF2YTJXU1BlcnNpc3RlbnRDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuRGF0YUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkZyb250ZW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuQ1hGTW9kZWxVdGlsczsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBKYXZhMldTUGVyc2lzdGVudENvbnRleHQgZXh0ZW5kcyBDWEZQZXJzaXN0ZW50Q29udGV4dCBpbXBsZW1lbnRzIEphdmEyV1NDb250ZXh0IHsKLSAgICAvKioKLSAgICAgKiBTdHJpbmcgY29uc3RhbnQgdXNlZCB0byBsb29rdXAgdGhlIGN4ZiBzb2FwIGJpbmRpbmcgZ2VuZXJhbCBwcmVmZXJlbmNlCi0gICAgICogZnJvbSB0aGUgcGx1Z2lucyBsb2NhbCBwcmVmZXJlbmNlcyBzdG9yZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9KMldTX1NPQVAxMl9CSU5ESU5HID0gImN4ZkoyV1NTb2FwMTJCaW5kaW5nIjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKgotICAgICAqIFN0cmluZyBjb25zdGFudCB1c2VkIHRvIGxvb2t1cCB0aGUgY3hmIGdlbmVyYXRlIHhzZCBpbXBvcnRzIGdlbmVyYWwKLSAgICAgKiBwcmVmZXJlbmNlIGZyb20gdGhlIHBsdWdpbnMgbG9jYWwgcHJlZmVyZW5jZXMgc3RvcmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfSjJXU19HRU5FUkFURV9YU0RfSU1QT1JUUyA9ICJjeGZKMldTWFNESW1wb3J0cyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFN0cmluZyBjb25zdGFudCB1c2VkIHRvIGxvb2t1cCB0aGUgY3hmIGRlZmF1bHQgZnJvbnRlbmQgZ2VuZXJhbAotICAgICAqIHByZWZlcmVuY2UgZnJvbSB0aGUgcGx1Z2lucyBsb2NhbCBwcmVmZXJlbmNlcyBzdG9yZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0oyV1NfREVGQVVMVF9GUk9OVEVORCA9ICJjeGZKMldTRGVmYXVsdEZyb250ZW5kIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGNvbnN0YW50IHVzZWQgdG8gbG9va3VwIHRoZSBjeGYgZGVmYXVsdCBEYXRhYmluZGluZyBnZW5lcmFsCi0gICAgICogcHJlZmVyZW5jZSBmcm9tIHRoZSBwbHVnaW5zIGxvY2FsIHByZWZlcmVuY2VzIHN0b3JlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfSjJXU19ERUZBVUxUX0RBVEFCSU5ESU5HID0gImN4ZkoyV1NEZWZhdWx0RGF0YWJpbmRpbmciOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcgY29uc3RhbnQgdXNlZCB0byBsb29rdXAgdGhlIGN4ZiBnZW5lcmF0ZSBjbGllbnQgZ2VuZXJhbCBwcmVmZXJlbmNlCi0gICAgICogZnJvbSB0aGUgcGx1Z2lucyBsb2NhbCBwcmVmZXJlbmNlcyBzdG9yZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0oyV1NfR0VORVJBVEVfQ0xJRU5UID0gImN4ZkoyV1NHZW5lcmF0ZUNsaWVudCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFN0cmluZyBjb25zdGFudCB1c2VkIHRvIGxvb2t1cCB0aGUgY3hmIGdlbmVyYXRlIHNlcnZlciBnZW5lcmFsIHByZWZlcmVuY2UKLSAgICAgKiBmcm9tIHRoZSBwbHVnaW5zIGxvY2FsIHByZWZlcmVuY2VzIHN0b3JlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfSjJXU19HRU5FUkFURV9TRVJWRVIgPSAiY3hmSjJXU0dlbmVyYXRlU2VydmVyIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGNvbnN0YW50IHVzZWQgdG8gbG9va3VwIHRoZSBjeGYgZ2VuZXJhdGUgd3JhcHBlciBhbmQgZmF1bHQgYmVhbnMKLSAgICAgKiBnZW5lcmFsIHByZWZlcmVuY2UgZnJvbSB0aGUgcGx1Z2lucyBsb2NhbCBwcmVmZXJlbmNlcyBzdG9yZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0oyV1NfR0VORVJBVEVfV1JBUFBFUl9GQVVMVF9CRUFOUyA9ICJjeGZKMldTR2VuZXJhdGVXcmFwcGVyRmF1bHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcgY29uc3RhbnQgdXNlZCB0byBsb29rdXAgdGhlIGN4ZiBnZW5lcmF0ZSB3c2RsIGdlbmVyYWwgcHJlZmVyZW5jZQotICAgICAqIGZyb20gdGhlIHBsdWdpbnMgbG9jYWwgcHJlZmVyZW5jZXMgc3RvcmUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9KMldTX0dFTkVSQVRFX1dTREwgPSAiY3hmSjJXU0dlbmVyYXRlV1NETCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFN0cmluZyBjb25zdGFudCB1c2VkIHRvIGxvb2t1cCB0aGUgY3hmIGdlbmVyYXRlIGFudCBidWlsZCBmaWxlIGdlbmVyYWwKLSAgICAgKiBwcmVmZXJlbmNlIGZyb20gdGhlIHBsdWdpbnMgbG9jYWwgcHJlZmVyZW5jZXMgc3RvcmUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9KMldTX0dFTkVSQVRFX0FOVF9CVUlMRF9GSUxFID0gImN4ZkoyV1NHZW5lcmF0ZUFOVEJ1aWxkRmlsZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFN0cmluZyBjb25zdGFudCB1c2VkIHRvIGxvb2t1cCB0aGUgQVBUIGFubm90YXRpb24gcHJvY2Vzc2luZyBnZW5lcmFsCi0gICAgICogcHJlZmVyZW5jZSBmcm9tIHRoZSBwbHVnaW5zIGxvY2FsIHByZWZlcmVuY2VzIHN0b3JlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfSjJXU19FTkFCTEVfQU5OT1RBVElPTl9QUk9DRVNTSU5HCi0gICAgPSAiY3hmSjJXU0VuYWJsZUFubm90YXRpb25Qcm9jZXNzaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGNvbnN0YW50IHVzZWQgdG8gbG9va3VwIHRoZSBnZW5lcmF0ZSA8Y29kZT5AV2ViTWV0aG9kPC9jb2RlPiBhbm5vdGF0aW9uIGdlbmVyYWwKLSAgICAgKiBwcmVmZXJlbmNlIGZyb20gdGhlIHBsdWdpbnMgbG9jYWwgcHJlZmVyZW5jZXMgc3RvcmUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9HRU5FUkFURV9XRUJfTUVUSE9EX0FOTk9UQVRJT04KLSAgICA9ICJjeGZKMldTR2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGNvbnN0YW50IHVzZWQgdG8gbG9va3VwIHRoZSBnZW5lcmF0ZSA8Y29kZT5AV2ViUGFyYW08L2NvZGU+IGFubm90YXRpb24gZ2VuZXJhbAotICAgICAqIHByZWZlcmVuY2UgZnJvbSB0aGUgcGx1Z2lucyBsb2NhbCBwcmVmZXJlbmNlcyBzdG9yZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0dFTkVSQVRFX1dFQl9QQVJBTV9BTk5PVEFUSU9OCi0gICAgPSAiY3hmSjJXU0dlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGNvbnN0YW50IHVzZWQgdG8gbG9va3VwIHRoZSBnZW5lcmF0ZSA8Y29kZT5AUmVxdWVzdFdyYXBwZXI8L2NvZGU+IGFubm90YXRpb24gZ2VuZXJhbAotICAgICAqIHByZWZlcmVuY2UgZnJvbSB0aGUgcGx1Z2lucyBsb2NhbCBwcmVmZXJlbmNlcyBzdG9yZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0dFTkVSQVRFX1JFUVVFU1RfV1JBUFBFUl9BTk5PVEFUSU9OCi0gICAgPSAiY3hmSjJXU0dlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGNvbnN0YW50IHVzZWQgdG8gbG9va3VwIHRoZSBnZW5lcmF0ZSA8Y29kZT5AUmVzcG9uc2VXcmFwcGVyPC9jb2RlPiBhbm5vdGF0aW9uIGdlbmVyYWwKLSAgICAgKiBwcmVmZXJlbmNlIGZyb20gdGhlIHBsdWdpbnMgbG9jYWwgcHJlZmVyZW5jZXMgc3RvcmUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9HRU5FUkFURV9SRVNQT05TRV9XUkFQUEVSX0FOTk9UQVRJT04KLSAgICA9ICJjeGZKMldTR2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIEphdmEyV1NQZXJzaXN0ZW50Q29udGV4dCgpIHsKLSAgICAgICAgc3VwZXIoQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGxvYWQoKSB7Ci0gICAgICAgIHN1cGVyLmxvYWQoKTsKLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX0oyV1NfU09BUDEyX0JJTkRJTkcsIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFQsIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fU09BUDEyX0JJTkRJTkcpKTsKLQotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfSjJXU19HRU5FUkFURV9YU0RfSU1QT1JUUywgQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVCwgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9YU0RfSU1QT1JUUykpOwotCi0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9KMldTX0RFRkFVTFRfREFUQUJJTkRJTkcsIERhdGFCaW5kaW5nLkpBWEIuZ2V0TGl0ZXJhbCgpKTsKLQotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfSjJXU19ERUZBVUxUX0ZST05URU5ELCBGcm9udGVuZC5KQVhXUy5nZXRMaXRlcmFsKCkpOwotCi0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9KMldTX0dFTkVSQVRFX0NMSUVOVCwgQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuQ1hGX0NPTlRFWFQsIENYRlBhY2thZ2UuQ1hGX0NPTlRFWFRfX0dFTkVSQVRFX0NMSUVOVCkpOwotCi0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9KMldTX0dFTkVSQVRFX1NFUlZFUiwgQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuQ1hGX0NPTlRFWFQsIENYRlBhY2thZ2UuQ1hGX0NPTlRFWFRfX0dFTkVSQVRFX1NFUlZFUikpOwotCi0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9KMldTX0dFTkVSQVRFX1dSQVBQRVJfRkFVTFRfQkVBTlMsIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFQsIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV1JBUFBFUl9GQVVMVF9CRUFOUykpOwotCi0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9KMldTX0dFTkVSQVRFX1dTREwsIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFQsIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV1NETCkpOwotCi0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9KMldTX0VOQUJMRV9BTk5PVEFUSU9OX1BST0NFU1NJTkcsIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFQsIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fQU5OT1RBVElPTl9QUk9DRVNTSU5HX0VOQUJMRUQpKTsKLQotICAgICAgICAvL1RPRE8gTU9WRSBUSEUgRk9MTE9XSU5HIDQKLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX0dFTkVSQVRFX1dFQl9NRVRIT0RfQU5OT1RBVElPTiwgQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVCwgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9XRUJfTUVUSE9EX0FOTk9UQVRJT04pKTsKLQotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfR0VORVJBVEVfV0VCX1BBUkFNX0FOTk9UQVRJT04sIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFQsIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV0VCX1BBUkFNX0FOTk9UQVRJT04pKTsKLQotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfR0VORVJBVEVfUkVRVUVTVF9XUkFQUEVSX0FOTk9UQVRJT04sIENYRk1vZGVsVXRpbHMKLSAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1JFUVVFU1RfV1JBUFBFUl9BTk5PVEFUSU9OKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX0dFTkVSQVRFX1JFU1BPTlNFX1dSQVBQRVJfQU5OT1RBVElPTiwgQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1JFU1BPTlNFX1dSQVBQRVJfQU5OT1RBVElPTikpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU29hcDEyQmluZGluZygpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfSjJXU19TT0FQMTJfQklORElORyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U29hcDEyQmluZGluZyhib29sZWFuIHNvYXAxMkJpbmRpbmcpIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9KMldTX1NPQVAxMl9CSU5ESU5HLCBzb2FwMTJCaW5kaW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlWFNESW1wb3J0cygpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfSjJXU19HRU5FUkFURV9YU0RfSU1QT1JUUyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVYU0RJbXBvcnRzKGJvb2xlYW4gZ2VuZXJhdGVYU0RJbXBvcnRzKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfSjJXU19HRU5FUkFURV9YU0RfSU1QT1JUUywgZ2VuZXJhdGVYU0RJbXBvcnRzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGF0YUJpbmRpbmcgZ2V0RGF0YWJpbmRpbmcoKSB7Ci0gICAgICAgIHJldHVybiBEYXRhQmluZGluZy5nZXQoZ2V0VmFsdWVBc1N0cmluZyhQUkVGRVJFTkNFX0oyV1NfREVGQVVMVF9EQVRBQklORElORykpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERhdGFiaW5kaW5nKERhdGFCaW5kaW5nIGRhdGFCaW5kaW5nKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfSjJXU19ERUZBVUxUX0RBVEFCSU5ESU5HLCBkYXRhQmluZGluZy5nZXRMaXRlcmFsKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBGcm9udGVuZCBnZXRGcm9udGVuZCgpIHsKLSAgICAgICAgcmV0dXJuIEZyb250ZW5kLmdldChnZXRWYWx1ZUFzU3RyaW5nKFBSRUZFUkVOQ0VfSjJXU19ERUZBVUxUX0ZST05URU5EKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RnJvbnRlbmQoRnJvbnRlbmQgZGVmYXVsdEZyb250ZW5kKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfSjJXU19ERUZBVUxUX0ZST05URU5ELCBkZWZhdWx0RnJvbnRlbmQuZ2V0TGl0ZXJhbCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlQ2xpZW50KCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9KMldTX0dFTkVSQVRFX0NMSUVOVCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVDbGllbnQoYm9vbGVhbiBnZW5lcmF0ZUNsaWVudCkgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX0oyV1NfR0VORVJBVEVfQ0xJRU5ULCBnZW5lcmF0ZUNsaWVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZVNlcnZlcigpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfSjJXU19HRU5FUkFURV9TRVJWRVIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlU2VydmVyKGJvb2xlYW4gZ2VuZXJhdGVTZXJ2ZXIpIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9KMldTX0dFTkVSQVRFX1NFUlZFUiwgZ2VuZXJhdGVTZXJ2ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucygpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfSjJXU19HRU5FUkFURV9XUkFQUEVSX0ZBVUxUX0JFQU5TKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKGJvb2xlYW4gZ2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucykgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX0oyV1NfR0VORVJBVEVfV1JBUFBFUl9GQVVMVF9CRUFOUywgZ2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZVdTREwoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX0oyV1NfR0VORVJBVEVfV1NETCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVXU0RMKGJvb2xlYW4gZ2VuZXJhdGVXU0RMKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfSjJXU19HRU5FUkFURV9XU0RMLCBnZW5lcmF0ZVdTREwpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVBbnRCdWlsZEZpbGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX0oyV1NfR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlQW50QnVpbGRGaWxlKGJvb2xlYW4gZ2VuZXJhdGVBbnRCdWlsZEZpbGUpIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9KMldTX0dFTkVSQVRFX0FOVF9CVUlMRF9GSUxFLCBnZW5lcmF0ZUFudEJ1aWxkRmlsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX0oyV1NfRU5BQkxFX0FOTk9UQVRJT05fUFJPQ0VTU0lORyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX0dFTkVSQVRFX1dFQl9NRVRIT0RfQU5OT1RBVElPTik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfR0VORVJBVEVfV0VCX1BBUkFNX0FOTk9UQVRJT04pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKGJvb2xlYW4gZ2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24pIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9HRU5FUkFURV9XRUJfUEFSQU1fQU5OT1RBVElPTiwgZ2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbihib29sZWFuIGdlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbikgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX0dFTkVSQVRFX1dFQl9NRVRIT0RfQU5OT1RBVElPTiwgZ2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoYm9vbGVhbiBlbmFibGVBbm5vdGF0aW9uUHJvY2Vzc2luZykgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX0oyV1NfRU5BQkxFX0FOTk9UQVRJT05fUFJPQ0VTU0lORywgZW5hYmxlQW5ub3RhdGlvblByb2Nlc3NpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX0dFTkVSQVRFX1JFUVVFU1RfV1JBUFBFUl9BTk5PVEFUSU9OKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbihib29sZWFuIGdlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfR0VORVJBVEVfUkVRVUVTVF9XUkFQUEVSX0FOTk9UQVRJT04sIGdlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfR0VORVJBVEVfUkVTUE9OU0VfV1JBUFBFUl9BTk5PVEFUSU9OKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24oYm9vbGVhbiBnZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24pIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9HRU5FUkFURV9SRVNQT05TRV9XUkFQUEVSX0FOTk9UQVRJT04sIGdlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9jb250ZXh0L1dTREwySmF2YVBlcnNpc3RlbnRDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL2NvbnRleHQvV1NETDJKYXZhUGVyc2lzdGVudENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgyZDNmMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL2NvbnRleHQvV1NETDJKYXZhUGVyc2lzdGVudENvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5EYXRhQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuRnJvbnRlbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkNYRk1vZGVsVXRpbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgV1NETDJKYXZhUGVyc2lzdGVudENvbnRleHQgZXh0ZW5kcyBDWEZQZXJzaXN0ZW50Q29udGV4dCBpbXBsZW1lbnRzIFdTREwySmF2YUNvbnRleHQgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfVzJKX0dFTkVSQVRFX0NMSUVOVCA9ICJjeGZXMkpHZW5lcmF0ZUNsaWVudCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX1cySl9HRU5FUkFURV9TRVJWRVIgPSAiY3hmVzJKR2VuZXJhdGVTZXJ2ZXIiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9XMkpfR0VORVJBVEVfSU1QTEVNRU5UQVRJT04gPSAiY3hmVzJKR2VuZXJhdGVJbXBsZW1lbnRhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX1cySl9HRU5FUkFURV9BTlRfQlVJTERfRklMRSA9ICJjeGZXMkpHZW5lcmF0ZUFudEJ1aWxkRmlsZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfVzJKX1BST0NFU1NfU09BUF9IRUFERVJTID0gImN4ZlcySlByb2Nlc3NTT0FQSGVhZGVycyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX1cySl9MT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VOQU1FX01BUFBJTkcgCi0gICAgICAgID0gImN4ZlcySkxvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZW5hbWVNYXBwaW5nIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfVzJKX0xPQURfREVGQVVMVF9FWENMVURFU19OQU1FU1BBQ0VfTUFQUElORyAKLSAgICAgICAgPSAiY3hmVzJKTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmciOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX1cySl9WQUxJREFURV9XU0RMID0gImN4ZlcySlZhbGlkYXRlV1NETCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfVzJKX0RBVEFCSU5ESU5HID0gImN4ZlcySkRhdGFiaW5kaW5nIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfVzJKX0ZST05URU5EID0gImN4ZlcySkZyb250ZW5kIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfVzJKX1dTRExfVkVSU0lPTiA9ICJjeGZXMkpXU0RMVmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX1cySl9YSkNfQVJHUyA9ICJjeGZXMkpYSkNBcmdzIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfVzJKX05PX0FERFJFU1NfQklORElORyA9ICJjeGZXMkpOb0FkZHJlc3NCaW5kaW5nIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfVzJKX1VTRV9ERUZBVUxUX1ZBTFVFUyA9ICJjeGZXMkpVc2VEZWZhdWx0VmFsdWVzIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfVzJKX0FVVE9fTkFNRV9SRVNPTFVUSU9OID0gImN4ZlcySkF1dG9OYW1lUmVzb2x1dGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhKQ19VU0VfREVGQVVMVF9WQUxVRVMgPSAieGpjVXNlRGVmYXVsdFZhbHVlcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfVE9fU1RSSU5HID0gInhqY1RvU3RyaW5nIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhKQ19UT19TVFJJTkdfTVVMVEkgPSAieGpjVG9TdHJpbmdNdWx0aSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfVE9fU1RSSU5HX1NJTVBMRSA9ICJ4amNUb1N0cmluZ1NpbXBsZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfTE9DQVRPUiA9ICJ4amNMb2NhdG9yIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhKQ19TWU5DX01FVEhPRFMgPSAieGpjU3luY01ldGhvZHMiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEpDX01BUktfR0VORVJBVEVEID0gInhqY01hcmtHZW5lcmF0ZWQiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEpDX0VQSVNPREVfRklMRSA9ICJ4amNFcGlzb2RlRmlsZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBXU0RMMkphdmFQZXJzaXN0ZW50Q29udGV4dCgpIHsKLSAgICAgICAgc3VwZXIoQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGxvYWQoKSB7Ci0gICAgICAgIHN1cGVyLmxvYWQoKTsKLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX1cySl9HRU5FUkFURV9DTElFTlQsIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkNYRl9DT05URVhULCBDWEZQYWNrYWdlLkNYRl9DT05URVhUX19HRU5FUkFURV9DTElFTlQpKTsKLQotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfVzJKX0dFTkVSQVRFX1NFUlZFUiwgQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuQ1hGX0NPTlRFWFQsIENYRlBhY2thZ2UuQ1hGX0NPTlRFWFRfX0dFTkVSQVRFX1NFUlZFUikpOwotCi0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9XMkpfR0VORVJBVEVfSU1QTEVNRU5UQVRJT04sIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX0dFTkVSQVRFX0lNUExFTUVOVEFUSU9OKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX1cySl9HRU5FUkFURV9BTlRfQlVJTERfRklMRSwgQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuQ1hGX0NPTlRFWFQsIENYRlBhY2thZ2UuQ1hGX0NPTlRFWFRfX0dFTkVSQVRFX0FOVF9CVUlMRF9GSUxFKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX1cySl9YSkNfQVJHUywgIiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX1cySl9QUk9DRVNTX1NPQVBfSEVBREVSUywgQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fUFJPQ0VTU19TT0FQX0hFQURFUlMpKTsKLQotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfVzJKX0xPQURfREVGQVVMVF9OQU1FU1BBQ0VfUEFDS0FHRU5BTUVfTUFQUElORywgQ1hGTW9kZWxVdGlscwotICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULAotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX0xPQURfREVGQVVMVF9OQU1FU1BBQ0VfUEFDS0FHRV9OQU1FX01BUFBJTkcpKTsKLQotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfVzJKX0xPQURfREVGQVVMVF9FWENMVURFU19OQU1FU1BBQ0VfTUFQUElORywgQ1hGTW9kZWxVdGlscwotICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULAotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX0xPQURfREVGQVVMVF9FWENMVURFU19OQU1FUFNBQ0VfTUFQUElORykpOwotCi0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9XMkpfVkFMSURBVEVfV1NETCwgQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fVkFMSURBVEUpKTsKLQotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfVzJKX0RBVEFCSU5ESU5HLCBEYXRhQmluZGluZy5KQVhCLmdldExpdGVyYWwoKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX1cySl9GUk9OVEVORCwgRnJvbnRlbmQuSkFYV1MuZ2V0TGl0ZXJhbCgpKTsKLQotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfVzJKX1dTRExfVkVSU0lPTiwgQ1hGUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETDJKYXZhQ29udGV4dF9Xc2RsVmVyc2lvbigpCi0gICAgICAgICAgICAgICAgLmdldERlZmF1bHRWYWx1ZUxpdGVyYWwoKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX1cySl9OT19BRERSRVNTX0JJTkRJTkcsIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX05PX0FERFJFU1NfQklORElORykpOwotCi0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9XMkpfVVNFX0RFRkFVTFRfVkFMVUVTLCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19VU0VfREVGQVVMVF9WQUxVRVMpKTsKLQotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfVzJKX0FVVE9fTkFNRV9SRVNPTFVUSU9OLCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19BVVRPX05BTUVfUkVTT0xVVElPTikpOwotCi0gICAgICAgIHNldERlZmF1bHQoWEpDX1VTRV9ERUZBVUxUX1ZBTFVFUywgQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1VTRV9ERUZBVUxUX1ZBTFVFUykpOwotCi0gICAgICAgIHNldERlZmF1bHQoWEpDX1RPX1NUUklORywgQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfVE9fU1RSSU5HKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChYSkNfVE9fU1RSSU5HX01VTFRJLCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19UT19TVFJJTkdfTVVMVElfTElORSkpOwotCi0gICAgICAgIHNldERlZmF1bHQoWEpDX1RPX1NUUklOR19TSU1QTEUsIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1RPX1NUUklOR19TSU1QTEUpKTsKLQotICAgICAgICBzZXREZWZhdWx0KFhKQ19MT0NBVE9SLCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19MT0NBVE9SKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChYSkNfU1lOQ19NRVRIT0RTLCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19TWU5DX01FVEhPRFMpKTsKLQotICAgICAgICBzZXREZWZhdWx0KFhKQ19NQVJLX0dFTkVSQVRFRCwgQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfTUFSS19HRU5FUkFURUQpKTsKLQotICAgICAgICBzZXREZWZhdWx0KFhKQ19FUElTT0RFX0ZJTEUsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVBbnRCdWlsZEZpbGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX1cySl9HRU5FUkFURV9BTlRfQlVJTERfRklMRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVBbnRCdWlsZEZpbGUoYm9vbGVhbiBnZW5lcmF0ZUFudEJ1aWxkRmlsZSkgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX1cySl9HRU5FUkFURV9BTlRfQlVJTERfRklMRSwgZ2VuZXJhdGVBbnRCdWlsZEZpbGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVDbGllbnQoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX1cySl9HRU5FUkFURV9DTElFTlQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlQ2xpZW50KGJvb2xlYW4gZ2VuZXJhdGVDbGllbnQpIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9XMkpfR0VORVJBVEVfQ0xJRU5ULCBnZW5lcmF0ZUNsaWVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZUltcGxlbWVudGF0aW9uKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9XMkpfR0VORVJBVEVfSU1QTEVNRU5UQVRJT04pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlSW1wbGVtZW50YXRpb24oYm9vbGVhbiBnZW5lcmF0ZUltcGxlbWVudGF0aW9uKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfVzJKX0dFTkVSQVRFX0lNUExFTUVOVEFUSU9OLCBnZW5lcmF0ZUltcGxlbWVudGF0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlU2VydmVyKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9XMkpfR0VORVJBVEVfU0VSVkVSKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVNlcnZlcihib29sZWFuIGdlbmVyYXRlU2VydmVyKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfVzJKX0dFTkVSQVRFX1NFUlZFUiwgZ2VuZXJhdGVTZXJ2ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX1cySl9MT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VOQU1FX01BUFBJTkcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKGJvb2xlYW4gbG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcpIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9XMkpfTE9BRF9ERUZBVUxUX05BTUVTUEFDRV9QQUNLQUdFTkFNRV9NQVBQSU5HLAotICAgICAgICAgICAgICAgIGxvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9XMkpfTE9BRF9ERUZBVUxUX0VYQ0xVREVTX05BTUVTUEFDRV9NQVBQSU5HKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyhib29sZWFuIGxvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfVzJKX0xPQURfREVGQVVMVF9FWENMVURFU19OQU1FU1BBQ0VfTUFQUElORywgbG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUHJvY2Vzc1NPQVBIZWFkZXJzKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9XMkpfUFJPQ0VTU19TT0FQX0hFQURFUlMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb2Nlc3NTT0FQSGVhZGVycyhib29sZWFuIHByb2Nlc3NTb2FwSGVhZGVycykgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX1cySl9QUk9DRVNTX1NPQVBfSEVBREVSUywgcHJvY2Vzc1NvYXBIZWFkZXJzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkYXRlKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9XMkpfVkFMSURBVEVfV1NETCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGUoYm9vbGVhbiB2YWxpZGF0ZSkgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX1cySl9WQUxJREFURV9XU0RMLCB2YWxpZGF0ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIERhdGFCaW5kaW5nIGdldERhdGFiaW5kaW5nKCkgewotICAgICAgICByZXR1cm4gRGF0YUJpbmRpbmcuZ2V0KGdldFZhbHVlQXNTdHJpbmcoUFJFRkVSRU5DRV9XMkpfREFUQUJJTkRJTkcpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRhYmluZGluZyhEYXRhQmluZGluZyBkYXRhQmluZGluZykgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX1cySl9EQVRBQklORElORywgZGF0YUJpbmRpbmcuZ2V0TGl0ZXJhbCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRnJvbnRlbmQgZ2V0RnJvbnRlbmQoKSB7Ci0gICAgICAgIHJldHVybiBGcm9udGVuZC5nZXQoZ2V0VmFsdWVBc1N0cmluZyhQUkVGRVJFTkNFX1cySl9GUk9OVEVORCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZyb250ZW5kKEZyb250ZW5kIGZyb250ZW5kKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfVzJKX0ZST05URU5ELCBmcm9udGVuZC5nZXRMaXRlcmFsKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0V3NkbFZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzU3RyaW5nKFBSRUZFUkVOQ0VfVzJKX1dTRExfVkVSU0lPTik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0V3NkbFZlcnNpb24oU3RyaW5nIHdzZGxWZXJzaW9uKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfVzJKX1dTRExfVkVSU0lPTiwgd3NkbFZlcnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0WGpjQXJncygpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNTdHJpbmcoUFJFRkVSRU5DRV9XMkpfWEpDX0FSR1MpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFhqY0FyZ3MoU3RyaW5nIHhqY0FyZ3MpIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9XMkpfWEpDX0FSR1MsIHhqY0FyZ3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzTm9BZGRyZXNzQmluZGluZygpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfVzJKX05PX0FERFJFU1NfQklORElORyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Tm9BZGRyZXNzQmluZGluZyhib29sZWFuIG5vQWRkcmVzc0JpbmRpbmcpIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9XMkpfTk9fQUREUkVTU19CSU5ESU5HLCBub0FkZHJlc3NCaW5kaW5nKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNBdXRvTmFtZVJlc29sdXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX1cySl9BVVRPX05BTUVfUkVTT0xVVElPTik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXV0b05hbWVSZXNvbHV0aW9uKGJvb2xlYW4gYXV0b05hbWVSZXNvbHV0aW9uKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfVzJKX0FVVE9fTkFNRV9SRVNPTFVUSU9OLCBhdXRvTmFtZVJlc29sdXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVXNlRGVmYXVsdFZhbHVlcygpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfVzJKX1VTRV9ERUZBVUxUX1ZBTFVFUyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXNlRGVmYXVsdFZhbHVlcyhib29sZWFuIHVzZURlZmF1bHRWYWx1ZXMpIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9XMkpfVVNFX0RFRkFVTFRfVkFMVUVTLCB1c2VEZWZhdWx0VmFsdWVzKTsKLSAgICB9Ci0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1hqY1VzZURlZmF1bHRWYWx1ZXMoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihYSkNfVVNFX0RFRkFVTFRfVkFMVUVTKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNVc2VEZWZhdWx0VmFsdWVzKGJvb2xlYW4gdXNlWEpDRGVmYXVsdFZhbHVlcykgewotICAgICAgICBzZXRWYWx1ZShYSkNfVVNFX0RFRkFVTFRfVkFMVUVTLCB1c2VYSkNEZWZhdWx0VmFsdWVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1hqY1RvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oWEpDX1RPX1NUUklORyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WGpjVG9TdHJpbmcoYm9vbGVhbiB4amNUb1N0cmluZykgewotICAgICAgICBzZXRWYWx1ZShYSkNfVE9fU1RSSU5HLCB4amNUb1N0cmluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNYamNUb1N0cmluZ011bHRpTGluZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFhKQ19UT19TVFJJTkdfTVVMVEkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFhqY1RvU3RyaW5nTXVsdGlMaW5lKGJvb2xlYW4geGpjVG9TdHJpbmdNdWx0aUxpbmUpIHsKLSAgICAgICAgc2V0VmFsdWUoWEpDX1RPX1NUUklOR19NVUxUSSwgeGpjVG9TdHJpbmdNdWx0aUxpbmUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzWGpjVG9TdHJpbmdTaW1wbGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihYSkNfVE9fU1RSSU5HX1NJTVBMRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WGpjVG9TdHJpbmdTaW1wbGUoYm9vbGVhbiB4amNUb1N0cmluZ1NpbXBsZSkgewotICAgICAgICBzZXRWYWx1ZShYSkNfVE9fU1RSSU5HX1NJTVBMRSwgeGpjVG9TdHJpbmdTaW1wbGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzWGpjTG9jYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFhKQ19MT0NBVE9SKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNMb2NhdG9yKGJvb2xlYW4geGpjTG9jYXRvcikgewotICAgICAgICBzZXRWYWx1ZShYSkNfTE9DQVRPUiwgeGpjTG9jYXRvcik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNYamNTeW5jTWV0aG9kcygpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFhKQ19TWU5DX01FVEhPRFMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFhqY1N5bmNNZXRob2RzKGJvb2xlYW4geGpjU3luY01ldGhvZHMpIHsKLSAgICAgICAgc2V0VmFsdWUoWEpDX1NZTkNfTUVUSE9EUywgeGpjU3luY01ldGhvZHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzWGpjTWFya0dlbmVyYXRlZCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFhKQ19NQVJLX0dFTkVSQVRFRCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WGpjTWFya0dlbmVyYXRlZChib29sZWFuIHhqY01hcmtHZW5lcmF0ZWQpIHsKLSAgICAgICAgc2V0VmFsdWUoWEpDX01BUktfR0VORVJBVEVELCB4amNNYXJrR2VuZXJhdGVkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFhqY0VwaXNvZGVGaWxlKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc1N0cmluZyhYSkNfRVBJU09ERV9GSUxFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNFcGlzb2RlRmlsZShTdHJpbmcgeGpjRXBpc29kZUZpbGUpIHsKLSAgICAgICAgc2V0VmFsdWUoWEpDX0VQSVNPREVfRklMRSwgeGpjRXBpc29kZUZpbGUpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9lbnYvYW50L0JpbmRpbmdzVHJhbnNmb3JtZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvZW52L2FudC9CaW5kaW5nc1RyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNjAwNWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9lbnYvYW50L0JpbmRpbmdzVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuZW52LmFudDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5UcmFuc2Zvcm1lcjsKLQotcHVibGljIGNsYXNzIEJpbmRpbmdzVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lciB7Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHRyYW5zZm9ybShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGJpbmRpbmdGaWxlc0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgU3RyaW5nW10gYWJzb2x1dGVQYXRocyA9IHZhbHVlLnRvU3RyaW5nKCkuc3BsaXQoIiwiKTsKLSAgICAgICAgZm9yIChTdHJpbmcgYWJzb3VsdXRlUGF0aCA6IGFic29sdXRlUGF0aHMpIHsKLSAgICAgICAgICAgIElQYXRoIHBhdGggPSBuZXcgUGF0aChhYnNvdWx1dGVQYXRoKTsKLSAgICAgICAgICAgIGlmIChwYXRoLmdldEZpbGVFeHRlbnNpb24oKSAhPSBudWxsICYmIHBhdGguZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFscygieG1sIikpIHsKLSAgICAgICAgICAgICAgICBiaW5kaW5nRmlsZXNMaXN0LmFkZChhYnNvdWx1dGVQYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmluZGluZ0ZpbGVzTGlzdDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvZW52L2FudC9NYXBwaW5nc1RyYW5zZm9ybWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL2Vudi9hbnQvTWFwcGluZ3NUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjhmMmU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvZW52L2FudC9NYXBwaW5nc1RyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLmVudi5hbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXI7Ci0KLXB1YmxpYyBjbGFzcyBNYXBwaW5nc1RyYW5zZm9ybWVyIGltcGxlbWVudHMgVHJhbnNmb3JtZXIgewotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIE9iamVjdCB0cmFuc2Zvcm0oT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgoKFN0cmluZyl2YWx1ZSk7Ci0gICAgICAgIElGaWxlIHJlc291cmNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgICAgICBwcm9wcy5sb2FkKHJlc291cmNlLmdldENvbnRlbnRzKCkpOwotICAgICAgICAgICAgICAgIG1hcC5wdXRBbGwocHJvcHMpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSAgewotICAgICAgICAgICAgICAgIENYRkNvcmVQbHVnaW4ubG9nKGlvZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coY2UuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtYXA7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL0NYRkNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvQ1hGQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjdlMTM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvQ1hGQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKLSAqLwotcHVibGljIGludGVyZmFjZSBDWEZDb250ZXh0IHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlZmF1bHQgUnVudGltZSBMb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCBDWEYgSG9tZSBEaXJlY3RvcnkgbG9jYXRpb24uCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBSdW50aW1lIExvY2F0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNzZXREZWZhdWx0UnVudGltZUxvY2F0aW9uKFN0cmluZykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZQYWNrYWdlI2dldENYRkNvbnRleHRfRGVmYXVsdFJ1bnRpbWVMb2NhdGlvbigpCi0gICAgICogQG1vZGVsCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIFN0cmluZyBnZXREZWZhdWx0UnVudGltZUxvY2F0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNnZXREZWZhdWx0UnVudGltZUxvY2F0aW9uIDxlbT5EZWZhdWx0IFJ1bnRpbWUgTG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNldHMgdGhlIGRlZmF1bHQgQ1hGIHJ1bnRpbWUgbG9jYXRpb24uCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBSdW50aW1lIExvY2F0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXREZWZhdWx0UnVudGltZUxvY2F0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXREZWZhdWx0UnVudGltZUxvY2F0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWZhdWx0IFJ1bnRpbWUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogIFJldHVybnMgdGhlIGRlZmF1bHQgQ1hGIHJ1bnRpbWUgdHlwZS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IFJ1bnRpbWUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjc2V0RGVmYXVsdFJ1bnRpbWVUeXBlKFN0cmluZykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZQYWNrYWdlI2dldENYRkNvbnRleHRfRGVmYXVsdFJ1bnRpbWVUeXBlKCkKLSAgICAgKiBAbW9kZWwKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgU3RyaW5nIGdldERlZmF1bHRSdW50aW1lVHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjZ2V0RGVmYXVsdFJ1bnRpbWVUeXBlIDxlbT5EZWZhdWx0IFJ1bnRpbWUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU2V0cyB0aGUgZGVmYXVsdCBDWEYgcnVudGltZSB0eXBlLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgUnVudGltZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXREZWZhdWx0UnVudGltZVR5cGUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldERlZmF1bHRSdW50aW1lVHlwZShTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVmYXVsdCBSdW50aW1lIFZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqICBSZXR1cm5zIHRoZSBkZWZhdWx0IENYRiBydW50aW1lIHZlcnNpb24uCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBSdW50aW1lIFZlcnNpb248L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI3NldERlZmF1bHRSdW50aW1lVmVyc2lvbihTdHJpbmcpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZSNnZXRDWEZDb250ZXh0X0RlZmF1bHRSdW50aW1lVmVyc2lvbigpCi0gICAgICogQG1vZGVsCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIFN0cmluZyBnZXREZWZhdWx0UnVudGltZVZlcnNpb24oKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2dldERlZmF1bHRSdW50aW1lVmVyc2lvbiA8ZW0+RGVmYXVsdCBSdW50aW1lIFZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNldHMgdGhlIGRlZmF1bHQgQ1hGIHJ1bnRpbWUgdmVyc2lvbi4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IFJ1bnRpbWUgVmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXREZWZhdWx0UnVudGltZVZlcnNpb24oU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciBjb21tZW50cyBhcmUgc2hvd24gZHVyaW5nIHRoZSBjb2RlIGdlbmVyYXRpb24gcHJvY2Vzcy4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIKLSAgICAgKi8KLSAgICBib29sZWFuIGlzVmVyYm9zZSgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjaXNWZXJib3NlIDxlbT5WZXJib3NlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBEaXNwbGF5cyBjb21tZW50cyBkdXJpbmcgdGhlIGNvZGUgZ2VuZXJhdGlvbiBwcm9jZXNzLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZlcmJvc2U8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzVmVyYm9zZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0VmVyYm9zZShib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0byBnZW5lcmF0ZSBhbiBBbnQgYnVpbGQueG1sIGZpbGUuCi0gICAgICogCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIgotICAgICAqLwotICAgIGJvb2xlYW4gaXNHZW5lcmF0ZUFudEJ1aWxkRmlsZSgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjaXNHZW5lcmF0ZUFudEJ1aWxkRmlsZSA8ZW0+R2VuZXJhdGUgQW50IEJ1aWxkIEZpbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNldCB0byBnZW5lcmF0ZSBhbiBBbnQgYnVpbGQueG1sIGZpbGUuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R2VuZXJhdGUgQW50IEJ1aWxkIEZpbGU8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVBbnRCdWlsZEZpbGUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEdlbmVyYXRlQW50QnVpbGRGaWxlKGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRvIGdlbmVyYXRlIGEgY2xpZW50LgotICAgICAqIAotICAgICAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIKLSAgICAgKi8KLSAgICBib29sZWFuIGlzR2VuZXJhdGVDbGllbnQoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2lzR2VuZXJhdGVDbGllbnQgPGVtPkdlbmVyYXRlIENsaWVudDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU3BlY2lmeSB0byBnZW5lcmF0ZSBjbGllbnQgc2lkZSBjb2RlLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdlbmVyYXRlIENsaWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNHZW5lcmF0ZUNsaWVudCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0R2VuZXJhdGVDbGllbnQoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIuCi0gICAgICogCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIgotICAgICAqLwotICAgIGJvb2xlYW4gaXNHZW5lcmF0ZVNlcnZlcigpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjaXNHZW5lcmF0ZVNlcnZlciA8ZW0+R2VuZXJhdGUgU2VydmVyPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTcGVjaWZ5IHRvIGdlbmVyYXRlIHNlcnZlciBzaWRlIGNvZGUuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R2VuZXJhdGUgU2VydmVyPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlU2VydmVyKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRHZW5lcmF0ZVNlcnZlcihib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRhdGEgYmluZGluZyB1c2VkLgotICAgICAqIAotICAgICAqIEBtb2RlbCBkZWZhdWx0PSJqYXhiIgotICAgICAqLwotICAgIERhdGFCaW5kaW5nIGdldERhdGFiaW5kaW5nKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNnZXREYXRhYmluZGluZyA8ZW0+RGF0YWJpbmRpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRhdGFiaW5kaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5EYXRhQmluZGluZwotICAgICAqIEBzZWUgI2dldERhdGFiaW5kaW5nKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXREYXRhYmluZGluZyhEYXRhQmluZGluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmcm9udGVuZCB1c2VkLgotICAgICAqIAotICAgICAqIEBtb2RlbCBkZWZhdWx0PSJqYXh3cyIKLSAgICAgKi8KLSAgICBGcm9udGVuZCBnZXRGcm9udGVuZCgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjZ2V0RnJvbnRlbmQgPGVtPkZyb250ZW5kPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Gcm9udGVuZDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuRnJvbnRlbmQKLSAgICAgKiBAc2VlICNnZXRGcm9udGVuZCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0RnJvbnRlbmQoRnJvbnRlbmQgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBpZiB0aGUgU3ByaW5nIEFwcGxpY2F0aW9uIENvbnRleHQgaXMgdXNlZCBpbnN0ZWFkIG9mIGN4Zi1zZXJ2bGV0LgotICAgICAqIAotICAgICAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIgotICAgICAqLwotICAgIGJvb2xlYW4gaXNVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2lzVXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0IDxlbT5Vc2UgU3ByaW5nIEFwcGxpY2F0aW9uIENvbnRleHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIElmIHRydWUgdGhlIFNwcmluZyBBcHBsaWNhdGlvbiBDb250ZXh0IGlzIHVzZWQgb3RoZXJ3aXNlIGN4ZiBzZXJ2bGV0LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVzZSBTcHJpbmcgQXBwbGljYXRpb24gQ29udGV4dDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFVzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dChib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4cG9ydCBDWEYgQ2xhc3NwYXRoIENvbnRhaW5lcjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJ0cnVlIjwvY29kZT4uCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeHBvcnQgQ1hGIENsYXNzcGF0aCBDb250YWluZXI8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhwb3J0IENYRiBDbGFzc3BhdGggQ29udGFpbmVyPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNzZXRFeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIoYm9vbGVhbikKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZQYWNrYWdlI2dldENYRkNvbnRleHRfRXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyKCkKLSAgICAgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0V4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcigpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjaXNFeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIgPGVtPkV4cG9ydCBDWEYgQ2xhc3NwYXRoIENvbnRhaW5lcjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXhwb3J0IENYRiBDbGFzc3BhdGggQ29udGFpbmVyPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc0V4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0RXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyKGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5zdGFsbGF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5zdGFsbGF0aW9uczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluc3RhbGxhdGlvbnM8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI3NldEluc3RhbGxhdGlvbnMoTWFwKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2UjZ2V0Q1hGQ29udGV4dF9JbnN0YWxsYXRpb25zKCkKLSAgICAgKiBAbW9kZWwgdHJhbnNpZW50PSJ0cnVlIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBNYXA8U3RyaW5nLCBDWEZJbnN0YWxsPiBnZXRJbnN0YWxsYXRpb25zKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNnZXRJbnN0YWxsYXRpb25zIDxlbT5JbnN0YWxsYXRpb25zPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbnN0YWxsYXRpb25zPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRJbnN0YWxsYXRpb25zKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRJbnN0YWxsYXRpb25zKE1hcDxTdHJpbmcsIENYRkluc3RhbGw+IHZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvQ1hGRGF0YU1vZGVsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL0NYRkRhdGFNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2ExY2VlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvQ1hGRGF0YU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLQotLyoqCi0gKiAKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqLwotcHVibGljIGludGVyZmFjZSBDWEZEYXRhTW9kZWwgZXh0ZW5kcyBDWEZDb250ZXh0IHsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBvcmlnaW5hdGluZyBwcm9qZWN0IHRoYXQgY29udGFpbnMgdGhlIGphdmEgb3Igd3NkbCByZXNvdXJjZS4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0UHJvamVjdE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0UHJvamVjdE5hbWUgPGVtPlByb2plY3QgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU2V0cyB0aGUgb3JpZ2luYXRpbmcgcHJvamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBqYXZhIG9yIHdzZGwgcmVzb3VyY2UuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJvamVjdCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRQcm9qZWN0TmFtZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0UHJvamVjdE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc291cmNlIGRpcmVjdG9yeSBpbiB3aGljaCB0aGUgb3V0cHV0IGZpbGVzIGFyZSBwbGFjZWQuCi0gICAgICogIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIFN0cmluZyBnZXRSZXNvdXJjZURpcmVjdG9yeSgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRSZXNvdXJjZURpcmVjdG9yeSA8ZW0+UmVzb3VyY2UgRGlyZWN0b3J5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTZXRzIHRoZSByZXNvdXJjZSBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIG91dHB1dCBmaWxlcyBhcmUgcGxhY2VkLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlIERpcmVjdG9yeTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0UmVzb3VyY2VEaXJlY3RvcnkoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFJlc291cmNlRGlyZWN0b3J5KFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIGdlbmVyYXRlZCBzb3VyY2VzIGFyZSBjb21waWxlZCBpbnRvLgotICAgICAqIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBmaWxlcyBhcmUgbm90IGNvbXBpbGVkLgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIFN0cmluZyBnZXRDbGFzc0RpcmVjdG9yeSgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRDbGFzc0RpcmVjdG9yeSA8ZW0+Q2xhc3MgRGlyZWN0b3J5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTZXRzIGRpcmVjdG9yeSBpbiB3aGljaCB0aGUgZ2VuZXJhdGVkIHNvdXJjZXMgYXJlIGNvbXBpbGVkIGludG8uIElmIG5vdAotICAgICAqIHNwZWNpZmllZCwgdGhlIGZpbGVzIGFyZSBub3QgY29tcGlsZWQuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2xhc3MgRGlyZWN0b3J5PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRDbGFzc0RpcmVjdG9yeSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0Q2xhc3NEaXJlY3RvcnkoU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIFdTREwgRmlsZSB0aGF0IGlzIHVzZWQgYXMgaW5wdXQgdG8gV1NETDJKYXZhIG9yCi0gICAgICogaXMgdGhlIG91dHB1dCBvZiBKYXZhMldTLgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIFN0cmluZyBnZXRXc2RsRmlsZU5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0V3NkbEZpbGVOYW1lIDxlbT5Xc2RsIEZpbGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V3NkbCBGaWxlIE5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldFdzZGxGaWxlTmFtZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0V3NkbEZpbGVOYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBXU0RMIFVSTC4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBVUkwgZ2V0V3NkbFVSTCgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRXc2RsVVJMIDxlbT5Xc2RsIFVSTDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V3NkbCBVUkw8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldFdzZGxVUkwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFdzZGxVUkwoVVJMIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHdzZGwgbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIFdlYkNvbnRlbnQgZGlyZWN0b3J5LgotICAgICAqIFVzZWQgaW4gdGhlIHNwcmluZyBjb25maWd1cmF0aW9uLgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIFN0cmluZyBnZXRDb25maWdXc2RsTG9jYXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0Q29uZmlnV3NkbExvY2F0aW9uIDxlbT5Db25maWcgV3NkbCBMb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29uZmlnIFdzZGwgTG9jYXRpb248L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldENvbmZpZ1dzZGxMb2NhdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0Q29uZmlnV3NkbExvY2F0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBKYXZhIENsYXNzIHRoYXQgbWF5IGJlIHVzZWQgYXMgaW5wdXQgdG8gSmF2YTJXUyBvciBpcyB0aGUgb3V0cHV0Ci0gICAgICogb2YgV1NETDJKYXZhLgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lIDxlbT5GdWxseSBRdWFsaWZpZWQgSmF2YSBDbGFzcyBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTZXRzIHRoZSBKYXZhIENsYXNzIHRoYXQgbWF5IGJlIHVzZWQgYXMgaW5wdXQgdG8gSmF2YTJXUyBvciBpcyB0aGUgb3V0cHV0IG9mIFdTREwySmF2YS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GdWxseSBRdWFsaWZpZWQgSmF2YSBDbGFzcyBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZShTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgSmF2YSBJbnRlcmZhY2UgdGhhdCBtYXkgYmUgdXNlZCBhcyBpbnB1dCB0byBKYXZhMldTLgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lIDxlbT5GdWxseSBRdWFsaWZpZWQgSmF2YSBJbnRlcmZhY2UgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgSmF2YSBJbnRlcmZhY2UgdGhhdCBtYXkgYmUgdXNlZCBhcyBpbnB1dCB0byBKYXZhMldTLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZ1bGx5IFF1YWxpZmllZCBKYXZhIEludGVyZmFjZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIGluIHRoZSBDWEYgU3ByaW5nIENvbmZpZ3VyYXRpb24gdG8gdW5pcXVlbHkgaWRlbnRpZnkgZWxlbWVudHMuCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgU3RyaW5nIGdldENvbmZpZ0lkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldENvbmZpZ0lkIDxlbT5Db25maWcgSWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbmZpZyBJZDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0Q29uZmlnSWQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldENvbmZpZ0lkKFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0YXJnZXROYW1lc3BhY2UuCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0VGFyZ2V0TmFtZXNwYWNlIDxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTZXRzIHRoZSB0YXJnZXROYW1lc3BhY2UuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVuZG9pbnROYW1lIGF0dHJpYnV0ZSB1c2VkIGluIHRoZSBqYXh3czplbmRwb2ludCBlbGVtZW50IGluIHRoZSBDWEYgU3ByaW5nIENvbmZpZ3VyYXRpb24uCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgU3RyaW5nIGdldEVuZHBvaW50TmFtZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0RW5kcG9pbnROYW1lIDxlbT5FbmRwb2ludCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTZXRzIHRoZSBlbmRwb2ludE5hbWUgYXR0cmlidXRlIHVzZWQgaW4gdGhlIGpheHdzOmVuZHBvaW50IGVsZW1lbnQgaW4gdGhlIENYRiBTcHJpbmcgQ29uZmlndXJhdGlvbi4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbmRwb2ludCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRFbmRwb2ludE5hbWUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEVuZHBvaW50TmFtZShTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2VydmljZU5hbWUgYXR0cmlidXRlIHVzZWQgaW4gdGhlIGpheHdzOmVuZHBvaW50IGVsZW1lbnQgaW4gdGhlIENYRiBTcHJpbmcgQ29uZmlndXJhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0U2VydmljZU5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0U2VydmljZU5hbWUgPGVtPlNlcnZpY2UgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU2V0cyB0aGUgc2VydmljZU5hbWUgYXR0cmlidXRlIHVzZWQgaW4gdGhlIGpheHdzOmVuZHBvaW50IGVsZW1lbnQgaW4gdGhlIENYRiBTcHJpbmcgQ29uZmlndXJhdGlvbi4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2aWNlIE5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldFNlcnZpY2VOYW1lKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRTZXJ2aWNlTmFtZShTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgRGVmaW5pdGlvbiBnZXRXc2RsRGVmaW5pdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRXc2RsRGVmaW5pdGlvbiA8ZW0+V3NkbCBEZWZpbml0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIERlZmluaXRpb248L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldFdzZGxEZWZpbml0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRXc2RsRGVmaW5pdGlvbihEZWZpbml0aW9uIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIFN0cmluZyBnZXRXc2RsTG9jYXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0V3NkbExvY2F0aW9uIDxlbT5Xc2RsIExvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIExvY2F0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRXc2RsTG9jYXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFdzZGxMb2NhdGlvbihTdHJpbmcgdmFsdWUpOwotICAgICAgICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL0NYRkZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvQ1hGRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjIzOWU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvQ1hGRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgotICogJElkOiBDWEZGYWN0b3J5LmphdmEsdiAxLjIgMjAxMC8wMS8xNyAxOTo1Njo1NiBzY2xhcmtlIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ1hGRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKLSAgICAvKioKLSAgICAgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIENYRkZhY3RvcnkgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRmFjdG9yeUltcGwuaW5pdCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5KYXZhMiBXUyBEYXRhIE1vZGVsPC9lbT4nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5KYXZhMiBXUyBEYXRhIE1vZGVsPC9lbT4nLgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBKYXZhMldTRGF0YU1vZGVsIGNyZWF0ZUphdmEyV1NEYXRhTW9kZWwoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V1NETDIgSmF2YSBEYXRhIE1vZGVsPC9lbT4nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XU0RMMiBKYXZhIERhdGEgTW9kZWw8L2VtPicuCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIFdTREwySmF2YURhdGFNb2RlbCBjcmVhdGVXU0RMMkphdmFEYXRhTW9kZWwoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW5zdGFsbDwvZW0+Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW5zdGFsbDwvZW0+Jy4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQ1hGSW5zdGFsbCBjcmVhdGVDWEZJbnN0YWxsKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIENYRlBhY2thZ2UgZ2V0Q1hGUGFja2FnZSgpOwotCi19IC8vQ1hGRmFjdG9yeQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9DWEZJbnN0YWxsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL0NYRkluc3RhbGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMyMTcyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL0NYRkluc3RhbGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBTaGFuZSBDbGFya2UKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiBDb250cmlidXRvcnM6Ci0gKiBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKiAkSWQ6IENYRkluc3RhbGwuamF2YSx2IDEuMSAyMDEwLzAxLzE3IDE5OjU2OjU2IHNjbGFya2UgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWw7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW5zdGFsbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGSW5zdGFsbCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGSW5zdGFsbCNnZXRMb2NhdGlvbiA8ZW0+TG9jYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZJbnN0YWxsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZQYWNrYWdlI2dldENYRkluc3RhbGwoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ1hGSW5zdGFsbCB7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNzZXRWZXJzaW9uKFN0cmluZykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZQYWNrYWdlI2dldENYRkluc3RhbGxfVmVyc2lvbigpCi0gICAgICogQG1vZGVsCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIFN0cmluZyBnZXRWZXJzaW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGSW5zdGFsbCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRWZXJzaW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TG9jYXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TG9jYXRpb248L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI3NldExvY2F0aW9uKFN0cmluZykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZQYWNrYWdlI2dldENYRkluc3RhbGxfTG9jYXRpb24oKQotICAgICAqIEBtb2RlbAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0TG9jYXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZJbnN0YWxsI2dldExvY2F0aW9uIDxlbT5Mb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TG9jYXRpb248L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldExvY2F0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNzZXRUeXBlKFN0cmluZykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZQYWNrYWdlI2dldENYRkluc3RhbGxfVHlwZSgpCi0gICAgICogQG1vZGVsCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIFN0cmluZyBnZXRUeXBlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGSW5zdGFsbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRUeXBlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRUeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gQ1hGSW5zdGFsbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9DWEZQYWNrYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL0NYRlBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNlY2RlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL0NYRlBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NDYgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgotICogJElkOiBDWEZQYWNrYWdlLmphdmEsdiAxLjQgMjAxMC8wMS8xNyAxOTo1Njo1NiBzY2xhcmtlIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAotICogPHVsPgotICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAqIDwvdWw+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkZhY3RvcnkKLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENYRlBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7Ci0gICAgLyoqCi0gICAgICogVGhlIHBhY2thZ2UgbmFtZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBTdHJpbmcgZU5BTUUgPSAibW9kZWwiOwotCi0gICAgLyoqCi0gICAgICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC5lY29yZSI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwiOwotCi0gICAgLyoqCi0gICAgICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBDWEZQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRlBhY2thZ2VJbXBsLmluaXQoKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQgPGVtPkNvbnRleHQ8L2VtPn0nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGUGFja2FnZUltcGwjZ2V0Q1hGQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIGludCBDWEZfQ09OVEVYVCA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBSdW50aW1lIExvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0NPTlRFWFRfX0RFRkFVTFRfUlVOVElNRV9MT0NBVElPTiA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBSdW50aW1lIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfQ09OVEVYVF9fREVGQVVMVF9SVU5USU1FX1RZUEUgPSAxOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgUnVudGltZSBWZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0NPTlRFWFRfX0RFRkFVTFRfUlVOVElNRV9WRVJTSU9OID0gMjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJib3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0NPTlRFWFRfX1ZFUkJPU0UgPSAzOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIEFudCBCdWlsZCBGaWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0NPTlRFWFRfX0dFTkVSQVRFX0FOVF9CVUlMRF9GSUxFID0gNDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBDbGllbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfQ09OVEVYVF9fR0VORVJBVEVfQ0xJRU5UID0gNTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBTZXJ2ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfQ09OVEVYVF9fR0VORVJBVEVfU0VSVkVSID0gNjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EYXRhYmluZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9DT05URVhUX19EQVRBQklORElORyA9IDc7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnJvbnRlbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfQ09OVEVYVF9fRlJPTlRFTkQgPSA4OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzZSBTcHJpbmcgQXBwbGljYXRpb24gQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9DT05URVhUX19VU0VfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFQgPSA5OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4cG9ydCBDWEYgQ2xhc3NwYXRoIENvbnRhaW5lcjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9DT05URVhUX19FWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVIgPSAxMDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnN0YWxsYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0NPTlRFWFRfX0lOU1RBTExBVElPTlMgPSAxMTsKLQotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db250ZXh0PC9lbT4nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgPSAxMjsKLQotICAgIC8qKgotICAgICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRGF0YU1vZGVsSW1wbCA8ZW0+RGF0YSBNb2RlbDwvZW0+fScgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkRhdGFNb2RlbEltcGwKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRlBhY2thZ2VJbXBsI2dldENYRkRhdGFNb2RlbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIGludCBDWEZfREFUQV9NT0RFTCA9IDE7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBSdW50aW1lIExvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0RBVEFfTU9ERUxfX0RFRkFVTFRfUlVOVElNRV9MT0NBVElPTiA9IENYRl9DT05URVhUX19ERUZBVUxUX1JVTlRJTUVfTE9DQVRJT047Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBSdW50aW1lIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfREFUQV9NT0RFTF9fREVGQVVMVF9SVU5USU1FX1RZUEUgPSBDWEZfQ09OVEVYVF9fREVGQVVMVF9SVU5USU1FX1RZUEU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBSdW50aW1lIFZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfREFUQV9NT0RFTF9fREVGQVVMVF9SVU5USU1FX1ZFUlNJT04gPSBDWEZfQ09OVEVYVF9fREVGQVVMVF9SVU5USU1FX1ZFUlNJT047Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyYm9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9EQVRBX01PREVMX19WRVJCT1NFID0gQ1hGX0NPTlRFWFRfX1ZFUkJPU0U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgQW50IEJ1aWxkIEZpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfREFUQV9NT0RFTF9fR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEUgPSBDWEZfQ09OVEVYVF9fR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgQ2xpZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0RBVEFfTU9ERUxfX0dFTkVSQVRFX0NMSUVOVCA9IENYRl9DT05URVhUX19HRU5FUkFURV9DTElFTlQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgU2VydmVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1NFUlZFUiA9IENYRl9DT05URVhUX19HRU5FUkFURV9TRVJWRVI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGF0YWJpbmRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfREFUQV9NT0RFTF9fREFUQUJJTkRJTkcgPSBDWEZfQ09OVEVYVF9fREFUQUJJTkRJTkc7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnJvbnRlbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfREFUQV9NT0RFTF9fRlJPTlRFTkQgPSBDWEZfQ09OVEVYVF9fRlJPTlRFTkQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNlIFNwcmluZyBBcHBsaWNhdGlvbiBDb250ZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0RBVEFfTU9ERUxfX1VTRV9TUFJJTkdfQVBQTElDQVRJT05fQ09OVEVYVCA9IENYRl9DT05URVhUX19VU0VfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhwb3J0IENYRiBDbGFzc3BhdGggQ29udGFpbmVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0RBVEFfTU9ERUxfX0VYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUiA9IENYRl9DT05URVhUX19FWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zdGFsbGF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9EQVRBX01PREVMX19JTlNUQUxMQVRJT05TID0gQ1hGX0NPTlRFWFRfX0lOU1RBTExBVElPTlM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvamVjdCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0RBVEFfTU9ERUxfX1BST0pFQ1RfTkFNRSA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIERpcmVjdG9yeTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9EQVRBX01PREVMX19SRVNPVVJDRV9ESVJFQ1RPUlkgPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbGFzcyBEaXJlY3Rvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfREFUQV9NT0RFTF9fQ0xBU1NfRElSRUNUT1JZID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBGaWxlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfREFUQV9NT0RFTF9fV1NETF9GSUxFX05BTUUgPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xc2RsIFVSTDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9EQVRBX01PREVMX19XU0RMX1VSTCA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmZpZyBXc2RsIExvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0RBVEFfTU9ERUxfX0NPTkZJR19XU0RMX0xPQ0FUSU9OID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsbHkgUXVhbGlmaWVkIEphdmEgQ2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9EQVRBX01PREVMX19GVUxMWV9RVUFMSUZJRURfSkFWQV9DTEFTU19OQU1FID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsbHkgUXVhbGlmaWVkIEphdmEgSW50ZXJmYWNlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfREFUQV9NT0RFTF9fRlVMTFlfUVVBTElGSUVEX0pBVkFfSU5URVJGQUNFX05BTUUgPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25maWcgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfREFUQV9NT0RFTF9fQ09ORklHX0lEID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IE5hbWVzcGFjZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9EQVRBX01PREVMX19UQVJHRVRfTkFNRVNQQUNFID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5kcG9pbnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9EQVRBX01PREVMX19FTkRQT0lOVF9OQU1FID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDEwOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9EQVRBX01PREVMX19TRVJWSUNFX05BTUUgPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgMTE7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBEZWZpbml0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0RBVEFfTU9ERUxfX1dTRExfREVGSU5JVElPTiA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyAxMjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xc2RsIExvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0RBVEFfTU9ERUxfX1dTRExfTE9DQVRJT04gPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgMTM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGF0YSBNb2RlbDwvZW0+JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDE0OwotCi0gICAgLyoqCi0gICAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQgPGVtPkphdmEyIFdTIENvbnRleHQ8L2VtPn0nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRlBhY2thZ2VJbXBsI2dldEphdmEyV1NDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0NPTlRFWFQgPSAyOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgUnVudGltZSBMb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0NPTlRFWFRfX0RFRkFVTFRfUlVOVElNRV9MT0NBVElPTiA9IENYRl9DT05URVhUX19ERUZBVUxUX1JVTlRJTUVfTE9DQVRJT047Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBSdW50aW1lIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19DT05URVhUX19ERUZBVUxUX1JVTlRJTUVfVFlQRSA9IENYRl9DT05URVhUX19ERUZBVUxUX1JVTlRJTUVfVFlQRTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFJ1bnRpbWUgVmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0NPTlRFWFRfX0RFRkFVTFRfUlVOVElNRV9WRVJTSU9OID0gQ1hGX0NPTlRFWFRfX0RFRkFVTFRfUlVOVElNRV9WRVJTSU9OOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcmJvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19DT05URVhUX19WRVJCT1NFID0gQ1hGX0NPTlRFWFRfX1ZFUkJPU0U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgQW50IEJ1aWxkIEZpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9BTlRfQlVJTERfRklMRSA9IENYRl9DT05URVhUX19HRU5FUkFURV9BTlRfQlVJTERfRklMRTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBDbGllbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9DTElFTlQgPSBDWEZfQ09OVEVYVF9fR0VORVJBVEVfQ0xJRU5UOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIFNlcnZlcjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1NFUlZFUiA9IENYRl9DT05URVhUX19HRU5FUkFURV9TRVJWRVI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGF0YWJpbmRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19DT05URVhUX19EQVRBQklORElORyA9IENYRl9DT05URVhUX19EQVRBQklORElORzsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Gcm9udGVuZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0NPTlRFWFRfX0ZST05URU5EID0gQ1hGX0NPTlRFWFRfX0ZST05URU5EOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzZSBTcHJpbmcgQXBwbGljYXRpb24gQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0NPTlRFWFRfX1VTRV9TUFJJTkdfQVBQTElDQVRJT05fQ09OVEVYVCA9IENYRl9DT05URVhUX19VU0VfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhwb3J0IENYRiBDbGFzc3BhdGggQ29udGFpbmVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfQ09OVEVYVF9fRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSID0gQ1hGX0NPTlRFWFRfX0VYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnN0YWxsYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfQ09OVEVYVF9fSU5TVEFMTEFUSU9OUyA9IENYRl9DT05URVhUX19JTlNUQUxMQVRJT05TOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvYXAxMiBCaW5kaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfQ09OVEVYVF9fU09BUDEyX0JJTkRJTkcgPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBYU0QgSW1wb3J0czwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1hTRF9JTVBPUlRTID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgV1NETDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dTREwgPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBXcmFwcGVyIEZhdWx0IEJlYW5zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV1JBUFBFUl9GQVVMVF9CRUFOUyA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFubm90YXRpb24gUHJvY2Vzc2luZyBFbmFibGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfQ09OVEVYVF9fQU5OT1RBVElPTl9QUk9DRVNTSU5HX0VOQUJMRUQgPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBXZWIgTWV0aG9kIEFubm90YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9XRUJfTUVUSE9EX0FOTk9UQVRJT04gPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBXZWIgUGFyYW0gQW5ub3RhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dFQl9QQVJBTV9BTk5PVEFUSU9OID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgUmVxdWVzdCBXcmFwcGVyIEFubm90YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9SRVFVRVNUX1dSQVBQRVJfQU5OT1RBVElPTiA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIFJlc3BvbnNlIFdyYXBwZXIgQW5ub3RhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1JFU1BPTlNFX1dSQVBQRVJfQU5OT1RBVElPTiA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkphdmEyIFdTIENvbnRleHQ8L2VtPicgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfQ09OVEVYVF9GRUFUVVJFX0NPVU5UID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkphdmEyV1NEYXRhTW9kZWxJbXBsIDxlbT5KYXZhMiBXUyBEYXRhIE1vZGVsPC9lbT59JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuSmF2YTJXU0RhdGFNb2RlbEltcGwKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRlBhY2thZ2VJbXBsI2dldEphdmEyV1NEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTCA9IDM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBSdW50aW1lIExvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fREVGQVVMVF9SVU5USU1FX0xPQ0FUSU9OID0gQ1hGX0RBVEFfTU9ERUxfX0RFRkFVTFRfUlVOVElNRV9MT0NBVElPTjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFJ1bnRpbWUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX0RFRkFVTFRfUlVOVElNRV9UWVBFID0gQ1hGX0RBVEFfTU9ERUxfX0RFRkFVTFRfUlVOVElNRV9UWVBFOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgUnVudGltZSBWZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fREVGQVVMVF9SVU5USU1FX1ZFUlNJT04gPSBDWEZfREFUQV9NT0RFTF9fREVGQVVMVF9SVU5USU1FX1ZFUlNJT047Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyYm9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX1ZFUkJPU0UgPSBDWEZfREFUQV9NT0RFTF9fVkVSQk9TRTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBBbnQgQnVpbGQgRmlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX0FOVF9CVUlMRF9GSUxFID0gQ1hGX0RBVEFfTU9ERUxfX0dFTkVSQVRFX0FOVF9CVUlMRF9GSUxFOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIENsaWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX0NMSUVOVCA9IENYRl9EQVRBX01PREVMX19HRU5FUkFURV9DTElFTlQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgU2VydmVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfU0VSVkVSID0gQ1hGX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1NFUlZFUjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EYXRhYmluZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX0RBVEFCSU5ESU5HID0gQ1hGX0RBVEFfTU9ERUxfX0RBVEFCSU5ESU5HOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZyb250ZW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fRlJPTlRFTkQgPSBDWEZfREFUQV9NT0RFTF9fRlJPTlRFTkQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNlIFNwcmluZyBBcHBsaWNhdGlvbiBDb250ZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fVVNFX1NQUklOR19BUFBMSUNBVElPTl9DT05URVhUID0gQ1hGX0RBVEFfTU9ERUxfX1VTRV9TUFJJTkdfQVBQTElDQVRJT05fQ09OVEVYVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHBvcnQgQ1hGIENsYXNzcGF0aCBDb250YWluZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19FWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVIgPSBDWEZfREFUQV9NT0RFTF9fRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluc3RhbGxhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19JTlNUQUxMQVRJT05TID0gQ1hGX0RBVEFfTU9ERUxfX0lOU1RBTExBVElPTlM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvamVjdCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fUFJPSkVDVF9OQU1FID0gQ1hGX0RBVEFfTU9ERUxfX1BST0pFQ1RfTkFNRTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBEaXJlY3Rvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19SRVNPVVJDRV9ESVJFQ1RPUlkgPSBDWEZfREFUQV9NT0RFTF9fUkVTT1VSQ0VfRElSRUNUT1JZOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNsYXNzIERpcmVjdG9yeTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX0NMQVNTX0RJUkVDVE9SWSA9IENYRl9EQVRBX01PREVMX19DTEFTU19ESVJFQ1RPUlk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBGaWxlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19XU0RMX0ZJTEVfTkFNRSA9IENYRl9EQVRBX01PREVMX19XU0RMX0ZJTEVfTkFNRTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xc2RsIFVSTDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX1dTRExfVVJMID0gQ1hGX0RBVEFfTU9ERUxfX1dTRExfVVJMOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmZpZyBXc2RsIExvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fQ09ORklHX1dTRExfTE9DQVRJT04gPSBDWEZfREFUQV9NT0RFTF9fQ09ORklHX1dTRExfTE9DQVRJT047Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsbHkgUXVhbGlmaWVkIEphdmEgQ2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX0ZVTExZX1FVQUxJRklFRF9KQVZBX0NMQVNTX05BTUUgPSBDWEZfREFUQV9NT0RFTF9fRlVMTFlfUVVBTElGSUVEX0pBVkFfQ0xBU1NfTkFNRTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxseSBRdWFsaWZpZWQgSmF2YSBJbnRlcmZhY2UgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX0ZVTExZX1FVQUxJRklFRF9KQVZBX0lOVEVSRkFDRV9OQU1FID0gQ1hGX0RBVEFfTU9ERUxfX0ZVTExZX1FVQUxJRklFRF9KQVZBX0lOVEVSRkFDRV9OQU1FOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmZpZyBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX0NPTkZJR19JRCA9IENYRl9EQVRBX01PREVMX19DT05GSUdfSUQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IE5hbWVzcGFjZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX1RBUkdFVF9OQU1FU1BBQ0UgPSBDWEZfREFUQV9NT0RFTF9fVEFSR0VUX05BTUVTUEFDRTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmRwb2ludCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fRU5EUE9JTlRfTkFNRSA9IENYRl9EQVRBX01PREVMX19FTkRQT0lOVF9OQU1FOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX1NFUlZJQ0VfTkFNRSA9IENYRl9EQVRBX01PREVMX19TRVJWSUNFX05BTUU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBEZWZpbml0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fV1NETF9ERUZJTklUSU9OID0gQ1hGX0RBVEFfTU9ERUxfX1dTRExfREVGSU5JVElPTjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xc2RsIExvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fV1NETF9MT0NBVElPTiA9IENYRl9EQVRBX01PREVMX19XU0RMX0xPQ0FUSU9OOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvYXAxMiBCaW5kaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fU09BUDEyX0JJTkRJTkcgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBYU0QgSW1wb3J0czwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1hTRF9JTVBPUlRTID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgV1NETDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dTREwgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBXcmFwcGVyIEZhdWx0IEJlYW5zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV1JBUFBFUl9GQVVMVF9CRUFOUyA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFubm90YXRpb24gUHJvY2Vzc2luZyBFbmFibGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fQU5OT1RBVElPTl9QUk9DRVNTSU5HX0VOQUJMRUQgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgNDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBXZWIgTWV0aG9kIEFubm90YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XRUJfTUVUSE9EX0FOTk9UQVRJT04gPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgNTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBXZWIgUGFyYW0gQW5ub3RhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dFQl9QQVJBTV9BTk5PVEFUSU9OID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgUmVxdWVzdCBXcmFwcGVyIEFubm90YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9SRVFVRVNUX1dSQVBQRVJfQU5OT1RBVElPTiA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIFJlc3BvbnNlIFdyYXBwZXIgQW5ub3RhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1JFU1BPTlNFX1dSQVBQRVJfQU5OT1RBVElPTiA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNsYXNzcGF0aDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX0NMQVNTUEFUSCA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyA5OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkphdmEgU3RhcnRpbmcgUG9pbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19KQVZBX1NUQVJUSU5HX1BPSU5UID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDEwOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzZSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX1VTRV9TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRSA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAxMTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRyYWN0IEludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX0VYVFJBQ1RfSU5URVJGQUNFID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDEyOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9OQU1FID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDEzOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBNYXA8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19NRVRIT0RfTUFQID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDE0OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFubm90YXRpb24gTWFwPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fQU5OT1RBVElPTl9NQVAgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMTU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U291cmNlIERpcmVjdG9yeTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX1NPVVJDRV9ESVJFQ1RPUlkgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMTY7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9ydCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fUE9SVF9OQU1FID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDE3OwotCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkphdmEyIFdTIERhdGEgTW9kZWw8L2VtPicgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDE4OwotCi0gICAgLyoqCi0gICAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCA8ZW0+V1NETDIgSmF2YSBDb250ZXh0PC9lbT59JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRlBhY2thZ2VJbXBsI2dldFdTREwySmF2YUNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9DT05URVhUID0gNDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFJ1bnRpbWUgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0NPTlRFWFRfX0RFRkFVTFRfUlVOVElNRV9MT0NBVElPTiA9IENYRl9DT05URVhUX19ERUZBVUxUX1JVTlRJTUVfTE9DQVRJT047Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBSdW50aW1lIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0NPTlRFWFRfX0RFRkFVTFRfUlVOVElNRV9UWVBFID0gQ1hGX0NPTlRFWFRfX0RFRkFVTFRfUlVOVElNRV9UWVBFOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgUnVudGltZSBWZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9DT05URVhUX19ERUZBVUxUX1JVTlRJTUVfVkVSU0lPTiA9IENYRl9DT05URVhUX19ERUZBVUxUX1JVTlRJTUVfVkVSU0lPTjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJib3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9DT05URVhUX19WRVJCT1NFID0gQ1hGX0NPTlRFWFRfX1ZFUkJPU0U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgQW50IEJ1aWxkIEZpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0NPTlRFWFRfX0dFTkVSQVRFX0FOVF9CVUlMRF9GSUxFID0gQ1hGX0NPTlRFWFRfX0dFTkVSQVRFX0FOVF9CVUlMRF9GSUxFOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIENsaWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfQ09OVEVYVF9fR0VORVJBVEVfQ0xJRU5UID0gQ1hGX0NPTlRFWFRfX0dFTkVSQVRFX0NMSUVOVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBTZXJ2ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0NPTlRFWFRfX0dFTkVSQVRFX1NFUlZFUiA9IENYRl9DT05URVhUX19HRU5FUkFURV9TRVJWRVI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGF0YWJpbmRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0NPTlRFWFRfX0RBVEFCSU5ESU5HID0gQ1hGX0NPTlRFWFRfX0RBVEFCSU5ESU5HOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZyb250ZW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9DT05URVhUX19GUk9OVEVORCA9IENYRl9DT05URVhUX19GUk9OVEVORDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2UgU3ByaW5nIEFwcGxpY2F0aW9uIENvbnRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0NPTlRFWFRfX1VTRV9TUFJJTkdfQVBQTElDQVRJT05fQ09OVEVYVCA9IENYRl9DT05URVhUX19VU0VfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhwb3J0IENYRiBDbGFzc3BhdGggQ29udGFpbmVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9DT05URVhUX19FWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVIgPSBDWEZfQ09OVEVYVF9fRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluc3RhbGxhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0NPTlRFWFRfX0lOU1RBTExBVElPTlMgPSBDWEZfQ09OVEVYVF9fSU5TVEFMTEFUSU9OUzsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBJbXBsZW1lbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfQ09OVEVYVF9fR0VORVJBVEVfSU1QTEVNRU5UQVRJT04gPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9jZXNzIFNPQVAgSGVhZGVyczwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfQ09OVEVYVF9fUFJPQ0VTU19TT0FQX0hFQURFUlMgPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2FkIERlZmF1bHQgTmFtZXNwYWNlIFBhY2thZ2UgTmFtZSBNYXBwaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9DT05URVhUX19MT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VfTkFNRV9NQVBQSU5HID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9hZCBEZWZhdWx0IEV4Y2x1ZGVzIE5hbWVwc2FjZSBNYXBwaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9DT05URVhUX19MT0FEX0RFRkFVTFRfRVhDTFVERVNfTkFNRVBTQUNFX01BUFBJTkcgPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWxpZGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfQ09OVEVYVF9fVkFMSURBVEUgPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xc2RsIFZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0NPTlRFWFRfX1dTRExfVkVSU0lPTiA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzZSBEZWZhdWx0IFZhbHVlczwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfQ09OVEVYVF9fVVNFX0RFRkFVTFRfVkFMVUVTID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WGpjIEFyZ3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19BUkdTID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm8gQWRkcmVzcyBCaW5kaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9DT05URVhUX19OT19BRERSRVNTX0JJTkRJTkcgPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgODsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YamMgVXNlIERlZmF1bHQgVmFsdWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9DT05URVhUX19YSkNfVVNFX0RFRkFVTFRfVkFMVUVTID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WGpjIFRvIFN0cmluZzwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1RPX1NUUklORyA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YamMgVG8gU3RyaW5nIE11bHRpIExpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19UT19TVFJJTkdfTVVMVElfTElORSA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyAxMTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YamMgVG8gU3RyaW5nIFNpbXBsZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1RPX1NUUklOR19TSU1QTEUgPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgMTI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WGpjIExvY2F0b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19MT0NBVE9SID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDEzOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhqYyBTeW5jIE1ldGhvZHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19TWU5DX01FVEhPRFMgPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgMTQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WGpjIE1hcmsgR2VuZXJhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9DT05URVhUX19YSkNfTUFSS19HRU5FUkFURUQgPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgMTU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WGpjIEVwaXNvZGUgRmlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfQ09OVEVYVF9fWEpDX0VQSVNPREVfRklMRSA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyAxNjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRvIE5hbWUgUmVzb2x1dGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfQ09OVEVYVF9fQVVUT19OQU1FX1JFU09MVVRJT04gPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgMTc7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V1NETDIgSmF2YSBDb250ZXh0PC9lbT4nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfQ09OVEVYVF9GRUFUVVJFX0NPVU5UID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDE4OwotCi0gICAgLyoqCi0gICAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5XU0RMMkphdmFEYXRhTW9kZWxJbXBsIDxlbT5XU0RMMiBKYXZhIERhdGEgTW9kZWw8L2VtPn0nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5XU0RMMkphdmFEYXRhTW9kZWxJbXBsCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZQYWNrYWdlSW1wbCNnZXRXU0RMMkphdmFEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMID0gNTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFJ1bnRpbWUgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0RFRkFVTFRfUlVOVElNRV9MT0NBVElPTiA9IENYRl9EQVRBX01PREVMX19ERUZBVUxUX1JVTlRJTUVfTE9DQVRJT047Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBSdW50aW1lIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0RFRkFVTFRfUlVOVElNRV9UWVBFID0gQ1hGX0RBVEFfTU9ERUxfX0RFRkFVTFRfUlVOVElNRV9UWVBFOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgUnVudGltZSBWZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19ERUZBVUxUX1JVTlRJTUVfVkVSU0lPTiA9IENYRl9EQVRBX01PREVMX19ERUZBVUxUX1JVTlRJTUVfVkVSU0lPTjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJib3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19WRVJCT1NFID0gQ1hGX0RBVEFfTU9ERUxfX1ZFUkJPU0U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgQW50IEJ1aWxkIEZpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0dFTkVSQVRFX0FOVF9CVUlMRF9GSUxFID0gQ1hGX0RBVEFfTU9ERUxfX0dFTkVSQVRFX0FOVF9CVUlMRF9GSUxFOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIENsaWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fR0VORVJBVEVfQ0xJRU5UID0gQ1hGX0RBVEFfTU9ERUxfX0dFTkVSQVRFX0NMSUVOVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBTZXJ2ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1NFUlZFUiA9IENYRl9EQVRBX01PREVMX19HRU5FUkFURV9TRVJWRVI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGF0YWJpbmRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0RBVEFCSU5ESU5HID0gQ1hGX0RBVEFfTU9ERUxfX0RBVEFCSU5ESU5HOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZyb250ZW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19GUk9OVEVORCA9IENYRl9EQVRBX01PREVMX19GUk9OVEVORDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2UgU3ByaW5nIEFwcGxpY2F0aW9uIENvbnRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1VTRV9TUFJJTkdfQVBQTElDQVRJT05fQ09OVEVYVCA9IENYRl9EQVRBX01PREVMX19VU0VfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhwb3J0IENYRiBDbGFzc3BhdGggQ29udGFpbmVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19FWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVIgPSBDWEZfREFUQV9NT0RFTF9fRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluc3RhbGxhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0lOU1RBTExBVElPTlMgPSBDWEZfREFUQV9NT0RFTF9fSU5TVEFMTEFUSU9OUzsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9qZWN0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1BST0pFQ1RfTkFNRSA9IENYRl9EQVRBX01PREVMX19QUk9KRUNUX05BTUU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRGlyZWN0b3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19SRVNPVVJDRV9ESVJFQ1RPUlkgPSBDWEZfREFUQV9NT0RFTF9fUkVTT1VSQ0VfRElSRUNUT1JZOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNsYXNzIERpcmVjdG9yeTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fQ0xBU1NfRElSRUNUT1JZID0gQ1hGX0RBVEFfTU9ERUxfX0NMQVNTX0RJUkVDVE9SWTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xc2RsIEZpbGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fV1NETF9GSUxFX05BTUUgPSBDWEZfREFUQV9NT0RFTF9fV1NETF9GSUxFX05BTUU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBVUkw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1dTRExfVVJMID0gQ1hGX0RBVEFfTU9ERUxfX1dTRExfVVJMOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmZpZyBXc2RsIExvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19DT05GSUdfV1NETF9MT0NBVElPTiA9IENYRl9EQVRBX01PREVMX19DT05GSUdfV1NETF9MT0NBVElPTjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxseSBRdWFsaWZpZWQgSmF2YSBDbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19GVUxMWV9RVUFMSUZJRURfSkFWQV9DTEFTU19OQU1FID0gQ1hGX0RBVEFfTU9ERUxfX0ZVTExZX1FVQUxJRklFRF9KQVZBX0NMQVNTX05BTUU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsbHkgUXVhbGlmaWVkIEphdmEgSW50ZXJmYWNlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0ZVTExZX1FVQUxJRklFRF9KQVZBX0lOVEVSRkFDRV9OQU1FID0gQ1hGX0RBVEFfTU9ERUxfX0ZVTExZX1FVQUxJRklFRF9KQVZBX0lOVEVSRkFDRV9OQU1FOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmZpZyBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fQ09ORklHX0lEID0gQ1hGX0RBVEFfTU9ERUxfX0NPTkZJR19JRDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgTmFtZXNwYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19UQVJHRVRfTkFNRVNQQUNFID0gQ1hGX0RBVEFfTU9ERUxfX1RBUkdFVF9OQU1FU1BBQ0U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5kcG9pbnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fRU5EUE9JTlRfTkFNRSA9IENYRl9EQVRBX01PREVMX19FTkRQT0lOVF9OQU1FOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fU0VSVklDRV9OQU1FID0gQ1hGX0RBVEFfTU9ERUxfX1NFUlZJQ0VfTkFNRTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xc2RsIERlZmluaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1dTRExfREVGSU5JVElPTiA9IENYRl9EQVRBX01PREVMX19XU0RMX0RFRklOSVRJT047Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBMb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fV1NETF9MT0NBVElPTiA9IENYRl9EQVRBX01PREVMX19XU0RMX0xPQ0FUSU9OOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIEltcGxlbWVudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19HRU5FUkFURV9JTVBMRU1FTlRBVElPTiA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3MgU09BUCBIZWFkZXJzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19QUk9DRVNTX1NPQVBfSEVBREVSUyA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvYWQgRGVmYXVsdCBOYW1lc3BhY2UgUGFja2FnZSBOYW1lIE1hcHBpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0xPQURfREVGQVVMVF9OQU1FU1BBQ0VfUEFDS0FHRV9OQU1FX01BUFBJTkcgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2FkIERlZmF1bHQgRXhjbHVkZXMgTmFtZXBzYWNlIE1hcHBpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0xPQURfREVGQVVMVF9FWENMVURFU19OQU1FUFNBQ0VfTUFQUElORyA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbGlkYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19WQUxJREFURSA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldzZGwgVmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fV1NETF9WRVJTSU9OID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNlIERlZmF1bHQgVmFsdWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19VU0VfREVGQVVMVF9WQUxVRVMgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgNjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YamMgQXJnczwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX0FSR1MgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgNzsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5ObyBBZGRyZXNzIEJpbmRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX05PX0FERFJFU1NfQklORElORyA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhqYyBVc2UgRGVmYXVsdCBWYWx1ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19VU0VfREVGQVVMVF9WQUxVRVMgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgOTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YamMgVG8gU3RyaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfVE9fU1RSSU5HID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDEwOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhqYyBUbyBTdHJpbmcgTXVsdGkgTGluZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1RPX1NUUklOR19NVUxUSV9MSU5FID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDExOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhqYyBUbyBTdHJpbmcgU2ltcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfVE9fU1RSSU5HX1NJTVBMRSA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAxMjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YamMgTG9jYXRvcjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX0xPQ0FUT1IgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMTM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WGpjIFN5bmMgTWV0aG9kczwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1NZTkNfTUVUSE9EUyA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAxNDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YamMgTWFyayBHZW5lcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19NQVJLX0dFTkVSQVRFRCA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAxNTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YamMgRXBpc29kZSBGaWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfRVBJU09ERV9GSUxFID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDE2OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dG8gTmFtZSBSZXNvbHV0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19BVVRPX05BTUVfUkVTT0xVVElPTiA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAxNzsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNsdWRlZCBOYW1lc3BhY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19JTkNMVURFRF9OQU1FU1BBQ0VTID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDE4OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJpbmRpbmcgRmlsZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fQklORElOR19GSUxFUyA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAxOTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGNsdWRlZCBOYW1lc3BhY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19FWENMVURFRF9OQU1FU1BBQ0VTID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDIwOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGFsb2cgRmlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fQ0FUQUxPR19GSUxFID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDIxOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkphdmEgU291cmNlIEZvbGRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fSkFWQV9TT1VSQ0VfRk9MREVSID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDIyOwotCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldTREwyIEphdmEgRGF0YSBNb2RlbDwvZW0+JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAyMzsKLQotICAgIC8qKgotICAgICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGSW5zdGFsbEltcGwgPGVtPkluc3RhbGw8L2VtPn0nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZJbnN0YWxsSW1wbAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGUGFja2FnZUltcGwjZ2V0Q1hGSW5zdGFsbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIGludCBDWEZfSU5TVEFMTCA9IDY7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9JTlNUQUxMX19WRVJTSU9OID0gMDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9JTlNUQUxMX19MT0NBVElPTiA9IDE7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9JTlNUQUxMX19UWVBFID0gMjsKLQotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JbnN0YWxsPC9lbT4nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9JTlNUQUxMX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0gICAgLyoqCi0gICAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuRnJvbnRlbmQgPGVtPkZyb250ZW5kPC9lbT59JyBlbnVtLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuRnJvbnRlbmQKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRlBhY2thZ2VJbXBsI2dldEZyb250ZW5kKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgaW50IEZST05URU5EID0gNzsKLQotICAgIC8qKgotICAgICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkRhdGFCaW5kaW5nIDxlbT5EYXRhIEJpbmRpbmc8L2VtPn0nIGVudW0uCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5EYXRhQmluZGluZwotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGUGFja2FnZUltcGwjZ2V0RGF0YUJpbmRpbmcoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBpbnQgREFUQV9CSU5ESU5HID0gODsKLQotICAgIC8qKgotICAgICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+VVJMPC9lbT4nIGRhdGEgdHlwZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgamF2YS5uZXQuVVJMCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZQYWNrYWdlSW1wbCNnZXRVUkwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBpbnQgVVJMID0gOTsKLQotICAgIC8qKgotICAgICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RGVmaW5pdGlvbjwvZW0+JyBkYXRhIHR5cGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlIGphdmF4LndzZGwuRGVmaW5pdGlvbgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGUGFja2FnZUltcGwjZ2V0RGVmaW5pdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIGludCBERUZJTklUSU9OID0gMTA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPk1hcDwvZW0+JyBkYXRhIHR5cGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlIGphdmEudXRpbC5NYXAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRlBhY2thZ2VJbXBsI2dldE1hcCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIGludCBNQVAgPSAxMTsKLQotICAgIC8qKgotICAgICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SU1ldGhvZDwvZW0+JyBkYXRhIHR5cGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2QKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRlBhY2thZ2VJbXBsI2dldElNZXRob2QoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBpbnQgSU1FVEhPRCA9IDEyOwotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCA8ZW0+Q29udGV4dDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db250ZXh0PC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUNsYXNzIGdldENYRkNvbnRleHQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjZ2V0RGVmYXVsdFJ1bnRpbWVMb2NhdGlvbiA8ZW0+RGVmYXVsdCBSdW50aW1lIExvY2F0aW9uPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVmYXVsdCBSdW50aW1lIExvY2F0aW9uPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjZ2V0RGVmYXVsdFJ1bnRpbWVMb2NhdGlvbigpCi0gICAgICogQHNlZSAjZ2V0Q1hGQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0Q1hGQ29udGV4dF9EZWZhdWx0UnVudGltZUxvY2F0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2dldERlZmF1bHRSdW50aW1lVHlwZSA8ZW0+RGVmYXVsdCBSdW50aW1lIFR5cGU8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0IFJ1bnRpbWUgVHlwZTwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2dldERlZmF1bHRSdW50aW1lVHlwZSgpCi0gICAgICogQHNlZSAjZ2V0Q1hGQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0Q1hGQ29udGV4dF9EZWZhdWx0UnVudGltZVR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uIDxlbT5EZWZhdWx0IFJ1bnRpbWUgVmVyc2lvbjwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlZmF1bHQgUnVudGltZSBWZXJzaW9uPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCkKLSAgICAgKiBAc2VlICNnZXRDWEZDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRDWEZDb250ZXh0X0RlZmF1bHRSdW50aW1lVmVyc2lvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNpc1ZlcmJvc2UgPGVtPlZlcmJvc2U8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WZXJib3NlPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjaXNWZXJib3NlKCkKLSAgICAgKiBAc2VlICNnZXRDWEZDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRDWEZDb250ZXh0X1ZlcmJvc2UoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjaXNHZW5lcmF0ZUFudEJ1aWxkRmlsZSA8ZW0+R2VuZXJhdGUgQW50IEJ1aWxkIEZpbGU8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5HZW5lcmF0ZSBBbnQgQnVpbGQgRmlsZTwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2lzR2VuZXJhdGVBbnRCdWlsZEZpbGUoKQotICAgICAqIEBzZWUgI2dldENYRkNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldENYRkNvbnRleHRfR2VuZXJhdGVBbnRCdWlsZEZpbGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjaXNHZW5lcmF0ZUNsaWVudCA8ZW0+R2VuZXJhdGUgQ2xpZW50PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+R2VuZXJhdGUgQ2xpZW50PC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjaXNHZW5lcmF0ZUNsaWVudCgpCi0gICAgICogQHNlZSAjZ2V0Q1hGQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0Q1hGQ29udGV4dF9HZW5lcmF0ZUNsaWVudCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNpc0dlbmVyYXRlU2VydmVyIDxlbT5HZW5lcmF0ZSBTZXJ2ZXI8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5HZW5lcmF0ZSBTZXJ2ZXI8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNpc0dlbmVyYXRlU2VydmVyKCkKLSAgICAgKiBAc2VlICNnZXRDWEZDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRDWEZDb250ZXh0X0dlbmVyYXRlU2VydmVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2dldERhdGFiaW5kaW5nIDxlbT5EYXRhYmluZGluZzwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRhdGFiaW5kaW5nPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjZ2V0RGF0YWJpbmRpbmcoKQotICAgICAqIEBzZWUgI2dldENYRkNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldENYRkNvbnRleHRfRGF0YWJpbmRpbmcoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjZ2V0RnJvbnRlbmQgPGVtPkZyb250ZW5kPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RnJvbnRlbmQ8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNnZXRGcm9udGVuZCgpCi0gICAgICogQHNlZSAjZ2V0Q1hGQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0Q1hGQ29udGV4dF9Gcm9udGVuZCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNpc1VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCA8ZW0+VXNlIFNwcmluZyBBcHBsaWNhdGlvbiBDb250ZXh0PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXNlIFNwcmluZyBBcHBsaWNhdGlvbiBDb250ZXh0PC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjaXNVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoKQotICAgICAqIEBzZWUgI2dldENYRkNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldENYRkNvbnRleHRfVXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2lzRXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyIDxlbT5FeHBvcnQgQ1hGIENsYXNzcGF0aCBDb250YWluZXI8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeHBvcnQgQ1hGIENsYXNzcGF0aCBDb250YWluZXI8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNpc0V4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcigpCi0gICAgICogQHNlZSAjZ2V0Q1hGQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0Q1hGQ29udGV4dF9FeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjZ2V0SW5zdGFsbGF0aW9ucyA8ZW0+SW5zdGFsbGF0aW9uczwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkluc3RhbGxhdGlvbnM8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNnZXRJbnN0YWxsYXRpb25zKCkKLSAgICAgKiBAc2VlICNnZXRDWEZDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRDWEZDb250ZXh0X0luc3RhbGxhdGlvbnMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwgPGVtPkRhdGEgTW9kZWw8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGF0YSBNb2RlbDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUNsYXNzIGdldENYRkRhdGFNb2RlbCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldFByb2plY3ROYW1lIDxlbT5Qcm9qZWN0IE5hbWU8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qcm9qZWN0IE5hbWU8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldFByb2plY3ROYW1lKCkKLSAgICAgKiBAc2VlICNnZXRDWEZEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldENYRkRhdGFNb2RlbF9Qcm9qZWN0TmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldFJlc291cmNlRGlyZWN0b3J5IDxlbT5SZXNvdXJjZSBEaXJlY3Rvcnk8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXNvdXJjZSBEaXJlY3Rvcnk8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldFJlc291cmNlRGlyZWN0b3J5KCkKLSAgICAgKiBAc2VlICNnZXRDWEZEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldENYRkRhdGFNb2RlbF9SZXNvdXJjZURpcmVjdG9yeSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldENsYXNzRGlyZWN0b3J5IDxlbT5DbGFzcyBEaXJlY3Rvcnk8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DbGFzcyBEaXJlY3Rvcnk8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldENsYXNzRGlyZWN0b3J5KCkKLSAgICAgKiBAc2VlICNnZXRDWEZEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldENYRkRhdGFNb2RlbF9DbGFzc0RpcmVjdG9yeSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldFdzZGxGaWxlTmFtZSA8ZW0+V3NkbCBGaWxlIE5hbWU8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xc2RsIEZpbGUgTmFtZTwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0V3NkbEZpbGVOYW1lKCkKLSAgICAgKiBAc2VlICNnZXRDWEZEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldENYRkRhdGFNb2RlbF9Xc2RsRmlsZU5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRXc2RsVVJMIDxlbT5Xc2RsIFVSTDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldzZGwgVVJMPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRXc2RsVVJMKCkKLSAgICAgKiBAc2VlICNnZXRDWEZEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldENYRkRhdGFNb2RlbF9Xc2RsVVJMKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0Q29uZmlnV3NkbExvY2F0aW9uIDxlbT5Db25maWcgV3NkbCBMb2NhdGlvbjwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbmZpZyBXc2RsIExvY2F0aW9uPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRDb25maWdXc2RsTG9jYXRpb24oKQotICAgICAqIEBzZWUgI2dldENYRkRhdGFNb2RlbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0Q1hGRGF0YU1vZGVsX0NvbmZpZ1dzZGxMb2NhdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSA8ZW0+RnVsbHkgUXVhbGlmaWVkIEphdmEgQ2xhc3MgTmFtZTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZ1bGx5IFF1YWxpZmllZCBKYXZhIENsYXNzIE5hbWU8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpCi0gICAgICogQHNlZSAjZ2V0Q1hGRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRDWEZEYXRhTW9kZWxfRnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSA8ZW0+RnVsbHkgUXVhbGlmaWVkIEphdmEgSW50ZXJmYWNlIE5hbWU8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GdWxseSBRdWFsaWZpZWQgSmF2YSBJbnRlcmZhY2UgTmFtZTwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSgpCi0gICAgICogQHNlZSAjZ2V0Q1hGRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRDWEZEYXRhTW9kZWxfRnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldENvbmZpZ0lkIDxlbT5Db25maWcgSWQ8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db25maWcgSWQ8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldENvbmZpZ0lkKCkKLSAgICAgKiBAc2VlICNnZXRDWEZEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldENYRkRhdGFNb2RlbF9Db25maWdJZCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldFRhcmdldE5hbWVzcGFjZSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldFRhcmdldE5hbWVzcGFjZSgpCi0gICAgICogQHNlZSAjZ2V0Q1hGRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRDWEZEYXRhTW9kZWxfVGFyZ2V0TmFtZXNwYWNlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0RW5kcG9pbnROYW1lIDxlbT5FbmRwb2ludCBOYW1lPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RW5kcG9pbnQgTmFtZTwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0RW5kcG9pbnROYW1lKCkKLSAgICAgKiBAc2VlICNnZXRDWEZEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldENYRkRhdGFNb2RlbF9FbmRwb2ludE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRTZXJ2aWNlTmFtZSA8ZW0+U2VydmljZSBOYW1lPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2VydmljZSBOYW1lPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRTZXJ2aWNlTmFtZSgpCi0gICAgICogQHNlZSAjZ2V0Q1hGRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRDWEZEYXRhTW9kZWxfU2VydmljZU5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRXc2RsRGVmaW5pdGlvbiA8ZW0+V3NkbCBEZWZpbml0aW9uPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V3NkbCBEZWZpbml0aW9uPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRXc2RsRGVmaW5pdGlvbigpCi0gICAgICogQHNlZSAjZ2V0Q1hGRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRDWEZEYXRhTW9kZWxfV3NkbERlZmluaXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRXc2RsTG9jYXRpb24gPGVtPldzZGwgTG9jYXRpb248L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xc2RsIExvY2F0aW9uPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRXc2RsTG9jYXRpb24oKQotICAgICAqIEBzZWUgI2dldENYRkRhdGFNb2RlbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0Q1hGRGF0YU1vZGVsX1dzZGxMb2NhdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0IDxlbT5KYXZhMiBXUyBDb250ZXh0PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkphdmEyIFdTIENvbnRleHQ8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUNsYXNzIGdldEphdmEyV1NDb250ZXh0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCNpc1NvYXAxMkJpbmRpbmcgPGVtPlNvYXAxMiBCaW5kaW5nPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U29hcDEyIEJpbmRpbmc8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQjaXNTb2FwMTJCaW5kaW5nKCkKLSAgICAgKiBAc2VlICNnZXRKYXZhMldTQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0NvbnRleHRfU29hcDEyQmluZGluZygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQjaXNHZW5lcmF0ZVhTREltcG9ydHMgPGVtPkdlbmVyYXRlIFhTRCBJbXBvcnRzPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+R2VuZXJhdGUgWFNEIEltcG9ydHM8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQjaXNHZW5lcmF0ZVhTREltcG9ydHMoKQotICAgICAqIEBzZWUgI2dldEphdmEyV1NDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVhTREltcG9ydHMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0I2lzR2VuZXJhdGVXU0RMIDxlbT5HZW5lcmF0ZSBXU0RMPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+R2VuZXJhdGUgV1NETDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCNpc0dlbmVyYXRlV1NETCgpCi0gICAgICogQHNlZSAjZ2V0SmF2YTJXU0NvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlV1NETCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQjaXNHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zIDxlbT5HZW5lcmF0ZSBXcmFwcGVyIEZhdWx0IEJlYW5zPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+R2VuZXJhdGUgV3JhcHBlciBGYXVsdCBCZWFuczwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCNpc0dlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMoKQotICAgICAqIEBzZWUgI2dldEphdmEyV1NDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCNpc0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCA8ZW0+QW5ub3RhdGlvbiBQcm9jZXNzaW5nIEVuYWJsZWQ8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Bbm5vdGF0aW9uIFByb2Nlc3NpbmcgRW5hYmxlZDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCNpc0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpCi0gICAgICogQHNlZSAjZ2V0SmF2YTJXU0NvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldEphdmEyV1NDb250ZXh0X0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQjaXNHZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24gPGVtPkdlbmVyYXRlIFdlYiBNZXRob2QgQW5ub3RhdGlvbjwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkdlbmVyYXRlIFdlYiBNZXRob2QgQW5ub3RhdGlvbjwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCNpc0dlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbigpCi0gICAgICogQHNlZSAjZ2V0SmF2YTJXU0NvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQjaXNHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbiA8ZW0+R2VuZXJhdGUgV2ViIFBhcmFtIEFubm90YXRpb248L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5HZW5lcmF0ZSBXZWIgUGFyYW0gQW5ub3RhdGlvbjwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCNpc0dlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKCkKLSAgICAgKiBAc2VlICNnZXRKYXZhMldTQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0I2lzR2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24gPGVtPkdlbmVyYXRlIFJlcXVlc3QgV3JhcHBlciBBbm5vdGF0aW9uPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+R2VuZXJhdGUgUmVxdWVzdCBXcmFwcGVyIEFubm90YXRpb248L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQjaXNHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbigpCi0gICAgICogQHNlZSAjZ2V0SmF2YTJXU0NvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCNpc0dlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbiA8ZW0+R2VuZXJhdGUgUmVzcG9uc2UgV3JhcHBlciBBbm5vdGF0aW9uPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+R2VuZXJhdGUgUmVzcG9uc2UgV3JhcHBlciBBbm5vdGF0aW9uPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0I2lzR2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKCkKLSAgICAgKiBAc2VlICNnZXRKYXZhMldTQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbCA8ZW0+SmF2YTIgV1MgRGF0YSBNb2RlbDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5KYXZhMiBXUyBEYXRhIE1vZGVsPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUNsYXNzIGdldEphdmEyV1NEYXRhTW9kZWwoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwjZ2V0Q2xhc3NwYXRoIDxlbT5DbGFzc3BhdGg8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DbGFzc3BhdGg8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbCNnZXRDbGFzc3BhdGgoKQotICAgICAqIEBzZWUgI2dldEphdmEyV1NEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldEphdmEyV1NEYXRhTW9kZWxfQ2xhc3NwYXRoKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsI2dldEphdmFTdGFydGluZ1BvaW50IDxlbT5KYXZhIFN0YXJ0aW5nIFBvaW50PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SmF2YSBTdGFydGluZyBQb2ludDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsI2dldEphdmFTdGFydGluZ1BvaW50KCkKLSAgICAgKiBAc2VlICNnZXRKYXZhMldTRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRKYXZhMldTRGF0YU1vZGVsX0phdmFTdGFydGluZ1BvaW50KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsI2lzVXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIDxlbT5Vc2UgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Vc2UgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbCNpc1VzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpCi0gICAgICogQHNlZSAjZ2V0SmF2YTJXU0RhdGFNb2RlbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0RhdGFNb2RlbF9Vc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwjaXNFeHRyYWN0SW50ZXJmYWNlIDxlbT5FeHRyYWN0IEludGVyZmFjZTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4dHJhY3QgSW50ZXJmYWNlPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwjaXNFeHRyYWN0SW50ZXJmYWNlKCkKLSAgICAgKiBAc2VlICNnZXRKYXZhMldTRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRKYXZhMldTRGF0YU1vZGVsX0V4dHJhY3RJbnRlcmZhY2UoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSA8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgTmFtZTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIE5hbWU8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbCNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKCkKLSAgICAgKiBAc2VlICNnZXRKYXZhMldTRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRKYXZhMldTRGF0YU1vZGVsX1NlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwjZ2V0TWV0aG9kTWFwIDxlbT5NZXRob2QgTWFwPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWV0aG9kIE1hcDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsI2dldE1ldGhvZE1hcCgpCi0gICAgICogQHNlZSAjZ2V0SmF2YTJXU0RhdGFNb2RlbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0RhdGFNb2RlbF9NZXRob2RNYXAoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwjZ2V0QW5ub3RhdGlvbk1hcCA8ZW0+QW5ub3RhdGlvbiBNYXA8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Bbm5vdGF0aW9uIE1hcDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsI2dldEFubm90YXRpb25NYXAoKQotICAgICAqIEBzZWUgI2dldEphdmEyV1NEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldEphdmEyV1NEYXRhTW9kZWxfQW5ub3RhdGlvbk1hcCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbCNnZXRTb3VyY2VEaXJlY3RvcnkgPGVtPlNvdXJjZSBEaXJlY3Rvcnk8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Tb3VyY2UgRGlyZWN0b3J5PC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwjZ2V0U291cmNlRGlyZWN0b3J5KCkKLSAgICAgKiBAc2VlICNnZXRKYXZhMldTRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRKYXZhMldTRGF0YU1vZGVsX1NvdXJjZURpcmVjdG9yeSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbCNnZXRQb3J0TmFtZSA8ZW0+UG9ydCBOYW1lPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UG9ydCBOYW1lPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwjZ2V0UG9ydE5hbWUoKQotICAgICAqIEBzZWUgI2dldEphdmEyV1NEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldEphdmEyV1NEYXRhTW9kZWxfUG9ydE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0IDxlbT5XU0RMMiBKYXZhIENvbnRleHQ8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V1NETDIgSmF2YSBDb250ZXh0PC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUNsYXNzIGdldFdTREwySmF2YUNvbnRleHQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNHZW5lcmF0ZUltcGxlbWVudGF0aW9uIDxlbT5HZW5lcmF0ZSBJbXBsZW1lbnRhdGlvbjwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkdlbmVyYXRlIEltcGxlbWVudGF0aW9uPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNHZW5lcmF0ZUltcGxlbWVudGF0aW9uKCkKLSAgICAgKiBAc2VlICNnZXRXU0RMMkphdmFDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X0dlbmVyYXRlSW1wbGVtZW50YXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNQcm9jZXNzU09BUEhlYWRlcnMgPGVtPlByb2Nlc3MgU09BUCBIZWFkZXJzPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJvY2VzcyBTT0FQIEhlYWRlcnM8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1Byb2Nlc3NTT0FQSGVhZGVycygpCi0gICAgICogQHNlZSAjZ2V0V1NETDJKYXZhQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9Qcm9jZXNzU09BUEhlYWRlcnMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyA8ZW0+TG9hZCBEZWZhdWx0IE5hbWVzcGFjZSBQYWNrYWdlIE5hbWUgTWFwcGluZzwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxvYWQgRGVmYXVsdCBOYW1lc3BhY2UgUGFja2FnZSBOYW1lIE1hcHBpbmc8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc0xvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKCkKLSAgICAgKiBAc2VlICNnZXRXU0RMMkphdmFDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X0xvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcgPGVtPkxvYWQgRGVmYXVsdCBFeGNsdWRlcyBOYW1lcHNhY2UgTWFwcGluZzwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxvYWQgRGVmYXVsdCBFeGNsdWRlcyBOYW1lcHNhY2UgTWFwcGluZzwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoKQotICAgICAqIEBzZWUgI2dldFdTREwySmF2YUNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNWYWxpZGF0ZSA8ZW0+VmFsaWRhdGU8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWxpZGF0ZTwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzVmFsaWRhdGUoKQotICAgICAqIEBzZWUgI2dldFdTREwySmF2YUNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfVmFsaWRhdGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjZ2V0V3NkbFZlcnNpb24gPGVtPldzZGwgVmVyc2lvbjwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldzZGwgVmVyc2lvbjwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2dldFdzZGxWZXJzaW9uKCkKLSAgICAgKiBAc2VlICNnZXRXU0RMMkphdmFDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X1dzZGxWZXJzaW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzVXNlRGVmYXVsdFZhbHVlcyA8ZW0+VXNlIERlZmF1bHQgVmFsdWVzPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXNlIERlZmF1bHQgVmFsdWVzPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNVc2VEZWZhdWx0VmFsdWVzKCkKLSAgICAgKiBAc2VlICNnZXRXU0RMMkphdmFDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X1VzZURlZmF1bHRWYWx1ZXMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjZ2V0WGpjQXJncyA8ZW0+WGpjIEFyZ3M8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5YamMgQXJnczwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2dldFhqY0FyZ3MoKQotICAgICAqIEBzZWUgI2dldFdTREwySmF2YUNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfWGpjQXJncygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc05vQWRkcmVzc0JpbmRpbmcgPGVtPk5vIEFkZHJlc3MgQmluZGluZzwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5vIEFkZHJlc3MgQmluZGluZzwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzTm9BZGRyZXNzQmluZGluZygpCi0gICAgICogQHNlZSAjZ2V0V1NETDJKYXZhQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9Ob0FkZHJlc3NCaW5kaW5nKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzWGpjVXNlRGVmYXVsdFZhbHVlcyA8ZW0+WGpjIFVzZSBEZWZhdWx0IFZhbHVlczwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlhqYyBVc2UgRGVmYXVsdCBWYWx1ZXM8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1hqY1VzZURlZmF1bHRWYWx1ZXMoKQotICAgICAqIEBzZWUgI2dldFdTREwySmF2YUNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfWGpjVXNlRGVmYXVsdFZhbHVlcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1hqY1RvU3RyaW5nIDxlbT5YamMgVG8gU3RyaW5nPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+WGpjIFRvIFN0cmluZzwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzWGpjVG9TdHJpbmcoKQotICAgICAqIEBzZWUgI2dldFdTREwySmF2YUNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfWGpjVG9TdHJpbmcoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNYamNUb1N0cmluZ011bHRpTGluZSA8ZW0+WGpjIFRvIFN0cmluZyBNdWx0aSBMaW5lPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+WGpjIFRvIFN0cmluZyBNdWx0aSBMaW5lPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNYamNUb1N0cmluZ011bHRpTGluZSgpCi0gICAgICogQHNlZSAjZ2V0V1NETDJKYXZhQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9YamNUb1N0cmluZ011bHRpTGluZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1hqY1RvU3RyaW5nU2ltcGxlIDxlbT5YamMgVG8gU3RyaW5nIFNpbXBsZTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlhqYyBUbyBTdHJpbmcgU2ltcGxlPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNYamNUb1N0cmluZ1NpbXBsZSgpCi0gICAgICogQHNlZSAjZ2V0V1NETDJKYXZhQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9YamNUb1N0cmluZ1NpbXBsZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1hqY0xvY2F0b3IgPGVtPlhqYyBMb2NhdG9yPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+WGpjIExvY2F0b3I8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1hqY0xvY2F0b3IoKQotICAgICAqIEBzZWUgI2dldFdTREwySmF2YUNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfWGpjTG9jYXRvcigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1hqY1N5bmNNZXRob2RzIDxlbT5YamMgU3luYyBNZXRob2RzPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+WGpjIFN5bmMgTWV0aG9kczwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzWGpjU3luY01ldGhvZHMoKQotICAgICAqIEBzZWUgI2dldFdTREwySmF2YUNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfWGpjU3luY01ldGhvZHMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNYamNNYXJrR2VuZXJhdGVkIDxlbT5YamMgTWFyayBHZW5lcmF0ZWQ8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5YamMgTWFyayBHZW5lcmF0ZWQ8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1hqY01hcmtHZW5lcmF0ZWQoKQotICAgICAqIEBzZWUgI2dldFdTREwySmF2YUNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfWGpjTWFya0dlbmVyYXRlZCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNnZXRYamNFcGlzb2RlRmlsZSA8ZW0+WGpjIEVwaXNvZGUgRmlsZTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlhqYyBFcGlzb2RlIEZpbGU8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNnZXRYamNFcGlzb2RlRmlsZSgpCi0gICAgICogQHNlZSAjZ2V0V1NETDJKYXZhQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9YamNFcGlzb2RlRmlsZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc0F1dG9OYW1lUmVzb2x1dGlvbiA8ZW0+QXV0byBOYW1lIFJlc29sdXRpb248L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdXRvIE5hbWUgUmVzb2x1dGlvbjwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzQXV0b05hbWVSZXNvbHV0aW9uKCkKLSAgICAgKiBAc2VlICNnZXRXU0RMMkphdmFDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X0F1dG9OYW1lUmVzb2x1dGlvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbCA8ZW0+V1NETDIgSmF2YSBEYXRhIE1vZGVsPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldTREwyIEphdmEgRGF0YSBNb2RlbDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWwKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUNsYXNzIGdldFdTREwySmF2YURhdGFNb2RlbCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsI2dldEluY2x1ZGVkTmFtZXNwYWNlcyA8ZW0+SW5jbHVkZWQgTmFtZXNwYWNlczwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkluY2x1ZGVkIE5hbWVzcGFjZXM8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsI2dldEluY2x1ZGVkTmFtZXNwYWNlcygpCi0gICAgICogQHNlZSAjZ2V0V1NETDJKYXZhRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFEYXRhTW9kZWxfSW5jbHVkZWROYW1lc3BhY2VzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbCNnZXRCaW5kaW5nRmlsZXMgPGVtPkJpbmRpbmcgRmlsZXM8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkJpbmRpbmcgRmlsZXM8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsI2dldEJpbmRpbmdGaWxlcygpCi0gICAgICogQHNlZSAjZ2V0V1NETDJKYXZhRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFEYXRhTW9kZWxfQmluZGluZ0ZpbGVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWwjZ2V0RXhjbHVkZWROYW1lc3BhY2VzIDxlbT5FeGNsdWRlZCBOYW1lc3BhY2VzPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXhjbHVkZWQgTmFtZXNwYWNlczwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWwjZ2V0RXhjbHVkZWROYW1lc3BhY2VzKCkKLSAgICAgKiBAc2VlICNnZXRXU0RMMkphdmFEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldFdTREwySmF2YURhdGFNb2RlbF9FeGNsdWRlZE5hbWVzcGFjZXMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbCNnZXRDYXRhbG9nRmlsZSA8ZW0+Q2F0YWxvZyBGaWxlPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2F0YWxvZyBGaWxlPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbCNnZXRDYXRhbG9nRmlsZSgpCi0gICAgICogQHNlZSAjZ2V0V1NETDJKYXZhRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFEYXRhTW9kZWxfQ2F0YWxvZ0ZpbGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbCNnZXRKYXZhU291cmNlRm9sZGVyIDxlbT5KYXZhIFNvdXJjZSBGb2xkZXI8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5KYXZhIFNvdXJjZSBGb2xkZXI8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsI2dldEphdmFTb3VyY2VGb2xkZXIoKQotICAgICAqIEBzZWUgI2dldFdTREwySmF2YURhdGFNb2RlbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhRGF0YU1vZGVsX0phdmFTb3VyY2VGb2xkZXIoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZJbnN0YWxsIDxlbT5JbnN0YWxsPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkluc3RhbGw8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGSW5zdGFsbAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQ2xhc3MgZ2V0Q1hGSW5zdGFsbCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGSW5zdGFsbCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmVyc2lvbjwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZJbnN0YWxsI2dldFZlcnNpb24oKQotICAgICAqIEBzZWUgI2dldENYRkluc3RhbGwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldENYRkluc3RhbGxfVmVyc2lvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGSW5zdGFsbCNnZXRMb2NhdGlvbiA8ZW0+TG9jYXRpb248L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Mb2NhdGlvbjwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZJbnN0YWxsI2dldExvY2F0aW9uKCkKLSAgICAgKiBAc2VlICNnZXRDWEZJbnN0YWxsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRDWEZJbnN0YWxsX0xvY2F0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZJbnN0YWxsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkluc3RhbGwjZ2V0VHlwZSgpCi0gICAgICogQHNlZSAjZ2V0Q1hGSW5zdGFsbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0Q1hGSW5zdGFsbF9UeXBlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5Gcm9udGVuZCA8ZW0+RnJvbnRlbmQ8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5Gcm9udGVuZDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5Gcm9udGVuZAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFRW51bSBnZXRGcm9udGVuZCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuRGF0YUJpbmRpbmcgPGVtPkRhdGEgQmluZGluZzwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPkRhdGEgQmluZGluZzwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5EYXRhQmluZGluZwotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFRW51bSBnZXREYXRhQmluZGluZygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubmV0LlVSTCA8ZW0+VVJMPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5VUkw8L2VtPicuCi0gICAgICogQHNlZSBqYXZhLm5ldC5VUkwKLSAgICAgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5uZXQuVVJMIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFRGF0YVR5cGUgZ2V0VVJMKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YXgud3NkbC5EZWZpbml0aW9uIDxlbT5EZWZpbml0aW9uPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5EZWZpbml0aW9uPC9lbT4nLgotICAgICAqIEBzZWUgamF2YXgud3NkbC5EZWZpbml0aW9uCi0gICAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuRGVmaW5pdGlvbiIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRURhdGFUeXBlIGdldERlZmluaXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLnV0aWwuTWFwIDxlbT5NYXA8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPk1hcDwvZW0+Jy4KLSAgICAgKiBAc2VlIGphdmEudXRpbC5NYXAKLSAgICAgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS51dGlsLk1hcCIgdHlwZVBhcmFtZXRlcnM9IlQgVDEiCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVEYXRhVHlwZSBnZXRNYXAoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kIDxlbT5JTWV0aG9kPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5JTWV0aG9kPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZAotICAgICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFRGF0YVR5cGUgZ2V0SU1ldGhvZCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQ1hGRmFjdG9yeSBnZXRDWEZGYWN0b3J5KCk7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKLSAgICAgKiA8dWw+Ci0gICAgICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICAgICAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gICAgICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gICAgICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBpbnRlcmZhY2UgTGl0ZXJhbHMgewotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0IDxlbT5Db250ZXh0PC9lbT59JyBjbGFzcy4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZQYWNrYWdlSW1wbCNnZXRDWEZDb250ZXh0KCkKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUNsYXNzIENYRl9DT05URVhUID0gZUlOU1RBTkNFLmdldENYRkNvbnRleHQoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgUnVudGltZSBMb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIENYRl9DT05URVhUX19ERUZBVUxUX1JVTlRJTUVfTE9DQVRJT04gPSBlSU5TVEFOQ0UuZ2V0Q1hGQ29udGV4dF9EZWZhdWx0UnVudGltZUxvY2F0aW9uKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFJ1bnRpbWUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIENYRl9DT05URVhUX19ERUZBVUxUX1JVTlRJTUVfVFlQRSA9IGVJTlNUQU5DRS5nZXRDWEZDb250ZXh0X0RlZmF1bHRSdW50aW1lVHlwZSgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBSdW50aW1lIFZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBDWEZfQ09OVEVYVF9fREVGQVVMVF9SVU5USU1FX1ZFUlNJT04gPSBlSU5TVEFOQ0UuZ2V0Q1hGQ29udGV4dF9EZWZhdWx0UnVudGltZVZlcnNpb24oKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZlcmJvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBDWEZfQ09OVEVYVF9fVkVSQk9TRSA9IGVJTlNUQU5DRS5nZXRDWEZDb250ZXh0X1ZlcmJvc2UoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIEFudCBCdWlsZCBGaWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgQ1hGX0NPTlRFWFRfX0dFTkVSQVRFX0FOVF9CVUlMRF9GSUxFID0gZUlOU1RBTkNFLmdldENYRkNvbnRleHRfR2VuZXJhdGVBbnRCdWlsZEZpbGUoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIENsaWVudDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIENYRl9DT05URVhUX19HRU5FUkFURV9DTElFTlQgPSBlSU5TVEFOQ0UuZ2V0Q1hGQ29udGV4dF9HZW5lcmF0ZUNsaWVudCgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgU2VydmVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgQ1hGX0NPTlRFWFRfX0dFTkVSQVRFX1NFUlZFUiA9IGVJTlNUQU5DRS5nZXRDWEZDb250ZXh0X0dlbmVyYXRlU2VydmVyKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EYXRhYmluZGluZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIENYRl9DT05URVhUX19EQVRBQklORElORyA9IGVJTlNUQU5DRS5nZXRDWEZDb250ZXh0X0RhdGFiaW5kaW5nKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Gcm9udGVuZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIENYRl9DT05URVhUX19GUk9OVEVORCA9IGVJTlNUQU5DRS5nZXRDWEZDb250ZXh0X0Zyb250ZW5kKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Vc2UgU3ByaW5nIEFwcGxpY2F0aW9uIENvbnRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBDWEZfQ09OVEVYVF9fVVNFX1NQUklOR19BUFBMSUNBVElPTl9DT05URVhUID0gZUlOU1RBTkNFLmdldENYRkNvbnRleHRfVXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeHBvcnQgQ1hGIENsYXNzcGF0aCBDb250YWluZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBDWEZfQ09OVEVYVF9fRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSID0gZUlOU1RBTkNFLmdldENYRkNvbnRleHRfRXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbnN0YWxsYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgQ1hGX0NPTlRFWFRfX0lOU1RBTExBVElPTlMgPSBlSU5TVEFOQ0UuZ2V0Q1hGQ29udGV4dF9JbnN0YWxsYXRpb25zKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZEYXRhTW9kZWxJbXBsIDxlbT5EYXRhIE1vZGVsPC9lbT59JyBjbGFzcy4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRGF0YU1vZGVsSW1wbAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRlBhY2thZ2VJbXBsI2dldENYRkRhdGFNb2RlbCgpCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVDbGFzcyBDWEZfREFUQV9NT0RFTCA9IGVJTlNUQU5DRS5nZXRDWEZEYXRhTW9kZWwoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2plY3QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIENYRl9EQVRBX01PREVMX19QUk9KRUNUX05BTUUgPSBlSU5TVEFOQ0UuZ2V0Q1hGRGF0YU1vZGVsX1Byb2plY3ROYW1lKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBEaXJlY3Rvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBDWEZfREFUQV9NT0RFTF9fUkVTT1VSQ0VfRElSRUNUT1JZID0gZUlOU1RBTkNFLmdldENYRkRhdGFNb2RlbF9SZXNvdXJjZURpcmVjdG9yeSgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3MgRGlyZWN0b3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgQ1hGX0RBVEFfTU9ERUxfX0NMQVNTX0RJUkVDVE9SWSA9IGVJTlNUQU5DRS5nZXRDWEZEYXRhTW9kZWxfQ2xhc3NEaXJlY3RvcnkoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldzZGwgRmlsZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgQ1hGX0RBVEFfTU9ERUxfX1dTRExfRklMRV9OQU1FID0gZUlOU1RBTkNFLmdldENYRkRhdGFNb2RlbF9Xc2RsRmlsZU5hbWUoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldzZGwgVVJMPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgQ1hGX0RBVEFfTU9ERUxfX1dTRExfVVJMID0gZUlOU1RBTkNFLmdldENYRkRhdGFNb2RlbF9Xc2RsVVJMKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db25maWcgV3NkbCBMb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIENYRl9EQVRBX01PREVMX19DT05GSUdfV1NETF9MT0NBVElPTiA9IGVJTlNUQU5DRS5nZXRDWEZEYXRhTW9kZWxfQ29uZmlnV3NkbExvY2F0aW9uKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GdWxseSBRdWFsaWZpZWQgSmF2YSBDbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgQ1hGX0RBVEFfTU9ERUxfX0ZVTExZX1FVQUxJRklFRF9KQVZBX0NMQVNTX05BTUUgPSBlSU5TVEFOQ0UuZ2V0Q1hGRGF0YU1vZGVsX0Z1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RnVsbHkgUXVhbGlmaWVkIEphdmEgSW50ZXJmYWNlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBDWEZfREFUQV9NT0RFTF9fRlVMTFlfUVVBTElGSUVEX0pBVkFfSU5URVJGQUNFX05BTUUgPSBlSU5TVEFOQ0UuZ2V0Q1hGRGF0YU1vZGVsX0Z1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbmZpZyBJZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIENYRl9EQVRBX01PREVMX19DT05GSUdfSUQgPSBlSU5TVEFOQ0UuZ2V0Q1hGRGF0YU1vZGVsX0NvbmZpZ0lkKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgTmFtZXNwYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgQ1hGX0RBVEFfTU9ERUxfX1RBUkdFVF9OQU1FU1BBQ0UgPSBlSU5TVEFOQ0UuZ2V0Q1hGRGF0YU1vZGVsX1RhcmdldE5hbWVzcGFjZSgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW5kcG9pbnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIENYRl9EQVRBX01PREVMX19FTkRQT0lOVF9OQU1FID0gZUlOU1RBTkNFLmdldENYRkRhdGFNb2RlbF9FbmRwb2ludE5hbWUoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIENYRl9EQVRBX01PREVMX19TRVJWSUNFX05BTUUgPSBlSU5TVEFOQ0UuZ2V0Q1hGRGF0YU1vZGVsX1NlcnZpY2VOYW1lKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xc2RsIERlZmluaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBDWEZfREFUQV9NT0RFTF9fV1NETF9ERUZJTklUSU9OID0gZUlOU1RBTkNFLmdldENYRkRhdGFNb2RlbF9Xc2RsRGVmaW5pdGlvbigpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBMb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIENYRl9EQVRBX01PREVMX19XU0RMX0xPQ0FUSU9OID0gZUlOU1RBTkNFLmdldENYRkRhdGFNb2RlbF9Xc2RsTG9jYXRpb24oKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCA8ZW0+SmF2YTIgV1MgQ29udGV4dDwvZW0+fScgY2xhc3MuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRlBhY2thZ2VJbXBsI2dldEphdmEyV1NDb250ZXh0KCkKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUNsYXNzIEpBVkEyX1dTX0NPTlRFWFQgPSBlSU5TVEFOQ0UuZ2V0SmF2YTJXU0NvbnRleHQoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNvYXAxMiBCaW5kaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgSkFWQTJfV1NfQ09OVEVYVF9fU09BUDEyX0JJTkRJTkcgPSBlSU5TVEFOQ0UuZ2V0SmF2YTJXU0NvbnRleHRfU29hcDEyQmluZGluZygpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgWFNEIEltcG9ydHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBKQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9YU0RfSU1QT1JUUyA9IGVJTlNUQU5DRS5nZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVhTREltcG9ydHMoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIFdTREw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBKQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9XU0RMID0gZUlOU1RBTkNFLmdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlV1NETCgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgV3JhcHBlciBGYXVsdCBCZWFuczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIEpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dSQVBQRVJfRkFVTFRfQkVBTlMgPSBlSU5TVEFOQ0UuZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucygpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QW5ub3RhdGlvbiBQcm9jZXNzaW5nIEVuYWJsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBKQVZBMl9XU19DT05URVhUX19BTk5PVEFUSU9OX1BST0NFU1NJTkdfRU5BQkxFRCA9IGVJTlNUQU5DRS5nZXRKYXZhMldTQ29udGV4dF9Bbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIFdlYiBNZXRob2QgQW5ub3RhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIEpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dFQl9NRVRIT0RfQU5OT1RBVElPTiA9IGVJTlNUQU5DRS5nZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24oKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIFdlYiBQYXJhbSBBbm5vdGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV0VCX1BBUkFNX0FOTk9UQVRJT04gPSBlSU5TVEFOQ0UuZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24oKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIFJlcXVlc3QgV3JhcHBlciBBbm5vdGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfUkVRVUVTVF9XUkFQUEVSX0FOTk9UQVRJT04gPSBlSU5TVEFOQ0UuZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24oKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIFJlc3BvbnNlIFdyYXBwZXIgQW5ub3RhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIEpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1JFU1BPTlNFX1dSQVBQRVJfQU5OT1RBVElPTiA9IGVJTlNUQU5DRS5nZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24oKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkphdmEyV1NEYXRhTW9kZWxJbXBsIDxlbT5KYXZhMiBXUyBEYXRhIE1vZGVsPC9lbT59JyBjbGFzcy4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuSmF2YTJXU0RhdGFNb2RlbEltcGwKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZQYWNrYWdlSW1wbCNnZXRKYXZhMldTRGF0YU1vZGVsKCkKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUNsYXNzIEpBVkEyX1dTX0RBVEFfTU9ERUwgPSBlSU5TVEFOQ0UuZ2V0SmF2YTJXU0RhdGFNb2RlbCgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3NwYXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgSkFWQTJfV1NfREFUQV9NT0RFTF9fQ0xBU1NQQVRIID0gZUlOU1RBTkNFLmdldEphdmEyV1NEYXRhTW9kZWxfQ2xhc3NwYXRoKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5KYXZhIFN0YXJ0aW5nIFBvaW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgSkFWQTJfV1NfREFUQV9NT0RFTF9fSkFWQV9TVEFSVElOR19QT0lOVCA9IGVJTlNUQU5DRS5nZXRKYXZhMldTRGF0YU1vZGVsX0phdmFTdGFydGluZ1BvaW50KCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Vc2UgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBKQVZBMl9XU19EQVRBX01PREVMX19VU0VfU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0UgPSBlSU5TVEFOQ0UuZ2V0SmF2YTJXU0RhdGFNb2RlbF9Vc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4dHJhY3QgSW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgSkFWQTJfV1NfREFUQV9NT0RFTF9fRVhUUkFDVF9JTlRFUkZBQ0UgPSBlSU5TVEFOQ0UuZ2V0SmF2YTJXU0RhdGFNb2RlbF9FeHRyYWN0SW50ZXJmYWNlKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgSkFWQTJfV1NfREFUQV9NT0RFTF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTkFNRSA9IGVJTlNUQU5DRS5nZXRKYXZhMldTRGF0YU1vZGVsX1NlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBNYXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBKQVZBMl9XU19EQVRBX01PREVMX19NRVRIT0RfTUFQID0gZUlOU1RBTkNFLmdldEphdmEyV1NEYXRhTW9kZWxfTWV0aG9kTWFwKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Bbm5vdGF0aW9uIE1hcDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIEpBVkEyX1dTX0RBVEFfTU9ERUxfX0FOTk9UQVRJT05fTUFQID0gZUlOU1RBTkNFLmdldEphdmEyV1NEYXRhTW9kZWxfQW5ub3RhdGlvbk1hcCgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U291cmNlIERpcmVjdG9yeTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIEpBVkEyX1dTX0RBVEFfTU9ERUxfX1NPVVJDRV9ESVJFQ1RPUlkgPSBlSU5TVEFOQ0UuZ2V0SmF2YTJXU0RhdGFNb2RlbF9Tb3VyY2VEaXJlY3RvcnkoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvcnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIEpBVkEyX1dTX0RBVEFfTU9ERUxfX1BPUlRfTkFNRSA9IGVJTlNUQU5DRS5nZXRKYXZhMldTRGF0YU1vZGVsX1BvcnROYW1lKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCA8ZW0+V1NETDIgSmF2YSBDb250ZXh0PC9lbT59JyBjbGFzcy4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZQYWNrYWdlSW1wbCNnZXRXU0RMMkphdmFDb250ZXh0KCkKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUNsYXNzIFdTREwyX0pBVkFfQ09OVEVYVCA9IGVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0KCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBJbXBsZW1lbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFdTREwyX0pBVkFfQ09OVEVYVF9fR0VORVJBVEVfSU1QTEVNRU5UQVRJT04gPSBlSU5TVEFOQ0UuZ2V0V1NETDJKYXZhQ29udGV4dF9HZW5lcmF0ZUltcGxlbWVudGF0aW9uKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcm9jZXNzIFNPQVAgSGVhZGVyczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFdTREwyX0pBVkFfQ09OVEVYVF9fUFJPQ0VTU19TT0FQX0hFQURFUlMgPSBlSU5TVEFOQ0UuZ2V0V1NETDJKYXZhQ29udGV4dF9Qcm9jZXNzU09BUEhlYWRlcnMoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxvYWQgRGVmYXVsdCBOYW1lc3BhY2UgUGFja2FnZSBOYW1lIE1hcHBpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBXU0RMMl9KQVZBX0NPTlRFWFRfX0xPQURfREVGQVVMVF9OQU1FU1BBQ0VfUEFDS0FHRV9OQU1FX01BUFBJTkcgPSBlSU5TVEFOQ0UuZ2V0V1NETDJKYXZhQ29udGV4dF9Mb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZygpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TG9hZCBEZWZhdWx0IEV4Y2x1ZGVzIE5hbWVwc2FjZSBNYXBwaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgV1NETDJfSkFWQV9DT05URVhUX19MT0FEX0RFRkFVTFRfRVhDTFVERVNfTkFNRVBTQUNFX01BUFBJTkcgPSBlSU5TVEFOQ0UuZ2V0V1NETDJKYXZhQ29udGV4dF9Mb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZygpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsaWRhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBXU0RMMl9KQVZBX0NPTlRFWFRfX1ZBTElEQVRFID0gZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfVmFsaWRhdGUoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldzZGwgVmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFdTREwyX0pBVkFfQ09OVEVYVF9fV1NETF9WRVJTSU9OID0gZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfV3NkbFZlcnNpb24oKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVzZSBEZWZhdWx0IFZhbHVlczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFdTREwyX0pBVkFfQ09OVEVYVF9fVVNFX0RFRkFVTFRfVkFMVUVTID0gZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfVXNlRGVmYXVsdFZhbHVlcygpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+WGpjIEFyZ3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBXU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19BUkdTID0gZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfWGpjQXJncygpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Tm8gQWRkcmVzcyBCaW5kaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgV1NETDJfSkFWQV9DT05URVhUX19OT19BRERSRVNTX0JJTkRJTkcgPSBlSU5TVEFOQ0UuZ2V0V1NETDJKYXZhQ29udGV4dF9Ob0FkZHJlc3NCaW5kaW5nKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5YamMgVXNlIERlZmF1bHQgVmFsdWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgV1NETDJfSkFWQV9DT05URVhUX19YSkNfVVNFX0RFRkFVTFRfVkFMVUVTID0gZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfWGpjVXNlRGVmYXVsdFZhbHVlcygpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+WGpjIFRvIFN0cmluZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFdTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1RPX1NUUklORyA9IGVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X1hqY1RvU3RyaW5nKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5YamMgVG8gU3RyaW5nIE11bHRpIExpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBXU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19UT19TVFJJTkdfTVVMVElfTElORSA9IGVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X1hqY1RvU3RyaW5nTXVsdGlMaW5lKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5YamMgVG8gU3RyaW5nIFNpbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFdTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1RPX1NUUklOR19TSU1QTEUgPSBlSU5TVEFOQ0UuZ2V0V1NETDJKYXZhQ29udGV4dF9YamNUb1N0cmluZ1NpbXBsZSgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+WGpjIExvY2F0b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBXU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19MT0NBVE9SID0gZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfWGpjTG9jYXRvcigpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+WGpjIFN5bmMgTWV0aG9kczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFdTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1NZTkNfTUVUSE9EUyA9IGVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X1hqY1N5bmNNZXRob2RzKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5YamMgTWFyayBHZW5lcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBXU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19NQVJLX0dFTkVSQVRFRCA9IGVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X1hqY01hcmtHZW5lcmF0ZWQoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlhqYyBFcGlzb2RlIEZpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBXU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19FUElTT0RFX0ZJTEUgPSBlSU5TVEFOQ0UuZ2V0V1NETDJKYXZhQ29udGV4dF9YamNFcGlzb2RlRmlsZSgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXV0byBOYW1lIFJlc29sdXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBXU0RMMl9KQVZBX0NPTlRFWFRfX0FVVE9fTkFNRV9SRVNPTFVUSU9OID0gZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfQXV0b05hbWVSZXNvbHV0aW9uKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5XU0RMMkphdmFEYXRhTW9kZWxJbXBsIDxlbT5XU0RMMiBKYXZhIERhdGEgTW9kZWw8L2VtPn0nIGNsYXNzLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5XU0RMMkphdmFEYXRhTW9kZWxJbXBsCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGUGFja2FnZUltcGwjZ2V0V1NETDJKYXZhRGF0YU1vZGVsKCkKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUNsYXNzIFdTREwyX0pBVkFfREFUQV9NT0RFTCA9IGVJTlNUQU5DRS5nZXRXU0RMMkphdmFEYXRhTW9kZWwoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluY2x1ZGVkIE5hbWVzcGFjZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0lOQ0xVREVEX05BTUVTUEFDRVMgPSBlSU5TVEFOQ0UuZ2V0V1NETDJKYXZhRGF0YU1vZGVsX0luY2x1ZGVkTmFtZXNwYWNlcygpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmluZGluZyBGaWxlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgV1NETDJfSkFWQV9EQVRBX01PREVMX19CSU5ESU5HX0ZJTEVTID0gZUlOU1RBTkNFLmdldFdTREwySmF2YURhdGFNb2RlbF9CaW5kaW5nRmlsZXMoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGVkIE5hbWVzcGFjZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0VYQ0xVREVEX05BTUVTUEFDRVMgPSBlSU5TVEFOQ0UuZ2V0V1NETDJKYXZhRGF0YU1vZGVsX0V4Y2x1ZGVkTmFtZXNwYWNlcygpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2F0YWxvZyBGaWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgV1NETDJfSkFWQV9EQVRBX01PREVMX19DQVRBTE9HX0ZJTEUgPSBlSU5TVEFOQ0UuZ2V0V1NETDJKYXZhRGF0YU1vZGVsX0NhdGFsb2dGaWxlKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5KYXZhIFNvdXJjZSBGb2xkZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0pBVkFfU09VUkNFX0ZPTERFUiA9IGVJTlNUQU5DRS5nZXRXU0RMMkphdmFEYXRhTW9kZWxfSmF2YVNvdXJjZUZvbGRlcigpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGSW5zdGFsbEltcGwgPGVtPkluc3RhbGw8L2VtPn0nIGNsYXNzLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZJbnN0YWxsSW1wbAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRlBhY2thZ2VJbXBsI2dldENYRkluc3RhbGwoKQotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQ2xhc3MgQ1hGX0lOU1RBTEwgPSBlSU5TVEFOQ0UuZ2V0Q1hGSW5zdGFsbCgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIENYRl9JTlNUQUxMX19WRVJTSU9OID0gZUlOU1RBTkNFLmdldENYRkluc3RhbGxfVmVyc2lvbigpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBDWEZfSU5TVEFMTF9fTE9DQVRJT04gPSBlSU5TVEFOQ0UuZ2V0Q1hGSW5zdGFsbF9Mb2NhdGlvbigpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIENYRl9JTlNUQUxMX19UWVBFID0gZUlOU1RBTkNFLmdldENYRkluc3RhbGxfVHlwZSgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkZyb250ZW5kIDxlbT5Gcm9udGVuZDwvZW0+fScgZW51bS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkZyb250ZW5kCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGUGFja2FnZUltcGwjZ2V0RnJvbnRlbmQoKQotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFRW51bSBGUk9OVEVORCA9IGVJTlNUQU5DRS5nZXRGcm9udGVuZCgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkRhdGFCaW5kaW5nIDxlbT5EYXRhIEJpbmRpbmc8L2VtPn0nIGVudW0uCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5EYXRhQmluZGluZwotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRlBhY2thZ2VJbXBsI2dldERhdGFCaW5kaW5nKCkKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUVudW0gREFUQV9CSU5ESU5HID0gZUlOU1RBTkNFLmdldERhdGFCaW5kaW5nKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5VUkw8L2VtPicgZGF0YSB0eXBlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQHNlZSBqYXZhLm5ldC5VUkwKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZQYWNrYWdlSW1wbCNnZXRVUkwoKQotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFRGF0YVR5cGUgVVJMID0gZUlOU1RBTkNFLmdldFVSTCgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+RGVmaW5pdGlvbjwvZW0+JyBkYXRhIHR5cGUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAc2VlIGphdmF4LndzZGwuRGVmaW5pdGlvbgotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRlBhY2thZ2VJbXBsI2dldERlZmluaXRpb24oKQotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFRGF0YVR5cGUgREVGSU5JVElPTiA9IGVJTlNUQU5DRS5nZXREZWZpbml0aW9uKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5NYXA8L2VtPicgZGF0YSB0eXBlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQHNlZSBqYXZhLnV0aWwuTWFwCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGUGFja2FnZUltcGwjZ2V0TWFwKCkKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRURhdGFUeXBlIE1BUCA9IGVJTlNUQU5DRS5nZXRNYXAoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPklNZXRob2Q8L2VtPicgZGF0YSB0eXBlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGUGFja2FnZUltcGwjZ2V0SU1ldGhvZCgpCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVEYXRhVHlwZSBJTUVUSE9EID0gZUlOU1RBTkNFLmdldElNZXRob2QoKTsKLQotICAgIH0KLQotfSAvL0NYRlBhY2thZ2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvRGF0YUJpbmRpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvRGF0YUJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQxZmIxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL0RhdGFCaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgotICogJElkOiBEYXRhQmluZGluZy5qYXZhLHYgMS4xIDIwMDgvMTEvMTAgMjA6Mzc6NDMgZGF2aWRfd2lsbGlhbXMgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5EYXRhIEJpbmRpbmc8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2UjZ2V0RGF0YUJpbmRpbmcoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBlbnVtIERhdGFCaW5kaW5nIGltcGxlbWVudHMgRW51bWVyYXRvciB7Ci0gICAgLyoqCi0gICAgICogVGhlICc8ZW0+PGI+SkFYQjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNKQVhCX1ZBTFVFCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgSkFYQigwLCAiSkFYQiIsICJqYXhiIik7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgJzxlbT48Yj5KQVhCPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5KQVhCPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI0pBWEIKLSAgICAgKiBAbW9kZWwgbGl0ZXJhbD0iamF4YiIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVhCX1ZBTFVFID0gMDsKLQotICAgIC8qKgotICAgICAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5EYXRhIEJpbmRpbmc8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIERhdGFCaW5kaW5nW10gVkFMVUVTX0FSUkFZID0KLSAgICAgICAgbmV3IERhdGFCaW5kaW5nW10gewotICAgICAgICAgICAgSkFYQiwKLSAgICAgICAgfTsKLQotICAgIC8qKgotICAgICAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5EYXRhIEJpbmRpbmc8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxEYXRhQmluZGluZz4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgJzxlbT48Yj5EYXRhIEJpbmRpbmc8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBEYXRhQmluZGluZyBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIERhdGFCaW5kaW5nIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlICc8ZW0+PGI+RGF0YSBCaW5kaW5nPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRGF0YUJpbmRpbmcgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICBEYXRhQmluZGluZyByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0gICAgICAgICAgICBpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlICc8ZW0+PGI+RGF0YSBCaW5kaW5nPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRGF0YUJpbmRpbmcgZ2V0KGludCB2YWx1ZSkgewotICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7Ci0gICAgICAgICAgICBjYXNlIEpBWEJfVkFMVUU6IHJldHVybiBKQVhCOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgaW50IHZhbHVlOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7Ci0KLSAgICAvKioKLSAgICAgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBEYXRhQmluZGluZyhpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICAgIHRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRWYWx1ZSgpIHsKLSAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKSB7Ci0gICAgICByZXR1cm4gbGl0ZXJhbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBsaXRlcmFsOwotICAgIH0KLSAgICAKLX0gLy9EYXRhQmluZGluZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9Gcm9udGVuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9Gcm9udGVuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGE5YTBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvRnJvbnRlbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKiAkSWQ6IEZyb250ZW5kLmphdmEsdiAxLjEgMjAwOC8xMS8xMCAyMDozNzo0MyBkYXZpZF93aWxsaWFtcyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkZyb250ZW5kPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZQYWNrYWdlI2dldEZyb250ZW5kKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZW51bSBGcm9udGVuZCBpbXBsZW1lbnRzIEVudW1lcmF0b3IgewotICAgIC8qKgotICAgICAqIFRoZSAnPGVtPjxiPkpBWFdTPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI0pBWFdTX1ZBTFVFCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgSkFYV1MoMCwgIkpBWFdTIiwgImpheHdzIik7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgJzxlbT48Yj5KQVhXUzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SkFYV1M8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjSkFYV1MKLSAgICAgKiBAbW9kZWwgbGl0ZXJhbD0iamF4d3MiCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFYV1NfVkFMVUUgPSAwOwotCi0gICAgLyoqCi0gICAgICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkZyb250ZW5kPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGcm9udGVuZFtdIFZBTFVFU19BUlJBWSA9Ci0gICAgICAgIG5ldyBGcm9udGVuZFtdIHsKLSAgICAgICAgICAgIEpBWFdTLAotICAgICAgICB9OwotCi0gICAgLyoqCi0gICAgICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkZyb250ZW5kPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8RnJvbnRlbmQ+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlICc8ZW0+PGI+RnJvbnRlbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBGcm9udGVuZCBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIEZyb250ZW5kIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlICc8ZW0+PGI+RnJvbnRlbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBGcm9udGVuZCBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIEZyb250ZW5kIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgJzxlbT48Yj5Gcm9udGVuZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEZyb250ZW5kIGdldChpbnQgdmFsdWUpIHsKLSAgICAgICAgc3dpdGNoICh2YWx1ZSkgewotICAgICAgICAgICAgY2FzZSBKQVhXU19WQUxVRTogcmV0dXJuIEpBWFdTOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgaW50IHZhbHVlOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7Ci0KLSAgICAvKioKLSAgICAgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBGcm9udGVuZChpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICAgIHRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRWYWx1ZSgpIHsKLSAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKSB7Ci0gICAgICByZXR1cm4gbGl0ZXJhbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBsaXRlcmFsOwotICAgIH0KLSAgICAKLX0gLy9Gcm9udGVuZApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9KYXZhMldTQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9KYXZhMldTQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTQ5ZDdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvSmF2YTJXU0NvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWw7Ci0KLS8qKgotICogCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhMldTQ29udGV4dCBleHRlbmRzIENYRkNvbnRleHQgewotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgZ2VuZXJhdGVkIFdTREwgaXMgdG8gaW5jbHVkZSBhIFNPQVAgMS4yIGJpbmRpbmcuCi0gICAgICogCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIgotICAgICAqLwotICAgIGJvb2xlYW4gaXNTb2FwMTJCaW5kaW5nKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQjaXNTb2FwMTJCaW5kaW5nIDxlbT5Tb2FwMTIgQmluZGluZzwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU3BlY2lmaWVzIHRoYXQgdGhlIGdlbmVyYXRlZCBXU0RMIGlzIHRvIGluY2x1ZGUgYSBTT0FQIDEuMiBiaW5kaW5nLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNvYXAxMiBCaW5kaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc1NvYXAxMkJpbmRpbmcoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFNvYXAxMkJpbmRpbmcoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdG8gb3V0cHV0IHNjaGVtYXMgdG8gc2VwYXJhdGUgZmlsZXMgYW5kIHVzZSBpbXBvcnRzIHRvCi0gICAgICogbG9hZCB0aGVtIGluc3RlYWQgb2YgaW5saW5pbmcgdGhlbSBpbnRvIHRoZSB3c2RsLgotICAgICAqIAotICAgICAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIgotICAgICAqLwotICAgIGJvb2xlYW4gaXNHZW5lcmF0ZVhTREltcG9ydHMoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCNpc0dlbmVyYXRlWFNESW1wb3J0cyA8ZW0+R2VuZXJhdGUgWFNEIEltcG9ydHM8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIE91dHB1dCBzY2hlbWFzIHRvIHNlcGFyYXRlIGZpbGVzIGFuZCB1c2UgaW1wb3J0cyB0byBsb2FkIHRoZW0gaW5zdGVhZCBvZgotICAgICAqIGlubGluaW5nIHRoZW0gaW50byB0aGUgd3NkbC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HZW5lcmF0ZSBYU0QgSW1wb3J0czwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNHZW5lcmF0ZVhTREltcG9ydHMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEdlbmVyYXRlWFNESW1wb3J0cyhib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0byBnZW5lcmF0ZSB3c2RsLgotICAgICAqIAotICAgICAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIgotICAgICAqLwotICAgIGJvb2xlYW4gaXNHZW5lcmF0ZVdTREwoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCNpc0dlbmVyYXRlV1NETCA8ZW0+R2VuZXJhdGUgV1NETDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU3BlY2lmeSB0byBnZW5lcmF0ZSB0aGUgV1NETCBmaWxlLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdlbmVyYXRlIFdTREw8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVXU0RMKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRHZW5lcmF0ZVdTREwoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdG8gZ2VuZXJhdGUgd3JhcHBlciBiZWFucy4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIKLSAgICAgKi8KLSAgICBib29sZWFuIGlzR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucygpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0I2lzR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucyA8ZW0+R2VuZXJhdGUgV3JhcHBlciBGYXVsdCBCZWFuczwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU3BlY2lmeSB0byBnZW5lcmF0ZSB0aGUgd3JhcHBlciBhbmQgZmF1bHQgYmVhbi4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HZW5lcmF0ZSBXcmFwcGVyIEZhdWx0IEJlYW5zPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIEFubm90YXRpb24gUHJvY2Vzc2luZyBUb29sIChBUFQpIGlzIGVuYWJsZWQuCi0gICAgICogCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIgotICAgICAqLwotICAgIGJvb2xlYW4gaXNBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCNpc0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCA8ZW0+QW5ub3RhdGlvbiBQcm9jZXNzaW5nIEVuYWJsZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNldCB0byBlbmFibGUgdGhlIEFubm90YXRpb24gUHJvY2Vzc2luZyBUb29sIChBUFQpIGV4dGVuc2lvbi4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Bbm5vdGF0aW9uIFByb2Nlc3NpbmcgRW5hYmxlZDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEFubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZChib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgPGNvZGU+QFdlYk1ldGhvZDwvY29kZT4gYW5ub3RhdGlvbiBnZW5lcmF0aW9uIGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIKLSAgICAgKi8KLSAgICBib29sZWFuIGlzR2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0I2lzR2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uIDxlbT5HZW5lcmF0ZSBXZWIgTWV0aG9kIEFubm90YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNldHMgdGhlIGVuYWJsZW1lbnQgb2YgdGhlIDxjb2RlPkBXZWJNZXRob2Q8L2NvZGU+IGFubm90YXRpb24gZ2VuZXJhdGlvbi4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HZW5lcmF0ZSBXZWIgTWV0aG9kIEFubm90YXRpb248L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRHZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24oYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIDxjb2RlPkBXZWJQYXJhbTwvY29kZT4gYW5ub3RhdGlvbiBnZW5lcmF0aW9uIGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIKLSAgICAgKi8KLSAgICBib29sZWFuIGlzR2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24oKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQjaXNHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbiA8ZW0+R2VuZXJhdGUgV2ViIFBhcmFtIEFubm90YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNldHMgdGhlIGVuYWJsZW1lbnQgb2YgdGhlIDxjb2RlPkBXZWJQYXJhbTwvY29kZT4gYW5ub3RhdGlvbiBnZW5lcmF0aW9uLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdlbmVyYXRlIFdlYiBQYXJhbSBBbm5vdGF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbihib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgPGNvZGU+QFJlcXVlc3RXcmFwcGVyPC9jb2RlPiBhbm5vdGF0aW9uIGdlbmVyYXRpb24gaXMgZW5hYmxlZCBieSBkZWZhdWx0LgotICAgICAqIAotICAgICAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIgotICAgICAqLwotICAgIGJvb2xlYW4gaXNHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbigpOwotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCNpc0dlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uIDxlbT5HZW5lcmF0ZSBSZXF1ZXN0IFdyYXBwZXIgQW5ub3RhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU2V0cyB0aGUgZW5hYmxlbWVudCBvZiB0aGUgPGNvZGU+QFJlcXVlc3RXcmFwcGVyPC9jb2RlPiBhbm5vdGF0aW9uIGdlbmVyYXRpb24uCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R2VuZXJhdGUgUmVxdWVzdCBXcmFwcGVyIEFubm90YXRpb248L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEdlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSA8Y29kZT5AUmVzcG9uc2VXcmFwcGVyPC9jb2RlPiBhbm5vdGF0aW9uIGdlbmVyYXRpb24gaXMgZW5hYmxlZCBieSBkZWZhdWx0LgotICAgICAqIAotICAgICAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIgotICAgICAqLwotICAgIGJvb2xlYW4gaXNHZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCNpc0dlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbiA8ZW0+R2VuZXJhdGUgUmVzcG9uc2UgV3JhcHBlciBBbm5vdGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTZXRzIHRoZSBlbmFibGVtZW50IG9mIHRoZSA8Y29kZT5AUmVzcG9uc2VXcmFwcGVyPC9jb2RlPiBhbm5vdGF0aW9uIGdlbmVyYXRpb24uCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R2VuZXJhdGUgUmVzcG9uc2UgV3JhcHBlciBBbm5vdGF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0R2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKGJvb2xlYW4gdmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9KYXZhMldTRGF0YU1vZGVsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL0phdmEyV1NEYXRhTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNmNmM2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL0phdmEyV1NEYXRhTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLQotLyoqCi0gKiAKLSAqIEBtb2RlbAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmEyV1NEYXRhTW9kZWwgZXh0ZW5kcyBDWEZEYXRhTW9kZWwsIEphdmEyV1NDb250ZXh0IHsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjbGFzc3BhdGggc2VhcmNoZWQgd2hlbiBwcm9jZXNzaW5nLgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIFN0cmluZyBnZXRDbGFzc3BhdGgoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsI2dldENsYXNzcGF0aCA8ZW0+Q2xhc3NwYXRoPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTZXRzIHRoZSBjbGFzc3BhdGggdG8gc2VhcmNoIHdoZW4gcHJvY2Vzc2luZy4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DbGFzc3BhdGg8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldENsYXNzcGF0aCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0Q2xhc3NwYXRoKFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBKYXZhIHN0YXJ0aW5nIHBvaW50IGFydGlmYWN0LiBUaGlzIGNhbiBiZSBlaXRoZXIgYSBKYXZhIENsYXNzIG9yIEludGVyZmFjZS4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0SmF2YVN0YXJ0aW5nUG9pbnQoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsI2dldEphdmFTdGFydGluZ1BvaW50IDxlbT5KYXZhIFN0YXJ0aW5nIFBvaW50PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTZXRzIHRoZSBKYXZhIHN0YXJ0aW5nIHBvaW50IGFydGlmYWN0LiBJdCBtYXkgYmUgYSBKYXZhIENsYXNzIG9yIEludGVyZmFjZS4KLSAgICAgKiBAc2VlICNzZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoKQotICAgICAqIEBzZWUgI3NldEZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUoKQotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkphdmEgU3RhcnRpbmcgUG9pbnQ8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldEphdmFTdGFydGluZ1BvaW50KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRKYXZhU3RhcnRpbmdQb2ludChTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogSWYgdGhlIHN0YXJ0aW5nIHBvaW50IGlzIGEgSmF2YSBDbGFzcyB0aGlzIHRyYWNrcyB3aGV0aGVyIHRvIHVzZSBhbiBTRUkgaGFzIGJlZW4gc2VsZWN0ZWQuCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1VzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOwotCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbCNpc1VzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA8ZW0+VXNlIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2UgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzVXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGUgc3RhcnRpbmcgcG9pbnQgaXMgYSBKYXZhIENsYXNzIHRoaXMgdHJhY2tzIHdoZXRoZXIgdG8gb3B0aW9uIHRvCi0gICAgICogZXh0cmFjdCB0aGUgU0VJIGhhcyBiZWVuIHNlbGVjdGVkLgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIGJvb2xlYW4gaXNFeHRyYWN0SW50ZXJmYWNlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbCNpc0V4dHJhY3RJbnRlcmZhY2UgPGVtPkV4dHJhY3QgSW50ZXJmYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTZXRzIHRoZSBvcHRpb24gdG8gZXh0cmFjdCB0aGUgU0VJIGZyb20gdGhlIEphdmEgY2xhc3Mgc3RhcnRpbmcgcG9pbnQuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXh0cmFjdCBJbnRlcmZhY2U8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzRXh0cmFjdEludGVyZmFjZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0RXh0cmFjdEludGVyZmFjZShib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG5ldyBTRUkgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSA8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZShTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWFwIG9mIHRoZSBtZXRob2RzIHRvIHVzZSBhbmQgdGhlaXIgYW5ub3RhdGlvbnMuCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgTWFwPElNZXRob2QsIE1hcDxTdHJpbmcsIEJvb2xlYW4+PiBnZXRNZXRob2RNYXAoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsI2dldE1ldGhvZE1hcCA8ZW0+TWV0aG9kIE1hcDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU2V0cyB0aGUgbWFwIG9mIHRoZSBtZXRob2RzIHRvIHVzZSBhbmQgdGhlIG1ldGhvZCBhbm5vdGF0aW9ucy4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgTWFwPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRNZXRob2RNYXAoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldE1ldGhvZE1hcChNYXA8SU1ldGhvZCwgTWFwPFN0cmluZywgQm9vbGVhbj4+IHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBtYXAgb2YgZW5hYmxlZCBkZWZhdWx0IG1ldGhvZCBhbm5vdGF0aW9ucwotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIE1hcDxTdHJpbmcsIEJvb2xlYW4+IGdldEFubm90YXRpb25NYXAoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbCNnZXRBbm5vdGF0aW9uTWFwIDxlbT5Bbm5vdGF0aW9uIE1hcDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU2V0cyBhIG1hcCBvZiB0aGUgZW5hYmxlZCBtZXRob2QgYW5ub3RhdGlvbnMuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QW5ub3RhdGlvbiBNYXA8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldEFubm90YXRpb25NYXAoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEFubm90YXRpb25NYXAoTWFwPFN0cmluZywgQm9vbGVhbj4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBnZW5lcmF0ZWQgc291cmNlIGZpbGVzIGFyZSBwbGFjZWQuCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgU3RyaW5nIGdldFNvdXJjZURpcmVjdG9yeSgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwjZ2V0U291cmNlRGlyZWN0b3J5IDxlbT5Tb3VyY2UgRGlyZWN0b3J5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTZXRzIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIGdlbmVyYXRlZCBzb3VyY2UgZmlsZXMgYXJlIHBsYWNlZC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Tb3VyY2UgRGlyZWN0b3J5PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRTb3VyY2VEaXJlY3RvcnkoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFNvdXJjZURpcmVjdG9yeShTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcG9ydCBuYW1lIHVzZWQgaW4gdGhlIGdlbmVyYXRlZCB3c2RsLgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIFN0cmluZyBnZXRQb3J0TmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwjZ2V0UG9ydE5hbWUgPGVtPlBvcnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU2V0cyB0aGUgcG9ydCBuYW1lIHRvIHVzZSBpbiB0aGUgZ2VuZXJhdGVkIHdzZGwuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9ydCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRQb3J0TmFtZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0UG9ydE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9XU0RMMkphdmFDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL1dTREwySmF2YUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE2YTE2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL1dTREwySmF2YUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWw7Ci0KLS8qKgotICogCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKLSAqLwotcHVibGljIGludGVyZmFjZSBXU0RMMkphdmFDb250ZXh0IGV4dGVuZHMgQ1hGQ29udGV4dCB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdG8gZ2VuZXJhdGUgc3RhcnRpbmcgcG9pbnQgY29kZSBmb3IgYW4gaW1wbGVtZW50YXRpb24gb2JqZWN0LgotICAgICAqIAotICAgICAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIgotICAgICAqLwotICAgIGJvb2xlYW4gaXNHZW5lcmF0ZUltcGxlbWVudGF0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc0dlbmVyYXRlSW1wbGVtZW50YXRpb24gPGVtPkdlbmVyYXRlIEltcGxlbWVudGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0byBnZW5lcmF0ZSBzdGFydGluZyBwb2ludCBjb2RlIGZvciBhbiBpbXBsZW1lbnRhdGlvbiBvYmplY3QuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R2VuZXJhdGUgSW1wbGVtZW50YXRpb248L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVJbXBsZW1lbnRhdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0R2VuZXJhdGVJbXBsZW1lbnRhdGlvbihib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciBwcm9jZXNzaW5nIG9mIGltcGxpY2l0IFNPQVAgaGVhZGVycyAoaS5lLiBTT0FQIGhlYWRlcnMKLSAgICAgKiBkZWZpbmVkIGluIHRoZSB3c2RsOmJpbmRpbmcgYnV0IG5vdCB3c2RsOnBvcnRUeXBlIHNlY3Rpb24uKSBpcyBlbmFibGVkLgotICAgICAqIAotICAgICAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIKLSAgICAgKi8KLSAgICBib29sZWFuIGlzUHJvY2Vzc1NPQVBIZWFkZXJzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1Byb2Nlc3NTT0FQSGVhZGVycyA8ZW0+UHJvY2VzcyBTT0FQIEhlYWRlcnM8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgcHJvY2Vzc2luZyBvZiBpbXBsaWNpdCBTT0FQIGhlYWRlcnMgKGkuZS4gU09BUAotICAgICAqIGhlYWRlcnMgZGVmaW5lZCBpbiB0aGUgd3NkbDpiaW5kaW5nIGJ1dCBub3Qgd3NkbDpwb3J0VHlwZSBzZWN0aW9uLikKLSAgICAgKiBEZWZhdWx0IGlzIGZhbHNlLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByb2Nlc3MgU09BUCBIZWFkZXJzPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc1Byb2Nlc3NTT0FQSGVhZGVycygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0UHJvY2Vzc1NPQVBIZWFkZXJzKGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBsb2FkaW5nIG9mIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSBwYWNrYWdlIG5hbWUgbWFwcGluZyBpcyBlbmFibGVkLiAKLSAgICAgKiBEZWZhdWx0IGlzIHRydWUuCi0gICAgICogCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9InRydWUiCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0xvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc0xvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nIDxlbT5Mb2FkIERlZmF1bHQgTmFtZXNwYWNlIFBhY2thZ2UgTmFtZSBNYXBwaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBFbmFibGVzIHRoZSB1c2Ugb2YgdGhlIGRlZmF1bHQgbmFtZXNwYWNlIHBhY2thZ2UgbmFtZSBtYXBwaW5nLgotICAgICAqIERlZmF1bHQgaXMgdHJ1ZS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2FkIERlZmF1bHQgTmFtZXNwYWNlIFBhY2thZ2UgTmFtZSBNYXBwaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc0xvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyhib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgbG9hZGluZyBvZiB0aGUgZGVmYXVsdCBleGNsdWRlcyBuYW1lc3BhY2UgbWFwcGluZyBpcyBlbmFibGVkLgotICAgICAqIERlZmF1bHQgaXMgdHJ1ZS4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIKLSAgICAgKi8KLSAgICBib29sZWFuIGlzTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcgPGVtPkxvYWQgRGVmYXVsdCBFeGNsdWRlcyBOYW1lcHNhY2UgTWFwcGluZzwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogRW5hYmxlcyB0aGUgdXNlIG9mIHRoZSBkZWZhdWx0IGV4Y2x1ZGVzIG5hbWVzcGFjZSBtYXBwaW5nLgotICAgICAqIERlZmF1bHQgaXMgdHJ1ZS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2FkIERlZmF1bHQgRXhjbHVkZXMgTmFtZXBzYWNlIE1hcHBpbmc8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldExvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRvIHZhbGlkYXRlIHRoZSBXU0RMIGJlZm9yZSBnZW5lcmF0aW5nIHRoZSBjb2RlLgotICAgICAqIAotICAgICAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIgotICAgICAqLwotICAgIGJvb2xlYW4gaXNWYWxpZGF0ZSgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNWYWxpZGF0ZSA8ZW0+VmFsaWRhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIEVuYWJsZXMgV1NETCB2YWxpZGF0aW9uIGJlZm9yZSBjb2RlIGdlbmVyYXRpb24uCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsaWRhdGU8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzVmFsaWRhdGUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFZhbGlkYXRlKGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgd3NkbCB2ZXJzaW9uIC5EZWZhdWx0IGlzIFdTREwxLjEuIEN1cnJlbnRseSBzdXBwb3J0cyBvbmx5IFdTREwxLjEgdmVyc2lvbi4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwgZGVmYXVsdD0iMS4xIgotICAgICAqLwotICAgIFN0cmluZyBnZXRXc2RsVmVyc2lvbigpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjZ2V0V3NkbFZlcnNpb24gPGVtPldzZGwgVmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V3NkbCBWZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRXc2RsVmVyc2lvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0V3NkbFZlcnNpb24oU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgdG9vbCBpcyBzZXQgdG8gZ2VuZXJhdGUgZGVmYXVsdCB2YWxlcyBmb3IgdGhlCi0gICAgICogZ2VuZXJhdGVkIGNsaWVudCBhbmQgdGhlIGdlbmVyYXRlZCBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKgotICAgICAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIgotICAgICAqLwotICAgIGJvb2xlYW4gaXNVc2VEZWZhdWx0VmFsdWVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1VzZURlZmF1bHRWYWx1ZXMgPGVtPlVzZSBEZWZhdWx0IFZhbHVlczwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogR2VuZXJhdGUgZGVmYXVsdCB2YWxlcyBmb3IgdGhlIGdlbmVyYXRlZCBjbGllbnQgYW5kIHRoZSBnZW5lcmF0ZWQgaW1wbGVtZW50YXRpb24uCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXNlIERlZmF1bHQgVmFsdWVzPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc1VzZURlZmF1bHRWYWx1ZXMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFVzZURlZmF1bHRWYWx1ZXMoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIGRpcmVjdGx5IHRvCi0gICAgICogdGhlIFhKQyB3aGVuIHRoZSBKQVhCIGJpbmRpbmcgaXMgYmVpbmcgdXNlZC4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0WGpjQXJncygpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjZ2V0WGpjQXJncyA8ZW0+WGpjIEFyZ3M8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlhqYyBBcmdzPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRYamNBcmdzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRYamNBcmdzKFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHRvb2wgaXMgc2V0IHRvIHVzZSB0aGUgQ1hGIHByb3ByaWV0YXJ5IFdTLUFkZHJlc3NpbmcgCi0gICAgICogdHlwZSBpbnN0ZWFkIG9mIHRoZSBKQVgtV1MgMi4xIGNvbXBsaWFudCBtYXBwaW5nLgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIGJvb2xlYW4gaXNOb0FkZHJlc3NCaW5kaW5nKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc05vQWRkcmVzc0JpbmRpbmcgPGVtPk5vIEFkZHJlc3MgQmluZGluZzwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogSW5zdHJ1Y3RzIHRoZSB0b29sIHRvIHVzZSB0aGUgQ1hGIHByb3ByaWV0YXJ5IFdTLUFkZHJlc3NpbmcgdHlwZSAKLSAgICAgKiBpbnN0ZWFkIG9mIHRoZSBKQVgtV1MgMi4xIGNvbXBsaWFudCBtYXBwaW5nLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5vIEFkZHJlc3MgQmluZGluZzwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNOb0FkZHJlc3NCaW5kaW5nKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXROb0FkZHJlc3NCaW5kaW5nKGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIFhKQyB3aWxsIGluaXRpYWxpemUgZmllbGRzIG1hcHBlZCBmcm9tIGVsZW1lbnRzIHdpdGggdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1hqY1VzZURlZmF1bHRWYWx1ZXMoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzWGpjVXNlRGVmYXVsdFZhbHVlcyA8ZW0+WGpjIFVzZSBEZWZhdWx0IFZhbHVlczwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+WGpjIFVzZSBEZWZhdWx0IFZhbHVlczwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNYamNVc2VEZWZhdWx0VmFsdWVzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRYamNVc2VEZWZhdWx0VmFsdWVzKGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIFhKQyB3aWxsIGdlbmVyYXRlIGEgPGNvZGU+dG9TdHJpbmcoKTwvY29kZT4gbWV0aG9kLgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIGJvb2xlYW4gaXNYamNUb1N0cmluZygpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNYamNUb1N0cmluZyA8ZW0+WGpjIFRvIFN0cmluZzwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+WGpjIFRvIFN0cmluZzwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNYamNUb1N0cmluZygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0WGpjVG9TdHJpbmcoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgbXVsdGkgbGluZSBvdXRwdXQgaXMgZW5hYmxlZCBmb3IgPGNvZGU+dG9TdHJpbmcoKTwvY29kZT4uCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1hqY1RvU3RyaW5nTXVsdGlMaW5lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1hqY1RvU3RyaW5nTXVsdGlMaW5lIDxlbT5YamMgVG8gU3RyaW5nIE11bHRpIExpbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlhqYyBUbyBTdHJpbmcgTXVsdGkgTGluZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNYamNUb1N0cmluZ011bHRpTGluZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0WGpjVG9TdHJpbmdNdWx0aUxpbmUoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGVyc2Ugb3V0cHV0IGlzIGVuYWJsZWQgZm9yIDxjb2RlPnRvU3RyaW5nKCk8L2NvZGU+LgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIGJvb2xlYW4gaXNYamNUb1N0cmluZ1NpbXBsZSgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNYamNUb1N0cmluZ1NpbXBsZSA8ZW0+WGpjIFRvIFN0cmluZyBTaW1wbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlhqYyBUbyBTdHJpbmcgU2ltcGxlPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc1hqY1RvU3RyaW5nU2ltcGxlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRYamNUb1N0cmluZ1NpbXBsZShib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciBzb3VyY2UgbG9jYXRpb24gc3VwcG9ydCBpcyBlbmFibGVkLgotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIGJvb2xlYW4gaXNYamNMb2NhdG9yKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1hqY0xvY2F0b3IgPGVtPlhqYyBMb2NhdG9yPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5YamMgTG9jYXRvcjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNYamNMb2NhdG9yKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRYamNMb2NhdG9yKGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBYSkMgd2lsbCBnZW5lcmF0ZSBhY2Nlc3NvciBtZXRob2RzIHdpdGggJ3N5bmNocm9uaXplZCcga2V5d29yZC4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBib29sZWFuIGlzWGpjU3luY01ldGhvZHMoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzWGpjU3luY01ldGhvZHMgPGVtPlhqYyBTeW5jIE1ldGhvZHM8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlhqYyBTeW5jIE1ldGhvZHM8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzWGpjU3luY01ldGhvZHMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFhqY1N5bmNNZXRob2RzKGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBYSkMgd2lsbCBtYXJrIHRoZSBjb2RlIGFzIGdlbmVyYXRlZCB1c2luZyB0aGUgYW5ub3RhdGlvbnMuCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1hqY01hcmtHZW5lcmF0ZWQoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzWGpjTWFya0dlbmVyYXRlZCA8ZW0+WGpjIE1hcmsgR2VuZXJhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5YamMgTWFyayBHZW5lcmF0ZWQ8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzWGpjTWFya0dlbmVyYXRlZCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0WGpjTWFya0dlbmVyYXRlZChib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBlcGlzb2RlIGZpbGUgbG9jYXRpb24uCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgU3RyaW5nIGdldFhqY0VwaXNvZGVGaWxlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNnZXRYamNFcGlzb2RlRmlsZSA8ZW0+WGpjIEVwaXNvZGUgRmlsZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+WGpjIEVwaXNvZGUgRmlsZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0WGpjRXBpc29kZUZpbGUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFhqY0VwaXNvZGVGaWxlKFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdXRvIE5hbWUgUmVzb2x1dGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXV0byBOYW1lIFJlc29sdXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXV0byBOYW1lIFJlc29sdXRpb248L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI3NldEF1dG9OYW1lUmVzb2x1dGlvbihib29sZWFuKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2UjZ2V0V1NETDJKYXZhQ29udGV4dF9BdXRvTmFtZVJlc29sdXRpb24oKQotICAgICAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0F1dG9OYW1lUmVzb2x1dGlvbigpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNBdXRvTmFtZVJlc29sdXRpb24gPGVtPkF1dG8gTmFtZSBSZXNvbHV0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRvIE5hbWUgUmVzb2x1dGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNBdXRvTmFtZVJlc29sdXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEF1dG9OYW1lUmVzb2x1dGlvbihib29sZWFuIHZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvV1NETDJKYXZhRGF0YU1vZGVsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL1dTREwySmF2YURhdGFNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzQwYmQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvV1NETDJKYXZhRGF0YU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBtb2RlbAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdTREwySmF2YURhdGFNb2RlbCBleHRlbmRzIENYRkRhdGFNb2RlbCwgV1NETDJKYXZhQ29udGV4dCB7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGFja2FnZSBuYW1lcyB0byB1c2UgZm9yIHRoZSBnZW5lcmF0ZWQgY29kZS4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldEluY2x1ZGVkTmFtZXNwYWNlcygpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbCNnZXRJbmNsdWRlZE5hbWVzcGFjZXMgPGVtPkluY2x1ZGVkIE5hbWVzcGFjZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNwZWNpZmllcyB6ZXJvLCBvciBtb3JlLCBwYWNrYWdlIG5hbWVzIHRvIHVzZSBmb3IgdGhlIGdlbmVyYXRlZCBjb2RlLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluY2x1ZGVkIE5hbWVzcGFjZXM8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldEluY2x1ZGVkTmFtZXNwYWNlcygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0SW5jbHVkZWROYW1lc3BhY2VzKE1hcDxTdHJpbmcsIFN0cmluZz4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIExpc3Qgb2YgdGhlIEpBWFdTIG9yIEpBWEIgYmluZGluZyBmaWxlcyB1c2VkLCBpZiBhbnkuCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgTGlzdDxTdHJpbmc+IGdldEJpbmRpbmdGaWxlcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgamF2YSBwYWNrYWdlIHRvIGV4Y2x1ZGVkIG5hbWVzcGFjZSBtYXBwaW5ncy4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldEV4Y2x1ZGVkTmFtZXNwYWNlcygpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbCNnZXRFeGNsdWRlZE5hbWVzcGFjZXMgPGVtPkV4Y2x1ZGVkIE5hbWVzcGFjZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIElnbm9yZSB0aGUgc3BlY2lmaWVkIFdTREwgc2NoZW1hIG5hbWVzcGFjZSB3aGVuIGdlbmVyYXRpbmcgY29kZS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeGNsdWRlZCBOYW1lc3BhY2VzPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRFeGNsdWRlZE5hbWVzcGFjZXMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEV4Y2x1ZGVkTmFtZXNwYWNlcyhNYXA8U3RyaW5nLCBTdHJpbmc+IHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNhdGFsb2cgZmlsZSB1c2VkIHRvIG1hcCB0aGUgaW1wb3J0ZWQgd3NkbC9zY2hlbWEKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0Q2F0YWxvZ0ZpbGUoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWwjZ2V0Q2F0YWxvZ0ZpbGUgPGVtPkNhdGFsb2cgRmlsZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU3BlY2lmeSBjYXRhbG9nIGZpbGUgdG8gbWFwIHRoZSBpbXBvcnRlZCB3c2RsL3NjaGVtYS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYXRhbG9nIEZpbGU8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldENhdGFsb2dGaWxlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRDYXRhbG9nRmlsZShTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIEphdmEgU291cmNlIERpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBmaWxlcyBhcmUgZ2VuZXJhdGVkLgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIFN0cmluZyBnZXRKYXZhU291cmNlRm9sZGVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsI2dldEphdmFTb3VyY2VGb2xkZXIgPGVtPkphdmEgU291cmNlIEZvbGRlcjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIEphdmEgU291cmNlIERpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBmaWxlcyBhcmUgZ2VuZXJhdGVkLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkphdmEgU291cmNlIEZvbGRlcjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0SmF2YVNvdXJjZUZvbGRlcigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0SmF2YVNvdXJjZUZvbGRlcihTdHJpbmcgdmFsdWUpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL2ltcGwvQ1hGRGF0YU1vZGVsSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9pbXBsL0NYRkRhdGFNb2RlbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY0ZGNkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL2ltcGwvQ1hGRGF0YU1vZGVsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyMCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKiAkSWQ6IENYRkRhdGFNb2RlbEltcGwuamF2YSx2IDEuNCAyMDEwLzAxLzE3IDE5OjU2OjU2IHNjbGFya2UgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuRGF0YUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkZyb250ZW5kOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EYXRhIE1vZGVsPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZEYXRhTW9kZWxJbXBsI2dldERlZmF1bHRSdW50aW1lTG9jYXRpb24gPGVtPkRlZmF1bHQgUnVudGltZSBMb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRGF0YU1vZGVsSW1wbCNnZXREZWZhdWx0UnVudGltZVR5cGUgPGVtPkRlZmF1bHQgUnVudGltZSBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZEYXRhTW9kZWxJbXBsI2dldERlZmF1bHRSdW50aW1lVmVyc2lvbiA8ZW0+RGVmYXVsdCBSdW50aW1lIFZlcnNpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkRhdGFNb2RlbEltcGwjaXNWZXJib3NlIDxlbT5WZXJib3NlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZEYXRhTW9kZWxJbXBsI2lzR2VuZXJhdGVBbnRCdWlsZEZpbGUgPGVtPkdlbmVyYXRlIEFudCBCdWlsZCBGaWxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZEYXRhTW9kZWxJbXBsI2lzR2VuZXJhdGVDbGllbnQgPGVtPkdlbmVyYXRlIENsaWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRGF0YU1vZGVsSW1wbCNpc0dlbmVyYXRlU2VydmVyIDxlbT5HZW5lcmF0ZSBTZXJ2ZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkRhdGFNb2RlbEltcGwjZ2V0RGF0YWJpbmRpbmcgPGVtPkRhdGFiaW5kaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZEYXRhTW9kZWxJbXBsI2dldEZyb250ZW5kIDxlbT5Gcm9udGVuZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRGF0YU1vZGVsSW1wbCNpc1VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCA8ZW0+VXNlIFNwcmluZyBBcHBsaWNhdGlvbiBDb250ZXh0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZEYXRhTW9kZWxJbXBsI2lzRXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyIDxlbT5FeHBvcnQgQ1hGIENsYXNzcGF0aCBDb250YWluZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkRhdGFNb2RlbEltcGwjZ2V0SW5zdGFsbGF0aW9ucyA8ZW0+SW5zdGFsbGF0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRGF0YU1vZGVsSW1wbCNnZXRQcm9qZWN0TmFtZSA8ZW0+UHJvamVjdCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZEYXRhTW9kZWxJbXBsI2dldFJlc291cmNlRGlyZWN0b3J5IDxlbT5SZXNvdXJjZSBEaXJlY3Rvcnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkRhdGFNb2RlbEltcGwjZ2V0Q2xhc3NEaXJlY3RvcnkgPGVtPkNsYXNzIERpcmVjdG9yeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRGF0YU1vZGVsSW1wbCNnZXRXc2RsRmlsZU5hbWUgPGVtPldzZGwgRmlsZSBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZEYXRhTW9kZWxJbXBsI2dldFdzZGxVUkwgPGVtPldzZGwgVVJMPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZEYXRhTW9kZWxJbXBsI2dldENvbmZpZ1dzZGxMb2NhdGlvbiA8ZW0+Q29uZmlnIFdzZGwgTG9jYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkRhdGFNb2RlbEltcGwjZ2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lIDxlbT5GdWxseSBRdWFsaWZpZWQgSmF2YSBDbGFzcyBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZEYXRhTW9kZWxJbXBsI2dldEZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUgPGVtPkZ1bGx5IFF1YWxpZmllZCBKYXZhIEludGVyZmFjZSBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZEYXRhTW9kZWxJbXBsI2dldENvbmZpZ0lkIDxlbT5Db25maWcgSWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkRhdGFNb2RlbEltcGwjZ2V0VGFyZ2V0TmFtZXNwYWNlIDxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZEYXRhTW9kZWxJbXBsI2dldEVuZHBvaW50TmFtZSA8ZW0+RW5kcG9pbnQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRGF0YU1vZGVsSW1wbCNnZXRTZXJ2aWNlTmFtZSA8ZW0+U2VydmljZSBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZEYXRhTW9kZWxJbXBsI2dldFdzZGxEZWZpbml0aW9uIDxlbT5Xc2RsIERlZmluaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkRhdGFNb2RlbEltcGwjZ2V0V3NkbExvY2F0aW9uIDxlbT5Xc2RsIExvY2F0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ1hGRGF0YU1vZGVsSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQ1hGRGF0YU1vZGVsIHsKLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdFJ1bnRpbWVMb2NhdGlvbigpIDxlbT5EZWZhdWx0IFJ1bnRpbWUgTG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldERlZmF1bHRSdW50aW1lTG9jYXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUlVOVElNRV9MT0NBVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0UnVudGltZUxvY2F0aW9uKCkgPGVtPkRlZmF1bHQgUnVudGltZSBMb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0RGVmYXVsdFJ1bnRpbWVMb2NhdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0UnVudGltZUxvY2F0aW9uID0gREVGQVVMVF9SVU5USU1FX0xPQ0FUSU9OX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRSdW50aW1lVHlwZSgpIDxlbT5EZWZhdWx0IFJ1bnRpbWUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0RGVmYXVsdFJ1bnRpbWVUeXBlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1JVTlRJTUVfVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0UnVudGltZVR5cGUoKSA8ZW0+RGVmYXVsdCBSdW50aW1lIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldERlZmF1bHRSdW50aW1lVHlwZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0UnVudGltZVR5cGUgPSBERUZBVUxUX1JVTlRJTUVfVFlQRV9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0UnVudGltZVZlcnNpb24oKSA8ZW0+RGVmYXVsdCBSdW50aW1lIFZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldERlZmF1bHRSdW50aW1lVmVyc2lvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9SVU5USU1FX1ZFUlNJT05fRURFRkFVTFQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCkgPGVtPkRlZmF1bHQgUnVudGltZSBWZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXREZWZhdWx0UnVudGltZVZlcnNpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFJ1bnRpbWVWZXJzaW9uID0gREVGQVVMVF9SVU5USU1FX1ZFUlNJT05fRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNWZXJib3NlKCkgPGVtPlZlcmJvc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzVmVyYm9zZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFZFUkJPU0VfRURFRkFVTFQgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNWZXJib3NlKCkgPGVtPlZlcmJvc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzVmVyYm9zZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdmVyYm9zZSA9IFZFUkJPU0VfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZUFudEJ1aWxkRmlsZSgpIDxlbT5HZW5lcmF0ZSBBbnQgQnVpbGQgRmlsZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNHZW5lcmF0ZUFudEJ1aWxkRmlsZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEdFTkVSQVRFX0FOVF9CVUlMRF9GSUxFX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0dlbmVyYXRlQW50QnVpbGRGaWxlKCkgPGVtPkdlbmVyYXRlIEFudCBCdWlsZCBGaWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlQW50QnVpbGRGaWxlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBnZW5lcmF0ZUFudEJ1aWxkRmlsZSA9IEdFTkVSQVRFX0FOVF9CVUlMRF9GSUxFX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzR2VuZXJhdGVDbGllbnQoKSA8ZW0+R2VuZXJhdGUgQ2xpZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlQ2xpZW50KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gR0VORVJBVEVfQ0xJRU5UX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0dlbmVyYXRlQ2xpZW50KCkgPGVtPkdlbmVyYXRlIENsaWVudDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNHZW5lcmF0ZUNsaWVudCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZ2VuZXJhdGVDbGllbnQgPSBHRU5FUkFURV9DTElFTlRfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZVNlcnZlcigpIDxlbT5HZW5lcmF0ZSBTZXJ2ZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVTZXJ2ZXIoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBHRU5FUkFURV9TRVJWRVJfRURFRkFVTFQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzR2VuZXJhdGVTZXJ2ZXIoKSA8ZW0+R2VuZXJhdGUgU2VydmVyPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlU2VydmVyKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBnZW5lcmF0ZVNlcnZlciA9IEdFTkVSQVRFX1NFUlZFUl9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREYXRhYmluZGluZygpIDxlbT5EYXRhYmluZGluZzwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0RGF0YWJpbmRpbmcoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgRGF0YUJpbmRpbmcgREFUQUJJTkRJTkdfRURFRkFVTFQgPSBEYXRhQmluZGluZy5KQVhCOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF0YWJpbmRpbmcoKSA8ZW0+RGF0YWJpbmRpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldERhdGFiaW5kaW5nKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRGF0YUJpbmRpbmcgZGF0YWJpbmRpbmcgPSBEQVRBQklORElOR19FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGcm9udGVuZCgpIDxlbT5Gcm9udGVuZDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0RnJvbnRlbmQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgRnJvbnRlbmQgRlJPTlRFTkRfRURFRkFVTFQgPSBGcm9udGVuZC5KQVhXUzsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZyb250ZW5kKCkgPGVtPkZyb250ZW5kPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRGcm9udGVuZCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEZyb250ZW5kIGZyb250ZW5kID0gRlJPTlRFTkRfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoKSA8ZW0+VXNlIFNwcmluZyBBcHBsaWNhdGlvbiBDb250ZXh0PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc1VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFVTRV9TUFJJTkdfQVBQTElDQVRJT05fQ09OVEVYVF9FREVGQVVMVCA9IHRydWU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCgpIDxlbT5Vc2UgU3ByaW5nIEFwcGxpY2F0aW9uIENvbnRleHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzVXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB1c2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQgPSBVU0VfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFRfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIoKSA8ZW0+RXhwb3J0IENYRiBDbGFzc3BhdGggQ29udGFpbmVyPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0V4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEVYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUl9FREVGQVVMVCA9IHRydWU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0V4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcigpIDxlbT5FeHBvcnQgQ1hGIENsYXNzcGF0aCBDb250YWluZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzRXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBleHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIgPSBFWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVJfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbnN0YWxsYXRpb25zKCkgPGVtPkluc3RhbGxhdGlvbnM8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldEluc3RhbGxhdGlvbnMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBDWEZJbnN0YWxsPiBpbnN0YWxsYXRpb25zOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2plY3ROYW1lKCkgPGVtPlByb2plY3QgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0UHJvamVjdE5hbWUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9qZWN0TmFtZSgpIDxlbT5Qcm9qZWN0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFByb2plY3ROYW1lKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHByb2plY3ROYW1lID0gUFJPSkVDVF9OQU1FX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlRGlyZWN0b3J5KCkgPGVtPlJlc291cmNlIERpcmVjdG9yeTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0UmVzb3VyY2VEaXJlY3RvcnkoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX0RJUkVDVE9SWV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZURpcmVjdG9yeSgpIDxlbT5SZXNvdXJjZSBEaXJlY3Rvcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFJlc291cmNlRGlyZWN0b3J5KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc291cmNlRGlyZWN0b3J5ID0gUkVTT1VSQ0VfRElSRUNUT1JZX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsYXNzRGlyZWN0b3J5KCkgPGVtPkNsYXNzIERpcmVjdG9yeTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0Q2xhc3NEaXJlY3RvcnkoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX0RJUkVDVE9SWV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbGFzc0RpcmVjdG9yeSgpIDxlbT5DbGFzcyBEaXJlY3Rvcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldENsYXNzRGlyZWN0b3J5KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzRGlyZWN0b3J5ID0gQ0xBU1NfRElSRUNUT1JZX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxGaWxlTmFtZSgpIDxlbT5Xc2RsIEZpbGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0V3NkbEZpbGVOYW1lKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX0ZJTEVfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXc2RsRmlsZU5hbWUoKSA8ZW0+V3NkbCBGaWxlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFdzZGxGaWxlTmFtZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyB3c2RsRmlsZU5hbWUgPSBXU0RMX0ZJTEVfTkFNRV9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXc2RsVVJMKCkgPGVtPldzZGwgVVJMPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRXc2RsVVJMKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFVSTCBXU0RMX1VSTF9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXc2RsVVJMKCkgPGVtPldzZGwgVVJMPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRXc2RsVVJMKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVVJMIHdzZGxVUkwgPSBXU0RMX1VSTF9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25maWdXc2RsTG9jYXRpb24oKSA8ZW0+Q29uZmlnIFdzZGwgTG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldENvbmZpZ1dzZGxMb2NhdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX1dTRExfTE9DQVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29uZmlnV3NkbExvY2F0aW9uKCkgPGVtPkNvbmZpZyBXc2RsIExvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRDb25maWdXc2RsTG9jYXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgY29uZmlnV3NkbExvY2F0aW9uID0gQ09ORklHX1dTRExfTE9DQVRJT05fRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCkgPGVtPkZ1bGx5IFF1YWxpZmllZCBKYXZhIENsYXNzIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVMTFlfUVVBTElGSUVEX0pBVkFfQ0xBU1NfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoKSA8ZW0+RnVsbHkgUXVhbGlmaWVkIEphdmEgQ2xhc3MgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSA9IEZVTExZX1FVQUxJRklFRF9KQVZBX0NMQVNTX05BTUVfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSgpIDxlbT5GdWxseSBRdWFsaWZpZWQgSmF2YSBJbnRlcmZhY2UgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVMTFlfUVVBTElGSUVEX0pBVkFfSU5URVJGQUNFX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSgpIDxlbT5GdWxseSBRdWFsaWZpZWQgSmF2YSBJbnRlcmZhY2UgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBmdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lID0gRlVMTFlfUVVBTElGSUVEX0pBVkFfSU5URVJGQUNFX05BTUVfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29uZmlnSWQoKSA8ZW0+Q29uZmlnIElkPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRDb25maWdJZCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0lEX0VERUZBVUxUID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbmZpZ0lkKCkgPGVtPkNvbmZpZyBJZDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0Q29uZmlnSWQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgY29uZmlnSWQgPSBDT05GSUdfSURfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFRhcmdldE5hbWVzcGFjZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXROYW1lc3BhY2UoKSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IFRBUkdFVF9OQU1FU1BBQ0VfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW5kcG9pbnROYW1lKCkgPGVtPkVuZHBvaW50IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldEVuZHBvaW50TmFtZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EUE9JTlRfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbmRwb2ludE5hbWUoKSA8ZW0+RW5kcG9pbnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0RW5kcG9pbnROYW1lKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGVuZHBvaW50TmFtZSA9IEVORFBPSU5UX05BTUVfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZU5hbWUoKSA8ZW0+U2VydmljZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRTZXJ2aWNlTmFtZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VOYW1lKCkgPGVtPlNlcnZpY2UgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0U2VydmljZU5hbWUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgc2VydmljZU5hbWUgPSBTRVJWSUNFX05BTUVfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbERlZmluaXRpb24oKSA8ZW0+V3NkbCBEZWZpbml0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRXc2RsRGVmaW5pdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEZWZpbml0aW9uIFdTRExfREVGSU5JVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXc2RsRGVmaW5pdGlvbigpIDxlbT5Xc2RsIERlZmluaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFdzZGxEZWZpbml0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRGVmaW5pdGlvbiB3c2RsRGVmaW5pdGlvbiA9IFdTRExfREVGSU5JVElPTl9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXc2RsTG9jYXRpb24oKSA8ZW0+V3NkbCBMb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0V3NkbExvY2F0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX0xPQ0FUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxMb2NhdGlvbigpIDxlbT5Xc2RsIExvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRXc2RsTG9jYXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgd3NkbExvY2F0aW9uID0gV1NETF9MT0NBVElPTl9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBDWEZEYXRhTW9kZWxJbXBsKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotICAgICAgICByZXR1cm4gQ1hGUGFja2FnZS5MaXRlcmFscy5DWEZfREFUQV9NT0RFTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRSdW50aW1lTG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0UnVudGltZUxvY2F0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRSdW50aW1lTG9jYXRpb24oU3RyaW5nIG5ld0RlZmF1bHRSdW50aW1lTG9jYXRpb24pIHsKLSAgICAgICAgU3RyaW5nIG9sZERlZmF1bHRSdW50aW1lTG9jYXRpb24gPSBkZWZhdWx0UnVudGltZUxvY2F0aW9uOwotICAgICAgICBkZWZhdWx0UnVudGltZUxvY2F0aW9uID0gbmV3RGVmYXVsdFJ1bnRpbWVMb2NhdGlvbjsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fREVGQVVMVF9SVU5USU1FX0xPQ0FUSU9OLCBvbGREZWZhdWx0UnVudGltZUxvY2F0aW9uLCBkZWZhdWx0UnVudGltZUxvY2F0aW9uKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0UnVudGltZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0UnVudGltZVR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdFJ1bnRpbWVUeXBlKFN0cmluZyBuZXdEZWZhdWx0UnVudGltZVR5cGUpIHsKLSAgICAgICAgU3RyaW5nIG9sZERlZmF1bHRSdW50aW1lVHlwZSA9IGRlZmF1bHRSdW50aW1lVHlwZTsKLSAgICAgICAgZGVmYXVsdFJ1bnRpbWVUeXBlID0gbmV3RGVmYXVsdFJ1bnRpbWVUeXBlOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19ERUZBVUxUX1JVTlRJTUVfVFlQRSwgb2xkRGVmYXVsdFJ1bnRpbWVUeXBlLCBkZWZhdWx0UnVudGltZVR5cGUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRSdW50aW1lVmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIGRlZmF1bHRSdW50aW1lVmVyc2lvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0UnVudGltZVZlcnNpb24oU3RyaW5nIG5ld0RlZmF1bHRSdW50aW1lVmVyc2lvbikgewotICAgICAgICBTdHJpbmcgb2xkRGVmYXVsdFJ1bnRpbWVWZXJzaW9uID0gZGVmYXVsdFJ1bnRpbWVWZXJzaW9uOwotICAgICAgICBkZWZhdWx0UnVudGltZVZlcnNpb24gPSBuZXdEZWZhdWx0UnVudGltZVZlcnNpb247Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0RFRkFVTFRfUlVOVElNRV9WRVJTSU9OLCBvbGREZWZhdWx0UnVudGltZVZlcnNpb24sIGRlZmF1bHRSdW50aW1lVmVyc2lvbikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmVyYm9zZSgpIHsKLSAgICAgICAgcmV0dXJuIHZlcmJvc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmVyYm9zZShib29sZWFuIG5ld1ZlcmJvc2UpIHsKLSAgICAgICAgYm9vbGVhbiBvbGRWZXJib3NlID0gdmVyYm9zZTsKLSAgICAgICAgdmVyYm9zZSA9IG5ld1ZlcmJvc2U7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1ZFUkJPU0UsIG9sZFZlcmJvc2UsIHZlcmJvc2UpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlQW50QnVpbGRGaWxlKCkgewotICAgICAgICByZXR1cm4gZ2VuZXJhdGVBbnRCdWlsZEZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVBbnRCdWlsZEZpbGUoYm9vbGVhbiBuZXdHZW5lcmF0ZUFudEJ1aWxkRmlsZSkgewotICAgICAgICBib29sZWFuIG9sZEdlbmVyYXRlQW50QnVpbGRGaWxlID0gZ2VuZXJhdGVBbnRCdWlsZEZpbGU7Ci0gICAgICAgIGdlbmVyYXRlQW50QnVpbGRGaWxlID0gbmV3R2VuZXJhdGVBbnRCdWlsZEZpbGU7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0dFTkVSQVRFX0FOVF9CVUlMRF9GSUxFLCBvbGRHZW5lcmF0ZUFudEJ1aWxkRmlsZSwgZ2VuZXJhdGVBbnRCdWlsZEZpbGUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlQ2xpZW50KCkgewotICAgICAgICByZXR1cm4gZ2VuZXJhdGVDbGllbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVDbGllbnQoYm9vbGVhbiBuZXdHZW5lcmF0ZUNsaWVudCkgewotICAgICAgICBib29sZWFuIG9sZEdlbmVyYXRlQ2xpZW50ID0gZ2VuZXJhdGVDbGllbnQ7Ci0gICAgICAgIGdlbmVyYXRlQ2xpZW50ID0gbmV3R2VuZXJhdGVDbGllbnQ7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0dFTkVSQVRFX0NMSUVOVCwgb2xkR2VuZXJhdGVDbGllbnQsIGdlbmVyYXRlQ2xpZW50KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZVNlcnZlcigpIHsKLSAgICAgICAgcmV0dXJuIGdlbmVyYXRlU2VydmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlU2VydmVyKGJvb2xlYW4gbmV3R2VuZXJhdGVTZXJ2ZXIpIHsKLSAgICAgICAgYm9vbGVhbiBvbGRHZW5lcmF0ZVNlcnZlciA9IGdlbmVyYXRlU2VydmVyOwotICAgICAgICBnZW5lcmF0ZVNlcnZlciA9IG5ld0dlbmVyYXRlU2VydmVyOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19HRU5FUkFURV9TRVJWRVIsIG9sZEdlbmVyYXRlU2VydmVyLCBnZW5lcmF0ZVNlcnZlcikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBEYXRhQmluZGluZyBnZXREYXRhYmluZGluZygpIHsKLSAgICAgICAgcmV0dXJuIGRhdGFiaW5kaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERhdGFiaW5kaW5nKERhdGFCaW5kaW5nIG5ld0RhdGFiaW5kaW5nKSB7Ci0gICAgICAgIERhdGFCaW5kaW5nIG9sZERhdGFiaW5kaW5nID0gZGF0YWJpbmRpbmc7Ci0gICAgICAgIGRhdGFiaW5kaW5nID0gbmV3RGF0YWJpbmRpbmcgPT0gbnVsbCA/IERBVEFCSU5ESU5HX0VERUZBVUxUIDogbmV3RGF0YWJpbmRpbmc7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0RBVEFCSU5ESU5HLCBvbGREYXRhYmluZGluZywgZGF0YWJpbmRpbmcpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRnJvbnRlbmQgZ2V0RnJvbnRlbmQoKSB7Ci0gICAgICAgIHJldHVybiBmcm9udGVuZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGcm9udGVuZChGcm9udGVuZCBuZXdGcm9udGVuZCkgewotICAgICAgICBGcm9udGVuZCBvbGRGcm9udGVuZCA9IGZyb250ZW5kOwotICAgICAgICBmcm9udGVuZCA9IG5ld0Zyb250ZW5kID09IG51bGwgPyBGUk9OVEVORF9FREVGQVVMVCA6IG5ld0Zyb250ZW5kOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19GUk9OVEVORCwgb2xkRnJvbnRlbmQsIGZyb250ZW5kKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiB1c2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KGJvb2xlYW4gbmV3VXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkVXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0ID0gdXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0OwotICAgICAgICB1c2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQgPSBuZXdVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQ7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1VTRV9TUFJJTkdfQVBQTElDQVRJT05fQ09OVEVYVCwgb2xkVXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0LCB1c2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0V4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcigpIHsKLSAgICAgICAgcmV0dXJuIGV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIoYm9vbGVhbiBuZXdFeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIpIHsKLSAgICAgICAgYm9vbGVhbiBvbGRFeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIgPSBleHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXI7Ci0gICAgICAgIGV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lciA9IG5ld0V4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcjsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSLCBvbGRFeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIsIGV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBDWEZJbnN0YWxsPiBnZXRJbnN0YWxsYXRpb25zKCkgewotICAgICAgICByZXR1cm4gaW5zdGFsbGF0aW9uczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbnN0YWxsYXRpb25zKE1hcDxTdHJpbmcsIENYRkluc3RhbGw+IG5ld0luc3RhbGxhdGlvbnMpIHsKLSAgICAgICAgTWFwPFN0cmluZywgQ1hGSW5zdGFsbD4gb2xkSW5zdGFsbGF0aW9ucyA9IGluc3RhbGxhdGlvbnM7Ci0gICAgICAgIGluc3RhbGxhdGlvbnMgPSBuZXdJbnN0YWxsYXRpb25zOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19JTlNUQUxMQVRJT05TLCBvbGRJbnN0YWxsYXRpb25zLCBpbnN0YWxsYXRpb25zKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHByb2plY3ROYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFByb2plY3ROYW1lKFN0cmluZyBuZXdQcm9qZWN0TmFtZSkgewotICAgICAgICBTdHJpbmcgb2xkUHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZTsKLSAgICAgICAgcHJvamVjdE5hbWUgPSBuZXdQcm9qZWN0TmFtZTsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fUFJPSkVDVF9OQU1FLCBvbGRQcm9qZWN0TmFtZSwgcHJvamVjdE5hbWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlRGlyZWN0b3J5KCkgewotICAgICAgICByZXR1cm4gcmVzb3VyY2VEaXJlY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VEaXJlY3RvcnkoU3RyaW5nIG5ld1Jlc291cmNlRGlyZWN0b3J5KSB7Ci0gICAgICAgIFN0cmluZyBvbGRSZXNvdXJjZURpcmVjdG9yeSA9IHJlc291cmNlRGlyZWN0b3J5OwotICAgICAgICByZXNvdXJjZURpcmVjdG9yeSA9IG5ld1Jlc291cmNlRGlyZWN0b3J5OwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19SRVNPVVJDRV9ESVJFQ1RPUlksIG9sZFJlc291cmNlRGlyZWN0b3J5LCByZXNvdXJjZURpcmVjdG9yeSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NEaXJlY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBjbGFzc0RpcmVjdG9yeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc0RpcmVjdG9yeShTdHJpbmcgbmV3Q2xhc3NEaXJlY3RvcnkpIHsKLSAgICAgICAgU3RyaW5nIG9sZENsYXNzRGlyZWN0b3J5ID0gY2xhc3NEaXJlY3Rvcnk7Ci0gICAgICAgIGNsYXNzRGlyZWN0b3J5ID0gbmV3Q2xhc3NEaXJlY3Rvcnk7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0NMQVNTX0RJUkVDVE9SWSwgb2xkQ2xhc3NEaXJlY3RvcnksIGNsYXNzRGlyZWN0b3J5KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRXc2RsRmlsZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB3c2RsRmlsZU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0V3NkbEZpbGVOYW1lKFN0cmluZyBuZXdXc2RsRmlsZU5hbWUpIHsKLSAgICAgICAgU3RyaW5nIG9sZFdzZGxGaWxlTmFtZSA9IHdzZGxGaWxlTmFtZTsKLSAgICAgICAgd3NkbEZpbGVOYW1lID0gbmV3V3NkbEZpbGVOYW1lOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19XU0RMX0ZJTEVfTkFNRSwgb2xkV3NkbEZpbGVOYW1lLCB3c2RsRmlsZU5hbWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgVVJMIGdldFdzZGxVUkwoKSB7Ci0gICAgICAgIHJldHVybiB3c2RsVVJMOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFdzZGxVUkwoVVJMIG5ld1dzZGxVUkwpIHsKLSAgICAgICAgVVJMIG9sZFdzZGxVUkwgPSB3c2RsVVJMOwotICAgICAgICB3c2RsVVJMID0gbmV3V3NkbFVSTDsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fV1NETF9VUkwsIG9sZFdzZGxVUkwsIHdzZGxVUkwpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbmZpZ1dzZGxMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGNvbmZpZ1dzZGxMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb25maWdXc2RsTG9jYXRpb24oU3RyaW5nIG5ld0NvbmZpZ1dzZGxMb2NhdGlvbikgewotICAgICAgICBTdHJpbmcgb2xkQ29uZmlnV3NkbExvY2F0aW9uID0gY29uZmlnV3NkbExvY2F0aW9uOwotICAgICAgICBjb25maWdXc2RsTG9jYXRpb24gPSBuZXdDb25maWdXc2RsTG9jYXRpb247Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0NPTkZJR19XU0RMX0xPQ0FUSU9OLCBvbGRDb25maWdXc2RsTG9jYXRpb24sIGNvbmZpZ1dzZGxMb2NhdGlvbikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gZnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZShTdHJpbmcgbmV3RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKSB7Ci0gICAgICAgIFN0cmluZyBvbGRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUgPSBmdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWU7Ci0gICAgICAgIGZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSA9IG5ld0Z1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZTsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fRlVMTFlfUVVBTElGSUVEX0pBVkFfQ0xBU1NfTkFNRSwgb2xkRnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lLCBmdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBmdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUoU3RyaW5nIG5ld0Z1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUpIHsKLSAgICAgICAgU3RyaW5nIG9sZEZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUgPSBmdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lOwotICAgICAgICBmdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lID0gbmV3RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZTsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fRlVMTFlfUVVBTElGSUVEX0pBVkFfSU5URVJGQUNFX05BTUUsIG9sZEZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUsIGZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbmZpZ0lkKCkgewotICAgICAgICByZXR1cm4gY29uZmlnSWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29uZmlnSWQoU3RyaW5nIG5ld0NvbmZpZ0lkKSB7Ci0gICAgICAgIFN0cmluZyBvbGRDb25maWdJZCA9IGNvbmZpZ0lkOwotICAgICAgICBjb25maWdJZCA9IG5ld0NvbmZpZ0lkOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19DT05GSUdfSUQsIG9sZENvbmZpZ0lkLCBjb25maWdJZCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgewotICAgICAgICByZXR1cm4gdGFyZ2V0TmFtZXNwYWNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldE5hbWVzcGFjZShTdHJpbmcgbmV3VGFyZ2V0TmFtZXNwYWNlKSB7Ci0gICAgICAgIFN0cmluZyBvbGRUYXJnZXROYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7Ci0gICAgICAgIHRhcmdldE5hbWVzcGFjZSA9IG5ld1RhcmdldE5hbWVzcGFjZTsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fVEFSR0VUX05BTUVTUEFDRSwgb2xkVGFyZ2V0TmFtZXNwYWNlLCB0YXJnZXROYW1lc3BhY2UpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVuZHBvaW50TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGVuZHBvaW50TmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmRwb2ludE5hbWUoU3RyaW5nIG5ld0VuZHBvaW50TmFtZSkgewotICAgICAgICBTdHJpbmcgb2xkRW5kcG9pbnROYW1lID0gZW5kcG9pbnROYW1lOwotICAgICAgICBlbmRwb2ludE5hbWUgPSBuZXdFbmRwb2ludE5hbWU7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0VORFBPSU5UX05BTUUsIG9sZEVuZHBvaW50TmFtZSwgZW5kcG9pbnROYW1lKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VOYW1lKFN0cmluZyBuZXdTZXJ2aWNlTmFtZSkgewotICAgICAgICBTdHJpbmcgb2xkU2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKLSAgICAgICAgc2VydmljZU5hbWUgPSBuZXdTZXJ2aWNlTmFtZTsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fU0VSVklDRV9OQU1FLCBvbGRTZXJ2aWNlTmFtZSwgc2VydmljZU5hbWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRGVmaW5pdGlvbiBnZXRXc2RsRGVmaW5pdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFdzZGxEZWZpbml0aW9uKERlZmluaXRpb24gbmV3V3NkbERlZmluaXRpb24pIHsKLSAgICAgICAgRGVmaW5pdGlvbiBvbGRXc2RsRGVmaW5pdGlvbiA9IHdzZGxEZWZpbml0aW9uOwotICAgICAgICB3c2RsRGVmaW5pdGlvbiA9IG5ld1dzZGxEZWZpbml0aW9uOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19XU0RMX0RFRklOSVRJT04sIG9sZFdzZGxEZWZpbml0aW9uLCB3c2RsRGVmaW5pdGlvbikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0V3NkbExvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gd3NkbExvY2F0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFdzZGxMb2NhdGlvbihTdHJpbmcgbmV3V3NkbExvY2F0aW9uKSB7Ci0gICAgICAgIFN0cmluZyBvbGRXc2RsTG9jYXRpb24gPSB3c2RsTG9jYXRpb247Ci0gICAgICAgIHdzZGxMb2NhdGlvbiA9IG5ld1dzZGxMb2NhdGlvbjsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fV1NETF9MT0NBVElPTiwgb2xkV3NkbExvY2F0aW9uLCB3c2RsTG9jYXRpb24pKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0RFRkFVTFRfUlVOVElNRV9MT0NBVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdFJ1bnRpbWVMb2NhdGlvbigpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19ERUZBVUxUX1JVTlRJTUVfVFlQRToKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdFJ1bnRpbWVUeXBlKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0RFRkFVTFRfUlVOVElNRV9WRVJTSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXREZWZhdWx0UnVudGltZVZlcnNpb24oKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fVkVSQk9TRToKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNWZXJib3NlKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0dFTkVSQVRFX0FOVF9CVUlMRF9GSUxFOgotICAgICAgICAgICAgICAgIHJldHVybiBpc0dlbmVyYXRlQW50QnVpbGRGaWxlKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0dFTkVSQVRFX0NMSUVOVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNHZW5lcmF0ZUNsaWVudCgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19HRU5FUkFURV9TRVJWRVI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzR2VuZXJhdGVTZXJ2ZXIoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fREFUQUJJTkRJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldERhdGFiaW5kaW5nKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0ZST05URU5EOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRGcm9udGVuZCgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19VU0VfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzVXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0VYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNFeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fSU5TVEFMTEFUSU9OUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SW5zdGFsbGF0aW9ucygpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19QUk9KRUNUX05BTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFByb2plY3ROYW1lKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1JFU09VUkNFX0RJUkVDVE9SWToKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UmVzb3VyY2VEaXJlY3RvcnkoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fQ0xBU1NfRElSRUNUT1JZOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRDbGFzc0RpcmVjdG9yeSgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19XU0RMX0ZJTEVfTkFNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0V3NkbEZpbGVOYW1lKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1dTRExfVVJMOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRXc2RsVVJMKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0NPTkZJR19XU0RMX0xPQ0FUSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRDb25maWdXc2RsTG9jYXRpb24oKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fRlVMTFlfUVVBTElGSUVEX0pBVkFfQ0xBU1NfTkFNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0ZVTExZX1FVQUxJRklFRF9KQVZBX0lOVEVSRkFDRV9OQU1FOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0NPTkZJR19JRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q29uZmlnSWQoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fVEFSR0VUX05BTUVTUEFDRToKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0VORFBPSU5UX05BTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEVuZHBvaW50TmFtZSgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19TRVJWSUNFX05BTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFNlcnZpY2VOYW1lKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1dTRExfREVGSU5JVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0V3NkbERlZmluaXRpb24oKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fV1NETF9MT0NBVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0V3NkbExvY2F0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fREVGQVVMVF9SVU5USU1FX0xPQ0FUSU9OOgotICAgICAgICAgICAgICAgIHNldERlZmF1bHRSdW50aW1lTG9jYXRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19ERUZBVUxUX1JVTlRJTUVfVFlQRToKLSAgICAgICAgICAgICAgICBzZXREZWZhdWx0UnVudGltZVR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19ERUZBVUxUX1JVTlRJTUVfVkVSU0lPTjoKLSAgICAgICAgICAgICAgICBzZXREZWZhdWx0UnVudGltZVZlcnNpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19WRVJCT1NFOgotICAgICAgICAgICAgICAgIHNldFZlcmJvc2UoKEJvb2xlYW4pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEU6Ci0gICAgICAgICAgICAgICAgc2V0R2VuZXJhdGVBbnRCdWlsZEZpbGUoKEJvb2xlYW4pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fR0VORVJBVEVfQ0xJRU5UOgotICAgICAgICAgICAgICAgIHNldEdlbmVyYXRlQ2xpZW50KChCb29sZWFuKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1NFUlZFUjoKLSAgICAgICAgICAgICAgICBzZXRHZW5lcmF0ZVNlcnZlcigoQm9vbGVhbiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19EQVRBQklORElORzoKLSAgICAgICAgICAgICAgICBzZXREYXRhYmluZGluZygoRGF0YUJpbmRpbmcpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fRlJPTlRFTkQ6Ci0gICAgICAgICAgICAgICAgc2V0RnJvbnRlbmQoKEZyb250ZW5kKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1VTRV9TUFJJTkdfQVBQTElDQVRJT05fQ09OVEVYVDoKLSAgICAgICAgICAgICAgICBzZXRVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoKEJvb2xlYW4pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSOgotICAgICAgICAgICAgICAgIHNldEV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcigoQm9vbGVhbiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19JTlNUQUxMQVRJT05TOgotICAgICAgICAgICAgICAgIHNldEluc3RhbGxhdGlvbnMoKE1hcDxTdHJpbmcsIENYRkluc3RhbGw+KW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1BST0pFQ1RfTkFNRToKLSAgICAgICAgICAgICAgICBzZXRQcm9qZWN0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1JFU09VUkNFX0RJUkVDVE9SWToKLSAgICAgICAgICAgICAgICBzZXRSZXNvdXJjZURpcmVjdG9yeSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0NMQVNTX0RJUkVDVE9SWToKLSAgICAgICAgICAgICAgICBzZXRDbGFzc0RpcmVjdG9yeSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1dTRExfRklMRV9OQU1FOgotICAgICAgICAgICAgICAgIHNldFdzZGxGaWxlTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1dTRExfVVJMOgotICAgICAgICAgICAgICAgIHNldFdzZGxVUkwoKFVSTCluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19DT05GSUdfV1NETF9MT0NBVElPTjoKLSAgICAgICAgICAgICAgICBzZXRDb25maWdXc2RsTG9jYXRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19GVUxMWV9RVUFMSUZJRURfSkFWQV9DTEFTU19OQU1FOgotICAgICAgICAgICAgICAgIHNldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0ZVTExZX1FVQUxJRklFRF9KQVZBX0lOVEVSRkFDRV9OQU1FOgotICAgICAgICAgICAgICAgIHNldEZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19DT05GSUdfSUQ6Ci0gICAgICAgICAgICAgICAgc2V0Q29uZmlnSWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19UQVJHRVRfTkFNRVNQQUNFOgotICAgICAgICAgICAgICAgIHNldFRhcmdldE5hbWVzcGFjZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0VORFBPSU5UX05BTUU6Ci0gICAgICAgICAgICAgICAgc2V0RW5kcG9pbnROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fU0VSVklDRV9OQU1FOgotICAgICAgICAgICAgICAgIHNldFNlcnZpY2VOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fV1NETF9ERUZJTklUSU9OOgotICAgICAgICAgICAgICAgIHNldFdzZGxEZWZpbml0aW9uKChEZWZpbml0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1dTRExfTE9DQVRJT046Ci0gICAgICAgICAgICAgICAgc2V0V3NkbExvY2F0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0RFRkFVTFRfUlVOVElNRV9MT0NBVElPTjoKLSAgICAgICAgICAgICAgICBzZXREZWZhdWx0UnVudGltZUxvY2F0aW9uKERFRkFVTFRfUlVOVElNRV9MT0NBVElPTl9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19ERUZBVUxUX1JVTlRJTUVfVFlQRToKLSAgICAgICAgICAgICAgICBzZXREZWZhdWx0UnVudGltZVR5cGUoREVGQVVMVF9SVU5USU1FX1RZUEVfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fREVGQVVMVF9SVU5USU1FX1ZFUlNJT046Ci0gICAgICAgICAgICAgICAgc2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKERFRkFVTFRfUlVOVElNRV9WRVJTSU9OX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1ZFUkJPU0U6Ci0gICAgICAgICAgICAgICAgc2V0VmVyYm9zZShWRVJCT1NFX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0dFTkVSQVRFX0FOVF9CVUlMRF9GSUxFOgotICAgICAgICAgICAgICAgIHNldEdlbmVyYXRlQW50QnVpbGRGaWxlKEdFTkVSQVRFX0FOVF9CVUlMRF9GSUxFX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0dFTkVSQVRFX0NMSUVOVDoKLSAgICAgICAgICAgICAgICBzZXRHZW5lcmF0ZUNsaWVudChHRU5FUkFURV9DTElFTlRfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fR0VORVJBVEVfU0VSVkVSOgotICAgICAgICAgICAgICAgIHNldEdlbmVyYXRlU2VydmVyKEdFTkVSQVRFX1NFUlZFUl9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19EQVRBQklORElORzoKLSAgICAgICAgICAgICAgICBzZXREYXRhYmluZGluZyhEQVRBQklORElOR19FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19GUk9OVEVORDoKLSAgICAgICAgICAgICAgICBzZXRGcm9udGVuZChGUk9OVEVORF9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19VU0VfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFQ6Ci0gICAgICAgICAgICAgICAgc2V0VXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KFVTRV9TUFJJTkdfQVBQTElDQVRJT05fQ09OVEVYVF9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19FWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVI6Ci0gICAgICAgICAgICAgICAgc2V0RXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyKEVYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUl9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19JTlNUQUxMQVRJT05TOgotICAgICAgICAgICAgICAgIHNldEluc3RhbGxhdGlvbnMoKE1hcDxTdHJpbmcsIENYRkluc3RhbGw+KW51bGwpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fUFJPSkVDVF9OQU1FOgotICAgICAgICAgICAgICAgIHNldFByb2plY3ROYW1lKFBST0pFQ1RfTkFNRV9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19SRVNPVVJDRV9ESVJFQ1RPUlk6Ci0gICAgICAgICAgICAgICAgc2V0UmVzb3VyY2VEaXJlY3RvcnkoUkVTT1VSQ0VfRElSRUNUT1JZX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0NMQVNTX0RJUkVDVE9SWToKLSAgICAgICAgICAgICAgICBzZXRDbGFzc0RpcmVjdG9yeShDTEFTU19ESVJFQ1RPUllfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fV1NETF9GSUxFX05BTUU6Ci0gICAgICAgICAgICAgICAgc2V0V3NkbEZpbGVOYW1lKFdTRExfRklMRV9OQU1FX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1dTRExfVVJMOgotICAgICAgICAgICAgICAgIHNldFdzZGxVUkwoV1NETF9VUkxfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fQ09ORklHX1dTRExfTE9DQVRJT046Ci0gICAgICAgICAgICAgICAgc2V0Q29uZmlnV3NkbExvY2F0aW9uKENPTkZJR19XU0RMX0xPQ0FUSU9OX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0ZVTExZX1FVQUxJRklFRF9KQVZBX0NMQVNTX05BTUU6Ci0gICAgICAgICAgICAgICAgc2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKEZVTExZX1FVQUxJRklFRF9KQVZBX0NMQVNTX05BTUVfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fRlVMTFlfUVVBTElGSUVEX0pBVkFfSU5URVJGQUNFX05BTUU6Ci0gICAgICAgICAgICAgICAgc2V0RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZShGVUxMWV9RVUFMSUZJRURfSkFWQV9JTlRFUkZBQ0VfTkFNRV9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19DT05GSUdfSUQ6Ci0gICAgICAgICAgICAgICAgc2V0Q29uZmlnSWQoQ09ORklHX0lEX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1RBUkdFVF9OQU1FU1BBQ0U6Ci0gICAgICAgICAgICAgICAgc2V0VGFyZ2V0TmFtZXNwYWNlKFRBUkdFVF9OQU1FU1BBQ0VfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fRU5EUE9JTlRfTkFNRToKLSAgICAgICAgICAgICAgICBzZXRFbmRwb2ludE5hbWUoRU5EUE9JTlRfTkFNRV9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19TRVJWSUNFX05BTUU6Ci0gICAgICAgICAgICAgICAgc2V0U2VydmljZU5hbWUoU0VSVklDRV9OQU1FX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1dTRExfREVGSU5JVElPTjoKLSAgICAgICAgICAgICAgICBzZXRXc2RsRGVmaW5pdGlvbihXU0RMX0RFRklOSVRJT05fRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fV1NETF9MT0NBVElPTjoKLSAgICAgICAgICAgICAgICBzZXRXc2RsTG9jYXRpb24oV1NETF9MT0NBVElPTl9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0RFRkFVTFRfUlVOVElNRV9MT0NBVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gREVGQVVMVF9SVU5USU1FX0xPQ0FUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZWZhdWx0UnVudGltZUxvY2F0aW9uICE9IG51bGwgOiAhREVGQVVMVF9SVU5USU1FX0xPQ0FUSU9OX0VERUZBVUxULmVxdWFscyhkZWZhdWx0UnVudGltZUxvY2F0aW9uKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fREVGQVVMVF9SVU5USU1FX1RZUEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIERFRkFVTFRfUlVOVElNRV9UWVBFX0VERUZBVUxUID09IG51bGwgPyBkZWZhdWx0UnVudGltZVR5cGUgIT0gbnVsbCA6ICFERUZBVUxUX1JVTlRJTUVfVFlQRV9FREVGQVVMVC5lcXVhbHMoZGVmYXVsdFJ1bnRpbWVUeXBlKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fREVGQVVMVF9SVU5USU1FX1ZFUlNJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIERFRkFVTFRfUlVOVElNRV9WRVJTSU9OX0VERUZBVUxUID09IG51bGwgPyBkZWZhdWx0UnVudGltZVZlcnNpb24gIT0gbnVsbCA6ICFERUZBVUxUX1JVTlRJTUVfVkVSU0lPTl9FREVGQVVMVC5lcXVhbHMoZGVmYXVsdFJ1bnRpbWVWZXJzaW9uKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fVkVSQk9TRToKLSAgICAgICAgICAgICAgICByZXR1cm4gdmVyYm9zZSAhPSBWRVJCT1NFX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19HRU5FUkFURV9BTlRfQlVJTERfRklMRToKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVBbnRCdWlsZEZpbGUgIT0gR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEVfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0dFTkVSQVRFX0NMSUVOVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVDbGllbnQgIT0gR0VORVJBVEVfQ0xJRU5UX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19HRU5FUkFURV9TRVJWRVI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlU2VydmVyICE9IEdFTkVSQVRFX1NFUlZFUl9FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fREFUQUJJTkRJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGFiaW5kaW5nICE9IERBVEFCSU5ESU5HX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19GUk9OVEVORDoKLSAgICAgICAgICAgICAgICByZXR1cm4gZnJvbnRlbmQgIT0gRlJPTlRFTkRfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1VTRV9TUFJJTkdfQVBQTElDQVRJT05fQ09OVEVYVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gdXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0ICE9IFVTRV9TUFJJTkdfQVBQTElDQVRJT05fQ09OVEVYVF9FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSOgotICAgICAgICAgICAgICAgIHJldHVybiBleHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIgIT0gRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19JTlNUQUxMQVRJT05TOgotICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YWxsYXRpb25zICE9IG51bGw7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1BST0pFQ1RfTkFNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gUFJPSkVDVF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBwcm9qZWN0TmFtZSAhPSBudWxsIDogIVBST0pFQ1RfTkFNRV9FREVGQVVMVC5lcXVhbHMocHJvamVjdE5hbWUpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19SRVNPVVJDRV9ESVJFQ1RPUlk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFJFU09VUkNFX0RJUkVDVE9SWV9FREVGQVVMVCA9PSBudWxsID8gcmVzb3VyY2VEaXJlY3RvcnkgIT0gbnVsbCA6ICFSRVNPVVJDRV9ESVJFQ1RPUllfRURFRkFVTFQuZXF1YWxzKHJlc291cmNlRGlyZWN0b3J5KTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fQ0xBU1NfRElSRUNUT1JZOgotICAgICAgICAgICAgICAgIHJldHVybiBDTEFTU19ESVJFQ1RPUllfRURFRkFVTFQgPT0gbnVsbCA/IGNsYXNzRGlyZWN0b3J5ICE9IG51bGwgOiAhQ0xBU1NfRElSRUNUT1JZX0VERUZBVUxULmVxdWFscyhjbGFzc0RpcmVjdG9yeSk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1dTRExfRklMRV9OQU1FOgotICAgICAgICAgICAgICAgIHJldHVybiBXU0RMX0ZJTEVfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gd3NkbEZpbGVOYW1lICE9IG51bGwgOiAhV1NETF9GSUxFX05BTUVfRURFRkFVTFQuZXF1YWxzKHdzZGxGaWxlTmFtZSk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1dTRExfVVJMOgotICAgICAgICAgICAgICAgIHJldHVybiBXU0RMX1VSTF9FREVGQVVMVCA9PSBudWxsID8gd3NkbFVSTCAhPSBudWxsIDogIVdTRExfVVJMX0VERUZBVUxULmVxdWFscyh3c2RsVVJMKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fQ09ORklHX1dTRExfTE9DQVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENPTkZJR19XU0RMX0xPQ0FUSU9OX0VERUZBVUxUID09IG51bGwgPyBjb25maWdXc2RsTG9jYXRpb24gIT0gbnVsbCA6ICFDT05GSUdfV1NETF9MT0NBVElPTl9FREVGQVVMVC5lcXVhbHMoY29uZmlnV3NkbExvY2F0aW9uKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fRlVMTFlfUVVBTElGSUVEX0pBVkFfQ0xBU1NfTkFNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gRlVMTFlfUVVBTElGSUVEX0pBVkFfQ0xBU1NfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gZnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lICE9IG51bGwgOiAhRlVMTFlfUVVBTElGSUVEX0pBVkFfQ0xBU1NfTkFNRV9FREVGQVVMVC5lcXVhbHMoZnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fRlVMTFlfUVVBTElGSUVEX0pBVkFfSU5URVJGQUNFX05BTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZVTExZX1FVQUxJRklFRF9KQVZBX0lOVEVSRkFDRV9OQU1FX0VERUZBVUxUID09IG51bGwgPyBmdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lICE9IG51bGwgOiAhRlVMTFlfUVVBTElGSUVEX0pBVkFfSU5URVJGQUNFX05BTUVfRURFRkFVTFQuZXF1YWxzKGZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19DT05GSUdfSUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENPTkZJR19JRF9FREVGQVVMVCA9PSBudWxsID8gY29uZmlnSWQgIT0gbnVsbCA6ICFDT05GSUdfSURfRURFRkFVTFQuZXF1YWxzKGNvbmZpZ0lkKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fVEFSR0VUX05BTUVTUEFDRToKLSAgICAgICAgICAgICAgICByZXR1cm4gVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVCA9PSBudWxsID8gdGFyZ2V0TmFtZXNwYWNlICE9IG51bGwgOiAhVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVC5lcXVhbHModGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fRU5EUE9JTlRfTkFNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gRU5EUE9JTlRfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gZW5kcG9pbnROYW1lICE9IG51bGwgOiAhRU5EUE9JTlRfTkFNRV9FREVGQVVMVC5lcXVhbHMoZW5kcG9pbnROYW1lKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fU0VSVklDRV9OQU1FOgotICAgICAgICAgICAgICAgIHJldHVybiBTRVJWSUNFX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHNlcnZpY2VOYW1lICE9IG51bGwgOiAhU0VSVklDRV9OQU1FX0VERUZBVUxULmVxdWFscyhzZXJ2aWNlTmFtZSk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1dTRExfREVGSU5JVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gV1NETF9ERUZJTklUSU9OX0VERUZBVUxUID09IG51bGwgPyB3c2RsRGVmaW5pdGlvbiAhPSBudWxsIDogIVdTRExfREVGSU5JVElPTl9FREVGQVVMVC5lcXVhbHMod3NkbERlZmluaXRpb24pOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19XU0RMX0xPQ0FUSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBXU0RMX0xPQ0FUSU9OX0VERUZBVUxUID09IG51bGwgPyB3c2RsTG9jYXRpb24gIT0gbnVsbCA6ICFXU0RMX0xPQ0FUSU9OX0VERUZBVUxULmVxdWFscyh3c2RsTG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiAoZGVmYXVsdFJ1bnRpbWVMb2NhdGlvbjogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoZGVmYXVsdFJ1bnRpbWVMb2NhdGlvbik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZGVmYXVsdFJ1bnRpbWVUeXBlOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChkZWZhdWx0UnVudGltZVR5cGUpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGRlZmF1bHRSdW50aW1lVmVyc2lvbjogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoZGVmYXVsdFJ1bnRpbWVWZXJzaW9uKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCB2ZXJib3NlOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCh2ZXJib3NlKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBnZW5lcmF0ZUFudEJ1aWxkRmlsZTogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoZ2VuZXJhdGVBbnRCdWlsZEZpbGUpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGdlbmVyYXRlQ2xpZW50OiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChnZW5lcmF0ZUNsaWVudCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZ2VuZXJhdGVTZXJ2ZXI6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGdlbmVyYXRlU2VydmVyKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBkYXRhYmluZGluZzogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoZGF0YWJpbmRpbmcpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGZyb250ZW5kOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChmcm9udGVuZCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgdXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0OiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCh1c2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcjogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoZXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBpbnN0YWxsYXRpb25zOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChpbnN0YWxsYXRpb25zKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBwcm9qZWN0TmFtZTogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQocHJvamVjdE5hbWUpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHJlc291cmNlRGlyZWN0b3J5OiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChyZXNvdXJjZURpcmVjdG9yeSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgY2xhc3NEaXJlY3Rvcnk6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGNsYXNzRGlyZWN0b3J5KTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCB3c2RsRmlsZU5hbWU6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHdzZGxGaWxlTmFtZSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgd3NkbFVSTDogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQod3NkbFVSTCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgY29uZmlnV3NkbExvY2F0aW9uOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChjb25maWdXc2RsTG9jYXRpb24pOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZTogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoZnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBmdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChmdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBjb25maWdJZDogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoY29uZmlnSWQpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHRhcmdldE5hbWVzcGFjZTogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQodGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBlbmRwb2ludE5hbWU6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGVuZHBvaW50TmFtZSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgc2VydmljZU5hbWU6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCB3c2RsRGVmaW5pdGlvbjogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQod3NkbERlZmluaXRpb24pOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHdzZGxMb2NhdGlvbjogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQod3NkbExvY2F0aW9uKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgnKScpOwotICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi19IC8vQ1hGRGF0YU1vZGVsSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9pbXBsL0NYRkZhY3RvcnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL2ltcGwvQ1hGRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM3YzYxMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL2ltcGwvQ1hGRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKiAkSWQ6IENYRkZhY3RvcnlJbXBsLmphdmEsdiAxLjIgMjAxMC8wMS8xNyAxOTo1Njo1NiBzY2xhcmtlIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC4qOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ1hGRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBDWEZGYWN0b3J5IHsKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDWEZGYWN0b3J5IGluaXQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDWEZGYWN0b3J5IHRoZUNYRkZhY3RvcnkgPSAoQ1hGRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiaHR0cDovLy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwuZWNvcmUiKTsgCi0gICAgICAgICAgICBpZiAodGhlQ1hGRmFjdG9yeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoZUNYRkZhY3Rvcnk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLSAgICAgICAgICAgIEVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgQ1hGRmFjdG9yeUltcGwoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBDWEZGYWN0b3J5SW1wbCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotICAgICAgICBzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUw6IHJldHVybiAoRU9iamVjdCljcmVhdGVKYXZhMldTRGF0YU1vZGVsKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlV1NETDJKYXZhRGF0YU1vZGVsKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0lOU1RBTEw6IHJldHVybiAoRU9iamVjdCljcmVhdGVDWEZJbnN0YWxsKCk7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotICAgICAgICBzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkZST05URU5EOgotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVGcm9udGVuZEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkRBVEFfQklORElORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlRGF0YUJpbmRpbmdGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5VUkw6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVVSTEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkRFRklOSVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZURlZmluaXRpb25Gcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5NQVA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZU1hcEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLklNRVRIT0Q6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUlNZXRob2RGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0gICAgICAgIHN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuRlJPTlRFTkQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRGcm9udGVuZFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuREFUQV9CSU5ESU5HOgotICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0RGF0YUJpbmRpbmdUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLlVSTDoKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydFVSTFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuREVGSU5JVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydERlZmluaXRpb25Ub1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLk1BUDoKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydE1hcFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSU1FVEhPRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydElNZXRob2RUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEphdmEyV1NEYXRhTW9kZWwgY3JlYXRlSmF2YTJXU0RhdGFNb2RlbCgpIHsKLSAgICAgICAgSmF2YTJXU0RhdGFNb2RlbEltcGwgamF2YTJXU0RhdGFNb2RlbCA9IG5ldyBKYXZhMldTRGF0YU1vZGVsSW1wbCgpOwotICAgICAgICByZXR1cm4gamF2YTJXU0RhdGFNb2RlbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgV1NETDJKYXZhRGF0YU1vZGVsIGNyZWF0ZVdTREwySmF2YURhdGFNb2RlbCgpIHsKLSAgICAgICAgV1NETDJKYXZhRGF0YU1vZGVsSW1wbCB3c2RsMkphdmFEYXRhTW9kZWwgPSBuZXcgV1NETDJKYXZhRGF0YU1vZGVsSW1wbCgpOwotICAgICAgICByZXR1cm4gd3NkbDJKYXZhRGF0YU1vZGVsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBDWEZJbnN0YWxsIGNyZWF0ZUNYRkluc3RhbGwoKSB7Ci0gICAgICAgIENYRkluc3RhbGxJbXBsIGN4Zkluc3RhbGwgPSBuZXcgQ1hGSW5zdGFsbEltcGwoKTsKLSAgICAgICAgcmV0dXJuIGN4Zkluc3RhbGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEZyb250ZW5kIGNyZWF0ZUZyb250ZW5kRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0gICAgICAgIEZyb250ZW5kIHJlc3VsdCA9IEZyb250ZW5kLmdldChpbml0aWFsVmFsdWUpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRGcm9udGVuZFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBEYXRhQmluZGluZyBjcmVhdGVEYXRhQmluZGluZ0Zyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotICAgICAgICBEYXRhQmluZGluZyByZXN1bHQgPSBEYXRhQmluZGluZy5nZXQoaW5pdGlhbFZhbHVlKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBjb252ZXJ0RGF0YUJpbmRpbmdUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotICAgICAgICByZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgVVJMIGNyZWF0ZVVSTEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotICAgICAgICByZXR1cm4gKFVSTClzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRVUkxUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotICAgICAgICByZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIERlZmluaXRpb24gY3JlYXRlRGVmaW5pdGlvbkZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotICAgICAgICByZXR1cm4gKERlZmluaXRpb24pc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBjb252ZXJ0RGVmaW5pdGlvblRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwPD8sID8+IGNyZWF0ZU1hcEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotICAgICAgICByZXR1cm4gKE1hcDw/LCA/PilzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGluaXRpYWxWYWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBjb252ZXJ0TWFwVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhpbnN0YW5jZVZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgSU1ldGhvZCBjcmVhdGVJTWV0aG9kRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0gICAgICAgIHJldHVybiAoSU1ldGhvZClzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRJTWV0aG9kVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBDWEZQYWNrYWdlIGdldENYRlBhY2thZ2UoKSB7Ci0gICAgICAgIHJldHVybiAoQ1hGUGFja2FnZSlnZXRFUGFja2FnZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgc3RhdGljIENYRlBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIENYRlBhY2thZ2UuZUlOU1RBTkNFOwotICAgIH0KLQotfSAvL0NYRkZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL2ltcGwvQ1hGSW5zdGFsbEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvaW1wbC9DWEZJbnN0YWxsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGMyODFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvaW1wbC9DWEZJbnN0YWxsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDEwIFNoYW5lIENsYXJrZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoKLSAqICRJZDogQ1hGSW5zdGFsbEltcGwuamF2YSx2IDEuMSAyMDEwLzAxLzE3IDE5OjU2OjU2IHNjbGFya2UgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZJbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW5zdGFsbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGSW5zdGFsbEltcGwjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGSW5zdGFsbEltcGwjZ2V0TG9jYXRpb24gPGVtPkxvY2F0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZJbnN0YWxsSW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ1hGSW5zdGFsbEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIENYRkluc3RhbGwgewotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFZlcnNpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fRURFRkFVTFQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRWZXJzaW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHZlcnNpb24gPSBWRVJTSU9OX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2F0aW9uKCkgPGVtPkxvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRMb2NhdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYXRpb24oKSA8ZW0+TG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldExvY2F0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGxvY2F0aW9uID0gTE9DQVRJT05fRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRUeXBlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0VERUZBVUxUID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0VHlwZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBDWEZJbnN0YWxsSW1wbCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIENYRlBhY2thZ2UuTGl0ZXJhbHMuQ1hGX0lOU1RBTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gdmVyc2lvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyBuZXdWZXJzaW9uKSB7Ci0gICAgICAgIFN0cmluZyBvbGRWZXJzaW9uID0gdmVyc2lvbjsKLSAgICAgICAgdmVyc2lvbiA9IG5ld1ZlcnNpb247Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0lOU1RBTExfX1ZFUlNJT04sIG9sZFZlcnNpb24sIHZlcnNpb24pKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gbG9jYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIG5ld0xvY2F0aW9uKSB7Ci0gICAgICAgIFN0cmluZyBvbGRMb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgICAgICBsb2NhdGlvbiA9IG5ld0xvY2F0aW9uOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkNYRl9JTlNUQUxMX19MT0NBVElPTiwgb2xkTG9jYXRpb24sIGxvY2F0aW9uKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyBuZXdUeXBlKSB7Ci0gICAgICAgIFN0cmluZyBvbGRUeXBlID0gdHlwZTsKLSAgICAgICAgdHlwZSA9IG5ld1R5cGU7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0lOU1RBTExfX1RZUEUsIG9sZFR5cGUsIHR5cGUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0lOU1RBTExfX1ZFUlNJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFZlcnNpb24oKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfSU5TVEFMTF9fTE9DQVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldExvY2F0aW9uKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0lOU1RBTExfX1RZUEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFR5cGUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9JTlNUQUxMX19WRVJTSU9OOgotICAgICAgICAgICAgICAgIHNldFZlcnNpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9JTlNUQUxMX19MT0NBVElPTjoKLSAgICAgICAgICAgICAgICBzZXRMb2NhdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0lOU1RBTExfX1RZUEU6Ci0gICAgICAgICAgICAgICAgc2V0VHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9JTlNUQUxMX19WRVJTSU9OOgotICAgICAgICAgICAgICAgIHNldFZlcnNpb24oVkVSU0lPTl9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9JTlNUQUxMX19MT0NBVElPTjoKLSAgICAgICAgICAgICAgICBzZXRMb2NhdGlvbihMT0NBVElPTl9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9JTlNUQUxMX19UWVBFOgotICAgICAgICAgICAgICAgIHNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0lOU1RBTExfX1ZFUlNJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFZFUlNJT05fRURFRkFVTFQgPT0gbnVsbCA/IHZlcnNpb24gIT0gbnVsbCA6ICFWRVJTSU9OX0VERUZBVUxULmVxdWFscyh2ZXJzaW9uKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfSU5TVEFMTF9fTE9DQVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIExPQ0FUSU9OX0VERUZBVUxUID09IG51bGwgPyBsb2NhdGlvbiAhPSBudWxsIDogIUxPQ0FUSU9OX0VERUZBVUxULmVxdWFscyhsb2NhdGlvbik7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0lOU1RBTExfX1RZUEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGUgIT0gbnVsbCA6ICFUWVBFX0VERUZBVUxULmVxdWFscyh0eXBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0gICAgICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIgKHZlcnNpb246ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHZlcnNpb24pOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGxvY2F0aW9uOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChsb2NhdGlvbik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgdHlwZTogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQodHlwZSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLQotfSAvL0NYRkluc3RhbGxJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL2ltcGwvQ1hGUGFja2FnZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvaW1wbC9DWEZQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTkwNDE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvaW1wbC9DWEZQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzOCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKiAkSWQ6IENYRlBhY2thZ2VJbXBsLmphdmEsdiAxLjYgMjAxMC8wMS8xNyAxOTo1Njo1NiBzY2xhcmtlIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUdlbmVyaWNUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZJbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5EYXRhQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuRnJvbnRlbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWw7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDWEZQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIENYRlBhY2thZ2UgewotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGN4ZkNvbnRleHRFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgY3hmRGF0YU1vZGVsRUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGphdmEyV1NDb250ZXh0RUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGphdmEyV1NEYXRhTW9kZWxFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3Mgd3NkbDJKYXZhQ29udGV4dEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyB3c2RsMkphdmFEYXRhTW9kZWxFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgY3hmSW5zdGFsbEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVFbnVtIGZyb250ZW5kRUVudW0gPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFRW51bSBkYXRhQmluZGluZ0VFbnVtID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRURhdGFUeXBlIHVybEVEYXRhVHlwZSA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVEYXRhVHlwZSBkZWZpbml0aW9uRURhdGFUeXBlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRURhdGFUeXBlIG1hcEVEYXRhVHlwZSA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVEYXRhVHlwZSBpTWV0aG9kRURhdGFUeXBlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLSAgICAgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotICAgICAqIHBhY2thZ2UgVVJJIHZhbHVlLgotICAgICAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLSAgICAgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotICAgICAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0gICAgICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZQYWNrYWdlI2VOU19VUkkKLSAgICAgKiBAc2VlICNpbml0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBDWEZQYWNrYWdlSW1wbCgpIHsKLSAgICAgICAgc3VwZXIoZU5TX1VSSSwgQ1hGRmFjdG9yeS5lSU5TVEFOQ0UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcyBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4KLSAgICAgKiAKLSAgICAgKiA8cD5UaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGluaXRpYWxpemUge0BsaW5rIENYRlBhY2thZ2UjZUlOU1RBTkNFfSB3aGVuIHRoYXQgZmllbGQgaXMgYWNjZXNzZWQuCi0gICAgICogQ2xpZW50cyBzaG91bGQgbm90IGludm9rZSBpdCBkaXJlY3RseS4gSW5zdGVhZCwgdGhleSBzaG91bGQgc2ltcGx5IGFjY2VzcyB0aGF0IGZpZWxkIHRvIG9idGFpbiB0aGUgcGFja2FnZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2VOU19VUkkKLSAgICAgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotICAgICAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENYRlBhY2thZ2UgaW5pdCgpIHsKLSAgICAgICAgaWYgKGlzSW5pdGVkKSByZXR1cm4gKENYRlBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ1hGUGFja2FnZS5lTlNfVVJJKTsKLQotICAgICAgICAvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0gICAgICAgIENYRlBhY2thZ2VJbXBsIHRoZUNYRlBhY2thZ2UgPSAoQ1hGUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mIENYRlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIDogbmV3IENYRlBhY2thZ2VJbXBsKCkpOwotCi0gICAgICAgIGlzSW5pdGVkID0gdHJ1ZTsKLQotICAgICAgICAvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwotICAgICAgICB0aGVDWEZQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0gICAgICAgIC8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLSAgICAgICAgdGhlQ1hGUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLSAgICAgICAgLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotICAgICAgICB0aGVDWEZQYWNrYWdlLmZyZWV6ZSgpOwotCi0gIAotICAgICAgICAvLyBVcGRhdGUgdGhlIHJlZ2lzdHJ5IGFuZCByZXR1cm4gdGhlIHBhY2thZ2UKLSAgICAgICAgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UucHV0KENYRlBhY2thZ2UuZU5TX1VSSSwgdGhlQ1hGUGFja2FnZSk7Ci0gICAgICAgIHJldHVybiB0aGVDWEZQYWNrYWdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0Q1hGQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGN4ZkNvbnRleHRFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q1hGQ29udGV4dF9EZWZhdWx0UnVudGltZUxvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpY3hmQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldENYRkNvbnRleHRfRGVmYXVsdFJ1bnRpbWVUeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpY3hmQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldENYRkNvbnRleHRfRGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpY3hmQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldENYRkNvbnRleHRfVmVyYm9zZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWN4ZkNvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDWEZDb250ZXh0X0dlbmVyYXRlQW50QnVpbGRGaWxlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpY3hmQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldENYRkNvbnRleHRfR2VuZXJhdGVDbGllbnQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSljeGZDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q1hGQ29udGV4dF9HZW5lcmF0ZVNlcnZlcigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWN4ZkNvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDWEZDb250ZXh0X0RhdGFiaW5kaW5nKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpY3hmQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldENYRkNvbnRleHRfRnJvbnRlbmQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSljeGZDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q1hGQ29udGV4dF9Vc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSljeGZDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q1hGQ29udGV4dF9FeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSljeGZDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldENYRkNvbnRleHRfSW5zdGFsbGF0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWN4ZkNvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRDWEZEYXRhTW9kZWwoKSB7Ci0gICAgICAgIHJldHVybiBjeGZEYXRhTW9kZWxFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q1hGRGF0YU1vZGVsX1Byb2plY3ROYW1lKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpY3hmRGF0YU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q1hGRGF0YU1vZGVsX1Jlc291cmNlRGlyZWN0b3J5KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpY3hmRGF0YU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q1hGRGF0YU1vZGVsX0NsYXNzRGlyZWN0b3J5KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpY3hmRGF0YU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q1hGRGF0YU1vZGVsX1dzZGxGaWxlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWN4ZkRhdGFNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldENYRkRhdGFNb2RlbF9Xc2RsVVJMKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpY3hmRGF0YU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q1hGRGF0YU1vZGVsX0NvbmZpZ1dzZGxMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWN4ZkRhdGFNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldENYRkRhdGFNb2RlbF9GdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSljeGZEYXRhTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDWEZEYXRhTW9kZWxfRnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWN4ZkRhdGFNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldENYRkRhdGFNb2RlbF9Db25maWdJZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWN4ZkRhdGFNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldENYRkRhdGFNb2RlbF9UYXJnZXROYW1lc3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSljeGZEYXRhTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDWEZEYXRhTW9kZWxfRW5kcG9pbnROYW1lKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpY3hmRGF0YU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldENYRkRhdGFNb2RlbF9TZXJ2aWNlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWN4ZkRhdGFNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDExKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDWEZEYXRhTW9kZWxfV3NkbERlZmluaXRpb24oKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSljeGZEYXRhTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q1hGRGF0YU1vZGVsX1dzZGxMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWN4ZkRhdGFNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldEphdmEyV1NDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gamF2YTJXU0NvbnRleHRFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0NvbnRleHRfU29hcDEyQmluZGluZygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWphdmEyV1NDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVYU0RJbXBvcnRzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpamF2YTJXU0NvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVdTREwoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlqYXZhMldTQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlqYXZhMldTQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldEphdmEyV1NDb250ZXh0X0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWphdmEyV1NDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpamF2YTJXU0NvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWphdmEyV1NDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlqYXZhMldTQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWphdmEyV1NDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRKYXZhMldTRGF0YU1vZGVsKCkgewotICAgICAgICByZXR1cm4gamF2YTJXU0RhdGFNb2RlbEVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKYXZhMldTRGF0YU1vZGVsX0NsYXNzcGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWphdmEyV1NEYXRhTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKYXZhMldTRGF0YU1vZGVsX0phdmFTdGFydGluZ1BvaW50KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpamF2YTJXU0RhdGFNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldEphdmEyV1NEYXRhTW9kZWxfVXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpamF2YTJXU0RhdGFNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldEphdmEyV1NEYXRhTW9kZWxfRXh0cmFjdEludGVyZmFjZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWphdmEyV1NEYXRhTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKYXZhMldTRGF0YU1vZGVsX1NlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlqYXZhMldTRGF0YU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0RhdGFNb2RlbF9NZXRob2RNYXAoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlqYXZhMldTRGF0YU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0RhdGFNb2RlbF9Bbm5vdGF0aW9uTWFwKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpamF2YTJXU0RhdGFNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldEphdmEyV1NEYXRhTW9kZWxfU291cmNlRGlyZWN0b3J5KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpamF2YTJXU0RhdGFNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldEphdmEyV1NEYXRhTW9kZWxfUG9ydE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlqYXZhMldTRGF0YU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRXU0RMMkphdmFDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gd3NkbDJKYXZhQ29udGV4dEVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X0dlbmVyYXRlSW1wbGVtZW50YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSl3c2RsMkphdmFDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9Qcm9jZXNzU09BUEhlYWRlcnMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSl3c2RsMkphdmFDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9Mb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKXdzZGwySmF2YUNvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X0xvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpd3NkbDJKYXZhQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfVmFsaWRhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSl3c2RsMkphdmFDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9Xc2RsVmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKXdzZGwySmF2YUNvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X1VzZURlZmF1bHRWYWx1ZXMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSl3c2RsMkphdmFDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9YamNBcmdzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpd3NkbDJKYXZhQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfTm9BZGRyZXNzQmluZGluZygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKXdzZGwySmF2YUNvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X1hqY1VzZURlZmF1bHRWYWx1ZXMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSl3c2RsMkphdmFDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9YamNUb1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKXdzZGwySmF2YUNvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9YamNUb1N0cmluZ011bHRpTGluZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKXdzZGwySmF2YUNvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9YamNUb1N0cmluZ1NpbXBsZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKXdzZGwySmF2YUNvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9YamNMb2NhdG9yKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpd3NkbDJKYXZhQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X1hqY1N5bmNNZXRob2RzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpd3NkbDJKYXZhQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X1hqY01hcmtHZW5lcmF0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSl3c2RsMkphdmFDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfWGpjRXBpc29kZUZpbGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSl3c2RsMkphdmFDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTYpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfQXV0b05hbWVSZXNvbHV0aW9uKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpd3NkbDJKYXZhQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE3KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldFdTREwySmF2YURhdGFNb2RlbCgpIHsKLSAgICAgICAgcmV0dXJuIHdzZGwySmF2YURhdGFNb2RlbEVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFEYXRhTW9kZWxfSW5jbHVkZWROYW1lc3BhY2VzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpd3NkbDJKYXZhRGF0YU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhRGF0YU1vZGVsX0JpbmRpbmdGaWxlcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKXdzZGwySmF2YURhdGFNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFdTREwySmF2YURhdGFNb2RlbF9FeGNsdWRlZE5hbWVzcGFjZXMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSl3c2RsMkphdmFEYXRhTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFEYXRhTW9kZWxfQ2F0YWxvZ0ZpbGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSl3c2RsMkphdmFEYXRhTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFEYXRhTW9kZWxfSmF2YVNvdXJjZUZvbGRlcigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKXdzZGwySmF2YURhdGFNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0Q1hGSW5zdGFsbCgpIHsKLSAgICAgICAgcmV0dXJuIGN4Zkluc3RhbGxFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q1hGSW5zdGFsbF9WZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpY3hmSW5zdGFsbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldENYRkluc3RhbGxfTG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSljeGZJbnN0YWxsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q1hGSW5zdGFsbF9UeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpY3hmSW5zdGFsbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFRW51bSBnZXRGcm9udGVuZCgpIHsKLSAgICAgICAgcmV0dXJuIGZyb250ZW5kRUVudW07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVFbnVtIGdldERhdGFCaW5kaW5nKCkgewotICAgICAgICByZXR1cm4gZGF0YUJpbmRpbmdFRW51bTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRURhdGFUeXBlIGdldFVSTCgpIHsKLSAgICAgICAgcmV0dXJuIHVybEVEYXRhVHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRURhdGFUeXBlIGdldERlZmluaXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBkZWZpbml0aW9uRURhdGFUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFRGF0YVR5cGUgZ2V0TWFwKCkgewotICAgICAgICByZXR1cm4gbWFwRURhdGFUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFRGF0YVR5cGUgZ2V0SU1ldGhvZCgpIHsKLSAgICAgICAgcmV0dXJuIGlNZXRob2RFRGF0YVR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIENYRkZhY3RvcnkgZ2V0Q1hGRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIChDWEZGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLSAgICAgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotICAgICAgICBpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0gICAgICAgIGlzQ3JlYXRlZCA9IHRydWU7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0gICAgICAgIGN4ZkNvbnRleHRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ1hGX0NPTlRFWFQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGN4ZkNvbnRleHRFQ2xhc3MsIENYRl9DT05URVhUX19ERUZBVUxUX1JVTlRJTUVfTE9DQVRJT04pOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGN4ZkNvbnRleHRFQ2xhc3MsIENYRl9DT05URVhUX19ERUZBVUxUX1JVTlRJTUVfVFlQRSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY3hmQ29udGV4dEVDbGFzcywgQ1hGX0NPTlRFWFRfX0RFRkFVTFRfUlVOVElNRV9WRVJTSU9OKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShjeGZDb250ZXh0RUNsYXNzLCBDWEZfQ09OVEVYVF9fVkVSQk9TRSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY3hmQ29udGV4dEVDbGFzcywgQ1hGX0NPTlRFWFRfX0dFTkVSQVRFX0FOVF9CVUlMRF9GSUxFKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShjeGZDb250ZXh0RUNsYXNzLCBDWEZfQ09OVEVYVF9fR0VORVJBVEVfQ0xJRU5UKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShjeGZDb250ZXh0RUNsYXNzLCBDWEZfQ09OVEVYVF9fR0VORVJBVEVfU0VSVkVSKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShjeGZDb250ZXh0RUNsYXNzLCBDWEZfQ09OVEVYVF9fREFUQUJJTkRJTkcpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGN4ZkNvbnRleHRFQ2xhc3MsIENYRl9DT05URVhUX19GUk9OVEVORCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY3hmQ29udGV4dEVDbGFzcywgQ1hGX0NPTlRFWFRfX1VTRV9TUFJJTkdfQVBQTElDQVRJT05fQ09OVEVYVCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY3hmQ29udGV4dEVDbGFzcywgQ1hGX0NPTlRFWFRfX0VYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUik7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY3hmQ29udGV4dEVDbGFzcywgQ1hGX0NPTlRFWFRfX0lOU1RBTExBVElPTlMpOwotCi0gICAgICAgIGN4ZkRhdGFNb2RlbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDWEZfREFUQV9NT0RFTCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY3hmRGF0YU1vZGVsRUNsYXNzLCBDWEZfREFUQV9NT0RFTF9fUFJPSkVDVF9OQU1FKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShjeGZEYXRhTW9kZWxFQ2xhc3MsIENYRl9EQVRBX01PREVMX19SRVNPVVJDRV9ESVJFQ1RPUlkpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGN4ZkRhdGFNb2RlbEVDbGFzcywgQ1hGX0RBVEFfTU9ERUxfX0NMQVNTX0RJUkVDVE9SWSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY3hmRGF0YU1vZGVsRUNsYXNzLCBDWEZfREFUQV9NT0RFTF9fV1NETF9GSUxFX05BTUUpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGN4ZkRhdGFNb2RlbEVDbGFzcywgQ1hGX0RBVEFfTU9ERUxfX1dTRExfVVJMKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShjeGZEYXRhTW9kZWxFQ2xhc3MsIENYRl9EQVRBX01PREVMX19DT05GSUdfV1NETF9MT0NBVElPTik7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY3hmRGF0YU1vZGVsRUNsYXNzLCBDWEZfREFUQV9NT0RFTF9fRlVMTFlfUVVBTElGSUVEX0pBVkFfQ0xBU1NfTkFNRSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY3hmRGF0YU1vZGVsRUNsYXNzLCBDWEZfREFUQV9NT0RFTF9fRlVMTFlfUVVBTElGSUVEX0pBVkFfSU5URVJGQUNFX05BTUUpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGN4ZkRhdGFNb2RlbEVDbGFzcywgQ1hGX0RBVEFfTU9ERUxfX0NPTkZJR19JRCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY3hmRGF0YU1vZGVsRUNsYXNzLCBDWEZfREFUQV9NT0RFTF9fVEFSR0VUX05BTUVTUEFDRSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY3hmRGF0YU1vZGVsRUNsYXNzLCBDWEZfREFUQV9NT0RFTF9fRU5EUE9JTlRfTkFNRSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY3hmRGF0YU1vZGVsRUNsYXNzLCBDWEZfREFUQV9NT0RFTF9fU0VSVklDRV9OQU1FKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShjeGZEYXRhTW9kZWxFQ2xhc3MsIENYRl9EQVRBX01PREVMX19XU0RMX0RFRklOSVRJT04pOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGN4ZkRhdGFNb2RlbEVDbGFzcywgQ1hGX0RBVEFfTU9ERUxfX1dTRExfTE9DQVRJT04pOwotCi0gICAgICAgIGphdmEyV1NDb250ZXh0RUNsYXNzID0gY3JlYXRlRUNsYXNzKEpBVkEyX1dTX0NPTlRFWFQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGphdmEyV1NDb250ZXh0RUNsYXNzLCBKQVZBMl9XU19DT05URVhUX19TT0FQMTJfQklORElORyk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoamF2YTJXU0NvbnRleHRFQ2xhc3MsIEpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1hTRF9JTVBPUlRTKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShqYXZhMldTQ29udGV4dEVDbGFzcywgSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV1NETCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoamF2YTJXU0NvbnRleHRFQ2xhc3MsIEpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dSQVBQRVJfRkFVTFRfQkVBTlMpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGphdmEyV1NDb250ZXh0RUNsYXNzLCBKQVZBMl9XU19DT05URVhUX19BTk5PVEFUSU9OX1BST0NFU1NJTkdfRU5BQkxFRCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoamF2YTJXU0NvbnRleHRFQ2xhc3MsIEpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dFQl9NRVRIT0RfQU5OT1RBVElPTik7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoamF2YTJXU0NvbnRleHRFQ2xhc3MsIEpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dFQl9QQVJBTV9BTk5PVEFUSU9OKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShqYXZhMldTQ29udGV4dEVDbGFzcywgSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfUkVRVUVTVF9XUkFQUEVSX0FOTk9UQVRJT04pOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGphdmEyV1NDb250ZXh0RUNsYXNzLCBKQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9SRVNQT05TRV9XUkFQUEVSX0FOTk9UQVRJT04pOwotCi0gICAgICAgIGphdmEyV1NEYXRhTW9kZWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSkFWQTJfV1NfREFUQV9NT0RFTCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoamF2YTJXU0RhdGFNb2RlbEVDbGFzcywgSkFWQTJfV1NfREFUQV9NT0RFTF9fQ0xBU1NQQVRIKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShqYXZhMldTRGF0YU1vZGVsRUNsYXNzLCBKQVZBMl9XU19EQVRBX01PREVMX19KQVZBX1NUQVJUSU5HX1BPSU5UKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShqYXZhMldTRGF0YU1vZGVsRUNsYXNzLCBKQVZBMl9XU19EQVRBX01PREVMX19VU0VfU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0UpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGphdmEyV1NEYXRhTW9kZWxFQ2xhc3MsIEpBVkEyX1dTX0RBVEFfTU9ERUxfX0VYVFJBQ1RfSU5URVJGQUNFKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShqYXZhMldTRGF0YU1vZGVsRUNsYXNzLCBKQVZBMl9XU19EQVRBX01PREVMX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9OQU1FKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShqYXZhMldTRGF0YU1vZGVsRUNsYXNzLCBKQVZBMl9XU19EQVRBX01PREVMX19NRVRIT0RfTUFQKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShqYXZhMldTRGF0YU1vZGVsRUNsYXNzLCBKQVZBMl9XU19EQVRBX01PREVMX19BTk5PVEFUSU9OX01BUCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoamF2YTJXU0RhdGFNb2RlbEVDbGFzcywgSkFWQTJfV1NfREFUQV9NT0RFTF9fU09VUkNFX0RJUkVDVE9SWSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoamF2YTJXU0RhdGFNb2RlbEVDbGFzcywgSkFWQTJfV1NfREFUQV9NT0RFTF9fUE9SVF9OQU1FKTsKLQotICAgICAgICB3c2RsMkphdmFDb250ZXh0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFdTREwyX0pBVkFfQ09OVEVYVCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUod3NkbDJKYXZhQ29udGV4dEVDbGFzcywgV1NETDJfSkFWQV9DT05URVhUX19HRU5FUkFURV9JTVBMRU1FTlRBVElPTik7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUod3NkbDJKYXZhQ29udGV4dEVDbGFzcywgV1NETDJfSkFWQV9DT05URVhUX19QUk9DRVNTX1NPQVBfSEVBREVSUyk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUod3NkbDJKYXZhQ29udGV4dEVDbGFzcywgV1NETDJfSkFWQV9DT05URVhUX19MT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VfTkFNRV9NQVBQSU5HKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZSh3c2RsMkphdmFDb250ZXh0RUNsYXNzLCBXU0RMMl9KQVZBX0NPTlRFWFRfX0xPQURfREVGQVVMVF9FWENMVURFU19OQU1FUFNBQ0VfTUFQUElORyk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUod3NkbDJKYXZhQ29udGV4dEVDbGFzcywgV1NETDJfSkFWQV9DT05URVhUX19WQUxJREFURSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUod3NkbDJKYXZhQ29udGV4dEVDbGFzcywgV1NETDJfSkFWQV9DT05URVhUX19XU0RMX1ZFUlNJT04pOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHdzZGwySmF2YUNvbnRleHRFQ2xhc3MsIFdTREwyX0pBVkFfQ09OVEVYVF9fVVNFX0RFRkFVTFRfVkFMVUVTKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZSh3c2RsMkphdmFDb250ZXh0RUNsYXNzLCBXU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19BUkdTKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZSh3c2RsMkphdmFDb250ZXh0RUNsYXNzLCBXU0RMMl9KQVZBX0NPTlRFWFRfX05PX0FERFJFU1NfQklORElORyk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUod3NkbDJKYXZhQ29udGV4dEVDbGFzcywgV1NETDJfSkFWQV9DT05URVhUX19YSkNfVVNFX0RFRkFVTFRfVkFMVUVTKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZSh3c2RsMkphdmFDb250ZXh0RUNsYXNzLCBXU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19UT19TVFJJTkcpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHdzZGwySmF2YUNvbnRleHRFQ2xhc3MsIFdTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1RPX1NUUklOR19NVUxUSV9MSU5FKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZSh3c2RsMkphdmFDb250ZXh0RUNsYXNzLCBXU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19UT19TVFJJTkdfU0lNUExFKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZSh3c2RsMkphdmFDb250ZXh0RUNsYXNzLCBXU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19MT0NBVE9SKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZSh3c2RsMkphdmFDb250ZXh0RUNsYXNzLCBXU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19TWU5DX01FVEhPRFMpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHdzZGwySmF2YUNvbnRleHRFQ2xhc3MsIFdTREwyX0pBVkFfQ09OVEVYVF9fWEpDX01BUktfR0VORVJBVEVEKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZSh3c2RsMkphdmFDb250ZXh0RUNsYXNzLCBXU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19FUElTT0RFX0ZJTEUpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHdzZGwySmF2YUNvbnRleHRFQ2xhc3MsIFdTREwyX0pBVkFfQ09OVEVYVF9fQVVUT19OQU1FX1JFU09MVVRJT04pOwotCi0gICAgICAgIHdzZGwySmF2YURhdGFNb2RlbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXU0RMMl9KQVZBX0RBVEFfTU9ERUwpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHdzZGwySmF2YURhdGFNb2RlbEVDbGFzcywgV1NETDJfSkFWQV9EQVRBX01PREVMX19JTkNMVURFRF9OQU1FU1BBQ0VTKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZSh3c2RsMkphdmFEYXRhTW9kZWxFQ2xhc3MsIFdTREwyX0pBVkFfREFUQV9NT0RFTF9fQklORElOR19GSUxFUyk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUod3NkbDJKYXZhRGF0YU1vZGVsRUNsYXNzLCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0VYQ0xVREVEX05BTUVTUEFDRVMpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHdzZGwySmF2YURhdGFNb2RlbEVDbGFzcywgV1NETDJfSkFWQV9EQVRBX01PREVMX19DQVRBTE9HX0ZJTEUpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHdzZGwySmF2YURhdGFNb2RlbEVDbGFzcywgV1NETDJfSkFWQV9EQVRBX01PREVMX19KQVZBX1NPVVJDRV9GT0xERVIpOwotCi0gICAgICAgIGN4Zkluc3RhbGxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ1hGX0lOU1RBTEwpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGN4Zkluc3RhbGxFQ2xhc3MsIENYRl9JTlNUQUxMX19WRVJTSU9OKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShjeGZJbnN0YWxsRUNsYXNzLCBDWEZfSU5TVEFMTF9fTE9DQVRJT04pOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGN4Zkluc3RhbGxFQ2xhc3MsIENYRl9JTlNUQUxMX19UWVBFKTsKLQotICAgICAgICAvLyBDcmVhdGUgZW51bXMKLSAgICAgICAgZnJvbnRlbmRFRW51bSA9IGNyZWF0ZUVFbnVtKEZST05URU5EKTsKLSAgICAgICAgZGF0YUJpbmRpbmdFRW51bSA9IGNyZWF0ZUVFbnVtKERBVEFfQklORElORyk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGRhdGEgdHlwZXMKLSAgICAgICAgdXJsRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFVSTCk7Ci0gICAgICAgIGRlZmluaXRpb25FRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoREVGSU5JVElPTik7Ci0gICAgICAgIG1hcEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShNQVApOwotICAgICAgICBpTWV0aG9kRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKElNRVRIT0QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotICAgICAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLSAgICAgICAgaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLSAgICAgICAgaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0gICAgICAgIHNldE5hbWUoZU5BTUUpOwotICAgICAgICBzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLSAgICAgICAgc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIHR5cGUgcGFyYW1ldGVycwotICAgICAgICBhZGRFVHlwZVBhcmFtZXRlcihtYXBFRGF0YVR5cGUsICJUIik7Ci0gICAgICAgIGFkZEVUeXBlUGFyYW1ldGVyKG1hcEVEYXRhVHlwZSwgIlQxIik7Ci0KLSAgICAgICAgLy8gU2V0IGJvdW5kcyBmb3IgdHlwZSBwYXJhbWV0ZXJzCi0KLSAgICAgICAgLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotICAgICAgICBjeGZEYXRhTW9kZWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDWEZDb250ZXh0KCkpOwotICAgICAgICBqYXZhMldTQ29udGV4dEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENYRkNvbnRleHQoKSk7Ci0gICAgICAgIGphdmEyV1NEYXRhTW9kZWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDWEZEYXRhTW9kZWwoKSk7Ci0gICAgICAgIGphdmEyV1NEYXRhTW9kZWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRKYXZhMldTQ29udGV4dCgpKTsKLSAgICAgICAgd3NkbDJKYXZhQ29udGV4dEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENYRkNvbnRleHQoKSk7Ci0gICAgICAgIHdzZGwySmF2YURhdGFNb2RlbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENYRkRhdGFNb2RlbCgpKTsKLSAgICAgICAgd3NkbDJKYXZhRGF0YU1vZGVsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V1NETDJKYXZhQ29udGV4dCgpKTsKLQotICAgICAgICAvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotICAgICAgICBpbml0RUNsYXNzKGN4ZkNvbnRleHRFQ2xhc3MsIENYRkNvbnRleHQuY2xhc3MsICJDWEZDb250ZXh0IiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0Q1hGQ29udGV4dF9EZWZhdWx0UnVudGltZUxvY2F0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZWZhdWx0UnVudGltZUxvY2F0aW9uIiwgbnVsbCwgMCwgMSwgQ1hGQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0Q1hGQ29udGV4dF9EZWZhdWx0UnVudGltZVR5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlZmF1bHRSdW50aW1lVHlwZSIsIG51bGwsIDAsIDEsIENYRkNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldENYRkNvbnRleHRfRGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZWZhdWx0UnVudGltZVZlcnNpb24iLCBudWxsLCAwLCAxLCBDWEZDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRDWEZDb250ZXh0X1ZlcmJvc2UoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJ2ZXJib3NlIiwgInRydWUiLCAwLCAxLCBDWEZDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRDWEZDb250ZXh0X0dlbmVyYXRlQW50QnVpbGRGaWxlKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZ2VuZXJhdGVBbnRCdWlsZEZpbGUiLCAiZmFsc2UiLCAwLCAxLCBDWEZDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRDWEZDb250ZXh0X0dlbmVyYXRlQ2xpZW50KCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZ2VuZXJhdGVDbGllbnQiLCAiZmFsc2UiLCAwLCAxLCBDWEZDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRDWEZDb250ZXh0X0dlbmVyYXRlU2VydmVyKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZ2VuZXJhdGVTZXJ2ZXIiLCAiZmFsc2UiLCAwLCAxLCBDWEZDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRDWEZDb250ZXh0X0RhdGFiaW5kaW5nKCksIHRoaXMuZ2V0RGF0YUJpbmRpbmcoKSwgImRhdGFiaW5kaW5nIiwgImpheGIiLCAwLCAxLCBDWEZDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRDWEZDb250ZXh0X0Zyb250ZW5kKCksIHRoaXMuZ2V0RnJvbnRlbmQoKSwgImZyb250ZW5kIiwgImpheHdzIiwgMCwgMSwgQ1hGQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0Q1hGQ29udGV4dF9Vc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJ1c2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQiLCAidHJ1ZSIsIDAsIDEsIENYRkNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldENYRkNvbnRleHRfRXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyIiwgInRydWUiLCAwLCAxLCBDWEZDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBFR2VuZXJpY1R5cGUgZzEgPSBjcmVhdGVFR2VuZXJpY1R5cGUoZWNvcmVQYWNrYWdlLmdldEVNYXAoKSk7Ci0gICAgICAgIEVHZW5lcmljVHlwZSBnMiA9IGNyZWF0ZUVHZW5lcmljVHlwZShlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpKTsKLSAgICAgICAgZzEuZ2V0RVR5cGVBcmd1bWVudHMoKS5hZGQoZzIpOwotICAgICAgICBnMiA9IGNyZWF0ZUVHZW5lcmljVHlwZSh0aGlzLmdldENYRkluc3RhbGwoKSk7Ci0gICAgICAgIGcxLmdldEVUeXBlQXJndW1lbnRzKCkuYWRkKGcyKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0Q1hGQ29udGV4dF9JbnN0YWxsYXRpb25zKCksIGcxLCAiaW5zdGFsbGF0aW9ucyIsIG51bGwsIDAsIDEsIENYRkNvbnRleHQuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotICAgICAgICBpbml0RUNsYXNzKGN4ZkRhdGFNb2RlbEVDbGFzcywgQ1hGRGF0YU1vZGVsLmNsYXNzLCAiQ1hGRGF0YU1vZGVsIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldENYRkRhdGFNb2RlbF9Qcm9qZWN0TmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicHJvamVjdE5hbWUiLCBudWxsLCAwLCAxLCBDWEZEYXRhTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldENYRkRhdGFNb2RlbF9SZXNvdXJjZURpcmVjdG9yeSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicmVzb3VyY2VEaXJlY3RvcnkiLCBudWxsLCAwLCAxLCBDWEZEYXRhTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldENYRkRhdGFNb2RlbF9DbGFzc0RpcmVjdG9yeSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY2xhc3NEaXJlY3RvcnkiLCBudWxsLCAwLCAxLCBDWEZEYXRhTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldENYRkRhdGFNb2RlbF9Xc2RsRmlsZU5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIndzZGxGaWxlTmFtZSIsIG51bGwsIDAsIDEsIENYRkRhdGFNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0Q1hGRGF0YU1vZGVsX1dzZGxVUkwoKSwgdGhpcy5nZXRVUkwoKSwgIndzZGxVUkwiLCBudWxsLCAwLCAxLCBDWEZEYXRhTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldENYRkRhdGFNb2RlbF9Db25maWdXc2RsTG9jYXRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNvbmZpZ1dzZGxMb2NhdGlvbiIsIG51bGwsIDAsIDEsIENYRkRhdGFNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0Q1hGRGF0YU1vZGVsX0Z1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lIiwgbnVsbCwgMCwgMSwgQ1hGRGF0YU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRDWEZEYXRhTW9kZWxfRnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSIsIG51bGwsIDAsIDEsIENYRkRhdGFNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0Q1hGRGF0YU1vZGVsX0NvbmZpZ0lkKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjb25maWdJZCIsIG51bGwsIDAsIDEsIENYRkRhdGFNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0Q1hGRGF0YU1vZGVsX1RhcmdldE5hbWVzcGFjZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidGFyZ2V0TmFtZXNwYWNlIiwgbnVsbCwgMCwgMSwgQ1hGRGF0YU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRDWEZEYXRhTW9kZWxfRW5kcG9pbnROYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJlbmRwb2ludE5hbWUiLCBudWxsLCAwLCAxLCBDWEZEYXRhTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldENYRkRhdGFNb2RlbF9TZXJ2aWNlTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic2VydmljZU5hbWUiLCBudWxsLCAwLCAxLCBDWEZEYXRhTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldENYRkRhdGFNb2RlbF9Xc2RsRGVmaW5pdGlvbigpLCB0aGlzLmdldERlZmluaXRpb24oKSwgIndzZGxEZWZpbml0aW9uIiwgbnVsbCwgMCwgMSwgQ1hGRGF0YU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRDWEZEYXRhTW9kZWxfV3NkbExvY2F0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ3c2RsTG9jYXRpb24iLCBudWxsLCAwLCAxLCBDWEZEYXRhTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLSAgICAgICAgaW5pdEVDbGFzcyhqYXZhMldTQ29udGV4dEVDbGFzcywgSmF2YTJXU0NvbnRleHQuY2xhc3MsICJKYXZhMldTQ29udGV4dCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEphdmEyV1NDb250ZXh0X1NvYXAxMkJpbmRpbmcoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJzb2FwMTJCaW5kaW5nIiwgImZhbHNlIiwgMCwgMSwgSmF2YTJXU0NvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlWFNESW1wb3J0cygpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImdlbmVyYXRlWFNESW1wb3J0cyIsICJ0cnVlIiwgMCwgMSwgSmF2YTJXU0NvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlV1NETCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImdlbmVyYXRlV1NETCIsICJ0cnVlIiwgMCwgMSwgSmF2YTJXU0NvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJnZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zIiwgInRydWUiLCAwLCAxLCBKYXZhMldTQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0SmF2YTJXU0NvbnRleHRfQW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiYW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkIiwgImZhbHNlIiwgMCwgMSwgSmF2YTJXU0NvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImdlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbiIsICJmYWxzZSIsIDAsIDEsIEphdmEyV1NDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImdlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uIiwgImZhbHNlIiwgMCwgMSwgSmF2YTJXU0NvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZ2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24iLCAiZmFsc2UiLCAwLCAxLCBKYXZhMldTQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZ2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uIiwgImZhbHNlIiwgMCwgMSwgSmF2YTJXU0NvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLSAgICAgICAgaW5pdEVDbGFzcyhqYXZhMldTRGF0YU1vZGVsRUNsYXNzLCBKYXZhMldTRGF0YU1vZGVsLmNsYXNzLCAiSmF2YTJXU0RhdGFNb2RlbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0SmF2YTJXU0RhdGFNb2RlbF9DbGFzc3BhdGgoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNsYXNzcGF0aCIsIG51bGwsIDAsIDEsIEphdmEyV1NEYXRhTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEphdmEyV1NEYXRhTW9kZWxfSmF2YVN0YXJ0aW5nUG9pbnQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImphdmFTdGFydGluZ1BvaW50IiwgbnVsbCwgMCwgMSwgSmF2YTJXU0RhdGFNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0SmF2YTJXU0RhdGFNb2RlbF9Vc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJ1c2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UiLCBudWxsLCAwLCAxLCBKYXZhMldTRGF0YU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRKYXZhMldTRGF0YU1vZGVsX0V4dHJhY3RJbnRlcmZhY2UoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJleHRyYWN0SW50ZXJmYWNlIiwgbnVsbCwgMCwgMSwgSmF2YTJXU0RhdGFNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0SmF2YTJXU0RhdGFNb2RlbF9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lIiwgbnVsbCwgMCwgMSwgSmF2YTJXU0RhdGFNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgZzEgPSBjcmVhdGVFR2VuZXJpY1R5cGUodGhpcy5nZXRNYXAoKSk7Ci0gICAgICAgIGcyID0gY3JlYXRlRUdlbmVyaWNUeXBlKHRoaXMuZ2V0SU1ldGhvZCgpKTsKLSAgICAgICAgZzEuZ2V0RVR5cGVBcmd1bWVudHMoKS5hZGQoZzIpOwotICAgICAgICBnMiA9IGNyZWF0ZUVHZW5lcmljVHlwZSh0aGlzLmdldE1hcCgpKTsKLSAgICAgICAgZzEuZ2V0RVR5cGVBcmd1bWVudHMoKS5hZGQoZzIpOwotICAgICAgICBFR2VuZXJpY1R5cGUgZzMgPSBjcmVhdGVFR2VuZXJpY1R5cGUoZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSk7Ci0gICAgICAgIGcyLmdldEVUeXBlQXJndW1lbnRzKCkuYWRkKGczKTsKLSAgICAgICAgZzMgPSBjcmVhdGVFR2VuZXJpY1R5cGUoZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuT2JqZWN0KCkpOwotICAgICAgICBnMi5nZXRFVHlwZUFyZ3VtZW50cygpLmFkZChnMyk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEphdmEyV1NEYXRhTW9kZWxfTWV0aG9kTWFwKCksIGcxLCAibWV0aG9kTWFwIiwgbnVsbCwgMCwgMSwgSmF2YTJXU0RhdGFNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgZzEgPSBjcmVhdGVFR2VuZXJpY1R5cGUodGhpcy5nZXRNYXAoKSk7Ci0gICAgICAgIGcyID0gY3JlYXRlRUdlbmVyaWNUeXBlKGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCkpOwotICAgICAgICBnMS5nZXRFVHlwZUFyZ3VtZW50cygpLmFkZChnMik7Ci0gICAgICAgIGcyID0gY3JlYXRlRUdlbmVyaWNUeXBlKGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbk9iamVjdCgpKTsKLSAgICAgICAgZzEuZ2V0RVR5cGVBcmd1bWVudHMoKS5hZGQoZzIpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRKYXZhMldTRGF0YU1vZGVsX0Fubm90YXRpb25NYXAoKSwgZzEsICJhbm5vdGF0aW9uTWFwIiwgbnVsbCwgMCwgMSwgSmF2YTJXU0RhdGFNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0SmF2YTJXU0RhdGFNb2RlbF9Tb3VyY2VEaXJlY3RvcnkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInNvdXJjZURpcmVjdG9yeSIsIG51bGwsIDAsIDEsIEphdmEyV1NEYXRhTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEphdmEyV1NEYXRhTW9kZWxfUG9ydE5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInBvcnROYW1lIiwgbnVsbCwgMCwgMSwgSmF2YTJXU0RhdGFNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotICAgICAgICBpbml0RUNsYXNzKHdzZGwySmF2YUNvbnRleHRFQ2xhc3MsIFdTREwySmF2YUNvbnRleHQuY2xhc3MsICJXU0RMMkphdmFDb250ZXh0IiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETDJKYXZhQ29udGV4dF9HZW5lcmF0ZUltcGxlbWVudGF0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbiIsICJ0cnVlIiwgMCwgMSwgV1NETDJKYXZhQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETDJKYXZhQ29udGV4dF9Qcm9jZXNzU09BUEhlYWRlcnMoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJwcm9jZXNzU09BUEhlYWRlcnMiLCAiZmFsc2UiLCAwLCAxLCBXU0RMMkphdmFDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRXU0RMMkphdmFDb250ZXh0X0xvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAibG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmciLCAidHJ1ZSIsIDAsIDEsIFdTREwySmF2YUNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFdTREwySmF2YUNvbnRleHRfTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJsb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyIsICJ0cnVlIiwgMCwgMSwgV1NETDJKYXZhQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETDJKYXZhQ29udGV4dF9WYWxpZGF0ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInZhbGlkYXRlIiwgInRydWUiLCAwLCAxLCBXU0RMMkphdmFDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRXU0RMMkphdmFDb250ZXh0X1dzZGxWZXJzaW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ3c2RsVmVyc2lvbiIsICIxLjEiLCAwLCAxLCBXU0RMMkphdmFDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRXU0RMMkphdmFDb250ZXh0X1VzZURlZmF1bHRWYWx1ZXMoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJ1c2VEZWZhdWx0VmFsdWVzIiwgInRydWUiLCAwLCAxLCBXU0RMMkphdmFDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRXU0RMMkphdmFDb250ZXh0X1hqY0FyZ3MoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInhqY0FyZ3MiLCBudWxsLCAwLCAxLCBXU0RMMkphdmFDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRXU0RMMkphdmFDb250ZXh0X05vQWRkcmVzc0JpbmRpbmcoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJub0FkZHJlc3NCaW5kaW5nIiwgImZhbHNlIiwgMCwgMSwgV1NETDJKYXZhQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETDJKYXZhQ29udGV4dF9YamNVc2VEZWZhdWx0VmFsdWVzKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAieGpjVXNlRGVmYXVsdFZhbHVlcyIsICJmYWxzZSIsIDAsIDEsIFdTREwySmF2YUNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFdTREwySmF2YUNvbnRleHRfWGpjVG9TdHJpbmcoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJ4amNUb1N0cmluZyIsICJmYWxzZSIsIDAsIDEsIFdTREwySmF2YUNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFdTREwySmF2YUNvbnRleHRfWGpjVG9TdHJpbmdNdWx0aUxpbmUoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJ4amNUb1N0cmluZ011bHRpTGluZSIsICJmYWxzZSIsIDAsIDEsIFdTREwySmF2YUNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFdTREwySmF2YUNvbnRleHRfWGpjVG9TdHJpbmdTaW1wbGUoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJ4amNUb1N0cmluZ1NpbXBsZSIsICJmYWxzZSIsIDAsIDEsIFdTREwySmF2YUNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFdTREwySmF2YUNvbnRleHRfWGpjTG9jYXRvcigpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInhqY0xvY2F0b3IiLCAiZmFsc2UiLCAwLCAxLCBXU0RMMkphdmFDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRXU0RMMkphdmFDb250ZXh0X1hqY1N5bmNNZXRob2RzKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAieGpjU3luY01ldGhvZHMiLCAiZmFsc2UiLCAwLCAxLCBXU0RMMkphdmFDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRXU0RMMkphdmFDb250ZXh0X1hqY01hcmtHZW5lcmF0ZWQoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJ4amNNYXJrR2VuZXJhdGVkIiwgImZhbHNlIiwgMCwgMSwgV1NETDJKYXZhQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETDJKYXZhQ29udGV4dF9YamNFcGlzb2RlRmlsZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAieGpjRXBpc29kZUZpbGUiLCBudWxsLCAwLCAxLCBXU0RMMkphdmFDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRXU0RMMkphdmFDb250ZXh0X0F1dG9OYW1lUmVzb2x1dGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImF1dG9OYW1lUmVzb2x1dGlvbiIsICJmYWxzZSIsIDAsIDEsIFdTREwySmF2YUNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLSAgICAgICAgaW5pdEVDbGFzcyh3c2RsMkphdmFEYXRhTW9kZWxFQ2xhc3MsIFdTREwySmF2YURhdGFNb2RlbC5jbGFzcywgIldTREwySmF2YURhdGFNb2RlbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgZzEgPSBjcmVhdGVFR2VuZXJpY1R5cGUodGhpcy5nZXRNYXAoKSk7Ci0gICAgICAgIGcyID0gY3JlYXRlRUdlbmVyaWNUeXBlKGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCkpOwotICAgICAgICBnMS5nZXRFVHlwZUFyZ3VtZW50cygpLmFkZChnMik7Ci0gICAgICAgIGcyID0gY3JlYXRlRUdlbmVyaWNUeXBlKGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCkpOwotICAgICAgICBnMS5nZXRFVHlwZUFyZ3VtZW50cygpLmFkZChnMik7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFdTREwySmF2YURhdGFNb2RlbF9JbmNsdWRlZE5hbWVzcGFjZXMoKSwgZzEsICJpbmNsdWRlZE5hbWVzcGFjZXMiLCBudWxsLCAwLCAxLCBXU0RMMkphdmFEYXRhTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFdTREwySmF2YURhdGFNb2RlbF9CaW5kaW5nRmlsZXMoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImJpbmRpbmdGaWxlcyIsIG51bGwsIDAsIC0xLCBXU0RMMkphdmFEYXRhTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGcxID0gY3JlYXRlRUdlbmVyaWNUeXBlKHRoaXMuZ2V0TWFwKCkpOwotICAgICAgICBnMiA9IGNyZWF0ZUVHZW5lcmljVHlwZShlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpKTsKLSAgICAgICAgZzEuZ2V0RVR5cGVBcmd1bWVudHMoKS5hZGQoZzIpOwotICAgICAgICBnMiA9IGNyZWF0ZUVHZW5lcmljVHlwZShlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpKTsKLSAgICAgICAgZzEuZ2V0RVR5cGVBcmd1bWVudHMoKS5hZGQoZzIpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRXU0RMMkphdmFEYXRhTW9kZWxfRXhjbHVkZWROYW1lc3BhY2VzKCksIGcxLCAiZXhjbHVkZWROYW1lc3BhY2VzIiwgbnVsbCwgMCwgMSwgV1NETDJKYXZhRGF0YU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRXU0RMMkphdmFEYXRhTW9kZWxfQ2F0YWxvZ0ZpbGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNhdGFsb2dGaWxlIiwgbnVsbCwgMCwgMSwgV1NETDJKYXZhRGF0YU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRXU0RMMkphdmFEYXRhTW9kZWxfSmF2YVNvdXJjZUZvbGRlcigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiamF2YVNvdXJjZUZvbGRlciIsIG51bGwsIDAsIDEsIFdTREwySmF2YURhdGFNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotICAgICAgICBpbml0RUNsYXNzKGN4Zkluc3RhbGxFQ2xhc3MsIENYRkluc3RhbGwuY2xhc3MsICJDWEZJbnN0YWxsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRDWEZJbnN0YWxsX1ZlcnNpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInZlcnNpb24iLCBudWxsLCAwLCAxLCBDWEZJbnN0YWxsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRDWEZJbnN0YWxsX0xvY2F0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsb2NhdGlvbiIsIG51bGwsIDAsIDEsIENYRkluc3RhbGwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldENYRkluc3RhbGxfVHlwZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidHlwZSIsIG51bGwsIDAsIDEsIENYRkluc3RhbGwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKLSAgICAgICAgaW5pdEVFbnVtKGZyb250ZW5kRUVudW0sIEZyb250ZW5kLmNsYXNzLCAiRnJvbnRlbmQiKTsKLSAgICAgICAgYWRkRUVudW1MaXRlcmFsKGZyb250ZW5kRUVudW0sIEZyb250ZW5kLkpBWFdTKTsKLQotICAgICAgICBpbml0RUVudW0oZGF0YUJpbmRpbmdFRW51bSwgRGF0YUJpbmRpbmcuY2xhc3MsICJEYXRhQmluZGluZyIpOwotICAgICAgICBhZGRFRW51bUxpdGVyYWwoZGF0YUJpbmRpbmdFRW51bSwgRGF0YUJpbmRpbmcuSkFYQik7Ci0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSBkYXRhIHR5cGVzCi0gICAgICAgIGluaXRFRGF0YVR5cGUodXJsRURhdGFUeXBlLCBqYXZhLm5ldC5VUkwuY2xhc3MsICJVUkwiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RURhdGFUeXBlKGRlZmluaXRpb25FRGF0YVR5cGUsIERlZmluaXRpb24uY2xhc3MsICJEZWZpbml0aW9uIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVEYXRhVHlwZShtYXBFRGF0YVR5cGUsIE1hcC5jbGFzcywgIk1hcCIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFRGF0YVR5cGUoaU1ldGhvZEVEYXRhVHlwZSwgSU1ldGhvZC5jbGFzcywgIklNZXRob2QiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIC8vIENyZWF0ZSByZXNvdXJjZQotICAgICAgICBjcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLSAgICB9Ci0KLX0gLy9DWEZQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9pbXBsL0phdmEyV1NEYXRhTW9kZWxJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL2ltcGwvSmF2YTJXU0RhdGFNb2RlbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI1NzRjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL2ltcGwvSmF2YTJXU0RhdGFNb2RlbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMjQgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgotICogJElkOiBKYXZhMldTRGF0YU1vZGVsSW1wbC5qYXZhLHYgMS4zIDIwMTAvMDEvMTcgMTk6NTY6NTYgc2NsYXJrZSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5KYXZhMiBXUyBEYXRhIE1vZGVsPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5KYXZhMldTRGF0YU1vZGVsSW1wbCNpc1NvYXAxMkJpbmRpbmcgPGVtPlNvYXAxMiBCaW5kaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5KYXZhMldTRGF0YU1vZGVsSW1wbCNpc0dlbmVyYXRlWFNESW1wb3J0cyA8ZW0+R2VuZXJhdGUgWFNEIEltcG9ydHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkphdmEyV1NEYXRhTW9kZWxJbXBsI2lzR2VuZXJhdGVXU0RMIDxlbT5HZW5lcmF0ZSBXU0RMPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5KYXZhMldTRGF0YU1vZGVsSW1wbCNpc0dlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMgPGVtPkdlbmVyYXRlIFdyYXBwZXIgRmF1bHQgQmVhbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkphdmEyV1NEYXRhTW9kZWxJbXBsI2lzQW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkIDxlbT5Bbm5vdGF0aW9uIFByb2Nlc3NpbmcgRW5hYmxlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuSmF2YTJXU0RhdGFNb2RlbEltcGwjaXNHZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24gPGVtPkdlbmVyYXRlIFdlYiBNZXRob2QgQW5ub3RhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuSmF2YTJXU0RhdGFNb2RlbEltcGwjaXNHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbiA8ZW0+R2VuZXJhdGUgV2ViIFBhcmFtIEFubm90YXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkphdmEyV1NEYXRhTW9kZWxJbXBsI2lzR2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24gPGVtPkdlbmVyYXRlIFJlcXVlc3QgV3JhcHBlciBBbm5vdGF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5KYXZhMldTRGF0YU1vZGVsSW1wbCNpc0dlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbiA8ZW0+R2VuZXJhdGUgUmVzcG9uc2UgV3JhcHBlciBBbm5vdGF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5KYXZhMldTRGF0YU1vZGVsSW1wbCNnZXRDbGFzc3BhdGggPGVtPkNsYXNzcGF0aDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuSmF2YTJXU0RhdGFNb2RlbEltcGwjZ2V0SmF2YVN0YXJ0aW5nUG9pbnQgPGVtPkphdmEgU3RhcnRpbmcgUG9pbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkphdmEyV1NEYXRhTW9kZWxJbXBsI2lzVXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIDxlbT5Vc2UgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkphdmEyV1NEYXRhTW9kZWxJbXBsI2lzRXh0cmFjdEludGVyZmFjZSA8ZW0+RXh0cmFjdCBJbnRlcmZhY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkphdmEyV1NEYXRhTW9kZWxJbXBsI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUgPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkphdmEyV1NEYXRhTW9kZWxJbXBsI2dldE1ldGhvZE1hcCA8ZW0+TWV0aG9kIE1hcDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuSmF2YTJXU0RhdGFNb2RlbEltcGwjZ2V0QW5ub3RhdGlvbk1hcCA8ZW0+QW5ub3RhdGlvbiBNYXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkphdmEyV1NEYXRhTW9kZWxJbXBsI2dldFNvdXJjZURpcmVjdG9yeSA8ZW0+U291cmNlIERpcmVjdG9yeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuSmF2YTJXU0RhdGFNb2RlbEltcGwjZ2V0UG9ydE5hbWUgPGVtPlBvcnQgTmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEphdmEyV1NEYXRhTW9kZWxJbXBsIGV4dGVuZHMgQ1hGRGF0YU1vZGVsSW1wbCBpbXBsZW1lbnRzIEphdmEyV1NEYXRhTW9kZWwgewotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1NvYXAxMkJpbmRpbmcoKSA8ZW0+U29hcDEyIEJpbmRpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzU29hcDEyQmluZGluZygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFNPQVAxMl9CSU5ESU5HX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1NvYXAxMkJpbmRpbmcoKSA8ZW0+U29hcDEyIEJpbmRpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzU29hcDEyQmluZGluZygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc29hcDEyQmluZGluZyA9IFNPQVAxMl9CSU5ESU5HX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzR2VuZXJhdGVYU0RJbXBvcnRzKCkgPGVtPkdlbmVyYXRlIFhTRCBJbXBvcnRzPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlWFNESW1wb3J0cygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEdFTkVSQVRFX1hTRF9JTVBPUlRTX0VERUZBVUxUID0gdHJ1ZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzR2VuZXJhdGVYU0RJbXBvcnRzKCkgPGVtPkdlbmVyYXRlIFhTRCBJbXBvcnRzPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlWFNESW1wb3J0cygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZ2VuZXJhdGVYU0RJbXBvcnRzID0gR0VORVJBVEVfWFNEX0lNUE9SVFNfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZVdTREwoKSA8ZW0+R2VuZXJhdGUgV1NETDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNHZW5lcmF0ZVdTREwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBHRU5FUkFURV9XU0RMX0VERUZBVUxUID0gdHJ1ZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzR2VuZXJhdGVXU0RMKCkgPGVtPkdlbmVyYXRlIFdTREw8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVXU0RMKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBnZW5lcmF0ZVdTREwgPSBHRU5FUkFURV9XU0RMX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucygpIDxlbT5HZW5lcmF0ZSBXcmFwcGVyIEZhdWx0IEJlYW5zPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBHRU5FUkFURV9XUkFQUEVSX0ZBVUxUX0JFQU5TX0VERUZBVUxUID0gdHJ1ZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucygpIDxlbT5HZW5lcmF0ZSBXcmFwcGVyIEZhdWx0IEJlYW5zPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMgPSBHRU5FUkFURV9XUkFQUEVSX0ZBVUxUX0JFQU5TX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKCkgPGVtPkFubm90YXRpb24gUHJvY2Vzc2luZyBFbmFibGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEFOTk9UQVRJT05fUFJPQ0VTU0lOR19FTkFCTEVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpIDxlbT5Bbm5vdGF0aW9uIFByb2Nlc3NpbmcgRW5hYmxlZDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGFubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCA9IEFOTk9UQVRJT05fUFJPQ0VTU0lOR19FTkFCTEVEX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzR2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uKCkgPGVtPkdlbmVyYXRlIFdlYiBNZXRob2QgQW5ub3RhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNHZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBHRU5FUkFURV9XRUJfTUVUSE9EX0FOTk9UQVRJT05fRURFRkFVTFQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzR2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uKCkgPGVtPkdlbmVyYXRlIFdlYiBNZXRob2QgQW5ub3RhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNHZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGdlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbiA9IEdFTkVSQVRFX1dFQl9NRVRIT0RfQU5OT1RBVElPTl9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0dlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKCkgPGVtPkdlbmVyYXRlIFdlYiBQYXJhbSBBbm5vdGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gR0VORVJBVEVfV0VCX1BBUkFNX0FOTk9UQVRJT05fRURFRkFVTFQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzR2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24oKSA8ZW0+R2VuZXJhdGUgV2ViIFBhcmFtIEFubm90YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGdlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uID0gR0VORVJBVEVfV0VCX1BBUkFNX0FOTk9UQVRJT05fRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbigpIDxlbT5HZW5lcmF0ZSBSZXF1ZXN0IFdyYXBwZXIgQW5ub3RhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEdFTkVSQVRFX1JFUVVFU1RfV1JBUFBFUl9BTk5PVEFUSU9OX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0dlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKCkgPGVtPkdlbmVyYXRlIFJlcXVlc3QgV3JhcHBlciBBbm5vdGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBnZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbiA9IEdFTkVSQVRFX1JFUVVFU1RfV1JBUFBFUl9BTk5PVEFUSU9OX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzR2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKCkgPGVtPkdlbmVyYXRlIFJlc3BvbnNlIFdyYXBwZXIgQW5ub3RhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNHZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBHRU5FUkFURV9SRVNQT05TRV9XUkFQUEVSX0FOTk9UQVRJT05fRURFRkFVTFQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzR2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKCkgPGVtPkdlbmVyYXRlIFJlc3BvbnNlIFdyYXBwZXIgQW5ub3RhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNHZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGdlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbiA9IEdFTkVSQVRFX1JFU1BPTlNFX1dSQVBQRVJfQU5OT1RBVElPTl9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbGFzc3BhdGgoKSA8ZW0+Q2xhc3NwYXRoPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRDbGFzc3BhdGgoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTUEFUSF9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbGFzc3BhdGgoKSA8ZW0+Q2xhc3NwYXRoPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRDbGFzc3BhdGgoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgY2xhc3NwYXRoID0gQ0xBU1NQQVRIX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEphdmFTdGFydGluZ1BvaW50KCkgPGVtPkphdmEgU3RhcnRpbmcgUG9pbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldEphdmFTdGFydGluZ1BvaW50KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX1NUQVJUSU5HX1BPSU5UX0VERUZBVUxUID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEphdmFTdGFydGluZ1BvaW50KCkgPGVtPkphdmEgU3RhcnRpbmcgUG9pbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldEphdmFTdGFydGluZ1BvaW50KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGphdmFTdGFydGluZ1BvaW50ID0gSkFWQV9TVEFSVElOR19QT0lOVF9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1VzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpIDxlbT5Vc2UgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzVXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gVVNFX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1VzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpIDxlbT5Vc2UgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzVXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB1c2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPSBVU0VfU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFeHRyYWN0SW50ZXJmYWNlKCkgPGVtPkV4dHJhY3QgSW50ZXJmYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0V4dHJhY3RJbnRlcmZhY2UoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBFWFRSQUNUX0lOVEVSRkFDRV9FREVGQVVMVCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFeHRyYWN0SW50ZXJmYWNlKCkgPGVtPkV4dHJhY3QgSW50ZXJmYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0V4dHJhY3RJbnRlcmZhY2UoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGV4dHJhY3RJbnRlcmZhY2UgPSBFWFRSQUNUX0lOVEVSRkFDRV9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKCkgPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSgpIDxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUgPSBTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9OQU1FX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kTWFwKCkgPGVtPk1ldGhvZCBNYXA8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldE1ldGhvZE1hcCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE1hcDxJTWV0aG9kLCBNYXA8U3RyaW5nLCBCb29sZWFuPj4gbWV0aG9kTWFwOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QW5ub3RhdGlvbk1hcCgpIDxlbT5Bbm5vdGF0aW9uIE1hcDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0QW5ub3RhdGlvbk1hcCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIEJvb2xlYW4+IGFubm90YXRpb25NYXA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U291cmNlRGlyZWN0b3J5KCkgPGVtPlNvdXJjZSBEaXJlY3Rvcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFNvdXJjZURpcmVjdG9yeSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFX0RJUkVDVE9SWV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb3VyY2VEaXJlY3RvcnkoKSA8ZW0+U291cmNlIERpcmVjdG9yeTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0U291cmNlRGlyZWN0b3J5KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHNvdXJjZURpcmVjdG9yeSA9IFNPVVJDRV9ESVJFQ1RPUllfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9ydE5hbWUoKSA8ZW0+UG9ydCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRQb3J0TmFtZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9SVF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvcnROYW1lKCkgPGVtPlBvcnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0UG9ydE5hbWUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgcG9ydE5hbWUgPSBQT1JUX05BTUVfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSmF2YTJXU0RhdGFNb2RlbEltcGwoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiBDWEZQYWNrYWdlLkxpdGVyYWxzLkpBVkEyX1dTX0RBVEFfTU9ERUw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTb2FwMTJCaW5kaW5nKCkgewotICAgICAgICByZXR1cm4gc29hcDEyQmluZGluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTb2FwMTJCaW5kaW5nKGJvb2xlYW4gbmV3U29hcDEyQmluZGluZykgewotICAgICAgICBib29sZWFuIG9sZFNvYXAxMkJpbmRpbmcgPSBzb2FwMTJCaW5kaW5nOwotICAgICAgICBzb2FwMTJCaW5kaW5nID0gbmV3U29hcDEyQmluZGluZzsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19TT0FQMTJfQklORElORywgb2xkU29hcDEyQmluZGluZywgc29hcDEyQmluZGluZykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVYU0RJbXBvcnRzKCkgewotICAgICAgICByZXR1cm4gZ2VuZXJhdGVYU0RJbXBvcnRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlWFNESW1wb3J0cyhib29sZWFuIG5ld0dlbmVyYXRlWFNESW1wb3J0cykgewotICAgICAgICBib29sZWFuIG9sZEdlbmVyYXRlWFNESW1wb3J0cyA9IGdlbmVyYXRlWFNESW1wb3J0czsKLSAgICAgICAgZ2VuZXJhdGVYU0RJbXBvcnRzID0gbmV3R2VuZXJhdGVYU0RJbXBvcnRzOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1hTRF9JTVBPUlRTLCBvbGRHZW5lcmF0ZVhTREltcG9ydHMsIGdlbmVyYXRlWFNESW1wb3J0cykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVXU0RMKCkgewotICAgICAgICByZXR1cm4gZ2VuZXJhdGVXU0RMOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlV1NETChib29sZWFuIG5ld0dlbmVyYXRlV1NETCkgewotICAgICAgICBib29sZWFuIG9sZEdlbmVyYXRlV1NETCA9IGdlbmVyYXRlV1NETDsKLSAgICAgICAgZ2VuZXJhdGVXU0RMID0gbmV3R2VuZXJhdGVXU0RMOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dTREwsIG9sZEdlbmVyYXRlV1NETCwgZ2VuZXJhdGVXU0RMKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKCkgewotICAgICAgICByZXR1cm4gZ2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFuczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKGJvb2xlYW4gbmV3R2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucykgewotICAgICAgICBib29sZWFuIG9sZEdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMgPSBnZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zOwotICAgICAgICBnZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zID0gbmV3R2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFuczsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XUkFQUEVSX0ZBVUxUX0JFQU5TLCBvbGRHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zLCBnZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKGJvb2xlYW4gbmV3QW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkQW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkID0gYW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkOwotICAgICAgICBhbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQgPSBuZXdBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQ7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fQU5OT1RBVElPTl9QUk9DRVNTSU5HX0VOQUJMRUQsIG9sZEFubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCwgYW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBnZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uKGJvb2xlYW4gbmV3R2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uKSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkR2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uID0gZ2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uOwotICAgICAgICBnZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24gPSBuZXdHZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb247Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV0VCX01FVEhPRF9BTk5PVEFUSU9OLCBvbGRHZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24sIGdlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBnZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbihib29sZWFuIG5ld0dlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkR2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24gPSBnZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbjsKLSAgICAgICAgZ2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24gPSBuZXdHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbjsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XRUJfUEFSQU1fQU5OT1RBVElPTiwgb2xkR2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24sIGdlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGdlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKGJvb2xlYW4gbmV3R2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24pIHsKLSAgICAgICAgYm9vbGVhbiBvbGRHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbiA9IGdlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uOwotICAgICAgICBnZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbiA9IG5ld0dlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1JFUVVFU1RfV1JBUFBFUl9BTk5PVEFUSU9OLCBvbGRHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbiwgZ2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24pKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGdlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24oYm9vbGVhbiBuZXdHZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24pIHsKLSAgICAgICAgYm9vbGVhbiBvbGRHZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24gPSBnZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb247Ci0gICAgICAgIGdlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbiA9IG5ld0dlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbjsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9SRVNQT05TRV9XUkFQUEVSX0FOTk9UQVRJT04sIG9sZEdlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbiwgZ2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc3BhdGgoKSB7Ci0gICAgICAgIHJldHVybiBjbGFzc3BhdGg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKFN0cmluZyBuZXdDbGFzc3BhdGgpIHsKLSAgICAgICAgU3RyaW5nIG9sZENsYXNzcGF0aCA9IGNsYXNzcGF0aDsKLSAgICAgICAgY2xhc3NwYXRoID0gbmV3Q2xhc3NwYXRoOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0NMQVNTUEFUSCwgb2xkQ2xhc3NwYXRoLCBjbGFzc3BhdGgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEphdmFTdGFydGluZ1BvaW50KCkgewotICAgICAgICByZXR1cm4gamF2YVN0YXJ0aW5nUG9pbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SmF2YVN0YXJ0aW5nUG9pbnQoU3RyaW5nIG5ld0phdmFTdGFydGluZ1BvaW50KSB7Ci0gICAgICAgIFN0cmluZyBvbGRKYXZhU3RhcnRpbmdQb2ludCA9IGphdmFTdGFydGluZ1BvaW50OwotICAgICAgICBqYXZhU3RhcnRpbmdQb2ludCA9IG5ld0phdmFTdGFydGluZ1BvaW50OwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0pBVkFfU1RBUlRJTkdfUE9JTlQsIG9sZEphdmFTdGFydGluZ1BvaW50LCBqYXZhU3RhcnRpbmdQb2ludCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkgewotICAgICAgICByZXR1cm4gdXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFVzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZShib29sZWFuIG5ld1VzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSkgewotICAgICAgICBib29sZWFuIG9sZFVzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA9IHVzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsKLSAgICAgICAgdXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlID0gbmV3VXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX1VTRV9TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRSwgb2xkVXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLCB1c2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0V4dHJhY3RJbnRlcmZhY2UoKSB7Ci0gICAgICAgIHJldHVybiBleHRyYWN0SW50ZXJmYWNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEV4dHJhY3RJbnRlcmZhY2UoYm9vbGVhbiBuZXdFeHRyYWN0SW50ZXJmYWNlKSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkRXh0cmFjdEludGVyZmFjZSA9IGV4dHJhY3RJbnRlcmZhY2U7Ci0gICAgICAgIGV4dHJhY3RJbnRlcmZhY2UgPSBuZXdFeHRyYWN0SW50ZXJmYWNlOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0VYVFJBQ1RfSU5URVJGQUNFLCBvbGRFeHRyYWN0SW50ZXJmYWNlLCBleHRyYWN0SW50ZXJmYWNlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKCkgewotICAgICAgICByZXR1cm4gc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKFN0cmluZyBuZXdTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKSB7Ci0gICAgICAgIFN0cmluZyBvbGRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lID0gc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZTsKLSAgICAgICAgc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSA9IG5ld1NlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWU7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTkFNRSwgb2xkU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSwgc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBNYXA8SU1ldGhvZCwgTWFwPFN0cmluZywgQm9vbGVhbj4+IGdldE1ldGhvZE1hcCgpIHsKLSAgICAgICAgcmV0dXJuIG1ldGhvZE1hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRob2RNYXAoTWFwPElNZXRob2QsIE1hcDxTdHJpbmcsIEJvb2xlYW4+PiBuZXdNZXRob2RNYXApIHsKLSAgICAgICAgTWFwPElNZXRob2QsIE1hcDxTdHJpbmcsIEJvb2xlYW4+PiBvbGRNZXRob2RNYXAgPSBtZXRob2RNYXA7Ci0gICAgICAgIG1ldGhvZE1hcCA9IG5ld01ldGhvZE1hcDsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19NRVRIT0RfTUFQLCBvbGRNZXRob2RNYXAsIG1ldGhvZE1hcCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBCb29sZWFuPiBnZXRBbm5vdGF0aW9uTWFwKCkgewotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbk1hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBbm5vdGF0aW9uTWFwKE1hcDxTdHJpbmcsIEJvb2xlYW4+IG5ld0Fubm90YXRpb25NYXApIHsKLSAgICAgICAgTWFwPFN0cmluZywgQm9vbGVhbj4gb2xkQW5ub3RhdGlvbk1hcCA9IGFubm90YXRpb25NYXA7Ci0gICAgICAgIGFubm90YXRpb25NYXAgPSBuZXdBbm5vdGF0aW9uTWFwOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0FOTk9UQVRJT05fTUFQLCBvbGRBbm5vdGF0aW9uTWFwLCBhbm5vdGF0aW9uTWFwKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTb3VyY2VEaXJlY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBzb3VyY2VEaXJlY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U291cmNlRGlyZWN0b3J5KFN0cmluZyBuZXdTb3VyY2VEaXJlY3RvcnkpIHsKLSAgICAgICAgU3RyaW5nIG9sZFNvdXJjZURpcmVjdG9yeSA9IHNvdXJjZURpcmVjdG9yeTsKLSAgICAgICAgc291cmNlRGlyZWN0b3J5ID0gbmV3U291cmNlRGlyZWN0b3J5OwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX1NPVVJDRV9ESVJFQ1RPUlksIG9sZFNvdXJjZURpcmVjdG9yeSwgc291cmNlRGlyZWN0b3J5KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQb3J0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHBvcnROYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBvcnROYW1lKFN0cmluZyBuZXdQb3J0TmFtZSkgewotICAgICAgICBTdHJpbmcgb2xkUG9ydE5hbWUgPSBwb3J0TmFtZTsKLSAgICAgICAgcG9ydE5hbWUgPSBuZXdQb3J0TmFtZTsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19QT1JUX05BTUUsIG9sZFBvcnROYW1lLCBwb3J0TmFtZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19TT0FQMTJfQklORElORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNTb2FwMTJCaW5kaW5nKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfWFNEX0lNUE9SVFM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzR2VuZXJhdGVYU0RJbXBvcnRzKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV1NETDoKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNHZW5lcmF0ZVdTREwoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XUkFQUEVSX0ZBVUxUX0JFQU5TOgotICAgICAgICAgICAgICAgIHJldHVybiBpc0dlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19BTk5PVEFUSU9OX1BST0NFU1NJTkdfRU5BQkxFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XRUJfTUVUSE9EX0FOTk9UQVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzR2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV0VCX1BBUkFNX0FOTk9UQVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzR2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24oKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9SRVFVRVNUX1dSQVBQRVJfQU5OT1RBVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbigpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1JFU1BPTlNFX1dSQVBQRVJfQU5OT1RBVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNHZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24oKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19DTEFTU1BBVEg6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldENsYXNzcGF0aCgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0pBVkFfU1RBUlRJTkdfUE9JTlQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEphdmFTdGFydGluZ1BvaW50KCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fVVNFX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFOgotICAgICAgICAgICAgICAgIHJldHVybiBpc1VzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0VYVFJBQ1RfSU5URVJGQUNFOgotICAgICAgICAgICAgICAgIHJldHVybiBpc0V4dHJhY3RJbnRlcmZhY2UoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9OQU1FOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fTUVUSE9EX01BUDoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TWV0aG9kTWFwKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fQU5OT1RBVElPTl9NQVA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEFubm90YXRpb25NYXAoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19TT1VSQ0VfRElSRUNUT1JZOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRTb3VyY2VEaXJlY3RvcnkoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19QT1JUX05BTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFBvcnROYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19TT0FQMTJfQklORElORzoKLSAgICAgICAgICAgICAgICBzZXRTb2FwMTJCaW5kaW5nKChCb29sZWFuKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfWFNEX0lNUE9SVFM6Ci0gICAgICAgICAgICAgICAgc2V0R2VuZXJhdGVYU0RJbXBvcnRzKChCb29sZWFuKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV1NETDoKLSAgICAgICAgICAgICAgICBzZXRHZW5lcmF0ZVdTREwoKEJvb2xlYW4pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XUkFQUEVSX0ZBVUxUX0JFQU5TOgotICAgICAgICAgICAgICAgIHNldEdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMoKEJvb2xlYW4pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19BTk5PVEFUSU9OX1BST0NFU1NJTkdfRU5BQkxFRDoKLSAgICAgICAgICAgICAgICBzZXRBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoKEJvb2xlYW4pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XRUJfTUVUSE9EX0FOTk9UQVRJT046Ci0gICAgICAgICAgICAgICAgc2V0R2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uKChCb29sZWFuKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV0VCX1BBUkFNX0FOTk9UQVRJT046Ci0gICAgICAgICAgICAgICAgc2V0R2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24oKEJvb2xlYW4pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9SRVFVRVNUX1dSQVBQRVJfQU5OT1RBVElPTjoKLSAgICAgICAgICAgICAgICBzZXRHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbigoQm9vbGVhbiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1JFU1BPTlNFX1dSQVBQRVJfQU5OT1RBVElPTjoKLSAgICAgICAgICAgICAgICBzZXRHZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24oKEJvb2xlYW4pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19DTEFTU1BBVEg6Ci0gICAgICAgICAgICAgICAgc2V0Q2xhc3NwYXRoKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19KQVZBX1NUQVJUSU5HX1BPSU5UOgotICAgICAgICAgICAgICAgIHNldEphdmFTdGFydGluZ1BvaW50KChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19VU0VfU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0U6Ci0gICAgICAgICAgICAgICAgc2V0VXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKChCb29sZWFuKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fRVhUUkFDVF9JTlRFUkZBQ0U6Ci0gICAgICAgICAgICAgICAgc2V0RXh0cmFjdEludGVyZmFjZSgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX05BTUU6Ci0gICAgICAgICAgICAgICAgc2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fTUVUSE9EX01BUDoKLSAgICAgICAgICAgICAgICBzZXRNZXRob2RNYXAoKE1hcDxJTWV0aG9kLCBNYXA8U3RyaW5nLCBCb29sZWFuPj4pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19BTk5PVEFUSU9OX01BUDoKLSAgICAgICAgICAgICAgICBzZXRBbm5vdGF0aW9uTWFwKChNYXA8U3RyaW5nLCBCb29sZWFuPiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX1NPVVJDRV9ESVJFQ1RPUlk6Ci0gICAgICAgICAgICAgICAgc2V0U291cmNlRGlyZWN0b3J5KChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19QT1JUX05BTUU6Ci0gICAgICAgICAgICAgICAgc2V0UG9ydE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19TT0FQMTJfQklORElORzoKLSAgICAgICAgICAgICAgICBzZXRTb2FwMTJCaW5kaW5nKFNPQVAxMl9CSU5ESU5HX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfWFNEX0lNUE9SVFM6Ci0gICAgICAgICAgICAgICAgc2V0R2VuZXJhdGVYU0RJbXBvcnRzKEdFTkVSQVRFX1hTRF9JTVBPUlRTX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV1NETDoKLSAgICAgICAgICAgICAgICBzZXRHZW5lcmF0ZVdTREwoR0VORVJBVEVfV1NETF9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dSQVBQRVJfRkFVTFRfQkVBTlM6Ci0gICAgICAgICAgICAgICAgc2V0R2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucyhHRU5FUkFURV9XUkFQUEVSX0ZBVUxUX0JFQU5TX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fQU5OT1RBVElPTl9QUk9DRVNTSU5HX0VOQUJMRUQ6Ci0gICAgICAgICAgICAgICAgc2V0QW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKEFOTk9UQVRJT05fUFJPQ0VTU0lOR19FTkFCTEVEX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV0VCX01FVEhPRF9BTk5PVEFUSU9OOgotICAgICAgICAgICAgICAgIHNldEdlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbihHRU5FUkFURV9XRUJfTUVUSE9EX0FOTk9UQVRJT05fRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XRUJfUEFSQU1fQU5OT1RBVElPTjoKLSAgICAgICAgICAgICAgICBzZXRHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbihHRU5FUkFURV9XRUJfUEFSQU1fQU5OT1RBVElPTl9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1JFUVVFU1RfV1JBUFBFUl9BTk5PVEFUSU9OOgotICAgICAgICAgICAgICAgIHNldEdlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKEdFTkVSQVRFX1JFUVVFU1RfV1JBUFBFUl9BTk5PVEFUSU9OX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfUkVTUE9OU0VfV1JBUFBFUl9BTk5PVEFUSU9OOgotICAgICAgICAgICAgICAgIHNldEdlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbihHRU5FUkFURV9SRVNQT05TRV9XUkFQUEVSX0FOTk9UQVRJT05fRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19DTEFTU1BBVEg6Ci0gICAgICAgICAgICAgICAgc2V0Q2xhc3NwYXRoKENMQVNTUEFUSF9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0pBVkFfU1RBUlRJTkdfUE9JTlQ6Ci0gICAgICAgICAgICAgICAgc2V0SmF2YVN0YXJ0aW5nUG9pbnQoSkFWQV9TVEFSVElOR19QT0lOVF9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX1VTRV9TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRToKLSAgICAgICAgICAgICAgICBzZXRVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoVVNFX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fRVhUUkFDVF9JTlRFUkZBQ0U6Ci0gICAgICAgICAgICAgICAgc2V0RXh0cmFjdEludGVyZmFjZShFWFRSQUNUX0lOVEVSRkFDRV9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX05BTUU6Ci0gICAgICAgICAgICAgICAgc2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZShTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9OQU1FX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fTUVUSE9EX01BUDoKLSAgICAgICAgICAgICAgICBzZXRNZXRob2RNYXAoKE1hcDxJTWV0aG9kLCBNYXA8U3RyaW5nLCBCb29sZWFuPj4pbnVsbCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0FOTk9UQVRJT05fTUFQOgotICAgICAgICAgICAgICAgIHNldEFubm90YXRpb25NYXAoKE1hcDxTdHJpbmcsIEJvb2xlYW4+KW51bGwpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19TT1VSQ0VfRElSRUNUT1JZOgotICAgICAgICAgICAgICAgIHNldFNvdXJjZURpcmVjdG9yeShTT1VSQ0VfRElSRUNUT1JZX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fUE9SVF9OQU1FOgotICAgICAgICAgICAgICAgIHNldFBvcnROYW1lKFBPUlRfTkFNRV9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fU09BUDEyX0JJTkRJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNvYXAxMkJpbmRpbmcgIT0gU09BUDEyX0JJTkRJTkdfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfWFNEX0lNUE9SVFM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlWFNESW1wb3J0cyAhPSBHRU5FUkFURV9YU0RfSU1QT1JUU19FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XU0RMOgotICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZVdTREwgIT0gR0VORVJBVEVfV1NETF9FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XUkFQUEVSX0ZBVUxUX0JFQU5TOgotICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zICE9IEdFTkVSQVRFX1dSQVBQRVJfRkFVTFRfQkVBTlNfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fQU5OT1RBVElPTl9QUk9DRVNTSU5HX0VOQUJMRUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCAhPSBBTk5PVEFUSU9OX1BST0NFU1NJTkdfRU5BQkxFRF9FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XRUJfTUVUSE9EX0FOTk9UQVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbiAhPSBHRU5FUkFURV9XRUJfTUVUSE9EX0FOTk9UQVRJT05fRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV0VCX1BBUkFNX0FOTk9UQVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uICE9IEdFTkVSQVRFX1dFQl9QQVJBTV9BTk5PVEFUSU9OX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1JFUVVFU1RfV1JBUFBFUl9BTk5PVEFUSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbiAhPSBHRU5FUkFURV9SRVFVRVNUX1dSQVBQRVJfQU5OT1RBVElPTl9FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9SRVNQT05TRV9XUkFQUEVSX0FOTk9UQVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbiAhPSBHRU5FUkFURV9SRVNQT05TRV9XUkFQUEVSX0FOTk9UQVRJT05fRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fQ0xBU1NQQVRIOgotICAgICAgICAgICAgICAgIHJldHVybiBDTEFTU1BBVEhfRURFRkFVTFQgPT0gbnVsbCA/IGNsYXNzcGF0aCAhPSBudWxsIDogIUNMQVNTUEFUSF9FREVGQVVMVC5lcXVhbHMoY2xhc3NwYXRoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19KQVZBX1NUQVJUSU5HX1BPSU5UOgotICAgICAgICAgICAgICAgIHJldHVybiBKQVZBX1NUQVJUSU5HX1BPSU5UX0VERUZBVUxUID09IG51bGwgPyBqYXZhU3RhcnRpbmdQb2ludCAhPSBudWxsIDogIUpBVkFfU1RBUlRJTkdfUE9JTlRfRURFRkFVTFQuZXF1YWxzKGphdmFTdGFydGluZ1BvaW50KTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19VU0VfU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHVzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSAhPSBVU0VfU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fRVhUUkFDVF9JTlRFUkZBQ0U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RJbnRlcmZhY2UgIT0gRVhUUkFDVF9JTlRFUkZBQ0VfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTkFNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSAhPSBudWxsIDogIVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX05BTUVfRURFRkFVTFQuZXF1YWxzKHNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX01FVEhPRF9NQVA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZE1hcCAhPSBudWxsOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0FOTk9UQVRJT05fTUFQOgotICAgICAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uTWFwICE9IG51bGw7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fU09VUkNFX0RJUkVDVE9SWToKLSAgICAgICAgICAgICAgICByZXR1cm4gU09VUkNFX0RJUkVDVE9SWV9FREVGQVVMVCA9PSBudWxsID8gc291cmNlRGlyZWN0b3J5ICE9IG51bGwgOiAhU09VUkNFX0RJUkVDVE9SWV9FREVGQVVMVC5lcXVhbHMoc291cmNlRGlyZWN0b3J5KTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19QT1JUX05BTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBPUlRfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gcG9ydE5hbWUgIT0gbnVsbCA6ICFQT1JUX05BTUVfRURFRkFVTFQuZXF1YWxzKHBvcnROYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgewotICAgICAgICBpZiAoYmFzZUNsYXNzID09IEphdmEyV1NDb250ZXh0LmNsYXNzKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fU09BUDEyX0JJTkRJTkc6IHJldHVybiBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX1NPQVAxMl9CSU5ESU5HOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9YU0RfSU1QT1JUUzogcmV0dXJuIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfWFNEX0lNUE9SVFM7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dTREw6IHJldHVybiBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dTREw7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dSQVBQRVJfRkFVTFRfQkVBTlM6IHJldHVybiBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dSQVBQRVJfRkFVTFRfQkVBTlM7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0FOTk9UQVRJT05fUFJPQ0VTU0lOR19FTkFCTEVEOiByZXR1cm4gQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19BTk5PVEFUSU9OX1BST0NFU1NJTkdfRU5BQkxFRDsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV0VCX01FVEhPRF9BTk5PVEFUSU9OOiByZXR1cm4gQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9XRUJfTUVUSE9EX0FOTk9UQVRJT047Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dFQl9QQVJBTV9BTk5PVEFUSU9OOiByZXR1cm4gQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9XRUJfUEFSQU1fQU5OT1RBVElPTjsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfUkVRVUVTVF9XUkFQUEVSX0FOTk9UQVRJT046IHJldHVybiBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1JFUVVFU1RfV1JBUFBFUl9BTk5PVEFUSU9OOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9SRVNQT05TRV9XUkFQUEVSX0FOTk9UQVRJT046IHJldHVybiBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1JFU1BPTlNFX1dSQVBQRVJfQU5OT1RBVElPTjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKLSAgICAgICAgaWYgKGJhc2VDbGFzcyA9PSBKYXZhMldTQ29udGV4dC5jbGFzcykgewotICAgICAgICAgICAgc3dpdGNoIChiYXNlRmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX1NPQVAxMl9CSU5ESU5HOiByZXR1cm4gQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19TT0FQMTJfQklORElORzsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfWFNEX0lNUE9SVFM6IHJldHVybiBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1hTRF9JTVBPUlRTOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9XU0RMOiByZXR1cm4gQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XU0RMOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9XUkFQUEVSX0ZBVUxUX0JFQU5TOiByZXR1cm4gQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XUkFQUEVSX0ZBVUxUX0JFQU5TOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19BTk5PVEFUSU9OX1BST0NFU1NJTkdfRU5BQkxFRDogcmV0dXJuIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fQU5OT1RBVElPTl9QUk9DRVNTSU5HX0VOQUJMRUQ7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dFQl9NRVRIT0RfQU5OT1RBVElPTjogcmV0dXJuIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV0VCX01FVEhPRF9BTk5PVEFUSU9OOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9XRUJfUEFSQU1fQU5OT1RBVElPTjogcmV0dXJuIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV0VCX1BBUkFNX0FOTk9UQVRJT047Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1JFUVVFU1RfV1JBUFBFUl9BTk5PVEFUSU9OOiByZXR1cm4gQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9SRVFVRVNUX1dSQVBQRVJfQU5OT1RBVElPTjsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfUkVTUE9OU0VfV1JBUFBFUl9BTk5PVEFUSU9OOiByZXR1cm4gQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9SRVNQT05TRV9XUkFQUEVSX0FOTk9UQVRJT047Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiAoc29hcDEyQmluZGluZzogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoc29hcDEyQmluZGluZyk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZ2VuZXJhdGVYU0RJbXBvcnRzOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChnZW5lcmF0ZVhTREltcG9ydHMpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGdlbmVyYXRlV1NETDogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoZ2VuZXJhdGVXU0RMKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBnZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChnZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBhbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQ6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGFubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZ2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChnZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24pOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGdlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChnZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZ2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb246ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGdlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBnZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb246ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGdlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgY2xhc3NwYXRoOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChjbGFzc3BhdGgpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGphdmFTdGFydGluZ1BvaW50OiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChqYXZhU3RhcnRpbmdQb2ludCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgdXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCh1c2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGV4dHJhY3RJbnRlcmZhY2U6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGV4dHJhY3RJbnRlcmZhY2UpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWU6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIG1ldGhvZE1hcDogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQobWV0aG9kTWFwKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBhbm5vdGF0aW9uTWFwOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChhbm5vdGF0aW9uTWFwKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBzb3VyY2VEaXJlY3Rvcnk6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHNvdXJjZURpcmVjdG9yeSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgcG9ydE5hbWU6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHBvcnROYW1lKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgnKScpOwotICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi19IC8vSmF2YTJXU0RhdGFNb2RlbEltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvaW1wbC9XU0RMMkphdmFEYXRhTW9kZWxJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL2ltcGwvV1NETDJKYXZhRGF0YU1vZGVsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTI0MTU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvaW1wbC9XU0RMMkphdmFEYXRhTW9kZWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzk4ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoKLSAqICRJZDogV1NETDJKYXZhRGF0YU1vZGVsSW1wbC5qYXZhLHYgMS4zIDIwMTAvMDEvMTcgMTk6NTY6NTYgc2NsYXJrZSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZVVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWw7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldTREwyIEphdmEgRGF0YSBNb2RlbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuV1NETDJKYXZhRGF0YU1vZGVsSW1wbCNpc0dlbmVyYXRlSW1wbGVtZW50YXRpb24gPGVtPkdlbmVyYXRlIEltcGxlbWVudGF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5XU0RMMkphdmFEYXRhTW9kZWxJbXBsI2lzUHJvY2Vzc1NPQVBIZWFkZXJzIDxlbT5Qcm9jZXNzIFNPQVAgSGVhZGVyczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuV1NETDJKYXZhRGF0YU1vZGVsSW1wbCNpc0xvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nIDxlbT5Mb2FkIERlZmF1bHQgTmFtZXNwYWNlIFBhY2thZ2UgTmFtZSBNYXBwaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5XU0RMMkphdmFEYXRhTW9kZWxJbXBsI2lzTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcgPGVtPkxvYWQgRGVmYXVsdCBFeGNsdWRlcyBOYW1lcHNhY2UgTWFwcGluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuV1NETDJKYXZhRGF0YU1vZGVsSW1wbCNpc1ZhbGlkYXRlIDxlbT5WYWxpZGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuV1NETDJKYXZhRGF0YU1vZGVsSW1wbCNnZXRXc2RsVmVyc2lvbiA8ZW0+V3NkbCBWZXJzaW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5XU0RMMkphdmFEYXRhTW9kZWxJbXBsI2lzVXNlRGVmYXVsdFZhbHVlcyA8ZW0+VXNlIERlZmF1bHQgVmFsdWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5XU0RMMkphdmFEYXRhTW9kZWxJbXBsI2dldFhqY0FyZ3MgPGVtPlhqYyBBcmdzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5XU0RMMkphdmFEYXRhTW9kZWxJbXBsI2lzTm9BZGRyZXNzQmluZGluZyA8ZW0+Tm8gQWRkcmVzcyBCaW5kaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5XU0RMMkphdmFEYXRhTW9kZWxJbXBsI2lzWGpjVXNlRGVmYXVsdFZhbHVlcyA8ZW0+WGpjIFVzZSBEZWZhdWx0IFZhbHVlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuV1NETDJKYXZhRGF0YU1vZGVsSW1wbCNpc1hqY1RvU3RyaW5nIDxlbT5YamMgVG8gU3RyaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5XU0RMMkphdmFEYXRhTW9kZWxJbXBsI2lzWGpjVG9TdHJpbmdNdWx0aUxpbmUgPGVtPlhqYyBUbyBTdHJpbmcgTXVsdGkgTGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuV1NETDJKYXZhRGF0YU1vZGVsSW1wbCNpc1hqY1RvU3RyaW5nU2ltcGxlIDxlbT5YamMgVG8gU3RyaW5nIFNpbXBsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuV1NETDJKYXZhRGF0YU1vZGVsSW1wbCNpc1hqY0xvY2F0b3IgPGVtPlhqYyBMb2NhdG9yPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5XU0RMMkphdmFEYXRhTW9kZWxJbXBsI2lzWGpjU3luY01ldGhvZHMgPGVtPlhqYyBTeW5jIE1ldGhvZHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLldTREwySmF2YURhdGFNb2RlbEltcGwjaXNYamNNYXJrR2VuZXJhdGVkIDxlbT5YamMgTWFyayBHZW5lcmF0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLldTREwySmF2YURhdGFNb2RlbEltcGwjZ2V0WGpjRXBpc29kZUZpbGUgPGVtPlhqYyBFcGlzb2RlIEZpbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLldTREwySmF2YURhdGFNb2RlbEltcGwjaXNBdXRvTmFtZVJlc29sdXRpb24gPGVtPkF1dG8gTmFtZSBSZXNvbHV0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5XU0RMMkphdmFEYXRhTW9kZWxJbXBsI2dldEluY2x1ZGVkTmFtZXNwYWNlcyA8ZW0+SW5jbHVkZWQgTmFtZXNwYWNlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuV1NETDJKYXZhRGF0YU1vZGVsSW1wbCNnZXRCaW5kaW5nRmlsZXMgPGVtPkJpbmRpbmcgRmlsZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLldTREwySmF2YURhdGFNb2RlbEltcGwjZ2V0RXhjbHVkZWROYW1lc3BhY2VzIDxlbT5FeGNsdWRlZCBOYW1lc3BhY2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5XU0RMMkphdmFEYXRhTW9kZWxJbXBsI2dldENhdGFsb2dGaWxlIDxlbT5DYXRhbG9nIEZpbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLldTREwySmF2YURhdGFNb2RlbEltcGwjZ2V0SmF2YVNvdXJjZUZvbGRlciA8ZW0+SmF2YSBTb3VyY2UgRm9sZGVyPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV1NETDJKYXZhRGF0YU1vZGVsSW1wbCBleHRlbmRzIENYRkRhdGFNb2RlbEltcGwgaW1wbGVtZW50cyBXU0RMMkphdmFEYXRhTW9kZWwgewotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0dlbmVyYXRlSW1wbGVtZW50YXRpb24oKSA8ZW0+R2VuZXJhdGUgSW1wbGVtZW50YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVJbXBsZW1lbnRhdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEdFTkVSQVRFX0lNUExFTUVOVEFUSU9OX0VERUZBVUxUID0gdHJ1ZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzR2VuZXJhdGVJbXBsZW1lbnRhdGlvbigpIDxlbT5HZW5lcmF0ZSBJbXBsZW1lbnRhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNHZW5lcmF0ZUltcGxlbWVudGF0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBnZW5lcmF0ZUltcGxlbWVudGF0aW9uID0gR0VORVJBVEVfSU1QTEVNRU5UQVRJT05fRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNQcm9jZXNzU09BUEhlYWRlcnMoKSA8ZW0+UHJvY2VzcyBTT0FQIEhlYWRlcnM8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzUHJvY2Vzc1NPQVBIZWFkZXJzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUFJPQ0VTU19TT0FQX0hFQURFUlNfRURFRkFVTFQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUHJvY2Vzc1NPQVBIZWFkZXJzKCkgPGVtPlByb2Nlc3MgU09BUCBIZWFkZXJzPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc1Byb2Nlc3NTT0FQSGVhZGVycygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc1NPQVBIZWFkZXJzID0gUFJPQ0VTU19TT0FQX0hFQURFUlNfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZygpIDxlbT5Mb2FkIERlZmF1bHQgTmFtZXNwYWNlIFBhY2thZ2UgTmFtZSBNYXBwaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0xvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9BRF9ERUZBVUxUX05BTUVTUEFDRV9QQUNLQUdFX05BTUVfTUFQUElOR19FREVGQVVMVCA9IHRydWU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0xvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKCkgPGVtPkxvYWQgRGVmYXVsdCBOYW1lc3BhY2UgUGFja2FnZSBOYW1lIE1hcHBpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGxvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nID0gTE9BRF9ERUZBVUxUX05BTUVTUEFDRV9QQUNLQUdFX05BTUVfTUFQUElOR19FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0xvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKCkgPGVtPkxvYWQgRGVmYXVsdCBFeGNsdWRlcyBOYW1lcHNhY2UgTWFwcGluZzwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIExPQURfREVGQVVMVF9FWENMVURFU19OQU1FUFNBQ0VfTUFQUElOR19FREVGQVVMVCA9IHRydWU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0xvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKCkgPGVtPkxvYWQgRGVmYXVsdCBFeGNsdWRlcyBOYW1lcHNhY2UgTWFwcGluZzwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gbG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcgPSBMT0FEX0RFRkFVTFRfRVhDTFVERVNfTkFNRVBTQUNFX01BUFBJTkdfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNWYWxpZGF0ZSgpIDxlbT5WYWxpZGF0ZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNWYWxpZGF0ZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFZBTElEQVRFX0VERUZBVUxUID0gdHJ1ZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVmFsaWRhdGUoKSA8ZW0+VmFsaWRhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzVmFsaWRhdGUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlID0gVkFMSURBVEVfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbFZlcnNpb24oKSA8ZW0+V3NkbCBWZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRXc2RsVmVyc2lvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9WRVJTSU9OX0VERUZBVUxUID0gIjEuMSI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXc2RsVmVyc2lvbigpIDxlbT5Xc2RsIFZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFdzZGxWZXJzaW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHdzZGxWZXJzaW9uID0gV1NETF9WRVJTSU9OX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVXNlRGVmYXVsdFZhbHVlcygpIDxlbT5Vc2UgRGVmYXVsdCBWYWx1ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzVXNlRGVmYXVsdFZhbHVlcygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFVTRV9ERUZBVUxUX1ZBTFVFU19FREVGQVVMVCA9IHRydWU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1VzZURlZmF1bHRWYWx1ZXMoKSA8ZW0+VXNlIERlZmF1bHQgVmFsdWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc1VzZURlZmF1bHRWYWx1ZXMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHVzZURlZmF1bHRWYWx1ZXMgPSBVU0VfREVGQVVMVF9WQUxVRVNfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0WGpjQXJncygpIDxlbT5YamMgQXJnczwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0WGpjQXJncygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEpDX0FSR1NfRURFRkFVTFQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0WGpjQXJncygpIDxlbT5YamMgQXJnczwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0WGpjQXJncygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyB4amNBcmdzID0gWEpDX0FSR1NfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNOb0FkZHJlc3NCaW5kaW5nKCkgPGVtPk5vIEFkZHJlc3MgQmluZGluZzwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNOb0FkZHJlc3NCaW5kaW5nKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTk9fQUREUkVTU19CSU5ESU5HX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc05vQWRkcmVzc0JpbmRpbmcoKSA8ZW0+Tm8gQWRkcmVzcyBCaW5kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc05vQWRkcmVzc0JpbmRpbmcoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIG5vQWRkcmVzc0JpbmRpbmcgPSBOT19BRERSRVNTX0JJTkRJTkdfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNYamNVc2VEZWZhdWx0VmFsdWVzKCkgPGVtPlhqYyBVc2UgRGVmYXVsdCBWYWx1ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzWGpjVXNlRGVmYXVsdFZhbHVlcygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFhKQ19VU0VfREVGQVVMVF9WQUxVRVNfRURFRkFVTFQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzWGpjVXNlRGVmYXVsdFZhbHVlcygpIDxlbT5YamMgVXNlIERlZmF1bHQgVmFsdWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc1hqY1VzZURlZmF1bHRWYWx1ZXMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHhqY1VzZURlZmF1bHRWYWx1ZXMgPSBYSkNfVVNFX0RFRkFVTFRfVkFMVUVTX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzWGpjVG9TdHJpbmcoKSA8ZW0+WGpjIFRvIFN0cmluZzwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNYamNUb1N0cmluZygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFhKQ19UT19TVFJJTkdfRURFRkFVTFQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzWGpjVG9TdHJpbmcoKSA8ZW0+WGpjIFRvIFN0cmluZzwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNYamNUb1N0cmluZygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4geGpjVG9TdHJpbmcgPSBYSkNfVE9fU1RSSU5HX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzWGpjVG9TdHJpbmdNdWx0aUxpbmUoKSA8ZW0+WGpjIFRvIFN0cmluZyBNdWx0aSBMaW5lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc1hqY1RvU3RyaW5nTXVsdGlMaW5lKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gWEpDX1RPX1NUUklOR19NVUxUSV9MSU5FX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1hqY1RvU3RyaW5nTXVsdGlMaW5lKCkgPGVtPlhqYyBUbyBTdHJpbmcgTXVsdGkgTGluZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNYamNUb1N0cmluZ011bHRpTGluZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4geGpjVG9TdHJpbmdNdWx0aUxpbmUgPSBYSkNfVE9fU1RSSU5HX01VTFRJX0xJTkVfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNYamNUb1N0cmluZ1NpbXBsZSgpIDxlbT5YamMgVG8gU3RyaW5nIFNpbXBsZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNYamNUb1N0cmluZ1NpbXBsZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFhKQ19UT19TVFJJTkdfU0lNUExFX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1hqY1RvU3RyaW5nU2ltcGxlKCkgPGVtPlhqYyBUbyBTdHJpbmcgU2ltcGxlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc1hqY1RvU3RyaW5nU2ltcGxlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB4amNUb1N0cmluZ1NpbXBsZSA9IFhKQ19UT19TVFJJTkdfU0lNUExFX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzWGpjTG9jYXRvcigpIDxlbT5YamMgTG9jYXRvcjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNYamNMb2NhdG9yKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gWEpDX0xPQ0FUT1JfRURFRkFVTFQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzWGpjTG9jYXRvcigpIDxlbT5YamMgTG9jYXRvcjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNYamNMb2NhdG9yKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB4amNMb2NhdG9yID0gWEpDX0xPQ0FUT1JfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNYamNTeW5jTWV0aG9kcygpIDxlbT5YamMgU3luYyBNZXRob2RzPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc1hqY1N5bmNNZXRob2RzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gWEpDX1NZTkNfTUVUSE9EU19FREVGQVVMVCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNYamNTeW5jTWV0aG9kcygpIDxlbT5YamMgU3luYyBNZXRob2RzPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc1hqY1N5bmNNZXRob2RzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB4amNTeW5jTWV0aG9kcyA9IFhKQ19TWU5DX01FVEhPRFNfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNYamNNYXJrR2VuZXJhdGVkKCkgPGVtPlhqYyBNYXJrIEdlbmVyYXRlZDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNYamNNYXJrR2VuZXJhdGVkKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gWEpDX01BUktfR0VORVJBVEVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1hqY01hcmtHZW5lcmF0ZWQoKSA8ZW0+WGpjIE1hcmsgR2VuZXJhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc1hqY01hcmtHZW5lcmF0ZWQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHhqY01hcmtHZW5lcmF0ZWQgPSBYSkNfTUFSS19HRU5FUkFURURfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0WGpjRXBpc29kZUZpbGUoKSA8ZW0+WGpjIEVwaXNvZGUgRmlsZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0WGpjRXBpc29kZUZpbGUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFhKQ19FUElTT0RFX0ZJTEVfRURFRkFVTFQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0WGpjRXBpc29kZUZpbGUoKSA8ZW0+WGpjIEVwaXNvZGUgRmlsZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0WGpjRXBpc29kZUZpbGUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgeGpjRXBpc29kZUZpbGUgPSBYSkNfRVBJU09ERV9GSUxFX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQXV0b05hbWVSZXNvbHV0aW9uKCkgPGVtPkF1dG8gTmFtZSBSZXNvbHV0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0F1dG9OYW1lUmVzb2x1dGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEFVVE9fTkFNRV9SRVNPTFVUSU9OX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0F1dG9OYW1lUmVzb2x1dGlvbigpIDxlbT5BdXRvIE5hbWUgUmVzb2x1dGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNBdXRvTmFtZVJlc29sdXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGF1dG9OYW1lUmVzb2x1dGlvbiA9IEFVVE9fTkFNRV9SRVNPTFVUSU9OX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5jbHVkZWROYW1lc3BhY2VzKCkgPGVtPkluY2x1ZGVkIE5hbWVzcGFjZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldEluY2x1ZGVkTmFtZXNwYWNlcygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIFN0cmluZz4gaW5jbHVkZWROYW1lc3BhY2VzOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmluZGluZ0ZpbGVzKCkgPGVtPkJpbmRpbmcgRmlsZXM8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0QmluZGluZ0ZpbGVzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRUxpc3Q8U3RyaW5nPiBiaW5kaW5nRmlsZXM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeGNsdWRlZE5hbWVzcGFjZXMoKSA8ZW0+RXhjbHVkZWQgTmFtZXNwYWNlczwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0RXhjbHVkZWROYW1lc3BhY2VzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgU3RyaW5nPiBleGNsdWRlZE5hbWVzcGFjZXM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2F0YWxvZ0ZpbGUoKSA8ZW0+Q2F0YWxvZyBGaWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRDYXRhbG9nRmlsZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FUQUxPR19GSUxFX0VERUZBVUxUID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhdGFsb2dGaWxlKCkgPGVtPkNhdGFsb2cgRmlsZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0Q2F0YWxvZ0ZpbGUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgY2F0YWxvZ0ZpbGUgPSBDQVRBTE9HX0ZJTEVfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SmF2YVNvdXJjZUZvbGRlcigpIDxlbT5KYXZhIFNvdXJjZSBGb2xkZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldEphdmFTb3VyY2VGb2xkZXIoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfU09VUkNFX0ZPTERFUl9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKYXZhU291cmNlRm9sZGVyKCkgPGVtPkphdmEgU291cmNlIEZvbGRlcjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0SmF2YVNvdXJjZUZvbGRlcigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBqYXZhU291cmNlRm9sZGVyID0gSkFWQV9TT1VSQ0VfRk9MREVSX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFdTREwySmF2YURhdGFNb2RlbEltcGwoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiBDWEZQYWNrYWdlLkxpdGVyYWxzLldTREwyX0pBVkFfREFUQV9NT0RFTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlSW1wbGVtZW50YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBnZW5lcmF0ZUltcGxlbWVudGF0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlSW1wbGVtZW50YXRpb24oYm9vbGVhbiBuZXdHZW5lcmF0ZUltcGxlbWVudGF0aW9uKSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkR2VuZXJhdGVJbXBsZW1lbnRhdGlvbiA9IGdlbmVyYXRlSW1wbGVtZW50YXRpb247Ci0gICAgICAgIGdlbmVyYXRlSW1wbGVtZW50YXRpb24gPSBuZXdHZW5lcmF0ZUltcGxlbWVudGF0aW9uOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fR0VORVJBVEVfSU1QTEVNRU5UQVRJT04sIG9sZEdlbmVyYXRlSW1wbGVtZW50YXRpb24sIGdlbmVyYXRlSW1wbGVtZW50YXRpb24pKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb2Nlc3NTT0FQSGVhZGVycygpIHsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NTT0FQSGVhZGVyczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9jZXNzU09BUEhlYWRlcnMoYm9vbGVhbiBuZXdQcm9jZXNzU09BUEhlYWRlcnMpIHsKLSAgICAgICAgYm9vbGVhbiBvbGRQcm9jZXNzU09BUEhlYWRlcnMgPSBwcm9jZXNzU09BUEhlYWRlcnM7Ci0gICAgICAgIHByb2Nlc3NTT0FQSGVhZGVycyA9IG5ld1Byb2Nlc3NTT0FQSGVhZGVyczsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1BST0NFU1NfU09BUF9IRUFERVJTLCBvbGRQcm9jZXNzU09BUEhlYWRlcnMsIHByb2Nlc3NTT0FQSGVhZGVycykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoKSB7Ci0gICAgICAgIHJldHVybiBsb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyhib29sZWFuIG5ld0xvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcgPSBsb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZzsKLSAgICAgICAgbG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcgPSBuZXdMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZzsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0xPQURfREVGQVVMVF9OQU1FU1BBQ0VfUEFDS0FHRV9OQU1FX01BUFBJTkcsIG9sZExvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nLCBsb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoKSB7Ci0gICAgICAgIHJldHVybiBsb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyhib29sZWFuIG5ld0xvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcgPSBsb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZzsKLSAgICAgICAgbG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcgPSBuZXdMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZzsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0xPQURfREVGQVVMVF9FWENMVURFU19OQU1FUFNBQ0VfTUFQUElORywgb2xkTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcsIGxvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbGlkYXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRlKGJvb2xlYW4gbmV3VmFsaWRhdGUpIHsKLSAgICAgICAgYm9vbGVhbiBvbGRWYWxpZGF0ZSA9IHZhbGlkYXRlOwotICAgICAgICB2YWxpZGF0ZSA9IG5ld1ZhbGlkYXRlOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fVkFMSURBVEUsIG9sZFZhbGlkYXRlLCB2YWxpZGF0ZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0V3NkbFZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiB3c2RsVmVyc2lvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRXc2RsVmVyc2lvbihTdHJpbmcgbmV3V3NkbFZlcnNpb24pIHsKLSAgICAgICAgU3RyaW5nIG9sZFdzZGxWZXJzaW9uID0gd3NkbFZlcnNpb247Ci0gICAgICAgIHdzZGxWZXJzaW9uID0gbmV3V3NkbFZlcnNpb247Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19XU0RMX1ZFUlNJT04sIG9sZFdzZGxWZXJzaW9uLCB3c2RsVmVyc2lvbikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVXNlRGVmYXVsdFZhbHVlcygpIHsKLSAgICAgICAgcmV0dXJuIHVzZURlZmF1bHRWYWx1ZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXNlRGVmYXVsdFZhbHVlcyhib29sZWFuIG5ld1VzZURlZmF1bHRWYWx1ZXMpIHsKLSAgICAgICAgYm9vbGVhbiBvbGRVc2VEZWZhdWx0VmFsdWVzID0gdXNlRGVmYXVsdFZhbHVlczsKLSAgICAgICAgdXNlRGVmYXVsdFZhbHVlcyA9IG5ld1VzZURlZmF1bHRWYWx1ZXM7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19VU0VfREVGQVVMVF9WQUxVRVMsIG9sZFVzZURlZmF1bHRWYWx1ZXMsIHVzZURlZmF1bHRWYWx1ZXMpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFhqY0FyZ3MoKSB7Ci0gICAgICAgIHJldHVybiB4amNBcmdzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFhqY0FyZ3MoU3RyaW5nIG5ld1hqY0FyZ3MpIHsKLSAgICAgICAgU3RyaW5nIG9sZFhqY0FyZ3MgPSB4amNBcmdzOwotICAgICAgICB4amNBcmdzID0gbmV3WGpjQXJnczsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19BUkdTLCBvbGRYamNBcmdzLCB4amNBcmdzKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNOb0FkZHJlc3NCaW5kaW5nKCkgewotICAgICAgICByZXR1cm4gbm9BZGRyZXNzQmluZGluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROb0FkZHJlc3NCaW5kaW5nKGJvb2xlYW4gbmV3Tm9BZGRyZXNzQmluZGluZykgewotICAgICAgICBib29sZWFuIG9sZE5vQWRkcmVzc0JpbmRpbmcgPSBub0FkZHJlc3NCaW5kaW5nOwotICAgICAgICBub0FkZHJlc3NCaW5kaW5nID0gbmV3Tm9BZGRyZXNzQmluZGluZzsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX05PX0FERFJFU1NfQklORElORywgb2xkTm9BZGRyZXNzQmluZGluZywgbm9BZGRyZXNzQmluZGluZykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzWGpjVXNlRGVmYXVsdFZhbHVlcygpIHsKLSAgICAgICAgcmV0dXJuIHhqY1VzZURlZmF1bHRWYWx1ZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0WGpjVXNlRGVmYXVsdFZhbHVlcyhib29sZWFuIG5ld1hqY1VzZURlZmF1bHRWYWx1ZXMpIHsKLSAgICAgICAgYm9vbGVhbiBvbGRYamNVc2VEZWZhdWx0VmFsdWVzID0geGpjVXNlRGVmYXVsdFZhbHVlczsKLSAgICAgICAgeGpjVXNlRGVmYXVsdFZhbHVlcyA9IG5ld1hqY1VzZURlZmF1bHRWYWx1ZXM7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfVVNFX0RFRkFVTFRfVkFMVUVTLCBvbGRYamNVc2VEZWZhdWx0VmFsdWVzLCB4amNVc2VEZWZhdWx0VmFsdWVzKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNYamNUb1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIHhqY1RvU3RyaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFhqY1RvU3RyaW5nKGJvb2xlYW4gbmV3WGpjVG9TdHJpbmcpIHsKLSAgICAgICAgYm9vbGVhbiBvbGRYamNUb1N0cmluZyA9IHhqY1RvU3RyaW5nOwotICAgICAgICB4amNUb1N0cmluZyA9IG5ld1hqY1RvU3RyaW5nOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1RPX1NUUklORywgb2xkWGpjVG9TdHJpbmcsIHhqY1RvU3RyaW5nKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNYamNUb1N0cmluZ011bHRpTGluZSgpIHsKLSAgICAgICAgcmV0dXJuIHhqY1RvU3RyaW5nTXVsdGlMaW5lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFhqY1RvU3RyaW5nTXVsdGlMaW5lKGJvb2xlYW4gbmV3WGpjVG9TdHJpbmdNdWx0aUxpbmUpIHsKLSAgICAgICAgYm9vbGVhbiBvbGRYamNUb1N0cmluZ011bHRpTGluZSA9IHhqY1RvU3RyaW5nTXVsdGlMaW5lOwotICAgICAgICB4amNUb1N0cmluZ011bHRpTGluZSA9IG5ld1hqY1RvU3RyaW5nTXVsdGlMaW5lOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1RPX1NUUklOR19NVUxUSV9MSU5FLCBvbGRYamNUb1N0cmluZ011bHRpTGluZSwgeGpjVG9TdHJpbmdNdWx0aUxpbmUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1hqY1RvU3RyaW5nU2ltcGxlKCkgewotICAgICAgICByZXR1cm4geGpjVG9TdHJpbmdTaW1wbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0WGpjVG9TdHJpbmdTaW1wbGUoYm9vbGVhbiBuZXdYamNUb1N0cmluZ1NpbXBsZSkgewotICAgICAgICBib29sZWFuIG9sZFhqY1RvU3RyaW5nU2ltcGxlID0geGpjVG9TdHJpbmdTaW1wbGU7Ci0gICAgICAgIHhqY1RvU3RyaW5nU2ltcGxlID0gbmV3WGpjVG9TdHJpbmdTaW1wbGU7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfVE9fU1RSSU5HX1NJTVBMRSwgb2xkWGpjVG9TdHJpbmdTaW1wbGUsIHhqY1RvU3RyaW5nU2ltcGxlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNYamNMb2NhdG9yKCkgewotICAgICAgICByZXR1cm4geGpjTG9jYXRvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNMb2NhdG9yKGJvb2xlYW4gbmV3WGpjTG9jYXRvcikgewotICAgICAgICBib29sZWFuIG9sZFhqY0xvY2F0b3IgPSB4amNMb2NhdG9yOwotICAgICAgICB4amNMb2NhdG9yID0gbmV3WGpjTG9jYXRvcjsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19MT0NBVE9SLCBvbGRYamNMb2NhdG9yLCB4amNMb2NhdG9yKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNYamNTeW5jTWV0aG9kcygpIHsKLSAgICAgICAgcmV0dXJuIHhqY1N5bmNNZXRob2RzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFhqY1N5bmNNZXRob2RzKGJvb2xlYW4gbmV3WGpjU3luY01ldGhvZHMpIHsKLSAgICAgICAgYm9vbGVhbiBvbGRYamNTeW5jTWV0aG9kcyA9IHhqY1N5bmNNZXRob2RzOwotICAgICAgICB4amNTeW5jTWV0aG9kcyA9IG5ld1hqY1N5bmNNZXRob2RzOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1NZTkNfTUVUSE9EUywgb2xkWGpjU3luY01ldGhvZHMsIHhqY1N5bmNNZXRob2RzKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNYamNNYXJrR2VuZXJhdGVkKCkgewotICAgICAgICByZXR1cm4geGpjTWFya0dlbmVyYXRlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNNYXJrR2VuZXJhdGVkKGJvb2xlYW4gbmV3WGpjTWFya0dlbmVyYXRlZCkgewotICAgICAgICBib29sZWFuIG9sZFhqY01hcmtHZW5lcmF0ZWQgPSB4amNNYXJrR2VuZXJhdGVkOwotICAgICAgICB4amNNYXJrR2VuZXJhdGVkID0gbmV3WGpjTWFya0dlbmVyYXRlZDsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19NQVJLX0dFTkVSQVRFRCwgb2xkWGpjTWFya0dlbmVyYXRlZCwgeGpjTWFya0dlbmVyYXRlZCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0WGpjRXBpc29kZUZpbGUoKSB7Ci0gICAgICAgIHJldHVybiB4amNFcGlzb2RlRmlsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNFcGlzb2RlRmlsZShTdHJpbmcgbmV3WGpjRXBpc29kZUZpbGUpIHsKLSAgICAgICAgU3RyaW5nIG9sZFhqY0VwaXNvZGVGaWxlID0geGpjRXBpc29kZUZpbGU7Ci0gICAgICAgIHhqY0VwaXNvZGVGaWxlID0gbmV3WGpjRXBpc29kZUZpbGU7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfRVBJU09ERV9GSUxFLCBvbGRYamNFcGlzb2RlRmlsZSwgeGpjRXBpc29kZUZpbGUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0F1dG9OYW1lUmVzb2x1dGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGF1dG9OYW1lUmVzb2x1dGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBdXRvTmFtZVJlc29sdXRpb24oYm9vbGVhbiBuZXdBdXRvTmFtZVJlc29sdXRpb24pIHsKLSAgICAgICAgYm9vbGVhbiBvbGRBdXRvTmFtZVJlc29sdXRpb24gPSBhdXRvTmFtZVJlc29sdXRpb247Ci0gICAgICAgIGF1dG9OYW1lUmVzb2x1dGlvbiA9IG5ld0F1dG9OYW1lUmVzb2x1dGlvbjsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0FVVE9fTkFNRV9SRVNPTFVUSU9OLCBvbGRBdXRvTmFtZVJlc29sdXRpb24sIGF1dG9OYW1lUmVzb2x1dGlvbikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldEluY2x1ZGVkTmFtZXNwYWNlcygpIHsKLSAgICAgICAgcmV0dXJuIGluY2x1ZGVkTmFtZXNwYWNlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlZE5hbWVzcGFjZXMoTWFwPFN0cmluZywgU3RyaW5nPiBuZXdJbmNsdWRlZE5hbWVzcGFjZXMpIHsKLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBvbGRJbmNsdWRlZE5hbWVzcGFjZXMgPSBpbmNsdWRlZE5hbWVzcGFjZXM7Ci0gICAgICAgIGluY2x1ZGVkTmFtZXNwYWNlcyA9IG5ld0luY2x1ZGVkTmFtZXNwYWNlczsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0lOQ0xVREVEX05BTUVTUEFDRVMsIG9sZEluY2x1ZGVkTmFtZXNwYWNlcywgaW5jbHVkZWROYW1lc3BhY2VzKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRCaW5kaW5nRmlsZXMoKSB7Ci0gICAgICAgIGlmIChiaW5kaW5nRmlsZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgYmluZGluZ0ZpbGVzID0gbmV3IEVEYXRhVHlwZVVuaXF1ZUVMaXN0PFN0cmluZz4oU3RyaW5nLmNsYXNzLCB0aGlzLCBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fQklORElOR19GSUxFUyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJpbmRpbmdGaWxlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRFeGNsdWRlZE5hbWVzcGFjZXMoKSB7Ci0gICAgICAgIHJldHVybiBleGNsdWRlZE5hbWVzcGFjZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXhjbHVkZWROYW1lc3BhY2VzKE1hcDxTdHJpbmcsIFN0cmluZz4gbmV3RXhjbHVkZWROYW1lc3BhY2VzKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gb2xkRXhjbHVkZWROYW1lc3BhY2VzID0gZXhjbHVkZWROYW1lc3BhY2VzOwotICAgICAgICBleGNsdWRlZE5hbWVzcGFjZXMgPSBuZXdFeGNsdWRlZE5hbWVzcGFjZXM7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19FWENMVURFRF9OQU1FU1BBQ0VTLCBvbGRFeGNsdWRlZE5hbWVzcGFjZXMsIGV4Y2x1ZGVkTmFtZXNwYWNlcykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2F0YWxvZ0ZpbGUoKSB7Ci0gICAgICAgIHJldHVybiBjYXRhbG9nRmlsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDYXRhbG9nRmlsZShTdHJpbmcgbmV3Q2F0YWxvZ0ZpbGUpIHsKLSAgICAgICAgU3RyaW5nIG9sZENhdGFsb2dGaWxlID0gY2F0YWxvZ0ZpbGU7Ci0gICAgICAgIGNhdGFsb2dGaWxlID0gbmV3Q2F0YWxvZ0ZpbGU7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19DQVRBTE9HX0ZJTEUsIG9sZENhdGFsb2dGaWxlLCBjYXRhbG9nRmlsZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SmF2YVNvdXJjZUZvbGRlcigpIHsKLSAgICAgICAgcmV0dXJuIGphdmFTb3VyY2VGb2xkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SmF2YVNvdXJjZUZvbGRlcihTdHJpbmcgbmV3SmF2YVNvdXJjZUZvbGRlcikgewotICAgICAgICBTdHJpbmcgb2xkSmF2YVNvdXJjZUZvbGRlciA9IGphdmFTb3VyY2VGb2xkZXI7Ci0gICAgICAgIGphdmFTb3VyY2VGb2xkZXIgPSBuZXdKYXZhU291cmNlRm9sZGVyOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fSkFWQV9TT1VSQ0VfRk9MREVSLCBvbGRKYXZhU291cmNlRm9sZGVyLCBqYXZhU291cmNlRm9sZGVyKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fR0VORVJBVEVfSU1QTEVNRU5UQVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzR2VuZXJhdGVJbXBsZW1lbnRhdGlvbigpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fUFJPQ0VTU19TT0FQX0hFQURFUlM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzUHJvY2Vzc1NPQVBIZWFkZXJzKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19MT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VfTkFNRV9NQVBQSU5HOgotICAgICAgICAgICAgICAgIHJldHVybiBpc0xvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19MT0FEX0RFRkFVTFRfRVhDTFVERVNfTkFNRVBTQUNFX01BUFBJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1ZBTElEQVRFOgotICAgICAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkYXRlKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19XU0RMX1ZFUlNJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFdzZGxWZXJzaW9uKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19VU0VfREVGQVVMVF9WQUxVRVM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzVXNlRGVmYXVsdFZhbHVlcygpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX0FSR1M6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFhqY0FyZ3MoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX05PX0FERFJFU1NfQklORElORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNOb0FkZHJlc3NCaW5kaW5nKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfVVNFX0RFRkFVTFRfVkFMVUVTOgotICAgICAgICAgICAgICAgIHJldHVybiBpc1hqY1VzZURlZmF1bHRWYWx1ZXMoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19UT19TVFJJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzWGpjVG9TdHJpbmcoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19UT19TVFJJTkdfTVVMVElfTElORToKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNYamNUb1N0cmluZ011bHRpTGluZSgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1RPX1NUUklOR19TSU1QTEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzWGpjVG9TdHJpbmdTaW1wbGUoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19MT0NBVE9SOgotICAgICAgICAgICAgICAgIHJldHVybiBpc1hqY0xvY2F0b3IoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19TWU5DX01FVEhPRFM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzWGpjU3luY01ldGhvZHMoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19NQVJLX0dFTkVSQVRFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNYamNNYXJrR2VuZXJhdGVkKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfRVBJU09ERV9GSUxFOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRYamNFcGlzb2RlRmlsZSgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fQVVUT19OQU1FX1JFU09MVVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzQXV0b05hbWVSZXNvbHV0aW9uKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19JTkNMVURFRF9OQU1FU1BBQ0VTOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRJbmNsdWRlZE5hbWVzcGFjZXMoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0JJTkRJTkdfRklMRVM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEJpbmRpbmdGaWxlcygpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fRVhDTFVERURfTkFNRVNQQUNFUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RXhjbHVkZWROYW1lc3BhY2VzKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19DQVRBTE9HX0ZJTEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldENhdGFsb2dGaWxlKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19KQVZBX1NPVVJDRV9GT0xERVI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEphdmFTb3VyY2VGb2xkZXIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fR0VORVJBVEVfSU1QTEVNRU5UQVRJT046Ci0gICAgICAgICAgICAgICAgc2V0R2VuZXJhdGVJbXBsZW1lbnRhdGlvbigoQm9vbGVhbiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fUFJPQ0VTU19TT0FQX0hFQURFUlM6Ci0gICAgICAgICAgICAgICAgc2V0UHJvY2Vzc1NPQVBIZWFkZXJzKChCb29sZWFuKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19MT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VfTkFNRV9NQVBQSU5HOgotICAgICAgICAgICAgICAgIHNldExvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKChCb29sZWFuKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19MT0FEX0RFRkFVTFRfRVhDTFVERVNfTkFNRVBTQUNFX01BUFBJTkc6Ci0gICAgICAgICAgICAgICAgc2V0TG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoKEJvb2xlYW4pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1ZBTElEQVRFOgotICAgICAgICAgICAgICAgIHNldFZhbGlkYXRlKChCb29sZWFuKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19XU0RMX1ZFUlNJT046Ci0gICAgICAgICAgICAgICAgc2V0V3NkbFZlcnNpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fVVNFX0RFRkFVTFRfVkFMVUVTOgotICAgICAgICAgICAgICAgIHNldFVzZURlZmF1bHRWYWx1ZXMoKEJvb2xlYW4pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19BUkdTOgotICAgICAgICAgICAgICAgIHNldFhqY0FyZ3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fTk9fQUREUkVTU19CSU5ESU5HOgotICAgICAgICAgICAgICAgIHNldE5vQWRkcmVzc0JpbmRpbmcoKEJvb2xlYW4pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19VU0VfREVGQVVMVF9WQUxVRVM6Ci0gICAgICAgICAgICAgICAgc2V0WGpjVXNlRGVmYXVsdFZhbHVlcygoQm9vbGVhbiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1RPX1NUUklORzoKLSAgICAgICAgICAgICAgICBzZXRYamNUb1N0cmluZygoQm9vbGVhbiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1RPX1NUUklOR19NVUxUSV9MSU5FOgotICAgICAgICAgICAgICAgIHNldFhqY1RvU3RyaW5nTXVsdGlMaW5lKChCb29sZWFuKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfVE9fU1RSSU5HX1NJTVBMRToKLSAgICAgICAgICAgICAgICBzZXRYamNUb1N0cmluZ1NpbXBsZSgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX0xPQ0FUT1I6Ci0gICAgICAgICAgICAgICAgc2V0WGpjTG9jYXRvcigoQm9vbGVhbiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1NZTkNfTUVUSE9EUzoKLSAgICAgICAgICAgICAgICBzZXRYamNTeW5jTWV0aG9kcygoQm9vbGVhbiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX01BUktfR0VORVJBVEVEOgotICAgICAgICAgICAgICAgIHNldFhqY01hcmtHZW5lcmF0ZWQoKEJvb2xlYW4pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19FUElTT0RFX0ZJTEU6Ci0gICAgICAgICAgICAgICAgc2V0WGpjRXBpc29kZUZpbGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fQVVUT19OQU1FX1JFU09MVVRJT046Ci0gICAgICAgICAgICAgICAgc2V0QXV0b05hbWVSZXNvbHV0aW9uKChCb29sZWFuKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19JTkNMVURFRF9OQU1FU1BBQ0VTOgotICAgICAgICAgICAgICAgIHNldEluY2x1ZGVkTmFtZXNwYWNlcygoTWFwPFN0cmluZywgU3RyaW5nPiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fQklORElOR19GSUxFUzoKLSAgICAgICAgICAgICAgICBnZXRCaW5kaW5nRmlsZXMoKS5jbGVhcigpOwotICAgICAgICAgICAgICAgIGdldEJpbmRpbmdGaWxlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fRVhDTFVERURfTkFNRVNQQUNFUzoKLSAgICAgICAgICAgICAgICBzZXRFeGNsdWRlZE5hbWVzcGFjZXMoKE1hcDxTdHJpbmcsIFN0cmluZz4pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0NBVEFMT0dfRklMRToKLSAgICAgICAgICAgICAgICBzZXRDYXRhbG9nRmlsZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19KQVZBX1NPVVJDRV9GT0xERVI6Ci0gICAgICAgICAgICAgICAgc2V0SmF2YVNvdXJjZUZvbGRlcigoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fR0VORVJBVEVfSU1QTEVNRU5UQVRJT046Ci0gICAgICAgICAgICAgICAgc2V0R2VuZXJhdGVJbXBsZW1lbnRhdGlvbihHRU5FUkFURV9JTVBMRU1FTlRBVElPTl9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fUFJPQ0VTU19TT0FQX0hFQURFUlM6Ci0gICAgICAgICAgICAgICAgc2V0UHJvY2Vzc1NPQVBIZWFkZXJzKFBST0NFU1NfU09BUF9IRUFERVJTX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19MT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VfTkFNRV9NQVBQSU5HOgotICAgICAgICAgICAgICAgIHNldExvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKExPQURfREVGQVVMVF9OQU1FU1BBQ0VfUEFDS0FHRV9OQU1FX01BUFBJTkdfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0xPQURfREVGQVVMVF9FWENMVURFU19OQU1FUFNBQ0VfTUFQUElORzoKLSAgICAgICAgICAgICAgICBzZXRMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyhMT0FEX0RFRkFVTFRfRVhDTFVERVNfTkFNRVBTQUNFX01BUFBJTkdfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1ZBTElEQVRFOgotICAgICAgICAgICAgICAgIHNldFZhbGlkYXRlKFZBTElEQVRFX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19XU0RMX1ZFUlNJT046Ci0gICAgICAgICAgICAgICAgc2V0V3NkbFZlcnNpb24oV1NETF9WRVJTSU9OX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19VU0VfREVGQVVMVF9WQUxVRVM6Ci0gICAgICAgICAgICAgICAgc2V0VXNlRGVmYXVsdFZhbHVlcyhVU0VfREVGQVVMVF9WQUxVRVNfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19BUkdTOgotICAgICAgICAgICAgICAgIHNldFhqY0FyZ3MoWEpDX0FSR1NfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX05PX0FERFJFU1NfQklORElORzoKLSAgICAgICAgICAgICAgICBzZXROb0FkZHJlc3NCaW5kaW5nKE5PX0FERFJFU1NfQklORElOR19FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1VTRV9ERUZBVUxUX1ZBTFVFUzoKLSAgICAgICAgICAgICAgICBzZXRYamNVc2VEZWZhdWx0VmFsdWVzKFhKQ19VU0VfREVGQVVMVF9WQUxVRVNfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19UT19TVFJJTkc6Ci0gICAgICAgICAgICAgICAgc2V0WGpjVG9TdHJpbmcoWEpDX1RPX1NUUklOR19FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1RPX1NUUklOR19NVUxUSV9MSU5FOgotICAgICAgICAgICAgICAgIHNldFhqY1RvU3RyaW5nTXVsdGlMaW5lKFhKQ19UT19TVFJJTkdfTVVMVElfTElORV9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1RPX1NUUklOR19TSU1QTEU6Ci0gICAgICAgICAgICAgICAgc2V0WGpjVG9TdHJpbmdTaW1wbGUoWEpDX1RPX1NUUklOR19TSU1QTEVfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19MT0NBVE9SOgotICAgICAgICAgICAgICAgIHNldFhqY0xvY2F0b3IoWEpDX0xPQ0FUT1JfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19TWU5DX01FVEhPRFM6Ci0gICAgICAgICAgICAgICAgc2V0WGpjU3luY01ldGhvZHMoWEpDX1NZTkNfTUVUSE9EU19FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX01BUktfR0VORVJBVEVEOgotICAgICAgICAgICAgICAgIHNldFhqY01hcmtHZW5lcmF0ZWQoWEpDX01BUktfR0VORVJBVEVEX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfRVBJU09ERV9GSUxFOgotICAgICAgICAgICAgICAgIHNldFhqY0VwaXNvZGVGaWxlKFhKQ19FUElTT0RFX0ZJTEVfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0FVVE9fTkFNRV9SRVNPTFVUSU9OOgotICAgICAgICAgICAgICAgIHNldEF1dG9OYW1lUmVzb2x1dGlvbihBVVRPX05BTUVfUkVTT0xVVElPTl9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fSU5DTFVERURfTkFNRVNQQUNFUzoKLSAgICAgICAgICAgICAgICBzZXRJbmNsdWRlZE5hbWVzcGFjZXMoKE1hcDxTdHJpbmcsIFN0cmluZz4pbnVsbCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fQklORElOR19GSUxFUzoKLSAgICAgICAgICAgICAgICBnZXRCaW5kaW5nRmlsZXMoKS5jbGVhcigpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0VYQ0xVREVEX05BTUVTUEFDRVM6Ci0gICAgICAgICAgICAgICAgc2V0RXhjbHVkZWROYW1lc3BhY2VzKChNYXA8U3RyaW5nLCBTdHJpbmc+KW51bGwpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0NBVEFMT0dfRklMRToKLSAgICAgICAgICAgICAgICBzZXRDYXRhbG9nRmlsZShDQVRBTE9HX0ZJTEVfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0pBVkFfU09VUkNFX0ZPTERFUjoKLSAgICAgICAgICAgICAgICBzZXRKYXZhU291cmNlRm9sZGVyKEpBVkFfU09VUkNFX0ZPTERFUl9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19HRU5FUkFURV9JTVBMRU1FTlRBVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbiAhPSBHRU5FUkFURV9JTVBMRU1FTlRBVElPTl9FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1BST0NFU1NfU09BUF9IRUFERVJTOgotICAgICAgICAgICAgICAgIHJldHVybiBwcm9jZXNzU09BUEhlYWRlcnMgIT0gUFJPQ0VTU19TT0FQX0hFQURFUlNfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19MT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VfTkFNRV9NQVBQSU5HOgotICAgICAgICAgICAgICAgIHJldHVybiBsb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyAhPSBMT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VfTkFNRV9NQVBQSU5HX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fTE9BRF9ERUZBVUxUX0VYQ0xVREVTX05BTUVQU0FDRV9NQVBQSU5HOgotICAgICAgICAgICAgICAgIHJldHVybiBsb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyAhPSBMT0FEX0RFRkFVTFRfRVhDTFVERVNfTkFNRVBTQUNFX01BUFBJTkdfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19WQUxJREFURToKLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsaWRhdGUgIT0gVkFMSURBVEVfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19XU0RMX1ZFUlNJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFdTRExfVkVSU0lPTl9FREVGQVVMVCA9PSBudWxsID8gd3NkbFZlcnNpb24gIT0gbnVsbCA6ICFXU0RMX1ZFUlNJT05fRURFRkFVTFQuZXF1YWxzKHdzZGxWZXJzaW9uKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1VTRV9ERUZBVUxUX1ZBTFVFUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gdXNlRGVmYXVsdFZhbHVlcyAhPSBVU0VfREVGQVVMVF9WQUxVRVNfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfQVJHUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gWEpDX0FSR1NfRURFRkFVTFQgPT0gbnVsbCA/IHhqY0FyZ3MgIT0gbnVsbCA6ICFYSkNfQVJHU19FREVGQVVMVC5lcXVhbHMoeGpjQXJncyk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19OT19BRERSRVNTX0JJTkRJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5vQWRkcmVzc0JpbmRpbmcgIT0gTk9fQUREUkVTU19CSU5ESU5HX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1VTRV9ERUZBVUxUX1ZBTFVFUzoKLSAgICAgICAgICAgICAgICByZXR1cm4geGpjVXNlRGVmYXVsdFZhbHVlcyAhPSBYSkNfVVNFX0RFRkFVTFRfVkFMVUVTX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1RPX1NUUklORzoKLSAgICAgICAgICAgICAgICByZXR1cm4geGpjVG9TdHJpbmcgIT0gWEpDX1RPX1NUUklOR19FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19UT19TVFJJTkdfTVVMVElfTElORToKLSAgICAgICAgICAgICAgICByZXR1cm4geGpjVG9TdHJpbmdNdWx0aUxpbmUgIT0gWEpDX1RPX1NUUklOR19NVUxUSV9MSU5FX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1RPX1NUUklOR19TSU1QTEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHhqY1RvU3RyaW5nU2ltcGxlICE9IFhKQ19UT19TVFJJTkdfU0lNUExFX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX0xPQ0FUT1I6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHhqY0xvY2F0b3IgIT0gWEpDX0xPQ0FUT1JfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfU1lOQ19NRVRIT0RTOgotICAgICAgICAgICAgICAgIHJldHVybiB4amNTeW5jTWV0aG9kcyAhPSBYSkNfU1lOQ19NRVRIT0RTX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX01BUktfR0VORVJBVEVEOgotICAgICAgICAgICAgICAgIHJldHVybiB4amNNYXJrR2VuZXJhdGVkICE9IFhKQ19NQVJLX0dFTkVSQVRFRF9FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19FUElTT0RFX0ZJTEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFhKQ19FUElTT0RFX0ZJTEVfRURFRkFVTFQgPT0gbnVsbCA/IHhqY0VwaXNvZGVGaWxlICE9IG51bGwgOiAhWEpDX0VQSVNPREVfRklMRV9FREVGQVVMVC5lcXVhbHMoeGpjRXBpc29kZUZpbGUpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fQVVUT19OQU1FX1JFU09MVVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGF1dG9OYW1lUmVzb2x1dGlvbiAhPSBBVVRPX05BTUVfUkVTT0xVVElPTl9FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0lOQ0xVREVEX05BTUVTUEFDRVM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGluY2x1ZGVkTmFtZXNwYWNlcyAhPSBudWxsOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fQklORElOR19GSUxFUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gYmluZGluZ0ZpbGVzICE9IG51bGwgJiYgIWJpbmRpbmdGaWxlcy5pc0VtcHR5KCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19FWENMVURFRF9OQU1FU1BBQ0VTOgotICAgICAgICAgICAgICAgIHJldHVybiBleGNsdWRlZE5hbWVzcGFjZXMgIT0gbnVsbDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0NBVEFMT0dfRklMRToKLSAgICAgICAgICAgICAgICByZXR1cm4gQ0FUQUxPR19GSUxFX0VERUZBVUxUID09IG51bGwgPyBjYXRhbG9nRmlsZSAhPSBudWxsIDogIUNBVEFMT0dfRklMRV9FREVGQVVMVC5lcXVhbHMoY2F0YWxvZ0ZpbGUpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fSkFWQV9TT1VSQ0VfRk9MREVSOgotICAgICAgICAgICAgICAgIHJldHVybiBKQVZBX1NPVVJDRV9GT0xERVJfRURFRkFVTFQgPT0gbnVsbCA/IGphdmFTb3VyY2VGb2xkZXIgIT0gbnVsbCA6ICFKQVZBX1NPVVJDRV9GT0xERVJfRURFRkFVTFQuZXF1YWxzKGphdmFTb3VyY2VGb2xkZXIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7Ci0gICAgICAgIGlmIChiYXNlQ2xhc3MgPT0gV1NETDJKYXZhQ29udGV4dC5jbGFzcykgewotICAgICAgICAgICAgc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fR0VORVJBVEVfSU1QTEVNRU5UQVRJT046IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fR0VORVJBVEVfSU1QTEVNRU5UQVRJT047Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fUFJPQ0VTU19TT0FQX0hFQURFUlM6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fUFJPQ0VTU19TT0FQX0hFQURFUlM7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fTE9BRF9ERUZBVUxUX05BTUVTUEFDRV9QQUNLQUdFX05BTUVfTUFQUElORzogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19MT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VfTkFNRV9NQVBQSU5HOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0xPQURfREVGQVVMVF9FWENMVURFU19OQU1FUFNBQ0VfTUFQUElORzogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19MT0FEX0RFRkFVTFRfRVhDTFVERVNfTkFNRVBTQUNFX01BUFBJTkc7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fVkFMSURBVEU6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fVkFMSURBVEU7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fV1NETF9WRVJTSU9OOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1dTRExfVkVSU0lPTjsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19VU0VfREVGQVVMVF9WQUxVRVM6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fVVNFX0RFRkFVTFRfVkFMVUVTOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19BUkdTOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19BUkdTOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX05PX0FERFJFU1NfQklORElORzogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19OT19BRERSRVNTX0JJTkRJTkc7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1VTRV9ERUZBVUxUX1ZBTFVFUzogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfVVNFX0RFRkFVTFRfVkFMVUVTOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19UT19TVFJJTkc6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1RPX1NUUklORzsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfVE9fU1RSSU5HX01VTFRJX0xJTkU6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1RPX1NUUklOR19NVUxUSV9MSU5FOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19UT19TVFJJTkdfU0lNUExFOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19UT19TVFJJTkdfU0lNUExFOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19MT0NBVE9SOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19MT0NBVE9SOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19TWU5DX01FVEhPRFM6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1NZTkNfTUVUSE9EUzsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfTUFSS19HRU5FUkFURUQ6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX01BUktfR0VORVJBVEVEOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19FUElTT0RFX0ZJTEU6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX0VQSVNPREVfRklMRTsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19BVVRPX05BTUVfUkVTT0xVVElPTjogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19BVVRPX05BTUVfUkVTT0xVVElPTjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKLSAgICAgICAgaWYgKGJhc2VDbGFzcyA9PSBXU0RMMkphdmFDb250ZXh0LmNsYXNzKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19HRU5FUkFURV9JTVBMRU1FTlRBVElPTjogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19HRU5FUkFURV9JTVBMRU1FTlRBVElPTjsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19QUk9DRVNTX1NPQVBfSEVBREVSUzogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19QUk9DRVNTX1NPQVBfSEVBREVSUzsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19MT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VfTkFNRV9NQVBQSU5HOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0xPQURfREVGQVVMVF9OQU1FU1BBQ0VfUEFDS0FHRV9OQU1FX01BUFBJTkc7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fTE9BRF9ERUZBVUxUX0VYQ0xVREVTX05BTUVQU0FDRV9NQVBQSU5HOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0xPQURfREVGQVVMVF9FWENMVURFU19OQU1FUFNBQ0VfTUFQUElORzsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19WQUxJREFURTogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19WQUxJREFURTsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19XU0RMX1ZFUlNJT046IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fV1NETF9WRVJTSU9OOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1VTRV9ERUZBVUxUX1ZBTFVFUzogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19VU0VfREVGQVVMVF9WQUxVRVM7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX0FSR1M6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX0FSR1M7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fTk9fQUREUkVTU19CSU5ESU5HOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX05PX0FERFJFU1NfQklORElORzsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfVVNFX0RFRkFVTFRfVkFMVUVTOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19VU0VfREVGQVVMVF9WQUxVRVM7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1RPX1NUUklORzogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfVE9fU1RSSU5HOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19UT19TVFJJTkdfTVVMVElfTElORTogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfVE9fU1RSSU5HX01VTFRJX0xJTkU7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1RPX1NUUklOR19TSU1QTEU6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1RPX1NUUklOR19TSU1QTEU7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX0xPQ0FUT1I6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX0xPQ0FUT1I7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1NZTkNfTUVUSE9EUzogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfU1lOQ19NRVRIT0RTOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19NQVJLX0dFTkVSQVRFRDogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfTUFSS19HRU5FUkFURUQ7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX0VQSVNPREVfRklMRTogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfRVBJU09ERV9GSUxFOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX0FVVE9fTkFNRV9SRVNPTFVUSU9OOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0FVVE9fTkFNRV9SRVNPTFVUSU9OOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0gICAgICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIgKGdlbmVyYXRlSW1wbGVtZW50YXRpb246ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGdlbmVyYXRlSW1wbGVtZW50YXRpb24pOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHByb2Nlc3NTT0FQSGVhZGVyczogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQocHJvY2Vzc1NPQVBIZWFkZXJzKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBsb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZzogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQobG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGxvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChsb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgdmFsaWRhdGU6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHZhbGlkYXRlKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCB3c2RsVmVyc2lvbjogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQod3NkbFZlcnNpb24pOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHVzZURlZmF1bHRWYWx1ZXM6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHVzZURlZmF1bHRWYWx1ZXMpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHhqY0FyZ3M6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHhqY0FyZ3MpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIG5vQWRkcmVzc0JpbmRpbmc6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKG5vQWRkcmVzc0JpbmRpbmcpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHhqY1VzZURlZmF1bHRWYWx1ZXM6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHhqY1VzZURlZmF1bHRWYWx1ZXMpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHhqY1RvU3RyaW5nOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCh4amNUb1N0cmluZyk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgeGpjVG9TdHJpbmdNdWx0aUxpbmU6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHhqY1RvU3RyaW5nTXVsdGlMaW5lKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCB4amNUb1N0cmluZ1NpbXBsZTogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoeGpjVG9TdHJpbmdTaW1wbGUpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHhqY0xvY2F0b3I6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHhqY0xvY2F0b3IpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHhqY1N5bmNNZXRob2RzOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCh4amNTeW5jTWV0aG9kcyk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgeGpjTWFya0dlbmVyYXRlZDogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoeGpjTWFya0dlbmVyYXRlZCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgeGpjRXBpc29kZUZpbGU6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHhqY0VwaXNvZGVGaWxlKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBhdXRvTmFtZVJlc29sdXRpb246ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGF1dG9OYW1lUmVzb2x1dGlvbik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgaW5jbHVkZWROYW1lc3BhY2VzOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChpbmNsdWRlZE5hbWVzcGFjZXMpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGJpbmRpbmdGaWxlczogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYmluZGluZ0ZpbGVzKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBleGNsdWRlZE5hbWVzcGFjZXM6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGV4Y2x1ZGVkTmFtZXNwYWNlcyk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgY2F0YWxvZ0ZpbGU6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGNhdGFsb2dGaWxlKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBqYXZhU291cmNlRm9sZGVyOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChqYXZhU291cmNlRm9sZGVyKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgnKScpOwotICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi19IC8vV1NETDJKYXZhRGF0YU1vZGVsSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC91dGlsL0NYRkFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL3V0aWwvQ1hGQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY2ODg5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL3V0aWwvQ1hGQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKiAkSWQ6IENYRkFkYXB0ZXJGYWN0b3J5LmphdmEsdiAxLjMgMjAxMC8wMS8xNyAxOTo1Njo1NiBzY2xhcmtlIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuKjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENYRkFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBDWEZQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgQ1hGQWRhcHRlckZhY3RvcnkoKSB7Ci0gICAgICAgIGlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgbW9kZWxQYWNrYWdlID0gQ1hGUGFja2FnZS5lSU5TVEFOQ0U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIGlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotICAgICAgICAgICAgcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgc3dpdGNoIHRoYXQgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENYRlN3aXRjaDxBZGFwdGVyPiBtb2RlbFN3aXRjaCA9Ci0gICAgICAgIG5ldyBDWEZTd2l0Y2g8QWRhcHRlcj4oKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBBZGFwdGVyIGNhc2VDWEZDb250ZXh0KENYRkNvbnRleHQgb2JqZWN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUNYRkNvbnRleHRBZGFwdGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBBZGFwdGVyIGNhc2VDWEZEYXRhTW9kZWwoQ1hGRGF0YU1vZGVsIG9iamVjdCkgewotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVDWEZEYXRhTW9kZWxBZGFwdGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBBZGFwdGVyIGNhc2VKYXZhMldTQ29udGV4dChKYXZhMldTQ29udGV4dCBvYmplY3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlSmF2YTJXU0NvbnRleHRBZGFwdGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBBZGFwdGVyIGNhc2VKYXZhMldTRGF0YU1vZGVsKEphdmEyV1NEYXRhTW9kZWwgb2JqZWN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUphdmEyV1NEYXRhTW9kZWxBZGFwdGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBBZGFwdGVyIGNhc2VXU0RMMkphdmFDb250ZXh0KFdTREwySmF2YUNvbnRleHQgb2JqZWN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVdTREwySmF2YUNvbnRleHRBZGFwdGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBBZGFwdGVyIGNhc2VXU0RMMkphdmFEYXRhTW9kZWwoV1NETDJKYXZhRGF0YU1vZGVsIG9iamVjdCkgewotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVXU0RMMkphdmFEYXRhTW9kZWxBZGFwdGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBBZGFwdGVyIGNhc2VDWEZJbnN0YWxsKENYRkluc3RhbGwgb2JqZWN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUNYRkluc3RhbGxBZGFwdGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBBZGFwdGVyIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgotICAgICAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotICAgICAgICByZXR1cm4gbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQgPGVtPkNvbnRleHQ8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQ1hGQ29udGV4dEFkYXB0ZXIoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCA8ZW0+RGF0YSBNb2RlbDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNYRkRhdGFNb2RlbEFkYXB0ZXIoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0IDxlbT5KYXZhMiBXUyBDb250ZXh0PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVKYXZhMldTQ29udGV4dEFkYXB0ZXIoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwgPGVtPkphdmEyIFdTIERhdGEgTW9kZWw8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSmF2YTJXU0RhdGFNb2RlbEFkYXB0ZXIoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQgPGVtPldTREwyIEphdmEgQ29udGV4dDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVXU0RMMkphdmFDb250ZXh0QWRhcHRlcigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsIDxlbT5XU0RMMiBKYXZhIERhdGEgTW9kZWw8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVXU0RMMkphdmFEYXRhTW9kZWxBZGFwdGVyKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZJbnN0YWxsIDxlbT5JbnN0YWxsPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZJbnN0YWxsCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNYRkluc3RhbGxBZGFwdGVyKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi19IC8vQ1hGQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvdXRpbC9DWEZTd2l0Y2guamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvdXRpbC9DWEZTd2l0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNjYzY5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL3V0aWwvQ1hGU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgotICogJElkOiBDWEZTd2l0Y2guamF2YSx2IDEuMiAyMDEwLzAxLzE3IDE5OjU2OjU2IHNjbGFya2UgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuKjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaChFT2JqZWN0KSBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDWEZTd2l0Y2g8VD4gewotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgQ1hGUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIENYRlN3aXRjaCgpIHsKLSAgICAgICAgaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtb2RlbFBhY2thZ2UgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFQgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBUIGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgewotICAgICAgICBpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLSAgICAgICAgICAgIHJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgTGlzdDxFQ2xhc3M+IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICBlU3VwZXJUeXBlcy5pc0VtcHR5KCkgPwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6Ci0gICAgICAgICAgICAgICAgICAgIGRvU3dpdGNoKGVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBUIGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewotICAgICAgICBzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9DT05URVhUOiB7Ci0gICAgICAgICAgICAgICAgQ1hGQ29udGV4dCBjeGZDb250ZXh0ID0gKENYRkNvbnRleHQpdGhlRU9iamVjdDsKLSAgICAgICAgICAgICAgICBUIHJlc3VsdCA9IGNhc2VDWEZDb250ZXh0KGN4ZkNvbnRleHQpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTDogewotICAgICAgICAgICAgICAgIENYRkRhdGFNb2RlbCBjeGZEYXRhTW9kZWwgPSAoQ1hGRGF0YU1vZGVsKXRoZUVPYmplY3Q7Ci0gICAgICAgICAgICAgICAgVCByZXN1bHQgPSBjYXNlQ1hGRGF0YU1vZGVsKGN4ZkRhdGFNb2RlbCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ1hGQ29udGV4dChjeGZEYXRhTW9kZWwpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUOiB7Ci0gICAgICAgICAgICAgICAgSmF2YTJXU0NvbnRleHQgamF2YTJXU0NvbnRleHQgPSAoSmF2YTJXU0NvbnRleHQpdGhlRU9iamVjdDsKLSAgICAgICAgICAgICAgICBUIHJlc3VsdCA9IGNhc2VKYXZhMldTQ29udGV4dChqYXZhMldTQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ1hGQ29udGV4dChqYXZhMldTQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUw6IHsKLSAgICAgICAgICAgICAgICBKYXZhMldTRGF0YU1vZGVsIGphdmEyV1NEYXRhTW9kZWwgPSAoSmF2YTJXU0RhdGFNb2RlbCl0aGVFT2JqZWN0OwotICAgICAgICAgICAgICAgIFQgcmVzdWx0ID0gY2FzZUphdmEyV1NEYXRhTW9kZWwoamF2YTJXU0RhdGFNb2RlbCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ1hGRGF0YU1vZGVsKGphdmEyV1NEYXRhTW9kZWwpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUphdmEyV1NDb250ZXh0KGphdmEyV1NEYXRhTW9kZWwpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNYRkNvbnRleHQoamF2YTJXU0RhdGFNb2RlbCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVDogewotICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnRleHQgd3NkbDJKYXZhQ29udGV4dCA9IChXU0RMMkphdmFDb250ZXh0KXRoZUVPYmplY3Q7Ci0gICAgICAgICAgICAgICAgVCByZXN1bHQgPSBjYXNlV1NETDJKYXZhQ29udGV4dCh3c2RsMkphdmFDb250ZXh0KTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDWEZDb250ZXh0KHdzZGwySmF2YUNvbnRleHQpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUw6IHsKLSAgICAgICAgICAgICAgICBXU0RMMkphdmFEYXRhTW9kZWwgd3NkbDJKYXZhRGF0YU1vZGVsID0gKFdTREwySmF2YURhdGFNb2RlbCl0aGVFT2JqZWN0OwotICAgICAgICAgICAgICAgIFQgcmVzdWx0ID0gY2FzZVdTREwySmF2YURhdGFNb2RlbCh3c2RsMkphdmFEYXRhTW9kZWwpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNYRkRhdGFNb2RlbCh3c2RsMkphdmFEYXRhTW9kZWwpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTREwySmF2YUNvbnRleHQod3NkbDJKYXZhRGF0YU1vZGVsKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDWEZDb250ZXh0KHdzZGwySmF2YURhdGFNb2RlbCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9JTlNUQUxMOiB7Ci0gICAgICAgICAgICAgICAgQ1hGSW5zdGFsbCBjeGZJbnN0YWxsID0gKENYRkluc3RhbGwpdGhlRU9iamVjdDsKLSAgICAgICAgICAgICAgICBUIHJlc3VsdCA9IGNhc2VDWEZJbnN0YWxsKGN4Zkluc3RhbGwpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRleHQ8L2VtPicuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZXh0PC9lbT4nLgotICAgICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgVCBjYXNlQ1hGQ29udGV4dChDWEZDb250ZXh0IG9iamVjdCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EYXRhIE1vZGVsPC9lbT4nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGF0YSBNb2RlbDwvZW0+Jy4KLSAgICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFQgY2FzZUNYRkRhdGFNb2RlbChDWEZEYXRhTW9kZWwgb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkphdmEyIFdTIENvbnRleHQ8L2VtPicuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KYXZhMiBXUyBDb250ZXh0PC9lbT4nLgotICAgICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgVCBjYXNlSmF2YTJXU0NvbnRleHQoSmF2YTJXU0NvbnRleHQgb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkphdmEyIFdTIERhdGEgTW9kZWw8L2VtPicuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KYXZhMiBXUyBEYXRhIE1vZGVsPC9lbT4nLgotICAgICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgVCBjYXNlSmF2YTJXU0RhdGFNb2RlbChKYXZhMldTRGF0YU1vZGVsIG9iamVjdCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XU0RMMiBKYXZhIENvbnRleHQ8L2VtPicuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XU0RMMiBKYXZhIENvbnRleHQ8L2VtPicuCi0gICAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBUIGNhc2VXU0RMMkphdmFDb250ZXh0KFdTREwySmF2YUNvbnRleHQgb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldTREwyIEphdmEgRGF0YSBNb2RlbDwvZW0+Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldTREwyIEphdmEgRGF0YSBNb2RlbDwvZW0+Jy4KLSAgICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFQgY2FzZVdTREwySmF2YURhdGFNb2RlbChXU0RMMkphdmFEYXRhTW9kZWwgb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkluc3RhbGw8L2VtPicuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JbnN0YWxsPC9lbT4nLgotICAgICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgVCBjYXNlQ1hGSW5zdGFsbChDWEZJbnN0YWxsIG9iamVjdCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0gICAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBUIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotfSAvL0NYRlN3aXRjaApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9yZXNvdXJjZXMvSmF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvcmVzb3VyY2VzL0phdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzYzhlOTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9yZXNvdXJjZXMvSmF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5yZXNvdXJjZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci0KLS8qKgotICogTGlzdGVucyBmb3IgY2hhbmdlcyB0byB0aGUgPGNvZGU+SUphdmFQcm9qZWN0PC9jb2RlPiBzcmMgZm9sZGVyLgotICoKLSAqLwotcHVibGljIGNsYXNzIEphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgewotICAgIHByaXZhdGUgTGlzdDxJUmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PElSZXNvdXJjZT4oKTsKLQotICAgIHByaXZhdGUgSVBhdGggc291cmNlRGlyZWN0b3J5UGF0aDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBKYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBpbnN0YW5jZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzb3VyY2VEaXJlY3RvcnlQYXRoCi0gICAgICovCi0gICAgcHVibGljIEphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKElQYXRoIHNvdXJjZURpcmVjdG9yeVBhdGgpIHsKLSAgICAgICAgdGhpcy5zb3VyY2VEaXJlY3RvcnlQYXRoID0gc291cmNlRGlyZWN0b3J5UGF0aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKGV2ZW50LmdldFR5cGUoKSAhPSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIElSZXNvdXJjZURlbHRhIHJvb3REZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0KLSAgICAgICAgSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgICAgIElGb2xkZXIgc3JjRm9sZGVyID0gd29ya3NwYWNlUm9vdC5nZXRGb2xkZXIoc291cmNlRGlyZWN0b3J5UGF0aCk7Ci0gICAgICAgIElQYXRoIHNyY0ZvbGRlclBhdGggPSBzcmNGb2xkZXIuZ2V0RnVsbFBhdGgoKTsKLSAgICAgICAgaWYgKCFzcmNGb2xkZXJQYXRoLmhhc1RyYWlsaW5nU2VwYXJhdG9yKCkpIHsKLSAgICAgICAgICAgIHNyY0ZvbGRlclBhdGggPSBzcmNGb2xkZXJQYXRoLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBJUmVzb3VyY2VEZWx0YSBqYXZhUmVzb3VyY2VEZWx0YSA9IHJvb3REZWx0YS5maW5kTWVtYmVyKHNyY0ZvbGRlclBhdGgpOwotCi0gICAgICAgIGlmIChqYXZhUmVzb3VyY2VEZWx0YSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgdmlzaXRvciA9IG5ldyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotICAgICAgICAgICAgICAgIGlmIChkZWx0YS5nZXRLaW5kKCkgIT0gSVJlc291cmNlRGVsdGEuQURERUQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0gICAgICAgICAgICAgICAgY2hhbmdlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICB0cnkgewotICAgICAgICAgICAgamF2YVJlc291cmNlRGVsdGEuYWNjZXB0KHZpc2l0b3IpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxJUmVzb3VyY2U+IGdldENoYW5nZWRSZXNvdXJjZXMoKSB7Ci0gICAgICAgIHJldHVybiBjaGFuZ2VkUmVzb3VyY2VzOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9yZXNvdXJjZXMvV2ViQ29udGVudENoYW5nZUxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL3Jlc291cmNlcy9XZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQwYjFjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL3Jlc291cmNlcy9XZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5yZXNvdXJjZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotCi0vKioKLSAqIExpc3RlbnMgZm9yIGNoYW5nZXMgdG8gdGhlIHdlYiBwcm9qZWN0cyBXZWJDb250ZW50IGZvbGRlci4KLSAqIAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIFdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKLSAgICBwcml2YXRlIExpc3Q8SVJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxJUmVzb3VyY2U+KCk7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9qZWN0TmFtZTsKLSAgICAKLSAgICBwdWJsaWMgV2ViQ29udGVudENoYW5nZUxpc3RlbmVyKFN0cmluZyBwcm9qZWN0TmFtZSkgewotICAgICAgICB0aGlzLnByb2plY3ROYW1lID0gcHJvamVjdE5hbWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotICAgICAgICBpZiAoZXZlbnQuZ2V0VHlwZSgpICE9IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgSVJlc291cmNlRGVsdGEgcm9vdERlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLQotICAgICAgICBJUGF0aCB3ZWJDb250ZW50UGF0aCA9IEoyRUVVdGlscy5nZXRXZWJDb250ZW50UGF0aChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpCi0gICAgICAgICAgICAgICAgLmdldFByb2plY3QocHJvamVjdE5hbWUpKTsKLSAgICAgICAgaWYgKCF3ZWJDb250ZW50UGF0aC5oYXNUcmFpbGluZ1NlcGFyYXRvcigpKSB7Ci0gICAgICAgICAgICB3ZWJDb250ZW50UGF0aCA9IHdlYkNvbnRlbnRQYXRoLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIElSZXNvdXJjZURlbHRhIHdlYlJlc291cmNlRGVsdGEgPSByb290RGVsdGEuZmluZE1lbWJlcih3ZWJDb250ZW50UGF0aCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKHdlYlJlc291cmNlRGVsdGEgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgSVJlc291cmNlRGVsdGFWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSVJlc291cmNlRGVsdGFWaXNpdG9yKCkgewotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLSAgICAgICAgICAgICAgICBpZiAoZGVsdGEuZ2V0S2luZCgpICE9IElSZXNvdXJjZURlbHRhLkFEREVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotICAgICAgICAgICAgICAgIGNoYW5nZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHdlYlJlc291cmNlRGVsdGEuYWNjZXB0KHZpc2l0b3IpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIExpc3Q8SVJlc291cmNlPiBnZXRDaGFuZ2VkUmVzb3VyY2VzKCkgewotICAgICAgICByZXR1cm4gY2hhbmdlZFJlc291cmNlczsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvdXRpbHMvQ1hGTW9kZWxVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS91dGlscy9DWEZNb2RlbFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYzk3OGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS91dGlscy9DWEZNb2RlbFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXF1ZXN0V3JhcHBlcjsKLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2VXcmFwcGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUxvY2FsVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN0cmluZ0xpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLnJld3JpdGUuSW1wb3J0UmV3cml0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuQ29kZVN0eWxlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuU2hhcmVkQVNUUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbi5JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5KRFRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5UZXh0RmlsZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi0vKioKLSAqIFByb3ZpZGVzIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZSBDWEYgbW9kZWwuCi0gKiBBbHNvIHNlcnZpbmcgYXMgYW4gaW50ZXJpbSBjbGFzcyB0byBhaWQgaW4gcmVmYWN0b3JpbmcgY29yZSB1dGlsaXRpZXMgaW50byBqYXh3cyBjb3JlLgotICoKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENYRk1vZGVsVXRpbHMgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFZlcnNpb24gdl8wXzBfMCA9IG5ldyBWZXJzaW9uKCIwLjAuMCIpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFZlcnNpb24gdl8yXzEgPSBuZXcgVmVyc2lvbihDWEZDb3JlUGx1Z2luLkNYRl9WRVJTSU9OXzJfMSk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVmVyc2lvbiB2XzJfMF83ID0gbmV3IFZlcnNpb24oIjIuMC43Iik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVmVyc2lvbiB2XzJfMV8xID0gbmV3IFZlcnNpb24oIjIuMS4xIik7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfU0VSVklDRSA9ICJXZWJTZXJ2aWNlIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9NRVRIT0QgPSAiV2ViTWV0aG9kIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9QQVJBTSA9ICJXZWJQYXJhbSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVRVNUX1dSQVBQRVIgPSAiUmVxdWVzdFdyYXBwZXIiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTUE9OU0VfV1JBUFBFUiA9ICJSZXNwb25zZVdyYXBwZXIiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EUE9JTlRfSU5URVJGQUNFID0gImVuZHBvaW50SW50ZXJmYWNlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBBTk5PVEFUSU9OX1RZUEVOQU1FX01BUCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgQU5OT1RBVElPTl9UWVBFTkFNRV9NQVAucHV0KCJTZXJ2aWNlTW9kZSIsICJqYXZheC54bWwud3MuU2VydmljZU1vZGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIEFOTk9UQVRJT05fVFlQRU5BTUVfTUFQLnB1dCgiV2ViRmF1bHQiLCAiamF2YXgueG1sLndzLldlYkZhdWx0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBBTk5PVEFUSU9OX1RZUEVOQU1FX01BUC5wdXQoUkVRVUVTVF9XUkFQUEVSLCAiamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgQU5OT1RBVElPTl9UWVBFTkFNRV9NQVAucHV0KFJFU1BPTlNFX1dSQVBQRVIsICJqYXZheC54bWwud3MuUmVzcG9uc2VXcmFwcGVyIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgQU5OT1RBVElPTl9UWVBFTkFNRV9NQVAucHV0KCJXZWJTZXJ2aWNlQ2xpZW50IiwgImphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBBTk5PVEFUSU9OX1RZUEVOQU1FX01BUC5wdXQoIldlYkVuZHBvaW50IiwgImphdmF4LnhtbC53cy5XZWJFbmRwb2ludCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgQU5OT1RBVElPTl9UWVBFTkFNRV9NQVAucHV0KCJXZWJTZXJ2aWNlUHJvdmlkZXIiLCAiamF2YXgueG1sLndzLldlYlNlcnZpY2VQcm92aWRlciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgQU5OT1RBVElPTl9UWVBFTkFNRV9NQVAucHV0KCJCaW5kaW5nVHlwZSIsICJqYXZheC54bWwud3MuQmluZGluZ1R5cGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIEFOTk9UQVRJT05fVFlQRU5BTUVfTUFQLnB1dCgiV2ViU2VydmljZVJlZiIsICJqYXZheC54bWwud3MuV2ViU2VydmljZVJlZiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgQU5OT1RBVElPTl9UWVBFTkFNRV9NQVAucHV0KCJXZWJTZXJ2aWNlUmVmcyIsICJqYXZheC54bWwud3MuV2ViU2VydmljZVJlZnMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIEFOTk9UQVRJT05fVFlQRU5BTUVfTUFQLnB1dChXRUJfU0VSVklDRSwgImphdmF4Lmp3cy5XZWJTZXJ2aWNlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgQU5OT1RBVElPTl9UWVBFTkFNRV9NQVAucHV0KFdFQl9NRVRIT0QsICJqYXZheC5qd3MuV2ViTWV0aG9kIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgQU5OT1RBVElPTl9UWVBFTkFNRV9NQVAucHV0KCJPbmV3YXkiLCAiamF2YXguandzLk9uZVdheSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgQU5OT1RBVElPTl9UWVBFTkFNRV9NQVAucHV0KFdFQl9QQVJBTSwgImphdmF4Lmp3cy5XZWJQYXJhbSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEFOTk9UQVRJT05fVFlQRU5BTUVfTUFQLnB1dCgiV2ViUmVzdWx0IiwgImphdmF4Lmp3cy5XZWJSZXN1bHQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIEFOTk9UQVRJT05fVFlQRU5BTUVfTUFQLnB1dCgiU09BUEJpbmRpbmciLCAiamF2YXguandzLlNPQVBCaW5kaW5nIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBBTk5PVEFUSU9OX1RZUEVOQU1FX01BUC5wdXQoIkhhbmRsZXJDaGFpbiIsICJqYXZheC5qd3MuSGFuZGxlckNoYWluIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIH0KLQotICAgIHByaXZhdGUgQ1hGTW9kZWxVdGlscygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZ2V0V2ViU2VydmljZUFubm90YXRpb25DaGFuZ2UoSVR5cGUgdHlwZSwgSmF2YTJXU0RhdGFNb2RlbCBtb2RlbCwKLSAgICAgICAgICAgIFRleHRGaWxlQ2hhbmdlIHRleHRGaWxlQ2hhbmdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElDb21waWxhdGlvblVuaXQgc291cmNlID0gdHlwZS5nZXRDb21waWxhdGlvblVuaXQoKTsKLSAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IFNoYXJlZEFTVFByb3ZpZGVyLmdldEFTVChzb3VyY2UsIFNoYXJlZEFTVFByb3ZpZGVyLldBSVRfWUVTLCBudWxsKTsKLQotICAgICAgICBBU1QgYXN0ID0gY29tcGlsYXRpb25Vbml0LmdldEFTVCgpOwotCi0gICAgICAgIE5vcm1hbEFubm90YXRpb24gd2ViU2VydmljZUFubm90YXRpb24gPSBnZXRBbm5vdGF0aW9uKHR5cGUsIFdlYlNlcnZpY2UuY2xhc3MpOwotICAgICAgICBpZiAod2ViU2VydmljZUFubm90YXRpb24gIT0gbnVsbCAmJiBtb2RlbC5pc1VzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpICYmIHR5cGUuaXNDbGFzcygpKSB7Ci0gICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgZW5kcG9pbnRJbnRlcmZhY2UgPSBnZXRNZW1iZXJWYWx1ZVBhaXIod2ViU2VydmljZUFubm90YXRpb24sIEVORFBPSU5UX0lOVEVSRkFDRSk7Ci0gICAgICAgICAgICBpZiAoZW5kcG9pbnRJbnRlcmZhY2UgIT0gbnVsbCAmJiBlbmRwb2ludEludGVyZmFjZS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgU3RyaW5nTGl0ZXJhbCkgewotICAgICAgICAgICAgICAgIFN0cmluZ0xpdGVyYWwgc3RyaW5nTGl0ZXJhbCA9IChTdHJpbmdMaXRlcmFsKSBlbmRwb2ludEludGVyZmFjZS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmICghc3RyaW5nTGl0ZXJhbC5nZXRMaXRlcmFsVmFsdWUoKS5lcXVhbHMobW9kZWwuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBBU1ROb2RlIG5ld1NFSVZhbHVlID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ0xpdGVyYWwoYXN0LCBtb2RlbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZVVwZGF0ZU1lbWJlclZhbHVlUGFpclRleHRFZGl0KGVuZHBvaW50SW50ZXJmYWNlLCBuZXdTRUlWYWx1ZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIGVuZHBvaW50SW50ZXJmYWNlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVNZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgRU5EUE9JTlRfSU5URVJGQUNFLCBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTGl0ZXJhbChhc3QsIG1vZGVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKCkpKTsKLQotICAgICAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZE1lbWJlclZhbHVlUGFpclRleHRFZGl0KHdlYlNlcnZpY2VBbm5vdGF0aW9uLCBlbmRwb2ludEludGVyZmFjZVBhaXIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgICAgIElBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgYW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyID0KLSAgICAgICAgICAgICAgICBBbm5vdGF0aW9uc01hbmFnZXIuZ2V0QW5ub3RhdGlvbkRlZmluaXRpb25Gb3JDbGFzcyhXZWJTZXJ2aWNlLmNsYXNzKS4KLSAgICAgICAgICAgICAgICBnZXRBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIoKTsKLQotICAgICAgICAgICAgaWYgKGFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycyA9IGFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5nZXRNZW1iZXJWYWx1ZVBhaXJzKHR5cGUsIGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdlYlNlcnZpY2UuY2xhc3MpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobW9kZWwuaXNVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSAmJiB0eXBlLmlzQ2xhc3MoKSkgewotICAgICAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciBlbmRwb2ludEludGVyZmFjZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgRU5EUE9JTlRfSU5URVJGQUNFLCBtb2RlbC5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKCkpOwotICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKDEsIGVuZHBvaW50SW50ZXJmYWNlVmFsdWVQYWlyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBXZWJTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbWVtYmVyVmFsdWVQYWlycyk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChzb3VyY2UuZmluZFByaW1hcnlUeXBlKCksIGFubm90YXRpb24pKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIE5vcm1hbEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihJVHlwZSB0eXBlLCBDbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbj4gYW5ub3RhdGlvbikgewotICAgICAgICBBbm5vdGF0aW9uIGpkdEFubm90YXRpb24gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbih0eXBlLCBhbm5vdGF0aW9uKTsKLSAgICAgICAgaWYgKGpkdEFubm90YXRpb24gIT0gbnVsbCAmJiBqZHRBbm5vdGF0aW9uIGluc3RhbmNlb2YgTm9ybWFsQW5ub3RhdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIChOb3JtYWxBbm5vdGF0aW9uKSBqZHRBbm5vdGF0aW9uOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHByaXZhdGUgc3RhdGljIE1lbWJlclZhbHVlUGFpciBnZXRNZW1iZXJWYWx1ZVBhaXIoTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBTdHJpbmcgbWVtYmVyTmFtZSkgewotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IGFubm90YXRpb24udmFsdWVzKCk7Ci0gICAgICAgIGZvciAoTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpciA6IG1lbWJlclZhbHVlUGFpcnMpIHsKLSAgICAgICAgICAgIGlmIChtZW1iZXJWYWx1ZVBhaXIuZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKS5lcXVhbHMobWVtYmVyTmFtZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbWVtYmVyVmFsdWVQYWlyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBnZXRXZWJNZXRob2RBbm5vdGF0aW9uQ2hhbmdlKElUeXBlIHR5cGUsIElNZXRob2QgbWV0aG9kLAotICAgICAgICAgICAgVGV4dEZpbGVDaGFuZ2UgdGV4dEZpbGVDaGFuZ2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2UgPSB0eXBlLmdldENvbXBpbGF0aW9uVW5pdCgpOwotICAgICAgICBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gU2hhcmVkQVNUUHJvdmlkZXIuZ2V0QVNUKHNvdXJjZSwgU2hhcmVkQVNUUHJvdmlkZXIuV0FJVF9ZRVMsIG51bGwpOwotCi0gICAgICAgIEFTVCBhc3QgPSBjb21waWxhdGlvblVuaXQuZ2V0QVNUKCk7Ci0KLSAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0QW5ub3RhdGlvbihtZXRob2QsIGFzdCwgV2ViTWV0aG9kLmNsYXNzKTsKLQotICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQobWV0aG9kLCBhbm5vdGF0aW9uKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGdldFJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbkNoYW5nZShJVHlwZSB0eXBlLCBJTWV0aG9kIG1ldGhvZCwKLSAgICAgICAgICAgIFRleHRGaWxlQ2hhbmdlIHRleHRGaWxlQ2hhbmdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElDb21waWxhdGlvblVuaXQgc291cmNlID0gdHlwZS5nZXRDb21waWxhdGlvblVuaXQoKTsKLSAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IFNoYXJlZEFTVFByb3ZpZGVyLmdldEFTVChzb3VyY2UsIFNoYXJlZEFTVFByb3ZpZGVyLldBSVRfWUVTLCBudWxsKTsKLQotICAgICAgICBBU1QgYXN0ID0gY29tcGlsYXRpb25Vbml0LmdldEFTVCgpOwotCi0gICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldEFubm90YXRpb24obWV0aG9kLCBhc3QsIFJlcXVlc3RXcmFwcGVyLmNsYXNzKTsKLQotICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQobWV0aG9kLCBhbm5vdGF0aW9uKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGdldFJlc3BvbnNlV3JhcHBlckFubm90YXRpb25DaGFuZ2UoSVR5cGUgdHlwZSwgSU1ldGhvZCBtZXRob2QsCi0gICAgICAgICAgICBUZXh0RmlsZUNoYW5nZSB0ZXh0RmlsZUNoYW5nZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJQ29tcGlsYXRpb25Vbml0IHNvdXJjZSA9IHR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0gICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBTaGFyZWRBU1RQcm92aWRlci5nZXRBU1Qoc291cmNlLCBTaGFyZWRBU1RQcm92aWRlci5XQUlUX1lFUywgbnVsbCk7Ci0KLSAgICAgICAgQVNUIGFzdCA9IGNvbXBpbGF0aW9uVW5pdC5nZXRBU1QoKTsKLQotICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRBbm5vdGF0aW9uKG1ldGhvZCwgYXN0LCBSZXNwb25zZVdyYXBwZXIuY2xhc3MpOwotCi0gICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChtZXRob2QsIGFubm90YXRpb24pKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZ2V0V2ViUGFyYW1Bbm5vdGF0aW9uQ2hhbmdlKElUeXBlIHR5cGUsIGZpbmFsIElNZXRob2QgbWV0aG9kLAotICAgICAgICAgICAgSUxvY2FsVmFyaWFibGUgcGFyYW1ldGVyLCBUZXh0RmlsZUNoYW5nZSB0ZXh0RmlsZUNoYW5nZSkKLSAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElDb21waWxhdGlvblVuaXQgc291cmNlID0gdHlwZS5nZXRDb21waWxhdGlvblVuaXQoKTsKLSAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IFNoYXJlZEFTVFByb3ZpZGVyLmdldEFTVChzb3VyY2UsIFNoYXJlZEFTVFByb3ZpZGVyLldBSVRfWUVTLCBudWxsKTsKLQotICAgICAgICBBU1QgYXN0ID0gY29tcGlsYXRpb25Vbml0LmdldEFTVCgpOwotCi0gICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldEFubm90YXRpb24ocGFyYW1ldGVyLCBhc3QsIFdlYlBhcmFtLmNsYXNzKTsKLQotICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQocGFyYW1ldGVyLCBhbm5vdGF0aW9uKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgQVNUIGFzdCwKLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MpIHsKLQotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotCi0gICAgICAgIElBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgYW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyID0gQW5ub3RhdGlvbnNNYW5hZ2VyCi0gICAgICAgIC5nZXRBbm5vdGF0aW9uRGVmaW5pdGlvbkZvckNsYXNzKGFubm90YXRpb25DbGFzcykuZ2V0QW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyKCk7Ci0KLSAgICAgICAgaWYgKGFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzID0gYW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmdldE1lbWJlclZhbHVlUGFpcnMoamF2YUVsZW1lbnQsIGFzdCwgYW5ub3RhdGlvbkNsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIGFubm90YXRpb25DbGFzcy5nZXRTaW1wbGVOYW1lKCksIG1lbWJlclZhbHVlUGFpcnMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBnZXRJbXBvcnRzQ2hhbmdlKElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LCBKYXZhMldTRGF0YU1vZGVsIG1vZGVsLAotICAgICAgICAgICAgVGV4dEZpbGVDaGFuZ2UgdGV4dEZpbGVDaGFuZ2UsIGJvb2xlYW4gY2xhc3NPbmx5KSB7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIEltcG9ydFJld3JpdGUgaW1wb3J0UmV3cml0ZSA9IENvZGVTdHlsZUNvbmZpZ3VyYXRpb24uY3JlYXRlSW1wb3J0UmV3cml0ZShjb21waWxhdGlvblVuaXQsIHRydWUpOwotCi0gICAgICAgICAgICBpbXBvcnRSZXdyaXRlLmFkZEltcG9ydChBTk5PVEFUSU9OX1RZUEVOQU1FX01BUC5nZXQoV0VCX1NFUlZJQ0UpKTsKLQotICAgICAgICAgICAgaWYgKCFjbGFzc09ubHkpIHsKLSAgICAgICAgICAgICAgICBNYXA8SU1ldGhvZCwgTWFwPFN0cmluZywgQm9vbGVhbj4+IG1ldGhvZEFubm90YXRpb25NYXAgPSBtb2RlbC5nZXRNZXRob2RNYXAoKTsKLSAgICAgICAgICAgICAgICBTZXQ8RW50cnk8SU1ldGhvZCwgTWFwPFN0cmluZywgQm9vbGVhbj4+PiBtZXRob2RBbm5vdGF0aW9uU2V0ID0gbWV0aG9kQW5ub3RhdGlvbk1hcC5lbnRyeVNldCgpOwotICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PElNZXRob2QsIE1hcDxTdHJpbmcsIEJvb2xlYW4+PiBtZXRob2RBbm5vdGF0aW9uIDogbWV0aG9kQW5ub3RhdGlvblNldCkgewotICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBCb29sZWFuPiBtZXRob2RNYXAgPSBtZXRob2RBbm5vdGF0aW9uLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIFNldDxFbnRyeTxTdHJpbmcsIEJvb2xlYW4+PiBtZXRob2RTZXQgPSBtZXRob2RNYXAuZW50cnlTZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBCb29sZWFuPiBtZXRob2QgOiBtZXRob2RTZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBTk5PVEFUSU9OX1RZUEVOQU1FX01BUC5jb250YWluc0tleShtZXRob2QuZ2V0S2V5KCkpICYmIG1ldGhvZC5nZXRWYWx1ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0UmV3cml0ZS5hZGRJbXBvcnQoQU5OT1RBVElPTl9UWVBFTkFNRV9NQVAuZ2V0KG1ldGhvZC5nZXRLZXkoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGltcG9ydFJld3JpdGUuaGFzUmVjb3JkZWRDaGFuZ2VzKCkpIHsKLSAgICAgICAgICAgICAgICBUZXh0RWRpdCBpbXBvcnRUZXh0RWRpdCA9IGltcG9ydFJld3JpdGUucmV3cml0ZUltcG9ydHMobnVsbCk7Ci0gICAgICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChpbXBvcnRUZXh0RWRpdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIENYRkNvcmVQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvYWRzIGFsbCBwdWJsaWMgbWV0aG9kcyB3aXRoIHRoZSBkZWZhdWx0IGFubm90YXRpb24gbWFwcwotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1hcDxJTWV0aG9kLCBNYXA8U3RyaW5nLCBCb29sZWFuPj4gZ2V0TWV0aG9kTWFwKElUeXBlIHR5cGUsIEphdmEyV1NEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgTWFwPElNZXRob2QsIE1hcDxTdHJpbmcsIEJvb2xlYW4+PiBtZXRob2RNYXAgPSBuZXcgSGFzaE1hcDxJTWV0aG9kLCBNYXA8U3RyaW5nLCBCb29sZWFuPj4oKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgSU1ldGhvZFtdIG1ldGhvZHMgPSB0eXBlLmdldE1ldGhvZHMoKTsKLSAgICAgICAgICAgIGZvciAoSU1ldGhvZCBtZXRob2QgOiBtZXRob2RzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGUuaXNJbnRlcmZhY2UoKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRob2RNYXAucHV0KG1ldGhvZCwgZ2V0QW5ub3RhdGlvbk1hcChtb2RlbCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5pc0NsYXNzKCkgJiYgSkRUVXRpbHMuaXNQdWJsaWNNZXRob2QobWV0aG9kKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRob2RNYXAucHV0KG1ldGhvZCwgZ2V0QW5ub3RhdGlvbk1hcChtb2RlbCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWV0aG9kTWFwOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgQm9vbGVhbj4gZ2V0QW5ub3RhdGlvbk1hcChKYXZhMldTRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIEJvb2xlYW4+IGFubm90YXRpb25kTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBCb29sZWFuPigpOwotICAgICAgICBhbm5vdGF0aW9uZE1hcC5wdXQoQ1hGTW9kZWxVdGlscy5XRUJfTUVUSE9ELCBtb2RlbC5pc0dlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbigpKTsKLSAgICAgICAgYW5ub3RhdGlvbmRNYXAucHV0KENYRk1vZGVsVXRpbHMuV0VCX1BBUkFNLCBtb2RlbC5pc0dlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKCkpOwotICAgICAgICBhbm5vdGF0aW9uZE1hcC5wdXQoQ1hGTW9kZWxVdGlscy5SRVFVRVNUX1dSQVBQRVIsIG1vZGVsLmlzR2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24oKSk7Ci0gICAgICAgIGFubm90YXRpb25kTWFwLnB1dChDWEZNb2RlbFV0aWxzLlJFU1BPTlNFX1dSQVBQRVIsIG1vZGVsLmlzR2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKCkpOwotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbmRNYXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ1hGIHdzZGwyamF2YSAtYXV0b05hbWVSZXNvbHV0aW9uIGlzIHN1cHBvcnRlZCBpbiB0aGUgQ1hGIDIuMCBzdHJlYW0gZnJvbSAyLjAuNwotICAgICAqIGFuZCBpbiB0aGUgQ1hGIDIuMSBzdHJlYW0gZnJvbSAyLjEuMSB1cC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjeGZSdW50aW1lVmVyc2lvbgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBdXRvTmFtZVJlc29sdXRpb25QZXJtaXR0ZWQoKSB7Ci0gICAgICAgIFZlcnNpb24gY3VycmVudFZlcnNpb24gPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRDdXJyZW50UnVudGltZVZlcnNpb24oKTsKLSAgICAgICAgLy9PbiBzdGFydHVwIHdpdGggY2xlYW4gd29ya3NwYWNlIHNob3cgYnkgZGVmYXVsdC4KLSAgICAgICAgaWYgKGN1cnJlbnRWZXJzaW9uLmNvbXBhcmVUbyh2XzBfMF8wKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjdXJyZW50VmVyc2lvbi5jb21wYXJlVG8oQ1hGTW9kZWxVdGlscy52XzJfMV8xKSA+PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjdXJyZW50VmVyc2lvbi5jb21wYXJlVG8oQ1hGTW9kZWxVdGlscy52XzJfMF83KSA+PSAwCi0gICAgICAgICAgICAgICAgJiYgY3VycmVudFZlcnNpb24uY29tcGFyZVRvKENYRk1vZGVsVXRpbHMudl8yXzEpIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREZWZhdWx0Qm9vbGVhblZhbHVlKGludCBjbGFzc2lmaWVySUQsIGludCBmZWF0dXJlSUQpIHsKLSAgICAgICAgT2JqZWN0IGRlZmF1bHRWYWx1ZSA9IG51bGw7Ci0KLSAgICAgICAgaWYgKGNsYXNzaWZpZXJJRCA9PSBDWEZQYWNrYWdlLkNYRl9DT05URVhUKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9DT05URVhUX19FWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVI6Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gQ1hGUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q1hGQ29udGV4dF9FeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIoKQotICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVF9fVkVSQk9TRToKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRDWEZDb250ZXh0X1ZlcmJvc2UoKS5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVF9fR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEU6Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gQ1hGUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q1hGQ29udGV4dF9HZW5lcmF0ZUFudEJ1aWxkRmlsZSgpLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9DT05URVhUX19VU0VfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFQ6Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gQ1hGUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q1hGQ29udGV4dF9Vc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoKQotICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVF9fR0VORVJBVEVfQ0xJRU5UOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldENYRkNvbnRleHRfR2VuZXJhdGVDbGllbnQoKS5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVF9fR0VORVJBVEVfU0VSVkVSOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldENYRkNvbnRleHRfR2VuZXJhdGVTZXJ2ZXIoKS5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjbGFzc2lmaWVySUQgPT0gQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0FOTk9UQVRJT05fUFJPQ0VTU0lOR19FTkFCTEVEOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmEyV1NDb250ZXh0X0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpCi0gICAgICAgICAgICAgICAgLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX1NPQVAxMl9CSU5ESU5HOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmEyV1NDb250ZXh0X1NvYXAxMkJpbmRpbmcoKS5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9YU0RfSU1QT1JUUzoKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVhTREltcG9ydHMoKS5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9XUkFQUEVSX0ZBVUxUX0JFQU5TOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMoKQotICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9XU0RMOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlV1NETCgpLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dFQl9NRVRIT0RfQU5OT1RBVElPTjoKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24oKQotICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9XRUJfUEFSQU1fQU5OT1RBVElPTjoKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbigpCi0gICAgICAgICAgICAgICAgLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1JFUVVFU1RfV1JBUFBFUl9BTk5PVEFUSU9OOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKCkKLSAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfUkVTUE9OU0VfV1JBUFBFUl9BTk5PVEFUSU9OOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbigpCi0gICAgICAgICAgICAgICAgLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNsYXNzaWZpZXJJRCA9PSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCkgewotICAgICAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX05PX0FERFJFU1NfQklORElORzoKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X05vQWRkcmVzc0JpbmRpbmcoKS5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1VTRV9ERUZBVUxUX1ZBTFVFUzoKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X1VzZURlZmF1bHRWYWx1ZXMoKS5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX0FVVE9fTkFNRV9SRVNPTFVUSU9OOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfQXV0b05hbWVSZXNvbHV0aW9uKCkKLSAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19HRU5FUkFURV9JTVBMRU1FTlRBVElPTjoKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X0dlbmVyYXRlSW1wbGVtZW50YXRpb24oKQotICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1BST0NFU1NfU09BUF9IRUFERVJTOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfUHJvY2Vzc1NPQVBIZWFkZXJzKCkKLSAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19HRU5FUkFURV9BTlRfQlVJTERfRklMRToKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRDWEZDb250ZXh0X0dlbmVyYXRlQW50QnVpbGRGaWxlKCkuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19WQUxJREFURToKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X1ZhbGlkYXRlKCkuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19MT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VfTkFNRV9NQVBQSU5HOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFCi0gICAgICAgICAgICAgICAgLmdldFdTREwySmF2YUNvbnRleHRfTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoKS5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX0xPQURfREVGQVVMVF9FWENMVURFU19OQU1FUFNBQ0VfTUFQUElORzoKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X0xvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKCkKLSAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfVVNFX0RFRkFVTFRfVkFMVUVTOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfWGpjVXNlRGVmYXVsdFZhbHVlcygpCi0gICAgICAgICAgICAgICAgLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1RPX1NUUklORzoKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X1hqY1RvU3RyaW5nKCkuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfVE9fU1RSSU5HX01VTFRJX0xJTkU6Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gQ1hGUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETDJKYXZhQ29udGV4dF9YamNUb1N0cmluZ011bHRpTGluZSgpCi0gICAgICAgICAgICAgICAgLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1RPX1NUUklOR19TSU1QTEU6Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gQ1hGUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETDJKYXZhQ29udGV4dF9YamNUb1N0cmluZ1NpbXBsZSgpLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX0xPQ0FUT1I6Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gQ1hGUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETDJKYXZhQ29udGV4dF9YamNMb2NhdG9yKCkuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfU1lOQ19NRVRIT0RTOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfWGpjU3luY01ldGhvZHMoKS5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19NQVJLX0dFTkVSQVRFRDoKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X1hqY01hcmtHZW5lcmF0ZWQoKS5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCAmJiBkZWZhdWx0VmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChCb29sZWFuKSBkZWZhdWx0VmFsdWUpLmJvb2xlYW5WYWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS91dGlscy9Db21tYW5kTGluZVV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL3V0aWxzL0NvbW1hbmRMaW5lVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I5MzI3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL3V0aWxzL0NvbW1hbmRMaW5lVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29tbWFuZExpbmVVdGlscyB7Ci0gICAgLy8gSmF2YTJXU0RMCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE9VVF9GSUxFID0gIi1vIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBSRVNPVVJDRV9ESVIgPSAiLWQiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFNPVVJDRV9ESVIgPSAiLXMiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIENMQVNTX0RJUiA9ICItY2xhc3NkaXIiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEoyV19DTEFTU1BBVEggPSAiLWNwIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBJTkNfU09BUDEyID0gIi1zb2FwMTIiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRBUkdFVF9OQU1FU1BBQ0UgPSAiLXQiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEoyV19TRVJWSUNFX05BTUUgPSAiLXNlcnZpY2VuYW1lIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBQT1JUX05BTUUgPSAiLXBvcnRuYW1lIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBHRU5fWFNEX0lNUE9SVFMgPSAiLWNyZWF0ZXhzZGltcG9ydHMiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFZFUkJPU0UgPSAiLXZlcmJvc2UiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvLyBKYXZhMldTCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEoyV19GUk9OVEVORCA9ICItZnJvbnRlbmQiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEoyV19EQVRBQklORElORyA9ICItZGF0YWJpbmRpbmciOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEJFQU5fUEFUSCA9ICItYmVhbnMiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEdFTl9XU0RMID0gIi13c2RsIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBHRU5fQ0xJRU5UID0gIi1jbGllbnQiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEdFTl9TRVJWRVIgPSAiLXNlcnZlciI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgR0VOX1dSQVBQRVJfRkFVTFQgPSAiLXdyYXBwZXJiZWFuIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFcySl9QQUNLQUdFX05BTUUgPSAiLXAiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFcySl9CSU5ESU5HX05BTUUgPSAiLWIiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVzJKX0ZST05URU5EID0gIi1mZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVzJKX0RBVEFCSU5ESU5HID0gIi1kYiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVzJKX1dTRExfVkVSU0lPTiA9ICItd3YiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFcySl9TRVJWSUNFX05BTUUgPSAiLXNuIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBXMkpfQ0FUQUxPRyA9ICItY2F0YWxvZyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVzJKX0NPTVBJTEUgPSAiLWNvbXBpbGUiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFcySl9HRU5fSU1QTCA9ICItaW1wbCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVzJKX0dFTl9BTEwgPSAiLWFsbCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVzJKX05PX09WRVJXUklURSA9ICIta2VlcCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVzJKX0RFRkFVTFRfVkFMVUVTID0gIi1kZWZhdWx0VmFsdWVzIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBXMkpfQVVUT19OQU1FX1JFU09MVVRJT04gPSAiLWF1dG9OYW1lUmVzb2x1dGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVzJKX0VYQ0xVREVfTkFNRVNQQUNFID0gIi1uZXhjbHVkZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVzJKX0VYVF9TT0FQX0hFQURFUiA9ICItZXhzaCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVzJKX0RFRkFVTFRfTkFNRVNQQUNFID0gIi1kbnMiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFcySl9ERUZBVUxUX0VYQ0xVREVfTlMgPSAiLWRleCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVzJKX1dTRExfTE9DQVRJT04gPSAiLXdzZGxMb2NhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVzJKX1hKQ19BUkdTID0gIi14amMiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFcySl9OT19BRERSRVNTX0JJTkRJTkcgPSAiLW5vQWRkcmVzc0JpbmRpbmciOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFcySl9WQUxJREFURV9XU0RMID0gIi12YWxpZGF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIFhKQwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfRFZfQVJHID0gIi1YZHYiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhKQ19UU19BUkcgPSAiLVh0cyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEpDX1RTX01VTFRJX0FSRyA9ICItWHRzOnN0eWxlOm11bHRpbGluZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEpDX1RTX1NJTVBMRSA9ICItWHRzOnN0eWxlOnNpbXBsZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEpDX0xPQ0FUT1JfQVJHID0gIi1YbG9jYXRvciI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEpDX1NZTkNfTUVUSE9EU19BUkcgPSAiLVhzeW5jLW1ldGhvZHMiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhKQ19NQVJLX0dFTkVSQVRFRF9BUkcgPSAiLW1hcmstZ2VuZXJhdGVkIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfRVBJU09ERV9GSUxFX0FSRyA9ICItZXBpc29kZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgQ29tbWFuZExpbmVVdGlscygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldEphdmEyV1NQcm9ncmFtQXJndW1lbnRzKEphdmEyV1NEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHByb2dBcmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3QobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSk7Ci0gICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5leGlzdHMoKSAmJiBKRFRVdGlscy5pc0phdmFQcm9qZWN0KHByb2plY3QpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gbW9kZWwuZ2V0SmF2YVN0YXJ0aW5nUG9pbnQoKTsKLSAgICAgICAgICAgIGlmIChtb2RlbC5pc1VzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpICYmIG1vZGVsLmdldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBtb2RlbC5nZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEFkZCBhbGwgdGhlIGVhcmxpZXIgd3NkbDJqYXZhIHRvb2wgb3B0aW9ucwotICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkQWxsKEFycmF5cy5hc0xpc3QoQ29tbWFuZExpbmVVdGlscy5nZXRTdGFuZGFyZEphdmEyV1NETFByb2dyYW1Bcmd1bWVudHMobW9kZWwpKSk7Ci0KLSAgICAgICAgICAgIGlmIChtb2RlbC5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKS5jb21wYXJlVG8oQ1hGQ29yZVBsdWdpbi5DWEZfVkVSU0lPTl8yXzEpID49IDApIHsKLSAgICAgICAgICAgICAgICBwcm9nQXJncy5hZGQoSjJXX0ZST05URU5EKTsKLSAgICAgICAgICAgICAgICBwcm9nQXJncy5hZGQobW9kZWwuZ2V0RnJvbnRlbmQoKS5nZXRMaXRlcmFsKCkpOwotCi0gICAgICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKEoyV19EQVRBQklORElORyk7Ci0gICAgICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKG1vZGVsLmdldERhdGFiaW5kaW5nKCkuZ2V0TGl0ZXJhbCgpKTsKLQotICAgICAgICAgICAgICAgIC8vIHByb2dBcmdzLmFkZChCRUFOX1BBVEgpOwotICAgICAgICAgICAgICAgIC8vIHByb2dBcmdzLmFkZCgiQkVBTl9QQVRIIik7Ci0KLSAgICAgICAgICAgICAgICBpZiAobW9kZWwuaXNHZW5lcmF0ZVdTREwoKSkgewotICAgICAgICAgICAgICAgICAgICBwcm9nQXJncy5hZGQoR0VOX1dTREwpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2dBcmdzLnJlbW92ZShPVVRfRklMRSk7Ci0gICAgICAgICAgICAgICAgICAgIHByb2dBcmdzLnJlbW92ZShtb2RlbC5nZXRXc2RsRmlsZU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG1vZGVsLmlzR2VuZXJhdGVDbGllbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBwcm9nQXJncy5hZGQoR0VOX0NMSUVOVCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG1vZGVsLmlzR2VuZXJhdGVTZXJ2ZXIoKSkgewotICAgICAgICAgICAgICAgICAgICBwcm9nQXJncy5hZGQoR0VOX1NFUlZFUik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG1vZGVsLmlzR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2dBcmdzLmFkZChHRU5fV1JBUFBFUl9GQVVMVCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcm9nQXJncy5hZGQoY2xhc3NOYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHJvZ0FyZ3MudG9BcnJheShuZXcgU3RyaW5nW3Byb2dBcmdzLnNpemUoKV0pOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGdldFN0YW5kYXJkSmF2YTJXU0RMUHJvZ3JhbUFyZ3VtZW50cyhKYXZhMldTRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IG1vZGVsLmdldFByb2plY3ROYW1lKCk7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBwcm9nQXJncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBwcm9nQXJncy5hZGQoSjJXX0NMQVNTUEFUSCk7Ci0gICAgICAgIHByb2dBcmdzLmFkZChKRFRVdGlscy5nZXRKYXZhUHJvamVjdE91dHB1dERpcmVjdG9yeVBhdGgocHJvamVjdE5hbWUpLnRvT1NTdHJpbmcoKSk7Ci0KLSAgICAgICAgcHJvZ0FyZ3MuYWRkKFNPVVJDRV9ESVIpOwotICAgICAgICBwcm9nQXJncy5hZGQoRmlsZVV0aWxzLmdldFRtcEZvbGRlcihwcm9qZWN0TmFtZSkgKyAiL3NyYyIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgcHJvZ0FyZ3MuYWRkKFJFU09VUkNFX0RJUik7Ci0gICAgICAgIHByb2dBcmdzLmFkZChGaWxlVXRpbHMuZ2V0VG1wRm9sZGVyKHByb2plY3ROYW1lKSArICIvd3NkbCIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgcHJvZ0FyZ3MuYWRkKENMQVNTX0RJUik7Ci0gICAgICAgIHByb2dBcmdzLmFkZChKRFRVdGlscy5nZXRKYXZhUHJvamVjdE91dHB1dERpcmVjdG9yeVBhdGgocHJvamVjdE5hbWUpLnRvT1NTdHJpbmcoKSk7Ci0KLSAgICAgICAgcHJvZ0FyZ3MuYWRkKE9VVF9GSUxFKTsKLSAgICAgICAgcHJvZ0FyZ3MuYWRkKG1vZGVsLmdldFdzZGxGaWxlTmFtZSgpKTsKLQotICAgICAgICBpZiAobW9kZWwuaXNTb2FwMTJCaW5kaW5nKCkpIHsKLSAgICAgICAgICAgIHByb2dBcmdzLmFkZChJTkNfU09BUDEyKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobW9kZWwuaXNHZW5lcmF0ZVhTREltcG9ydHMoKSkgewotICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKEdFTl9YU0RfSU1QT1JUUyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobW9kZWwuaXNWZXJib3NlKCkpIHsKLSAgICAgICAgICAgIHByb2dBcmdzLmFkZChWRVJCT1NFKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwcm9nQXJncy50b0FycmF5KG5ldyBTdHJpbmdbcHJvZ0FyZ3Muc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRXU0RMMkphdmFQcm9ncmFtQXJndW1lbnRzKFdTREwySmF2YURhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSBtb2RlbC5nZXRQcm9qZWN0TmFtZSgpOwotICAgICAgICBMaXN0PFN0cmluZz4gcHJvZ0FyZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5leGlzdHMoKSAmJiBKRFRVdGlscy5pc0phdmFQcm9qZWN0KHByb2plY3QpKSB7Ci0gICAgICAgICAgICAvLyBBZGQgU3RhbmRhcmQgYXJncwotICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkQWxsKEFycmF5cy5hc0xpc3QoQ29tbWFuZExpbmVVdGlscy5nZXRTdGFuZGFyZFdTREwySmF2YVByb2dyYW1Bcmd1bWVudHMobW9kZWwsCi0gICAgICAgICAgICAgICAgICAgIHByb2plY3ROYW1lKSkpOwotCi0gICAgICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSBtb2RlbC5nZXRTZXJ2aWNlTmFtZSgpOwotICAgICAgICAgICAgaWYgKHNlcnZpY2VOYW1lICE9IG51bGwgJiYgc2VydmljZU5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKFcySl9TRVJWSUNFX05BTUUpOwotICAgICAgICAgICAgICAgIHByb2dBcmdzLmFkZChzZXJ2aWNlTmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtb2RlbC5pc1VzZURlZmF1bHRWYWx1ZXMoKSkgewotICAgICAgICAgICAgICAgIHByb2dBcmdzLmFkZChXMkpfREVGQVVMVF9WQUxVRVMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobW9kZWwuZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCkuY29tcGFyZVRvKENYRkNvcmVQbHVnaW4uQ1hGX1ZFUlNJT05fMl8xKSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKFcySl9GUk9OVEVORCk7Ci0gICAgICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKG1vZGVsLmdldEZyb250ZW5kKCkuZ2V0TGl0ZXJhbCgpKTsKLQotICAgICAgICAgICAgICAgIHByb2dBcmdzLmFkZChXMkpfREFUQUJJTkRJTkcpOwotICAgICAgICAgICAgICAgIHByb2dBcmdzLmFkZChtb2RlbC5nZXREYXRhYmluZGluZygpLmdldExpdGVyYWwoKSk7Ci0KLSAgICAgICAgICAgICAgICBwcm9nQXJncy5hZGQoVzJKX1dTRExfVkVSU0lPTik7Ci0gICAgICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKG1vZGVsLmdldFdzZGxWZXJzaW9uKCkpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1vZGVsLmlzTm9BZGRyZXNzQmluZGluZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2dBcmdzLmFkZChXMkpfTk9fQUREUkVTU19CSU5ESU5HKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByb2dBcmdzLmFkZChtb2RlbC5nZXRXc2RsVVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHByb2dBcmdzLnRvQXJyYXkobmV3IFN0cmluZ1twcm9nQXJncy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFdTREwySmF2YUdlbmVyYXRlQ2xpZW50QXJndW1lbnRzKFdTREwySmF2YURhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSBtb2RlbC5nZXRQcm9qZWN0TmFtZSgpOwotICAgICAgICBMaXN0PFN0cmluZz4gcHJvZ0FyZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5leGlzdHMoKSAmJiBKRFRVdGlscy5pc0phdmFQcm9qZWN0KHByb2plY3QpKSB7Ci0gICAgICAgICAgICBwcm9nQXJncy5hZGQoR0VOX0NMSUVOVCk7Ci0KLSAgICAgICAgICAgIC8vIEFkZCBXU0xEMkphdmEgYXJncwotICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkQWxsKEFycmF5cy5hc0xpc3QoQ29tbWFuZExpbmVVdGlscy5nZXRXU0RMMkphdmFQcm9ncmFtQXJndW1lbnRzKG1vZGVsKSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcm9nQXJncy50b0FycmF5KG5ldyBTdHJpbmdbcHJvZ0FyZ3Muc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRTdGFuZGFyZFdTREwySmF2YVByb2dyYW1Bcmd1bWVudHMoV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcHJvamVjdE5hbWUpIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHByb2dBcmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIHByb2dBcmdzLmFkZChSRVNPVVJDRV9ESVIpOwotICAgICAgICBwcm9nQXJncy5hZGQoRmlsZVV0aWxzLmdldFRtcEZvbGRlcihwcm9qZWN0TmFtZSkgKyAiL3NyYyIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgcHJvZ0FyZ3MuYWRkKENMQVNTX0RJUik7Ci0gICAgICAgIHByb2dBcmdzLmFkZChKRFRVdGlscy5nZXRKYXZhUHJvamVjdE91dHB1dERpcmVjdG9yeVBhdGgocHJvamVjdE5hbWUpLnRvT1NTdHJpbmcoKSk7Ci0KLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBpbmNsdWRlZE5hbWVzcGFjZXMgPSBtb2RlbC5nZXRJbmNsdWRlZE5hbWVzcGFjZXMoKTsKLSAgICAgICAgaWYgKGluY2x1ZGVkTmFtZXNwYWNlcyAhPSBudWxsICYmIG1vZGVsLmdldEluY2x1ZGVkTmFtZXNwYWNlcygpLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIFNldDxNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBpbmNsdWRlZE5hbWVzcGFjZXNFbnRyeVNldCA9IGluY2x1ZGVkTmFtZXNwYWNlcy5lbnRyeVNldCgpOwotICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudHJ5IDogaW5jbHVkZWROYW1lc3BhY2VzRW50cnlTZXQpIHsKLSAgICAgICAgICAgICAgICBwcm9nQXJncy5hZGQoVzJKX1BBQ0tBR0VfTkFNRSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHdzZGxOYW1lc3BhY2UgPSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIHByb2dBcmdzLmFkZCh3c2RsTmFtZXNwYWNlICsgIj0iICsgcGFja2FnZU5hbWUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PFN0cmluZz4gYmluZGluZ0ZpbGVzID0gbW9kZWwuZ2V0QmluZGluZ0ZpbGVzKCk7Ci0gICAgICAgIGlmICghYmluZGluZ0ZpbGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgZm9yIChTdHJpbmcgYmluZGluZ0ZpbGUgOiBiaW5kaW5nRmlsZXMpIHsKLSAgICAgICAgICAgICAgICBwcm9nQXJncy5hZGQoVzJKX0JJTkRJTkdfTkFNRSk7Ci0gICAgICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKGJpbmRpbmdGaWxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtb2RlbC5pc0dlbmVyYXRlU2VydmVyKCkpIHsKLSAgICAgICAgICAgIHByb2dBcmdzLmFkZChHRU5fU0VSVkVSKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtb2RlbC5pc0dlbmVyYXRlSW1wbGVtZW50YXRpb24oKSkgewotICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKFcySl9HRU5fSU1QTCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihtb2RlbC5pc1ZhbGlkYXRlKCkpIHsKLSAgICAgICAgICAgIHByb2dBcmdzLmFkZChXMkpfVkFMSURBVEVfV1NETCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm9nQXJncy5hZGQoVzJKX0VYVF9TT0FQX0hFQURFUik7Ci0gICAgICAgIHByb2dBcmdzLmFkZChCb29sZWFuLnRvU3RyaW5nKG1vZGVsLmlzUHJvY2Vzc1NPQVBIZWFkZXJzKCkpKTsKLQotICAgICAgICBwcm9nQXJncy5hZGQoVzJKX0RFRkFVTFRfTkFNRVNQQUNFKTsKLSAgICAgICAgcHJvZ0FyZ3MuYWRkKEJvb2xlYW4udG9TdHJpbmcobW9kZWwuaXNMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZygpKSk7Ci0KLSAgICAgICAgcHJvZ0FyZ3MuYWRkKFcySl9ERUZBVUxUX0VYQ0xVREVfTlMpOwotICAgICAgICBwcm9nQXJncy5hZGQoQm9vbGVhbi50b1N0cmluZyhtb2RlbC5pc0xvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKCkpKTsKLQotICAgICAgICBpZiAobW9kZWwuaXNBdXRvTmFtZVJlc29sdXRpb24oKSAmJiBDWEZNb2RlbFV0aWxzLmlzQXV0b05hbWVSZXNvbHV0aW9uUGVybWl0dGVkKCkpIHsKLSAgICAgICAgICAgIHByb2dBcmdzLmFkZChXMkpfQVVUT19OQU1FX1JFU09MVVRJT04pOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHhqY0FyZ3MgPSBDb21tYW5kTGluZVV0aWxzLmdldFhKQ0FyZ3MobW9kZWwpOwotICAgICAgICBpZiAoeGpjQXJncy50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBwcm9nQXJncy5hZGQoVzJKX1hKQ19BUkdTICsgeGpjQXJncyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobW9kZWwuZ2V0V3NkbExvY2F0aW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKFcySl9XU0RMX0xPQ0FUSU9OKTsKLSAgICAgICAgICAgIHByb2dBcmdzLmFkZChtb2RlbC5nZXRXc2RsTG9jYXRpb24oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobW9kZWwuaXNWZXJib3NlKCkpIHsKLSAgICAgICAgICAgIHByb2dBcmdzLmFkZChWRVJCT1NFKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHJvZ0FyZ3MudG9BcnJheShuZXcgU3RyaW5nW3Byb2dBcmdzLnNpemUoKV0pOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRYSkNBcmdzKFdTREwySmF2YURhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICBMaXN0PFN0cmluZz4geGpjQXJncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBpZiAobW9kZWwuaXNYamNVc2VEZWZhdWx0VmFsdWVzKCkpIHsKLSAgICAgICAgICAgIHhqY0FyZ3MuYWRkKFhKQ19EVl9BUkcpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtb2RlbC5pc1hqY1RvU3RyaW5nKCkpIHsKLSAgICAgICAgICAgIHhqY0FyZ3MuYWRkKFhKQ19UU19BUkcpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtb2RlbC5pc1hqY1RvU3RyaW5nTXVsdGlMaW5lKCkpIHsKLSAgICAgICAgICAgIHhqY0FyZ3MuYWRkKFhKQ19UU19NVUxUSV9BUkcpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtb2RlbC5pc1hqY1RvU3RyaW5nU2ltcGxlKCkpIHsKLSAgICAgICAgICAgIHhqY0FyZ3MuYWRkKFhKQ19UU19TSU1QTEUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtb2RlbC5pc1hqY0xvY2F0b3IoKSkgewotICAgICAgICAgICAgeGpjQXJncy5hZGQoWEpDX0xPQ0FUT1JfQVJHKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobW9kZWwuaXNYamNTeW5jTWV0aG9kcygpKSB7Ci0gICAgICAgICAgICB4amNBcmdzLmFkZChYSkNfU1lOQ19NRVRIT0RTX0FSRyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1vZGVsLmlzWGpjTWFya0dlbmVyYXRlZCgpKSB7Ci0gICAgICAgICAgICB4amNBcmdzLmFkZChYSkNfTUFSS19HRU5FUkFURURfQVJHKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyB4amNBcmcgPSB4amNBcmdzLnRvU3RyaW5nKCk7Ci0gICAgICAgIHhqY0FyZyA9IHhqY0FyZy5yZXBsYWNlKCdbJywgJyAnKTsKLSAgICAgICAgeGpjQXJnID0geGpjQXJnLnJlcGxhY2UoJ10nLCAnICcpOwotCi0gICAgICAgIHhqY0FyZyA9IHhqY0FyZy5yZXBsYWNlQWxsKCJcXHMiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0gICAgICAgIHJldHVybiB4amNBcmcudHJpbSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvdXRpbHMvRmlsZVV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL3V0aWxzL0ZpbGVVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzhjOThkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvdXRpbHMvRmlsZVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLldTRExVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuRm9ybWF0UHJvY2Vzc29yc0V4dGVuc2lvblJlYWRlcjsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBGaWxlVXRpbHMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRNUF9GT0xERVJfTkFNRSA9ICIuY3hmdG1wIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBGaWxlVXRpbHMoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgewotICAgICAgICByZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNvcHlGb2xkZXIoU3RyaW5nIHNvdXJjZSwgU3RyaW5nIGRlc3RpbmF0aW9uKSB7Ci0gICAgICAgIEZpbGUgc291cmNlRm9sZGVyID0gbmV3IEZpbGUoc291cmNlKTsKLQotICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IHNvdXJjZUZvbGRlci5saXN0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHNvdXJjZUZvbGRlciArIEZpbGUuc2VwYXJhdG9yICsgZmlsZXNbaV0pOwotICAgICAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgIGNvcHlGb2xkZXIoc291cmNlLCBkZXN0aW5hdGlvbiwgZmlsZXNbaV0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjb3B5RmlsZShzb3VyY2UsIGRlc3RpbmF0aW9uLCBmaWxlc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNvcHlGb2xkZXIoU3RyaW5nIHNvdXJjZUZvbGRlciwgU3RyaW5nIHRhcmdldEZvbGRlciwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgRmlsZSB0YXJnZXQgPSBuZXcgRmlsZSh0YXJnZXRGb2xkZXIgKyBGaWxlLnNlcGFyYXRvciArIG5hbWUpOwotICAgICAgICBpZiAoIXRhcmdldC5leGlzdHMoKSkgewotICAgICAgICAgICAgdGFyZ2V0Lm1rZGlyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY29weUZvbGRlcihzb3VyY2VGb2xkZXIgKyBGaWxlLnNlcGFyYXRvciArIG5hbWUsIHRhcmdldEZvbGRlciArIEZpbGUuc2VwYXJhdG9yICsgbmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNvcHlGaWxlKFN0cmluZyBzb3VyY2VGb2xkZXIsIFN0cmluZyB0YXJnZXRGb2xkZXIsIFN0cmluZyBmaWxlTmFtZSkgewotICAgICAgICBGaWxlIHNvdXJjZUZpbGUgPSBuZXcgRmlsZShzb3VyY2VGb2xkZXIgKyBGaWxlLnNlcGFyYXRvciArIGZpbGVOYW1lKTsKLSAgICAgICAgRmlsZSB0YXJnZXRGaWxlID0gbmV3IEZpbGUodGFyZ2V0Rm9sZGVyICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlTmFtZSk7Ci0gICAgICAgIGlmICghdGFyZ2V0RmlsZS5leGlzdHMoKSkgewotICAgICAgICAJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOwotICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotCQkgICAgICAgIGlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzb3VyY2VGaWxlKTsKLSAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0YXJnZXRGaWxlKTsKLSAgICAgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMTAyNDAwXTsKLSAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyT2ZCeXRlcyA9IGlucHV0U3RyZWFtLnJlYWQoYnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG51bWJlck9mQnl0ZXMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0ud3JpdGUoYnVmZmVyLCAwLCBudW1iZXJPZkJ5dGVzKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmbmZlKSB7Ci0gICAgICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coZm5mZSk7Ci0JCSAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhpb2UpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQl0cnkgewotCQkJCSAgICBpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkgewotCQkJCSAgICAgICAgaW5wdXRTdHJlYW0uY2xvc2UoKTsgICAgCi0JCQkJICAgIH0KLQkJCQkgICAgaWYgKG91dHB1dFN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJICAgICAgICBvdXRwdXRTdHJlYW0uY2xvc2UoKTsgICAgCi0JCQkJICAgIH0KLQkJCQl9IGNhdGNoKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhpb2UpOwotCQkJCX0KLQkJCX0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChzb3VyY2VGaWxlLmdldE5hbWUoKS5pbmRleE9mKCIuamF2YSIpICE9IC0xKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBNZXJnZVV0aWxzLm1lcmdlKHNvdXJjZUZpbGUsIHRhcmdldEZpbGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VG1wRm9sZGVyTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIFRNUF9GT0xERVJfTkFNRTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VG1wRm9sZGVyKFN0cmluZyBwcm9qZWN0TmFtZSkgewotICAgICAgICByZXR1cm4gRmlsZVV0aWxzLmdldFRtcEZvbGRlcihGaWxlVXRpbHMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRtcEZvbGRlcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIElGb2xkZXIgdG1wRm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIoVE1QX0ZPTERFUl9OQU1FKTsKLSAgICAgICAgaWYgKCF0bXBGb2xkZXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdG1wRm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIElGb2xkZXIgdG1wU3JjRm9sZGVyID0gdG1wRm9sZGVyLmdldEZvbGRlcigic3JjIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKCF0bXBTcmNGb2xkZXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdG1wU3JjRm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIElGb2xkZXIgdG1wV1NETEZvbGRlciA9IHRtcEZvbGRlci5nZXRGb2xkZXIoIndzZGwiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAoIXRtcFdTRExGb2xkZXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdG1wV1NETEZvbGRlci5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coY2UuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0bXBGb2xkZXIuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNvcHlXMkpGaWxlc0Zyb21UbXAoV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIElXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCi0gICAgICAgIElQcm9qZWN0IHByb2plY3QgPSB3b3Jrc3BhY2VSb290LmdldFByb2plY3QobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSk7Ci0gICAgICAgIElGb2xkZXIgc3JjRm9sZGVyID0gd29ya3NwYWNlUm9vdC5nZXRGb2xkZXIobmV3IFBhdGgobW9kZWwuZ2V0SmF2YVNvdXJjZUZvbGRlcigpKSk7Ci0gICAgICAgIEZpbGVVdGlscy5jb3B5Rm9sZGVyKGdldFRtcEZvbGRlcihwcm9qZWN0KSArICIvc3JjIiwgc3JjRm9sZGVyLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzcmNGb2xkZXIucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIENYRkNvcmVQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgICAgICBkZWxldGVUbXBGb2xkZXIocHJvamVjdCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNvcHlKMldGaWxlc0Zyb21UbXAoSmF2YTJXU0RhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSBtb2RlbC5nZXRQcm9qZWN0TmFtZSgpOwotICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gRmlsZVV0aWxzLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCi0gICAgICAgIElUeXBlIHR5cGUgPSBKRFRVdGlscy5maW5kVHlwZShKRFRVdGlscy5nZXRKYXZhUHJvamVjdChwcm9qZWN0TmFtZSksIG1vZGVsLmdldEphdmFTdGFydGluZ1BvaW50KCkpOwotICAgICAgICBJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQgPSB0eXBlLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldFBhcmVudCgpOwotICAgICAgICBJUmVzb3VyY2UgamF2YUVsZW1lbnRSZXNvdXJjZSA9IGphdmFFbGVtZW50LmdldFJlc291cmNlKCk7Ci0gICAgICAgIGlmIChqYXZhRWxlbWVudFJlc291cmNlIGluc3RhbmNlb2YgSUZvbGRlcikgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBJRm9sZGVyIHNyY0RpcmVjdG9yeSA9IChJRm9sZGVyKSBqYXZhRWxlbWVudFJlc291cmNlOwotICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jb3B5Rm9sZGVyKGdldFRtcEZvbGRlcihwcm9qZWN0KSArICIvc3JjIiwgc3JjRGlyZWN0b3J5LmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHNyY0RpcmVjdG9yeS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCAgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKG1vZGVsLmlzR2VuZXJhdGVXU0RMKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgSUZvbGRlciB3c2RsRm9sZGVyID0gV1NETFV0aWxzLmdldFdTRExGb2xkZXIocHJvamVjdE5hbWUpOwotICAgICAgICAgICAgICAgICAgICBGaWxlVXRpbHMuY29weUZvbGRlcihnZXRUbXBGb2xkZXIocHJvamVjdCkgKyAiL3dzZGwiLCB3c2RsRm9sZGVyLmdldExvY2F0aW9uKCkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b09TU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICBtb2RlbC5zZXRDb25maWdXc2RsTG9jYXRpb24od3NkbEZvbGRlci5nZXROYW1lKCkgKyAiLyIgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1vZGVsLmdldFdzZGxGaWxlTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgd3NkbEZvbGRlci5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coY2UuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgZGVsZXRlVG1wRm9sZGVyKHByb2plY3QpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIElTdGF0dXMgZGVsZXRlVG1wRm9sZGVyKElQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCi0gICAgICAgIElGb2xkZXIgdG1wRm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIoVE1QX0ZPTERFUl9OQU1FKTsKLSAgICAgICAgaWYgKHRtcEZvbGRlci5leGlzdHMoKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB0bXBGb2xkZXIuZGVsZXRlKHRydWUsIGZhbHNlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGaWxlSW5XZWJDb250ZW50Rm9sZGVyKElQcm9qZWN0IHByb2plY3QsIElQYXRoIGZpbGVQYXRoKSB7Ci0gICAgCUlQYXRoIHdlYkNvbnRlbnRQYXRoID0gV1NETFV0aWxzLmdldFdlYkNvbnRlbnRGb2xkZXIocHJvamVjdCkuZ2V0TG9jYXRpb24oKTsKLSAgICAJaWYgKHdlYkNvbnRlbnRQYXRoLmlzUHJlZml4T2YoZmlsZVBhdGgpKSB7Ci0gICAgICAgCQlyZXR1cm4gdHJ1ZTsKLSAgICAJfQotICAgIAlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ZpbGVJbldvcmtzcGFjZShVUkwgZmlsZVVSTCkgewotICAgICAgICBJUGF0aCBmaWxlUGF0aCA9IG5ldyBQYXRoKGZpbGVVUkwuZ2V0UGF0aCgpKTsKLQotICAgICAgICBJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICAgICAgSVBhdGggd29ya3NwYWNlUGF0aCA9IHdvcmtzcGFjZVJvb3QuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgaWYgKGZpbGVQYXRoLmlzVmFsaWRQYXRoKHdvcmtzcGFjZVBhdGgudG9PU1N0cmluZygpKSkgewotICAgICAgICAJcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmb3JtYXRYTUxGaWxlKElGaWxlIGZpbGUpIHsKLSAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IGZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnREZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gY29udGVudERlc2NyaXB0aW9uLmdldENvbnRlbnRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgZm9ybWF0UHJvY2Vzc29yID0gRm9ybWF0UHJvY2Vzc29yc0V4dGVuc2lvblJlYWRlci5nZXRJbnN0YW5jZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Rm9ybWF0UHJvY2Vzc29yKGNvbnRlbnRUeXBlLmdldElkKCkpOwotICAgICAgICAgICAgICAgIGlmIChmb3JtYXRQcm9jZXNzb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmb3JtYXRQcm9jZXNzb3IuZm9ybWF0RmlsZShmaWxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coY2UuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coaW9lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaFByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IEZpbGVVdGlscy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgRmlsZVV0aWxzLnJlZnJlc2hQcm9qZWN0KHByb2plY3QsIG1vbml0b3IpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHByb2plY3QucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbW9uaXRvcik7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIENYRkNvcmVQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvdXRpbHMvTGF1bmNoVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvdXRpbHMvTGF1bmNoVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYzNDQ1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL3V0aWxzL0xhdW5jaFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5MYXVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1SdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlZNUnVubmVyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb25zb2xlLkNvbnNvbGVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29uc29sZS5JQ29uc29sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb25zb2xlLklDb25zb2xlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuSUNvbnNvbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuSUNvbnNvbGVWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuSU9Db25zb2xlT3V0cHV0U3RyZWFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuTWVzc2FnZUNvbnNvbGU7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBMYXVuY2hVdGlscyB7Ci0KLSAgICBwcml2YXRlIExhdW5jaFV0aWxzKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSVN0YXR1cyBsYXVuY2goU3RyaW5nW10gcnVudGltZUNsYXNzcGF0aCwgU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nW10gcHJvZ3JhbUFyZ3MpIHsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSVZNSW5zdGFsbCB2bUluc3RhbGwgPSBKYXZhUnVudGltZS5nZXREZWZhdWx0Vk1JbnN0YWxsKCk7Ci0gICAgICAgICAgICBJVk1SdW5uZXIgdm1SdW5uZXIgPSB2bUluc3RhbGwuZ2V0Vk1SdW5uZXIoSUxhdW5jaE1hbmFnZXIuUlVOX01PREUpOwotICAgICAgICAgICAgVk1SdW5uZXJDb25maWd1cmF0aW9uIHZtUnVubmVyQ29uZmlndXJhdGlvbiA9IG5ldyBWTVJ1bm5lckNvbmZpZ3VyYXRpb24oY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICBydW50aW1lQ2xhc3NwYXRoKTsKLSAgICAgICAgICAgIHZtUnVubmVyQ29uZmlndXJhdGlvbi5zZXRQcm9ncmFtQXJndW1lbnRzKHByb2dyYW1BcmdzKTsKLQotICAgICAgICAgICAgSUxhdW5jaCBsYXVuY2ggPSBuZXcgTGF1bmNoKG51bGwsIElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFLCBudWxsKTsKLSAgICAgICAgICAgIHZtUnVubmVyLnJ1bih2bVJ1bm5lckNvbmZpZ3VyYXRpb24sIGxhdW5jaCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIHdoaWxlICghbGF1bmNoLmlzVGVybWluYXRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coaWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSVByb2Nlc3NbXSBwcm9jZXNzZXMgPSBsYXVuY2guZ2V0UHJvY2Vzc2VzKCk7Ci0gICAgICAgICAgICBTdHJpbmcgb3V0cHV0U3RyZWFtID0gcHJvY2Vzc2VzWzBdLmdldFN0cmVhbXNQcm94eSgpLmdldE91dHB1dFN0cmVhbU1vbml0b3IoKS5nZXRDb250ZW50cygpOwotICAgICAgICAgICAgaWYgKG91dHB1dFN0cmVhbSAhPSBudWxsICYmIG91dHB1dFN0cmVhbS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuSU5GTywgQ1hGQ29yZVBsdWdpbi5QTFVHSU5fSUQsIG91dHB1dFN0cmVhbSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coY2UpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxhdW5jaChJSmF2YVByb2plY3QgamF2YVByb2plY3QsIFN0cmluZyBjbGFzc05hbWUsIFN0cmluZ1tdIHByb2dyYW1BcmdzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElWTUluc3RhbGwgdm1JbnN0YWxsID0gSmF2YVJ1bnRpbWUuZ2V0Vk1JbnN0YWxsKGphdmFQcm9qZWN0KTsKLSAgICAgICAgaWYgKHZtSW5zdGFsbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB2bUluc3RhbGwgPSBKYXZhUnVudGltZS5nZXREZWZhdWx0Vk1JbnN0YWxsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgaW5zdGFsbGVkVmVyc2lvbiA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldENYRlJ1bnRpbWVWZXJzaW9uKGphdmFQcm9qZWN0LmdldFByb2plY3QoKSk7Ci0gICAgICAgIENYRkluc3RhbGwgY3hmSW5zdGFsbCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCkuZ2V0SW5zdGFsbGF0aW9ucygpLmdldChpbnN0YWxsZWRWZXJzaW9uKTsKLQotICAgICAgICBJVk1SdW5uZXIgdm1SdW5uZXIgPSB2bUluc3RhbGwuZ2V0Vk1SdW5uZXIoSUxhdW5jaE1hbmFnZXIuUlVOX01PREUpOwotICAgICAgICBTdHJpbmdbXSBydW50aW1lQ2xhc3NwYXRoID0gSmF2YVJ1bnRpbWUuY29tcHV0ZURlZmF1bHRSdW50aW1lQ2xhc3NQYXRoKGphdmFQcm9qZWN0KTsKLSAgICAgICAgVk1SdW5uZXJDb25maWd1cmF0aW9uIHZtUnVubmVyQ29uZmlndXJhdGlvbiA9IG5ldyBWTVJ1bm5lckNvbmZpZ3VyYXRpb24oY2xhc3NOYW1lLCBydW50aW1lQ2xhc3NwYXRoKTsKLQotICAgICAgICB2bVJ1bm5lckNvbmZpZ3VyYXRpb24uc2V0UHJvZ3JhbUFyZ3VtZW50cyhwcm9ncmFtQXJncyk7Ci0KLSAgICAgICAgaWYgKHZtSW5zdGFsbCBpbnN0YW5jZW9mIElWTUluc3RhbGwyKSB7Ci0gICAgICAgICAgICBJVk1JbnN0YWxsMiBpbnN0YWxsMiA9IChJVk1JbnN0YWxsMikgdm1JbnN0YWxsOwotICAgICAgICAgICAgaWYgKGluc3RhbGwyLmdldEphdmFWZXJzaW9uKCkuY29tcGFyZVRvKEphdmFDb3JlLlZFUlNJT05fMV82KSA+IDApIHsKLSAgICAgICAgICAgICAgICB2bVJ1bm5lckNvbmZpZ3VyYXRpb24uc2V0Vk1Bcmd1bWVudHMobmV3IFN0cmluZ1tdIHsgIi1EamF2YS5lbmRvcnNlZC5kaXJzPSIgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgKyBjeGZJbnN0YWxsLmdldExvY2F0aW9uKCkgfSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBJTGF1bmNoIGxhdW5jaCA9IG5ldyBMYXVuY2gobnVsbCwgSUxhdW5jaE1hbmFnZXIuUlVOX01PREUsIG51bGwpOwotICAgICAgICB2bVJ1bm5lci5ydW4odm1SdW5uZXJDb25maWd1cmF0aW9uLCBsYXVuY2gsIG51bGwpOwotCi0gICAgICAgIHdoaWxlICghbGF1bmNoLmlzVGVybWluYXRlZCgpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDApOwotICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhpZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBJUHJvY2Vzc1tdIHByb2Nlc3NlcyA9IGxhdW5jaC5nZXRQcm9jZXNzZXMoKTsKLQotICAgICAgICBTdHJpbmcgb3V0cHV0U3RyZWFtID0gcHJvY2Vzc2VzWzBdLmdldFN0cmVhbXNQcm94eSgpLmdldE91dHB1dFN0cmVhbU1vbml0b3IoKS5nZXRDb250ZW50cygpOwotICAgICAgICBsb2dTdHJlYW0ob3V0cHV0U3RyZWFtLCBjeGZJbnN0YWxsKTsKLSAgICAgICAgU3RyaW5nIGVycm9yU3RyZWFtID0gcHJvY2Vzc2VzWzBdLmdldFN0cmVhbXNQcm94eSgpLmdldEVycm9yU3RyZWFtTW9uaXRvcigpLmdldENvbnRlbnRzKCk7Ci0gICAgICAgIGxvZ1N0cmVhbShlcnJvclN0cmVhbSwgY3hmSW5zdGFsbCk7Ci0KLSAgICAgICAgbG9nRXJyb3JTdHJlYW1Db250ZW50cyhlcnJvclN0cmVhbSwgY2xhc3NOYW1lKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGxvZ1N0cmVhbShTdHJpbmcgb3V0cHV0U3RyZWFtLCBDWEZJbnN0YWxsIGN4Zkluc3RhbGwpIHsKLSAgICAgICAgaWYgKCFQbGF0Zm9ybVVJLmlzV29ya2JlbmNoUnVubmluZygpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1lc3NhZ2VDb25zb2xlIGN4ZkNvbnNvbGUgPSBnZXRDWEZDb25zb2xlKGN4Zkluc3RhbGwpOwotICAgICAgICAgICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotICAgICAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgICAgICAgICBpZiAod29ya2JlbmNoV2luZG93ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY29uc29sZV92aWV3X2lkID0gSUNvbnNvbGVDb25zdGFudHMuSURfQ09OU09MRV9WSUVXOwotICAgICAgICAgICAgICAgIElDb25zb2xlVmlldyBjb25zb2xlVmlldyA9IChJQ29uc29sZVZpZXcpIHdvcmtiZW5jaFBhZ2Uuc2hvd1ZpZXcoY29uc29sZV92aWV3X2lkKTsKLSAgICAgICAgICAgICAgICBjb25zb2xlVmlldy5kaXNwbGF5KGN4ZkNvbnNvbGUpOwotICAgICAgICAgICAgICAgIElPQ29uc29sZU91dHB1dFN0cmVhbSBjb25zb2xlT3V0cHV0U3RyZWFtID0gY3hmQ29uc29sZS5uZXdPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICBjb25zb2xlT3V0cHV0U3RyZWFtLndyaXRlKG91dHB1dFN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgY29uc29sZU91dHB1dFN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBwaWUpIHsKLSAgICAgICAgICAgIENYRkNvcmVQbHVnaW4ubG9nKHBpZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coaW9lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIE1lc3NhZ2VDb25zb2xlIGdldENYRkNvbnNvbGUoQ1hGSW5zdGFsbCBjeGZJbnN0YWxsKSB7Ci0gICAgICAgIENvbnNvbGVQbHVnaW4gY29uc29sZVBsdWdpbiA9IENvbnNvbGVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotICAgICAgICBJQ29uc29sZU1hbmFnZXIgY29uc29sZU1hbmFnZXIgPSBjb25zb2xlUGx1Z2luLmdldENvbnNvbGVNYW5hZ2VyKCk7Ci0gICAgICAgIElDb25zb2xlW10gZXhpc3RpbmdDb25zb2xlcyA9IGNvbnNvbGVNYW5hZ2VyLmdldENvbnNvbGVzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhpc3RpbmdDb25zb2xlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKGV4aXN0aW5nQ29uc29sZXNbaV0uZ2V0TmFtZSgpLmVxdWFscyhjeGZJbnN0YWxsLmdldFR5cGUoKSArICIgIgotICAgICAgICAgICAgICAgICAgICArIGN4Zkluc3RhbGwuZ2V0VmVyc2lvbigpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiAoTWVzc2FnZUNvbnNvbGUpIGV4aXN0aW5nQ29uc29sZXNbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgTWVzc2FnZUNvbnNvbGUgY3hmQ29uc29sZSA9IG5ldyBNZXNzYWdlQ29uc29sZShjeGZJbnN0YWxsLmdldFR5cGUoKSArICIgIgotICAgICAgICAgICAgICAgICsgY3hmSW5zdGFsbC5nZXRWZXJzaW9uKCksCi0gICAgICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKENYRkNvcmVQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICJpY29ucy92aWV3MTYvY29uc29sZV92aWV3LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBjb25zb2xlTWFuYWdlci5hZGRDb25zb2xlcyhuZXcgSUNvbnNvbGVbXXtjeGZDb25zb2xlfSk7Ci0gICAgICAgIHJldHVybiBjeGZDb25zb2xlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbG9nRXJyb3JTdHJlYW1Db250ZW50cyhTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICBTdHJpbmcgdG9vbE5hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKGNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpICsgMSwgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBjbGFzc05hbWUubGVuZ3RoKCkpOwotCi0gICAgICAgIGlmIChtZXNzYWdlICE9IG51bGwgJiYgbWVzc2FnZS5pbmRleE9mKHRvb2xOYW1lICsgIiBFcnJvciIpICE9IC0xKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIFN0YXR1cyB0b29sU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDb3JlUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSk7Ci0gICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyh0b29sU3RhdHVzKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvdXRpbHMvTWVyZ2VVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS91dGlscy9NZXJnZVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMmIxNDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS91dGlscy9NZXJnZVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb2RlZ2VuLm1lcmdlLmphdmEuSkNvbnRyb2xNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29kZWdlbi5tZXJnZS5qYXZhLkpNZXJnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvZGVnZW4ubWVyZ2UuamF2YS5mYWNhZGUuRmFjYWRlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb2RlZ2VuLm1lcmdlLmphdmEuZmFjYWRlLkpDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvZGVnZW4udXRpbC5Db2RlR2VuVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLQotcHVibGljIGZpbmFsIGNsYXNzIE1lcmdlVXRpbHMgewotCi0gICAgcHJpdmF0ZSBNZXJnZVV0aWxzKCkgewotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgSk1lcmdlciBnZXRKTWVyZ2VyKCkgewotICAgICAgICBGYWNhZGVIZWxwZXIgZmFjYWRlSGVscGVyID0gQ29kZUdlblV0aWwuaW5zdGFudGlhdGVGYWNhZGVIZWxwZXIoSk1lcmdlci5ERUZBVUxUX0ZBQ0FERV9IRUxQRVJfQ0xBU1MpOwotICAgICAgICBVUkwgbWVyZ2VGaWxlVVJMID0gRmlsZUxvY2F0b3IuZmluZChDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKSwgbmV3IFBhdGgoCi0gICAgICAgICAgICAgICAgIi9qbWVyZ2VyL21lcmdlLnhtbCIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBKQ29udHJvbE1vZGVsIGNvbnRyb2xNb2RlbCA9IG5ldyBKQ29udHJvbE1vZGVsKCk7Ci0gICAgICAgIGNvbnRyb2xNb2RlbC5pbml0aWFsaXplKGZhY2FkZUhlbHBlciwgbWVyZ2VGaWxlVVJMLnRvU3RyaW5nKCkpOwotICAgICAgICBKTWVyZ2VyIGptZXJnZXIgPSBuZXcgSk1lcmdlcihjb250cm9sTW9kZWwpOwotCi0gICAgICAgIHJldHVybiBqbWVyZ2VyOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtZXJnZShGaWxlIHNvdXJjZUZpbGUsIEZpbGUgdGFyZ2V0RmlsZSkgewotICAgICAgICBKTWVyZ2VyIG1lcmdlciA9IGdldEpNZXJnZXIoKTsKLQotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gc291cmNlSW5wdXRTdHJlYW0gPSBudWxsOwotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gdGFyZ2V0SW5wdXRTdHJlYW0gPSBudWxsOwotICAgICAgICBPdXRwdXRTdHJlYW0gdGFyZ2V0T3V0cHV0U3RyZWFtID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIHNldCBzb3VyY2UKLSAgICAgICAgICAgIHNvdXJjZUlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzb3VyY2VGaWxlKTsKLSAgICAgICAgICAgIEpDb21waWxhdGlvblVuaXQgaW5wdXRDb21waWxhdGlvblVuaXQgPSBtZXJnZXIKLSAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZvcklucHV0U3RyZWFtKHNvdXJjZUlucHV0U3RyZWFtKTsKLSAgICAgICAgICAgIG1lcmdlci5zZXRTb3VyY2VDb21waWxhdGlvblVuaXQoaW5wdXRDb21waWxhdGlvblVuaXQpOwotCi0gICAgICAgICAgICAvLyBzZXQgdGFyZ2V0Ci0gICAgICAgICAgICB0YXJnZXRJbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0odGFyZ2V0RmlsZSk7Ci0gICAgICAgICAgICBKQ29tcGlsYXRpb25Vbml0IHRhcmdldENvbXBpbGF0aW9uVW5pdCA9IG1lcmdlcgotICAgICAgICAgICAgICAgICAgICAuY3JlYXRlQ29tcGlsYXRpb25Vbml0Rm9ySW5wdXRTdHJlYW0odGFyZ2V0SW5wdXRTdHJlYW0pOwotICAgICAgICAgICAgbWVyZ2VyLnNldFRhcmdldENvbXBpbGF0aW9uVW5pdCh0YXJnZXRDb21waWxhdGlvblVuaXQpOwotCi0gICAgICAgICAgICAvLyBtZXJnZSBzb3VyY2UgYW5kIHRhcmdldAotICAgICAgICAgICAgbWVyZ2VyLm1lcmdlKCk7Ci0KLSAgICAgICAgICAgIC8vIHdyaXRlIG1lcmdlZCBjb250ZW50cwotICAgICAgICAgICAgdGFyZ2V0T3V0cHV0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGFyZ2V0RmlsZSk7Ci0gICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBtZXJnZXIuZ2V0VGFyZ2V0Q29tcGlsYXRpb25Vbml0KCkuZ2V0Q29udGVudHMoKS5nZXRCeXRlcygpOwotICAgICAgICAgICAgdGFyZ2V0T3V0cHV0U3RyZWFtLndyaXRlKGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpOwotICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5mZSkgewotICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coZm5mZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coaW9lKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNvdXJjZUlucHV0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc291cmNlSW5wdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHRhcmdldElucHV0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SW5wdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHRhcmdldE91dHB1dFN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldE91dHB1dFN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgIENYRkNvcmVQbHVnaW4ubG9nKGlvZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL3V0aWxzL1NwcmluZ1V0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL3V0aWxzL1NwcmluZ1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMTk5ODcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS91dGlscy9TcHJpbmdVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlsczsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLlBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBqYXZheC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLldTRExVdGlsczsKLWltcG9ydCBvcmcuamRvbS5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmpkb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmpkb20uRWxlbWVudDsKLWltcG9ydCBvcmcuamRvbS5KRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5qZG9tLk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuamRvbS5pbnB1dC5TQVhCdWlsZGVyOwotaW1wb3J0IG9yZy5qZG9tLm91dHB1dC5YTUxPdXRwdXR0ZXI7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgZmluYWwgY2xhc3MgU3ByaW5nVXRpbHMgewotICAgIHByaXZhdGUgc3RhdGljIE5hbWVzcGFjZSBTUFJJTkdfQkVBTlNfTlMgPSBOYW1lc3BhY2UKLSAgICAuZ2V0TmFtZXNwYWNlKCJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIik7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBOYW1lc3BhY2UgWE1MTlNfWFNJID0gTmFtZXNwYWNlLmdldE5hbWVzcGFjZSgieHNpIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIHByaXZhdGUgc3RhdGljIE5hbWVzcGFjZSBKQVhXU19OUyA9IE5hbWVzcGFjZS5nZXROYW1lc3BhY2UoImpheHdzIiwgImh0dHA6Ly9jeGYuYXBhY2hlLm9yZy9qYXh3cyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICBwcml2YXRlIHN0YXRpYyBOYW1lc3BhY2UgU09BUF9OUyA9IE5hbWVzcGFjZS5nZXROYW1lc3BhY2UoInNvYXAiLCAiaHR0cDovL2N4Zi5hcGFjaGUub3JnL2JpbmRpbmdzL3NvYXAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgRE9DX1JPT1QgPSAiYmVhbnMiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIFNwcmluZ1V0aWxzKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSUZpbGUgZ2V0QmVhbnNGaWxlKElQcm9qZWN0IHByb2plY3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIElGaWxlIGJlYW5zRmlsZSA9IG51bGw7Ci0gICAgICAgIElQYXRoIHdlYkNvbnRlbnRQYXRoID0gSjJFRVV0aWxzLmdldFdlYkNvbnRlbnRQYXRoKHByb2plY3QpOwotICAgICAgICBpZiAoIXdlYkNvbnRlbnRQYXRoLmhhc1RyYWlsaW5nU2VwYXJhdG9yKCkpIHsKLSAgICAgICAgICAgIHdlYkNvbnRlbnRQYXRoID0gd2ViQ29udGVudFBhdGguYWRkVHJhaWxpbmdTZXBhcmF0b3IoKTsKLQotICAgICAgICAgICAgSVBhdGggd2ViSU5GUGF0aCA9IHdlYkNvbnRlbnRQYXRoLmFwcGVuZChuZXcgUGF0aCgiV0VCLUlORi8iKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIElGb2xkZXIgd2ViSU5GRm9sZGVyID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGb2xkZXIod2ViSU5GUGF0aCk7Ci0gICAgICAgICAgICBiZWFuc0ZpbGUgPSB3ZWJJTkZGb2xkZXIuZ2V0RmlsZSgiYmVhbnMueG1sIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGlmICghYmVhbnNGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotICAgICAgICAgICAgICAgICAgICBiZWFuc0ZpbGUuY3JlYXRlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVtdIHt9KSwgdHJ1ZSwgcHJvZ3Jlc3NNb25pdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgY3JlYXRlQmFzZUJlYW5zRmlsZShiZWFuc0ZpbGUpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmVhbnNGaWxlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSUZpbGUgZ2V0QmVhbnNGaWxlKFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIFNwcmluZ1V0aWxzLmdldEJlYW5zRmlsZShGaWxlVXRpbHMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBoYW5kbGUgdG8gdGhlIGN4Zi1zZXJ2bGV0IGZpbGUgaW4gdGhlIFdlYiBwcm9qZWN0cyBXRUItSU5GCi0gICAgICogZm9sZGVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9qZWN0Ci0gICAgICogQHJldHVybiB7QGxpbmsgSUZpbGV9Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJRmlsZSBnZXRDWEZTZXJ2bGV0KElQcm9qZWN0IHByb2plY3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIElGaWxlIGN4ZlNlcnZsZXQgPSBudWxsOwotICAgICAgICBJUGF0aCB3ZWJDb250ZW50UGF0aCA9IEoyRUVVdGlscy5nZXRXZWJDb250ZW50UGF0aChwcm9qZWN0KTsKLSAgICAgICAgaWYgKCF3ZWJDb250ZW50UGF0aC5oYXNUcmFpbGluZ1NlcGFyYXRvcigpKSB7Ci0gICAgICAgICAgICB3ZWJDb250ZW50UGF0aCA9IHdlYkNvbnRlbnRQYXRoLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCk7Ci0KLSAgICAgICAgICAgIElQYXRoIHdlYklORlBhdGggPSB3ZWJDb250ZW50UGF0aC5hcHBlbmQobmV3IFBhdGgoIldFQi1JTkYvIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBJRm9sZGVyIHdlYklORkZvbGRlciA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0Rm9sZGVyKHdlYklORlBhdGgpOwotICAgICAgICAgICAgY3hmU2VydmxldCA9IHdlYklORkZvbGRlci5nZXRGaWxlKCJjeGYtc2VydmxldC54bWwiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgaWYgKCFjeGZTZXJ2bGV0LmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCi0gICAgICAgICAgICAgICAgICAgIGN4ZlNlcnZsZXQuY3JlYXRlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVtdIHt9KSwgdHJ1ZSwgcHJvZ3Jlc3NNb25pdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgY3JlYXRlQmFzZUNYRlNlcnZsZXRGaWxlKGN4ZlNlcnZsZXQpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coY2UuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3hmU2VydmxldDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIElGaWxlIGdldENYRlNlcnZsZXQoU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gU3ByaW5nVXRpbHMuZ2V0Q1hGU2VydmxldChGaWxlVXRpbHMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY3JlYXRlQmFzZUNYRlNlcnZsZXRGaWxlKElGaWxlIGN4ZlNlcnZsZXQpICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBFbGVtZW50IGJlYW5zID0gbmV3IEVsZW1lbnQoRE9DX1JPT1QpOwotICAgICAgICBiZWFucy5zZXROYW1lc3BhY2UoU1BSSU5HX0JFQU5TX05TKTsKLSAgICAgICAgYmVhbnMuYWRkTmFtZXNwYWNlRGVjbGFyYXRpb24oWE1MTlNfWFNJKTsKLSAgICAgICAgYmVhbnMuYWRkTmFtZXNwYWNlRGVjbGFyYXRpb24oSkFYV1NfTlMpOwotICAgICAgICBiZWFucy5hZGROYW1lc3BhY2VEZWNsYXJhdGlvbihTT0FQX05TKTsKLQotICAgICAgICBBdHRyaWJ1dGUgc2NoZW1hTG9jYXRpb24gPSBuZXcgQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICJzY2hlbWFMb2NhdGlvbiIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zL3NwcmluZy1iZWFucy0yLjUueHNkICIgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICsgImh0dHA6Ly9jeGYuYXBhY2hlLm9yZy9iaW5kaW5ncy9zb2FwIGh0dHA6Ly9jeGYuYXBhY2hlLm9yZy9zY2hlbWFzL2NvbmZpZ3VyYXRpb24vc29hcC54c2QgIiAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgKyAiaHR0cDovL2N4Zi5hcGFjaGUub3JnL2pheHdzIGh0dHA6Ly9jeGYuYXBhY2hlLm9yZy9zY2hlbWFzL2pheHdzLnhzZCIsIFhNTE5TX1hTSSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBiZWFucy5zZXRBdHRyaWJ1dGUoc2NoZW1hTG9jYXRpb24pOwotCi0gICAgICAgIHdyaXRlQ29uZmlnKG5ldyBEb2N1bWVudChiZWFucyksIGN4ZlNlcnZsZXQpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY3JlYXRlQmFzZUJlYW5zRmlsZShJRmlsZSBiZWFuc0ZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEVsZW1lbnQgYmVhbnMgPSBuZXcgRWxlbWVudChET0NfUk9PVCk7Ci0gICAgICAgIGJlYW5zLnNldE5hbWVzcGFjZShTUFJJTkdfQkVBTlNfTlMpOwotICAgICAgICBiZWFucy5hZGROYW1lc3BhY2VEZWNsYXJhdGlvbihYTUxOU19YU0kpOwotICAgICAgICBiZWFucy5hZGROYW1lc3BhY2VEZWNsYXJhdGlvbihKQVhXU19OUyk7Ci0KLSAgICAgICAgQXR0cmlidXRlIHNjaGVtYUxvY2F0aW9uID0gbmV3IEF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAic2NoZW1hTG9jYXRpb24iLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMgaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucy9zcHJpbmctYmVhbnMtMi41LnhzZCAiIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICArICJodHRwOi8vY3hmLmFwYWNoZS5vcmcvamF4d3MgaHR0cDovL2N4Zi5hcGFjaGUub3JnL3NjaGVtYXMvamF4d3MueHNkIiwgWE1MTlNfWFNJKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIGJlYW5zLnNldEF0dHJpYnV0ZShzY2hlbWFMb2NhdGlvbik7Ci0KLSAgICAgICAgRWxlbWVudCBpbXBvcnRDWEZSZXNvdXJjZSA9IG5ldyBFbGVtZW50KCJpbXBvcnQiLCBTUFJJTkdfQkVBTlNfTlMpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGltcG9ydENYRlJlc291cmNlLnNldEF0dHJpYnV0ZSgicmVzb3VyY2UiLCAiY2xhc3NwYXRoOk1FVEEtSU5GL2N4Zi9jeGYueG1sIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0gICAgICAgIEVsZW1lbnQgaW1wb3J0Q1hGU29hcEV4dGVuc2lvblJlc291cmNlID0gbmV3IEVsZW1lbnQoImltcG9ydCIsIFNQUklOR19CRUFOU19OUyk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaW1wb3J0Q1hGU29hcEV4dGVuc2lvblJlc291cmNlLnNldEF0dHJpYnV0ZSgicmVzb3VyY2UiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICJjbGFzc3BhdGg6TUVUQS1JTkYvY3hmL2N4Zi1leHRlbnNpb24tc29hcC54bWwiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIEVsZW1lbnQgaW1wb3J0Q1hGU2VydmVsdFJlc291cmNlID0gbmV3IEVsZW1lbnQoImltcG9ydCIsIFNQUklOR19CRUFOU19OUyk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaW1wb3J0Q1hGU2VydmVsdFJlc291cmNlLnNldEF0dHJpYnV0ZSgicmVzb3VyY2UiLCAiY2xhc3NwYXRoOk1FVEEtSU5GL2N4Zi9jeGYtc2VydmxldC54bWwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLSAgICAgICAgYmVhbnMuYWRkQ29udGVudChpbXBvcnRDWEZSZXNvdXJjZSk7Ci0gICAgICAgIGJlYW5zLmFkZENvbnRlbnQoaW1wb3J0Q1hGU29hcEV4dGVuc2lvblJlc291cmNlKTsKLSAgICAgICAgYmVhbnMuYWRkQ29udGVudChpbXBvcnRDWEZTZXJ2ZWx0UmVzb3VyY2UpOwotCi0gICAgICAgIHdyaXRlQ29uZmlnKG5ldyBEb2N1bWVudChiZWFucyksIGJlYW5zRmlsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3ByaW5nQmVhbnNGaWxlKElGaWxlIHNwcmluZ0JlYW5zRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIHNwcmluZ0JlYW5zSW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNwcmluZ0JlYW5zRmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpKTsKLSAgICAgICAgaWYgKHNwcmluZ0JlYW5zSW5wdXRTdHJlYW0uYXZhaWxhYmxlKCkgPiAwKSB7Ci0gICAgICAgICAgICBTQVhCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU0FYQnVpbGRlcigpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2MgPSBidWlsZGVyLmJ1aWxkKHNwcmluZ0JlYW5zSW5wdXRTdHJlYW0pOwotICAgICAgICAgICAgICAgIEVsZW1lbnQgcm9vdCA9IGRvYy5nZXRSb290RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIGlmIChyb290LmdldE5hbWUoKS5lcXVhbHMoRE9DX1JPT1QpICYmIHJvb3QuZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKFNQUklOR19CRUFOU19OUykpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSkRPTUV4Y2VwdGlvbiBqZG9tZSkgewotICAgICAgICAgICAgICAgIENYRkNvcmVQbHVnaW4ubG9nKGpkb21lKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgc3ByaW5nQmVhbnNJbnB1dFN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQmVhbkRlZmluZWQoQ1hGRGF0YU1vZGVsIGN4ZkRhdGFNb2RlbCwgU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgZWxlbWVudE5hbWUsCi0gICAgICAgICAgICBOYW1lc3BhY2UgbmFtZXNwYWNlLCBTdHJpbmcgaWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIElGaWxlIHNwcmluZ0NvbmZpZ0ZpbGUgPSBudWxsOwotCi0gICAgICAgIGlmIChDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKYXZhMldTQ29udGV4dCgpLmlzVXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KCkpIHsKLSAgICAgICAgICAgIHNwcmluZ0NvbmZpZ0ZpbGUgPSBTcHJpbmdVdGlscy5nZXRCZWFuc0ZpbGUocHJvamVjdE5hbWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3ByaW5nQ29uZmlnRmlsZSA9IFNwcmluZ1V0aWxzLmdldENYRlNlcnZsZXQocHJvamVjdE5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzU3ByaW5nQmVhbnNGaWxlKHNwcmluZ0NvbmZpZ0ZpbGUpKSB7Ci0gICAgICAgICAgICBTQVhCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU0FYQnVpbGRlcigpOwotICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIHNwcmluZ0NvbmZpZ0lucHV0U3RlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNwcmluZ0NvbmZpZ0ZpbGUuZ2V0TG9jYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAudG9GaWxlKCkpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2MgPSBidWlsZGVyLmJ1aWxkKHNwcmluZ0NvbmZpZ0lucHV0U3RlYW0pOwotICAgICAgICAgICAgICAgIEVsZW1lbnQgYmVhbnMgPSBkb2MuZ2V0Um9vdEVsZW1lbnQoKTsKLQotICAgICAgICAgICAgICAgIExpc3Q8RWxlbWVudD4gZW5kcG9pbnRzID0gYmVhbnMuZ2V0Q2hpbGRyZW4oZWxlbWVudE5hbWUsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgZm9yIChFbGVtZW50IGVsZW1lbnQgOiBlbmRwb2ludHMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKSAhPSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZSBpZEF0dHJpYnV0ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWRBdHRyaWJ1dGUuZ2V0VmFsdWUoKS5lcXVhbHMoaWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChKRE9NRXhjZXB0aW9uIGpkb21lKSB7Ci0gICAgICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coamRvbWUpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBzcHJpbmdDb25maWdJbnB1dFN0ZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVuZHBvaW50QWRkcmVzcyhJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgamF4d3NFbmRwb2ludElkKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBJRmlsZSBzcHJpbmdDb25maWdGaWxlID0gbnVsbDsKLSAgICAgICAgaWYgKENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCkuaXNVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoKSkgewotICAgICAgICAgICAgc3ByaW5nQ29uZmlnRmlsZSA9IFNwcmluZ1V0aWxzLmdldEJlYW5zRmlsZShwcm9qZWN0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNwcmluZ0NvbmZpZ0ZpbGUgPSBTcHJpbmdVdGlscy5nZXRDWEZTZXJ2bGV0KHByb2plY3QpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpc1NwcmluZ0JlYW5zRmlsZShzcHJpbmdDb25maWdGaWxlKSkgewotICAgICAgICAgICAgU0FYQnVpbGRlciBidWlsZGVyID0gbmV3IFNBWEJ1aWxkZXIoKTsKLSAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBzcHJpbmdDb25maWdJbnB1dFN0ZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzcHJpbmdDb25maWdGaWxlLmdldExvY2F0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgLnRvRmlsZSgpKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gYnVpbGRlci5idWlsZChzcHJpbmdDb25maWdJbnB1dFN0ZWFtKTsKLSAgICAgICAgICAgICAgICBFbGVtZW50IGJlYW5zID0gZG9jLmdldFJvb3RFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgTGlzdDxFbGVtZW50PiBlbmRwb2ludHMgPSBiZWFucy5nZXRDaGlsZHJlbigiZW5kcG9pbnQiLCBKQVhXU19OUyk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBmb3IgKEVsZW1lbnQgZWxlbWVudCA6IGVuZHBvaW50cykgewotICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlIGlkQXR0cmlidXRlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZEF0dHJpYnV0ZS5nZXRWYWx1ZSgpLmVxdWFscyhqYXh3c0VuZHBvaW50SWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJhZGRyZXNzIikuZ2V0VmFsdWUoKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSkRPTUV4Y2VwdGlvbiBqZG9tZSkgewotICAgICAgICAgICAgICAgIENYRkNvcmVQbHVnaW4ubG9nKGpkb21lKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgc3ByaW5nQ29uZmlnSW5wdXRTdGVhbS5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVDb25maWd1cmF0aW9uRnJvbVdTREwoV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gbW9kZWwuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IG1vZGVsLmdldEluY2x1ZGVkTmFtZXNwYWNlcygpLmdldCh0YXJnZXROYW1lc3BhY2UpOwotCi0gICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG1vZGVsLmdldFdzZGxEZWZpbml0aW9uKCk7Ci0gICAgICAgIE1hcCBzZXJ2aWNlc01hcCA9IGRlZmluaXRpb24uZ2V0U2VydmljZXMoKTsKLSAgICAgICAgU2V0PE1hcC5FbnRyeT4gc2VydmljZXNTZXQgPSBzZXJ2aWNlc01hcC5lbnRyeVNldCgpOwotICAgICAgICBmb3IgKE1hcC5FbnRyeSBzZXJ2aWNlRW50cnkgOiBzZXJ2aWNlc1NldCkgewotICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpIHNlcnZpY2VFbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgbW9kZWwuc2V0U2VydmljZU5hbWUoc2VydmljZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgIE1hcCBwb3J0c01hcCA9IHNlcnZpY2UuZ2V0UG9ydHMoKTsKLSAgICAgICAgICAgIFNldDxNYXAuRW50cnk+IHBvcnRzU2V0ID0gcG9ydHNNYXAuZW50cnlTZXQoKTsKLSAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5IHBvcnRFbnRyeSA6IHBvcnRzU2V0KSB7Ci0gICAgICAgICAgICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpIHBvcnRFbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIG1vZGVsLnNldEVuZHBvaW50TmFtZShwb3J0LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgUG9ydFR5cGUgcG9ydFR5cGUgPSBwb3J0LmdldEJpbmRpbmcoKS5nZXRQb3J0VHlwZSgpOwotICAgICAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gcG9ydFR5cGUuZ2V0UU5hbWUoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcG9ydFR5cGVOYW1lID0gcU5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lID0gcGFja2FnZU5hbWUgKyAiLiIgKyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgY29udmVydFBvcnRUeXBlTmFtZShwb3J0VHlwZU5hbWUpICsgIkltcGwiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgbW9kZWwuc2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICBTcHJpbmdVdGlscy5jcmVhdGVKQVhXU0VuZHBvaW50KG1vZGVsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2FkU3ByaW5nQ29uZmlnSW5mb3JtYXRpb25Gcm9tV1NETChDWEZEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgSUZpbGUgd3NkbEZpbGUgPSBXU0RMVXRpbHMuZ2V0V1NETEZvbGRlcihtb2RlbC5nZXRQcm9qZWN0TmFtZSgpKS5nZXRGaWxlKG1vZGVsLmdldFdzZGxGaWxlTmFtZSgpKTsKLSAgICAgICAgaWYgKHdzZGxGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1vZGVsLnNldFdzZGxVUkwod3NkbEZpbGUuZ2V0TG9jYXRpb25VUkkoKS50b1VSTCgpKTsKLSAgICAgICAgICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBXU0RMVXRpbHMucmVhZFdTREwobW9kZWwuZ2V0V3NkbFVSTCgpKTsKLSAgICAgICAgICAgICAgICBNYXAgc2VydmljZXNNYXAgPSBkZWZpbml0aW9uLmdldFNlcnZpY2VzKCk7Ci0gICAgICAgICAgICAgICAgU2V0PE1hcC5FbnRyeT4gc2VydmljZXNTZXQgPSBzZXJ2aWNlc01hcC5lbnRyeVNldCgpOwotICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5IHNlcnZpY2VFbnRyeSA6IHNlcnZpY2VzU2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IChTZXJ2aWNlKSBzZXJ2aWNlRW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgbW9kZWwuc2V0U2VydmljZU5hbWUoc2VydmljZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgTWFwIHBvcnRzTWFwID0gc2VydmljZS5nZXRQb3J0cygpOwotICAgICAgICAgICAgICAgICAgICBTZXQ8TWFwLkVudHJ5PiBwb3J0c1NldCA9IHBvcnRzTWFwLmVudHJ5U2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5IHBvcnRFbnRyeSA6IHBvcnRzU2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQb3J0IHBvcnQgPSAoUG9ydCkgcG9ydEVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5zZXRFbmRwb2ludE5hbWUocG9ydC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1vZGVsLnNldFdzZGxEZWZpbml0aW9uKGRlZmluaXRpb24pOwotICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11cmxlKSB7Ci0gICAgICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2cobXVybGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coaW9lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjb252ZXJ0UG9ydFR5cGVOYW1lKFN0cmluZyBwb3J0VHlwZU5hbWUpIHsKLSAgICAgICAgU3RyaW5nW10gc2VnbWVudHMgPSBwb3J0VHlwZU5hbWUuc3BsaXQoIltcXC1cXC5cXDpcXF9cXHUwMGI3XFx1MDM4N1xcdTA2ZGRcXHUwNmRlXSIpOwotCi0gICAgICAgIFN0cmluZ0J1aWxkZXIgc3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZvciAoU3RyaW5nIHNlZ21lbnQgOiBzZWdtZW50cykgewotICAgICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hhciBmaXJzdENoYXJhY3RlciA9IHNlZ21lbnQuY2hhckF0KDApOwotICAgICAgICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNEaWdpdChmaXJzdENoYXJhY3RlcikgJiYgQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKGZpcnN0Q2hhcmFjdGVyKSkgewotICAgICAgICAgICAgICAgIHNlZ21lbnQgPSBzZWdtZW50LnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgc2VnbWVudC5zdWJzdHJpbmcoMSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc2VnbWVudC5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgY2hhciBjdXJyZW50Q2hhciA9IHNlZ21lbnQuY2hhckF0KGkpOwotICAgICAgICAgICAgICAgIGNoYXIgcHJlY2VkaW5nQ2hhciA9IHNlZ21lbnQuY2hhckF0KGkgLSAxKTsKLSAgICAgICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzTGV0dGVyKGN1cnJlbnRDaGFyKSAmJiBDaGFyYWN0ZXIuaXNEaWdpdChwcmVjZWRpbmdDaGFyKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKGN1cnJlbnRDaGFyKSkgewotICAgICAgICAgICAgICAgICAgICBzZWdtZW50ID0gc2VnbWVudC5zdWJzdHJpbmcoMCwgaSkgKyBzZWdtZW50LnN1YnN0cmluZyhpLCBpICsgMSkudG9VcHBlckNhc2UoKQotICAgICAgICAgICAgICAgICAgICArIHNlZ21lbnQuc3Vic3RyaW5nKGkgKyAxLCBzZWdtZW50Lmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZChzZWdtZW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RyaW5nQnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVKQVhXU0VuZHBvaW50KENYRkRhdGFNb2RlbCBtb2RlbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHByb2plY3ROYW1lID0gbW9kZWwuZ2V0UHJvamVjdE5hbWUoKTsKLQotICAgICAgICBJRmlsZSBzcHJpbmdDb25maWdGaWxlID0gbnVsbDsKLSAgICAgICAgaWYgKENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCkuaXNVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoKSkgewotICAgICAgICAgICAgc3ByaW5nQ29uZmlnRmlsZSA9IFNwcmluZ1V0aWxzLmdldEJlYW5zRmlsZShwcm9qZWN0TmFtZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcHJpbmdDb25maWdGaWxlID0gU3ByaW5nVXRpbHMuZ2V0Q1hGU2VydmxldChwcm9qZWN0TmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNTcHJpbmdCZWFuc0ZpbGUoc3ByaW5nQ29uZmlnRmlsZSkpIHsKLSAgICAgICAgICAgIFNBWEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTQVhCdWlsZGVyKCk7Ci0gICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gc3ByaW5nQ29uZmlnSW5wdXRTdGVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc3ByaW5nQ29uZmlnRmlsZS5nZXRMb2NhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgIC50b0ZpbGUoKSk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IGJ1aWxkZXIuYnVpbGQoc3ByaW5nQ29uZmlnSW5wdXRTdGVhbSk7Ci0gICAgICAgICAgICAgICAgRWxlbWVudCBiZWFucyA9IGRvYy5nZXRSb290RWxlbWVudCgpOwotCi0gICAgICAgICAgICAgICAgRWxlbWVudCBqYXh3c0VuZHBvaW50ID0gbmV3IEVsZW1lbnQoImVuZHBvaW50IiwgSkFYV1NfTlMpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgICAgICBTdHJpbmcgaWQgPSBnZXRKQVhXU0VuZHBvaW50SUQobW9kZWwpOwotICAgICAgICAgICAgICAgIG1vZGVsLnNldENvbmZpZ0lkKGlkKTsKLSAgICAgICAgICAgICAgICBqYXh3c0VuZHBvaW50LnNldEF0dHJpYnV0ZSgiaWQiLCBpZCk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAgICAgICAgIGpheHdzRW5kcG9pbnQuc2V0QXR0cmlidXRlKCJpbXBsZW1lbnRvciIsIG1vZGVsLmdldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgICAgICAgICAgaWYgKG1vZGVsLmdldENvbmZpZ1dzZGxMb2NhdGlvbigpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgamF4d3NFbmRwb2ludC5zZXRBdHRyaWJ1dGUoIndzZGxMb2NhdGlvbiIsIG1vZGVsLmdldENvbmZpZ1dzZGxMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbC5nZXRFbmRwb2ludE5hbWUoKSAhPSBudWxsICYmIG1vZGVsLmdldFNlcnZpY2VOYW1lKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF4d3NFbmRwb2ludC5zZXRBdHRyaWJ1dGUoImVuZHBvaW50TmFtZSIsICJ0bnM6IiArIG1vZGVsLmdldEVuZHBvaW50TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICAgICAgICAgICAgICBqYXh3c0VuZHBvaW50LnNldEF0dHJpYnV0ZSgic2VydmljZU5hbWUiLCAidG5zOiIgKyBtb2RlbC5nZXRTZXJ2aWNlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBYTUxOU19UTlMgPSBOYW1lc3BhY2UuZ2V0TmFtZXNwYWNlKCJ0bnMiLCBtb2RlbC5nZXRUYXJnZXROYW1lc3BhY2UoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIGpheHdzRW5kcG9pbnQuYWRkTmFtZXNwYWNlRGVjbGFyYXRpb24oWE1MTlNfVE5TKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChtb2RlbC5nZXRFbmRwb2ludE5hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGpheHdzRW5kcG9pbnQuc2V0QXR0cmlidXRlKCJhZGRyZXNzIiwgIi8iICsgbW9kZWwuZ2V0RW5kcG9pbnROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBqYXh3c0VuZHBvaW50LnNldEF0dHJpYnV0ZSgiYWRkcmVzcyIsICIvIiArIGlkKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICBFbGVtZW50IGpheHdzRmVhdHVyZXMgPSBuZXcgRWxlbWVudCgiZmVhdHVyZXMiLCBKQVhXU19OUyk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBFbGVtZW50IGJlYW4gPSBuZXcgRWxlbWVudCgiYmVhbiIsIFNQUklOR19CRUFOU19OUyk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBiZWFuLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCAib3JnLmFwYWNoZS5jeGYuZmVhdHVyZS5Mb2dnaW5nRmVhdHVyZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgICAgICBqYXh3c0ZlYXR1cmVzLmFkZENvbnRlbnQoYmVhbik7Ci0gICAgICAgICAgICAgICAgamF4d3NFbmRwb2ludC5hZGRDb250ZW50KGpheHdzRmVhdHVyZXMpOwotCi0gICAgICAgICAgICAgICAgaWYgKCFpc0JlYW5EZWZpbmVkKG1vZGVsLCBwcm9qZWN0TmFtZSwgImVuZHBvaW50IiwgSkFYV1NfTlMsIGlkKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIGJlYW5zLmFkZENvbnRlbnQoamF4d3NFbmRwb2ludCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd3JpdGVDb25maWcoZG9jLCBzcHJpbmdDb25maWdGaWxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChKRE9NRXhjZXB0aW9uIGpkb21lKSB7Ci0gICAgICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coamRvbWUpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBzcHJpbmdDb25maWdJbnB1dFN0ZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0SkFYV1NFbmRwb2ludElEKENYRkRhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICBTdHJpbmcgaW1wbGVtZW50b3IgPSBtb2RlbC5nZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoKTsKLSAgICAgICAgaWYgKGltcGxlbWVudG9yLmluZGV4T2YoIi4iKSAhPSAtMSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBpbXBsZW1lbnRvciA9IGltcGxlbWVudG9yLnN1YnN0cmluZyhpbXBsZW1lbnRvci5sYXN0SW5kZXhPZigiLiIpICsgMSwgaW1wbGVtZW50b3IubGVuZ3RoKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghaW1wbGVtZW50b3Iuc3RhcnRzV2l0aCgiSW1wbCIpICYmIGltcGxlbWVudG9yLmluZGV4T2YoIkltcGwiKSAhPSAtMSkgewotICAgICAgICAgICAgaW1wbGVtZW50b3IgPSBpbXBsZW1lbnRvci5zdWJzdHJpbmcoMCwgaW1wbGVtZW50b3IuaW5kZXhPZigiSW1wbCIpKS50b0xvd2VyQ2FzZSgpOyAvLyROT04tTkxTLTEkOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW1wbGVtZW50b3IgPSBpbXBsZW1lbnRvci50b0xvd2VyQ2FzZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbXBsZW1lbnRvcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlQ29uZmlnKERvY3VtZW50IGRvY3VtZW50LCBJRmlsZSBzcHJpbmdDb25maWdGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oc3ByaW5nQ29uZmlnRmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFhNTE91dHB1dHRlciBvdXRwdXR0ZXIgPSBuZXcgWE1MT3V0cHV0dGVyKCk7Ci0gICAgICAgICAgICBvdXRwdXR0ZXIub3V0cHV0KGRvY3VtZW50LCBvdXRwdXRTdHJlYW0pOwotICAgICAgICAgICAgc3ByaW5nQ29uZmlnRmlsZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX09ORSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuZm9ybWF0WE1MRmlsZShzcHJpbmdDb25maWdGaWxlKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coY2UuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgb3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9mYWNldC9DWEZGYWNldEluc3RhbGxBY3Rpb25Db25maWdGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9mYWNldC9DWEZGYWNldEluc3RhbGxBY3Rpb25Db25maWdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZDZlZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvZmFjZXQvQ1hGRmFjZXRJbnN0YWxsQWN0aW9uQ29uZmlnRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuZmFjZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklBY3Rpb25Db25maWdGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgQ1hGRmFjZXRJbnN0YWxsQWN0aW9uQ29uZmlnRmFjdG9yeSBpbXBsZW1lbnRzIElBY3Rpb25Db25maWdGYWN0b3J5IHsKLQotICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBDWEZEYXRhTW9kZWwgZGF0YU1vZGVsID0gQ1hGRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSmF2YTJXU0RhdGFNb2RlbCgpOwotICAgICAgICBDWEZDb250ZXh0IGNvbnRleHQgPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKYXZhMldTQ29udGV4dCgpOwotCi0gICAgICAgIGRhdGFNb2RlbC5zZXREZWZhdWx0UnVudGltZVZlcnNpb24oY29udGV4dC5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKSk7Ci0gICAgICAgIGRhdGFNb2RlbC5zZXREZWZhdWx0UnVudGltZUxvY2F0aW9uKGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVMb2NhdGlvbigpKTsKLSAgICAgICAgZGF0YU1vZGVsLnNldERlZmF1bHRSdW50aW1lVHlwZShjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVHlwZSgpKTsKLSAgICAgICAgZGF0YU1vZGVsLnNldFVzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dChjb250ZXh0LmlzVXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KCkpOwotICAgICAgICByZXR1cm4gZGF0YU1vZGVsOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvZmFjZXQvQ1hGRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2ZhY2V0L0NYRkZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwY2I4OTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvZmFjZXQvQ1hGRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuZmFjZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuYXB0LmNvcmUudXRpbC5BcHRDb25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFjY2Vzc1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotLyoqCi0gKiBBZGRzIHRoZSBDWEYgY2xhc3NwYXRoIGNvbnRhaW5lciB0byB0aGUgcHJvamVjdC4KLSAqIDxwPgotICogQWxzbyBzZXRzIHVwIHRoZSB3ZWIgcHJvamVjdHMgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yICh3ZWIueG1sIGZpbGUpCi0gKiB0byB1c2UgY3hmLXNlcnZsZXQgb3IgdGhlIFNwcmluZyBBcHBsaWNhdGlvbiBjb250ZXh0IChXRUItSU5GL2JlYW5zLnhtbCkgZm9yCi0gKiBlbmRwb2ludCBjb25maWd1cmF0aW9uLiBEZXBlbmRzIG9uIGEgc2V0dGluZyBpbiB0aGUgQ1hGIHByZWZlcmVuY2VzLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDWEZGYWNldEluc3RhbGxEZWxlZ2F0ZSBpbXBsZW1lbnRzIElEZWxlZ2F0ZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKGZpbmFsIElQcm9qZWN0IHByb2plY3QsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCBPYmplY3QgY29uZmlnLAotICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgQ1hGRGF0YU1vZGVsIG1vZGVsID0gKENYRkRhdGFNb2RlbCkgY29uZmlnOwotCi0gICAgICAgIC8vU2V0IHByb2plY3QgZGVmYXVsdAotICAgICAgICBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5zZXRDWEZSdW50aW1lVmVyc2lvbihwcm9qZWN0LCBtb2RlbC5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKSk7Ci0KLSAgICAgICAgaWYgKENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCkuZ2V0RGVmYXVsdFJ1bnRpbWVMb2NhdGlvbigpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhTdGF0dXMuRVJST1IsIENYRkNvcmVQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICBDWEZDb3JlTWVzc2FnZXMuQ1hGX0ZBQ0VUX0lOU1RBTExfREVMRUdBVEVfUlVOVElNRV9MT0NBVElPTl9OT1RfU0VUKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBJUGF0aCBjeGZMaWJQYXRoID0gbmV3IFBhdGgobW9kZWwuZ2V0RGVmYXVsdFJ1bnRpbWVMb2NhdGlvbigpKTsKLQotICAgICAgICBpZiAoIWN4ZkxpYlBhdGguaGFzVHJhaWxpbmdTZXBhcmF0b3IoKSkgewotICAgICAgICAgICAgY3hmTGliUGF0aCA9IGN4ZkxpYlBhdGguYWRkVHJhaWxpbmdTZXBhcmF0b3IoKTsKLSAgICAgICAgfQotICAgICAgICBjeGZMaWJQYXRoID0gY3hmTGliUGF0aC5hcHBlbmQoImxpYiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgSUNsYXNzcGF0aEF0dHJpYnV0ZSBqc3RDb21wb25lbnREZXBlbmRlbmN5ID0KLSAgICAgICAgICAgIEphdmFDb3JlLm5ld0NsYXNzcGF0aEF0dHJpYnV0ZSgib3JnLmVjbGlwc2UuanN0LmNvbXBvbmVudC5kZXBlbmRlbmN5IiwgIi9XRUItSU5GL2xpYiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIElDbGFzc3BhdGhFbnRyeSBjeGZDbGFzc3BhdGhDb250YWluZXIgPQotICAgICAgICAgICAgSmF2YUNvcmUubmV3Q29udGFpbmVyRW50cnkobmV3IFBhdGgoQ1hGQ29yZVBsdWdpbi5DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUl9JRCksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBJQWNjZXNzUnVsZVswXSwKLSAgICAgICAgICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKS5pc0V4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcigpCi0gICAgICAgICAgICAgICAgICAgID8gbmV3IElDbGFzc3BhdGhBdHRyaWJ1dGVbXXtqc3RDb21wb25lbnREZXBlbmRlbmN5fSA6IG5ldyBJQ2xhc3NwYXRoQXR0cmlidXRlW117fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLQotICAgICAgICBKRFRVdGlscy5hZGRUb0NsYXNzcGF0aChKYXZhQ29yZS5jcmVhdGUocHJvamVjdCksIGN4ZkNsYXNzcGF0aENvbnRhaW5lcik7Ci0KLSAgICAgICAgaWYgKENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCkuaXNBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoKSkgewotICAgICAgICAgICAgQXB0Q29uZmlnLnNldEVuYWJsZWQoSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpLCB0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvZmFjZXQvQ1hGRmFjZXRVbmluc3RhbGxEZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvZmFjZXQvQ1hGRmFjZXRVbmluc3RhbGxEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWQ0MDljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2ZhY2V0L0NYRkZhY2V0VW5pbnN0YWxsRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuZmFjZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBDWEZGYWNldFVuaW5zdGFsbERlbGVnYXRlIGltcGxlbWVudHMgSURlbGVnYXRlIHsKLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoSVByb2plY3QgcHJvamVjdCwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsIE9iamVjdCBjb25maWcsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgCi0gICAgICAgIC8vVE9ETyBJbXBsZW1lbnQKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzIxZDBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZGQxZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzRlOGUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI0ZyaSBOb3YgMDcgMjM6NTg6NTQgRVNUIDIwMDgKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIyY2M1Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5DWEZDcmVhdGlvbkNvcmVQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkiCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMS4zLjApIiwKLSBvcmcuZWNsaXBzZS53c3Qud3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cztidW5kbGUtdmVyc2lvbj0iWzEuMC4zMDQsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIGphdmF4LndzZGw7YnVuZGxlLXZlcnNpb249IlsxLjYuMiwxLjcuMCkiLAotIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjEwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMi40LjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZW07YnVuZGxlLXZlcnNpb249IlsyLjAuMCwyLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudjtidW5kbGUtdmVyc2lvbj0iWzEuMC4zMDUsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuamVlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMCwxLjEuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQW50LVZlcnNpb246IEFwYWNoZSBBbnQgMS43LjAKLUNyZWF0ZWQtQnk6IDEuNS4wXzE0LWIwMyAoU3VuIE1pY3Jvc3lzdGVtcyBJbmMuKQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QxNjliZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPlNlcHRlbWJlciAxMiwgMjAwODwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjZhNzM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA3ZjNlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPUNYRiBXZWIgU2VydmljZXMgQ3JlYXRpb24gQ29yZQotcGx1Z2luUHJvdmlkZXI9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvQ1hGQ3JlYXRpb25Db3JlTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvQ1hGQ3JlYXRpb25Db3JlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA4Yzk2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL0NYRkNyZWF0aW9uQ29yZU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgQ1hGQ3JlYXRpb25Db3JlTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9IAotICAgICAgICAib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLkNYRkNyZWF0aW9uQ29yZU1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9QUk9KRUNUX1NFTEVDVElPTl9FUlJPUjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfVkFMSURfUE9SVFRZUEVfTUVTU0FHRTsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX1NFUlZJQ0VfSU1QTF9OT1RfRk9VTkQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19TRVJWSUNFX0lNUExfTk9UX0JJTkFSWTsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIC8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0gICAgICAgIE5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIENYRkNyZWF0aW9uQ29yZU1lc3NhZ2VzLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENYRkNyZWF0aW9uQ29yZU1lc3NhZ2VzKCkgewotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvQ1hGQ3JlYXRpb25Db3JlTWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvQ1hGQ3JlYXRpb25Db3JlTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdhYzExMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL0NYRkNyZWF0aW9uQ29yZU1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOiAKLSMgSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVdTREwySkFWQV9QUk9KRUNUX1NFTEVDVElPTl9FUlJPUj1BIHBvc3NpYmxlIGNvbmZsaWN0IGhhcyBiZWVuIGRldGVjdGVkIGJldHdlZW4gcHJvamVjdCBzZWxlY3Rpb25zLlxuXG4gVGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiB3aWxsIHJlc3VsdCBpbiBjb2RlIGJlaW5nIGdlbmVyYXRlZCBpbnRvIHRoZSAiezB9IiBwcm9qZWN0LlxuXG5UbyBjaGFuZ2UgdGhlIGNvbmZpZ3VyYXRpb24gY2xpY2sgQ2FuY2VsIGFuZCB0aGVuIHNlbGVjdCB0aGUgIlNlcnZpY2UgcHJvamVjdDoiIGxpbmsgaW4gdGhlICJDb25maWd1cmF0aW9uOiIgc2VjdGlvbiBpbiB0aGUgV2ViIFNlcnZpY2Ugd2l6YXJkLlxuXG5DbGljayBPayB0byBjb250aW51ZSB3aXRoIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0KLVdTREwySkFWQV9WQUxJRF9QT1JUVFlQRV9NRVNTQUdFPVRoZSBXU0RMIGRvY3VtZW50IG11c3QgaGF2ZSBhIHZhbGlkIHBvcnRUeXBlIGVsZW1lbnQKLQotSkFWQTJXU19TRVJWSUNFX0lNUExfTk9UX0ZPVU5EPVRoZSBTZXJ2aWNlIEltcGxlbWVudGF0aW9uICJ7MH0iIGNhbm5vdCBiZSBsb2FkZWQgZnJvbSB0aGUgInsxfSIgcHJvamVjdC4gUGxlYXNlIGNoZWNrIHRoYXQgdGhlIHByb2plY3QgY29udGFpbnMgdGhlIGNsYXNzIGFuZCB0aGF0IGl0IGlzIHZpc2libGUgb24gdGhlIHByb2plY3RzICJKYXZhIEJ1aWxkIFBhdGgiLgotSkFWQTJXU19TRVJWSUNFX0lNUExfTk9UX0JJTkFSWT1CaW5hcnkgY2xhc3MgZmlsZXMgbm90IHN1cHBvcnRlZC4gVGhlIFNlcnZpY2UgSW1wbGVtZW50YXRpb24gbXVzdCBiZSBhIEphdmEgU291cmNlIHR5cGUuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9DWEZDcmVhdGlvbkNvcmVQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMzllNzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9DWEZDcmVhdGlvbkNvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENYRkNyZWF0aW9uQ29yZVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCi0gICAgLy8gVGhlIHBsdWctaW4gSUQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotICAgIHByaXZhdGUgc3RhdGljIENYRkNyZWF0aW9uQ29yZVBsdWdpbiBwbHVnaW47Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luKCkgewotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0gICAgICAgIHBsdWdpbiA9IHRoaXM7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcGx1Z2luID0gbnVsbDsKLSAgICAgICAgc3VwZXIuc3RvcChjb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENYRkNyZWF0aW9uQ29yZVBsdWdpbiBnZXREZWZhdWx0KCkgewotICAgICAgICByZXR1cm4gcGx1Z2luOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2dNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhuZXcgU3RhdHVzKHNldmVyaXR5LCBDWEZDcmVhdGlvbkNvcmVQbHVnaW4uUExVR0lOX0lELCBtZXNzYWdlKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSBleGNlcHRpb24pIHsKLSAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5QTFVHSU5fSUQsIAotICAgICAgICAgICAgZXhjZXB0aW9uLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZXhjZXB0aW9uKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9DWEZEZXBsb3lDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL0NYRkRlcGxveUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU2NDVlOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL0NYRkRlcGxveUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIEJ1ZyAjMjc0MjkzIC0gc3VkaGFuQHByb2dyZXNzLmNvbQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBBZGRyZXNzOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwMTIuU09BUDEyQWRkcmVzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuTW9kZWxQcm92aWRlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TZXJ2ZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLlNwcmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5DWEZDcmVhdGlvbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuV1NETFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuSVdlYlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuV2ViU2VydmljZUluZm87Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgQ1hGRGVwbG95Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1hGX1NFUlZMRVQgPSAib3JnLmFwYWNoZS5jeGYudHJhbnNwb3J0LnNlcnZsZXQuQ1hGU2VydmxldCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0gICAgcHJpdmF0ZSBJV2ViU2VydmljZSB3ZWJTZXJ2aWNlOwotICAgIHByaXZhdGUgQ1hGRGF0YU1vZGVsIG1vZGVsOwotCi0gICAgcHVibGljIENYRkRlcGxveUNvbW1hbmQoU3RyaW5nIHByb2plY3ROYW1lLCBJV2ViU2VydmljZSB3ZWJTZXJ2aWNlKSB7Ci0gICAgICAgIHRoaXMucHJvamVjdCA9IEZpbGVVdGlscy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgdGhpcy53ZWJTZXJ2aWNlID0gd2ViU2VydmljZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBXZWJTZXJ2aWNlSW5mbyB3ZWJTZXJ2aWNlSW5mbyA9IHdlYlNlcnZpY2UuZ2V0V2ViU2VydmljZUluZm8oKTsKLQotICAgICAgICAgICAgU3RyaW5nIHNlcnZlckluc3RhbmNlSWQgPSB3ZWJTZXJ2aWNlSW5mby5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCk7Ci0gICAgICAgICAgICBTdHJpbmcgc2VydmVyRmFjdG9yeUlkID0gd2ViU2VydmljZUluZm8uZ2V0U2VydmVyRmFjdG9yeUlkKCk7Ci0gICAgICAgICAgICBpZiAoc2VydmVySW5zdGFuY2VJZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSVNlcnZlciBzZXJ2ZXIgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXIoc2VydmVySW5zdGFuY2VJZCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHdlYkNvYkNvbXBvbmVudFVSTCA9IFNlcnZlclV0aWxzLmdldEVuY29kZWRXZWJDb21wb25lbnRVUkwocHJvamVjdCwgc2VydmVyRmFjdG9yeUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyB1cmxQYXR0ZXJuID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAgICAgICAgIElNb2RlbFByb3ZpZGVyIHByb3ZpZGVyID0gTW9kZWxQcm92aWRlck1hbmFnZXIuZ2V0TW9kZWxQcm92aWRlcihwcm9qZWN0KTsKLSAgICAgICAgICAgICAgICBPYmplY3QgbW9kZWxQcm92aWRlciA9IHByb3ZpZGVyLmdldE1vZGVsT2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgLy8ganN0LndlYiAyLjUKLSAgICAgICAgICAgICAgICBpZiAobW9kZWxQcm92aWRlciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCkgewotICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAgamF2YWVlV2ViQXBwID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHApIG1vZGVsUHJvdmlkZXI7Ci0KLSAgICAgICAgICAgICAgICAgICAgdXJsUGF0dGVybiA9IGdldFVSTFBhdHRlcm4oamF2YWVlV2ViQXBwKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBqc3Qud2ViIDIuNAotICAgICAgICAgICAgICAgIGlmIChtb2RlbFByb3ZpZGVyIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCB3ZWJBcHAgPQotICAgICAgICAgICAgICAgICAgICAgICAgKG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCkgbW9kZWxQcm92aWRlcjsKLQotICAgICAgICAgICAgICAgICAgICB1cmxQYXR0ZXJuID0gZ2V0VVJMUGF0dGVybih3ZWJBcHApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHVybFBhdHRlcm4gPSB1cmxQYXR0ZXJuLnN1YnN0cmluZygwLCB1cmxQYXR0ZXJuLmxhc3RJbmRleE9mKCIvIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgU3RyaW5nIGpheHdzRW5kcG9pbnRBZGRyZXNzID0gU3ByaW5nVXRpbHMuZ2V0RW5kcG9pbnRBZGRyZXNzKHByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5nZXRDb25maWdJZCgpKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyB3c2RsQWRkcmVzcyA9IHdlYkNvYkNvbXBvbmVudFVSTCArIHVybFBhdHRlcm4gKyBqYXh3c0VuZHBvaW50QWRkcmVzczsKLSAgICAgICAgICAgICAgICBTdHJpbmcgd3NkbFVSTCA9IHdzZGxBZGRyZXNzICsgIj93c2RsIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgICAgICAgICAgd2ViU2VydmljZS5nZXRXZWJTZXJ2aWNlSW5mbygpLnNldFdzZGxVUkwod3NkbFVSTCk7Ci0KLSAgICAgICAgICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBtb2RlbC5nZXRXc2RsRGVmaW5pdGlvbigpOwotCi0gICAgICAgICAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSBXU0RMVXRpbHMuZ2V0RW5kcG9pbnRBZGRyZXNzKGRlZmluaXRpb24pOwotICAgICAgICAgICAgICAgIGlmIChleHRlbnNpYmlsaXR5RWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChleHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFNPQVBBZGRyZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKFNPQVBBZGRyZXNzKSBleHRlbnNpYmlsaXR5RWxlbWVudCkuc2V0TG9jYXRpb25VUkkod3NkbEFkZHJlc3MpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChleHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFNPQVAxMkFkZHJlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICgoU09BUDEyQWRkcmVzcykgZXh0ZW5zaWJpbGl0eUVsZW1lbnQpLnNldExvY2F0aW9uVVJJKHdzZGxBZGRyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIFdTRExVdGlscy53cml0ZVdTREwobW9kZWwuZ2V0V3NkbFVSTCgpLCBkZWZpbml0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDcmVhdGlvbkNvcmVQbHVnaW4uUExVR0lOX0lELCBpb2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coc3RhdHVzKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgc3RhdHVzID0gY2UuZ2V0U3RhdHVzKCk7Ci0gICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwcml2YXRlIFN0cmluZyBnZXRVUkxQYXR0ZXJuKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCBqYXZhZWVXZWJBcHApIHsKLSAgICAgICAgTGlzdDxvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0PiBzZXJ2bGV0cyA9IGphdmFlZVdlYkFwcC5nZXRTZXJ2bGV0cygpOwotICAgICAgICBmb3IgKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQgc2VydmxldCA6IHNlcnZsZXRzKSB7Ci0gICAgICAgICAgICBpZiAoc2VydmxldC5nZXRTZXJ2bGV0Q2xhc3MoKS5lcXVhbHMoQ1hGX1NFUlZMRVQpKSB7Ci0gICAgICAgICAgICAgICAgTGlzdDxvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0TWFwcGluZz4gc2VydmxldE1hcHBpbmdzID0KLSAgICAgICAgICAgICAgICAgICAgamF2YWVlV2ViQXBwLmdldFNlcnZsZXRNYXBwaW5ncygpOwotICAgICAgICAgICAgICAgIGZvciAob3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldE1hcHBpbmcgc2VydmxldE1hcHBpbmcgOiBzZXJ2bGV0TWFwcGluZ3MpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZsZXRNYXBwaW5nLmdldFNlcnZsZXROYW1lKCkuZXF1YWxzKHNlcnZsZXQuZ2V0U2VydmxldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8b3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlVybFBhdHRlcm5UeXBlPiB1cmxQYXR0ZXJucyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmxldE1hcHBpbmcuZ2V0VXJsUGF0dGVybnMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cmxQYXR0ZXJucy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKHVybFBhdHRlcm5zLmdldCgwKSkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VVJMUGF0dGVybihvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHAgd2ViQXBwKSB7Ci0gICAgICAgIExpc3Q8b3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldD4gc2VydmxldHMgPSB3ZWJBcHAuZ2V0U2VydmxldHMoKTsKLSAgICAgICAgZm9yIChvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0IHNlcnZsZXQgOiBzZXJ2bGV0cykgewotICAgICAgICAgICAgaWYgKHNlcnZsZXQuZ2V0U2VydmxldENsYXNzKCkuZ2V0SmF2YU5hbWUoKS5lcXVhbHMoQ1hGX1NFUlZMRVQpKSB7Ci0gICAgICAgICAgICAgICAgTGlzdDxvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0TWFwcGluZz4gc2VydmxldE1hcHBpbmdzID0KLSAgICAgICAgICAgICAgICAgICAgd2ViQXBwLmdldFNlcnZsZXRNYXBwaW5ncygpOwotICAgICAgICAgICAgICAgIGZvciAob3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldE1hcHBpbmcgc2VydmxldE1hcHBpbmcgOiBzZXJ2bGV0TWFwcGluZ3MpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZsZXRNYXBwaW5nLmdldFNlcnZsZXQoKS5nZXRTZXJ2bGV0TmFtZSgpLmVxdWFscyhzZXJ2bGV0LmdldFNlcnZsZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmxldE1hcHBpbmcuZ2V0VXJsUGF0dGVybigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENYRkRhdGFNb2RlbChDWEZEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50Q29tcG9uZW50VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuICJ0ZW1wbGF0ZS5jeGYuY29yZSI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL0NyZWF0ZURlcGxveW1lbnREZXNjcmlwdG9yQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9DcmVhdGVEZXBsb3ltZW50RGVzY3JpcHRvckNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE3NzQwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL0NyZWF0ZURlcGxveW1lbnREZXNjcmlwdG9yQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgSU9OQSBUZWNobm9sb2dpZXMgUExDLCBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElPTkEgVGVjaG5vbG9naWVzIFBMQywgbW9kaWZ5IHdlYi54bWwgY29kZSBpbml0aWFsbHkgcGFydCBvZiBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmZhY2V0LkNYRkZhY2V0SW5zdGFsbERlbGVnYXRlCi0gKiAgICBTaGFuZSBDbGFya2UgLSBhZGRlZCB3ZWIueG1sIGZpbGUgY3JlYXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5Nb2RlbFByb3ZpZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhZWVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QYXJhbVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5VcmxQYXR0ZXJuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlc3Npb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnByb2plY3QuZmFjZXQuSUNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5wcm9qZWN0LmZhY2V0LklXZWJDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5yZXNvdXJjZXMuV2ViQ29udGVudENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5DWEZDcmVhdGlvbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBDcmVhdGVEZXBsb3ltZW50RGVzY3JpcHRvckNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9qZWN0TmFtZTsKLQotICAgIHByaXZhdGUgV2ViQ29udGVudENoYW5nZUxpc3RlbmVyIHdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lcjsKLQotICAgIHB1YmxpYyBDcmVhdGVEZXBsb3ltZW50RGVzY3JpcHRvckNvbW1hbmQoU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0gICAgICAgIHRoaXMucHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgd2ViQ29udGVudENoYW5nZUxpc3RlbmVyID0gbmV3IFdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lcihwcm9qZWN0TmFtZSk7Ci0KLSAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIod2ViQ29udGVudENoYW5nZUxpc3RlbmVyLAotICAgICAgICAgICAgICAgIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLQotICAgICAgICBmaW5hbCBJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgSVBhdGggd2ViWG1sRmlsZVBhdGggPSBuZXcgUGF0aCgiV0VCLUlORi93ZWIueG1sIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgSVZpcnR1YWxDb21wb25lbnQgdmlydHVhbENvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotICAgICAgICBpZih2aXJ0dWFsQ29tcG9uZW50LmdldFJvb3RGb2xkZXIoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYgdmlydHVhbENvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0VW5kZXJseWluZ0ZvbGRlcigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIElGaWxlIHdlYlhtbEZpbGUgPSB2aXJ0dWFsQ29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRVbmRlcmx5aW5nRm9sZGVyKCkuZ2V0RmlsZSh3ZWJYbWxGaWxlUGF0aCk7Ci0gICAgICAgICAgICBpZiAoIXdlYlhtbEZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKElXZWJDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBkYXRhTW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX1BST0pFQ1QsIHByb2plY3QpOwotICAgICAgICAgICAgICAgIGRhdGFNb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZSggbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBZGQgQ1hGIFNlcnZsZXQsIFNlcnZsZXQgTWFwcGluZyBhbmQgU2Vzc2lvbiBDb25maWcgdG8gd2ViLnhtbAotICAgICAgICBmaW5hbCBJTW9kZWxQcm92aWRlciBwcm92aWRlciA9IE1vZGVsUHJvdmlkZXJNYW5hZ2VyLmdldE1vZGVsUHJvdmlkZXIocHJvamVjdCk7Ci0gICAgICAgIHByb3ZpZGVyLm1vZGlmeShuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG1vZGVsUHJvdmlkZXIgPSBwcm92aWRlci5nZXRNb2RlbE9iamVjdCgpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNlU3ByaW5nQXBwQ29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCkuaXNVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgICAgICAgICAvLyBqc3Qud2ViIDIuNQotICAgICAgICAgICAgICAgIGlmIChtb2RlbFByb3ZpZGVyIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCBqYXZhZWVXZWJBcHAgPQotICAgICAgICAgICAgICAgICAgICAgICAgKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCkgbW9kZWxQcm92aWRlcjsKLSAgICAgICAgICAgICAgICAgICAgYWRkQ1hGSlNUV0VCMjVTZXJ2bGV0KHByb2plY3QsIGphdmFlZVdlYkFwcCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1c2VTcHJpbmdBcHBDb250ZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHRXZWIyNShwcm9qZWN0LCBqYXZhZWVXZWJBcHApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9LCBudWxsKTsKLQotICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih3ZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIpOwotCi0gICAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIHVuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIExpc3Q8SVJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxJUmVzb3VyY2U+KCk7Ci0gICAgICAgIGNoYW5nZWRSZXNvdXJjZXMuYWRkQWxsKHdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lci5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkpOwotICAgICAgICBpZiAoY2hhbmdlZFJlc291cmNlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBmb3IgKElSZXNvdXJjZSByZXNvdXJjZSA6IGNoYW5nZWRSZXNvdXJjZXMpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByZXNvdXJjZS5kZWxldGUodHJ1ZSwgbW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLSAgICAgICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhzdGF0dXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHByaXZhdGUgdm9pZCBhZGRTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHRXZWIyNShJUHJvamVjdCB3ZWJQcm9qZWN0LAotICAgICAgICAgICAgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwIHdlYmFwcCkgewotICAgICAgICBMaXN0IGNvbnRleHRQYXJhbXMgPSB3ZWJhcHAuZ2V0Q29udGV4dFBhcmFtcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnRleHRQYXJhbXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFBhcmFtVmFsdWUgY29udGV4dFBhcmFtID0gKFBhcmFtVmFsdWUpIGNvbnRleHRQYXJhbXMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKGNvbnRleHRQYXJhbS5nZXRQYXJhbU5hbWUoKS5lcXVhbHMoImNvbnRleHRDb25maWdMb2NhdGlvbiIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0IGxpc3RlbmVycyA9IHdlYmFwcC5nZXRMaXN0ZW5lcnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaXN0ZW5lciBjb250ZXh0TG9hZGVyTGlzdGVuZXIgPQotICAgICAgICAgICAgICAgIChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlzdGVuZXIpIGxpc3RlbmVycy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoY29udGV4dExvYWRlckxpc3RlbmVyLmdldExpc3RlbmVyQ2xhc3MoKS5lcXVhbHMoCi0gICAgICAgICAgICAib3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuY29udGV4dC5Db250ZXh0TG9hZGVyTGlzdGVuZXIiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgSmF2YWVlRmFjdG9yeSBqYXZhZWVGYWN0b3J5ID0gSmF2YWVlRmFjdG9yeS5lSU5TVEFOQ0U7Ci0KLSAgICAgICAgUGFyYW1WYWx1ZSBjb25maWdMb2NhdGlvblBhcmFtID0gamF2YWVlRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlKCk7Ci0gICAgICAgIGNvbmZpZ0xvY2F0aW9uUGFyYW0uc2V0UGFyYW1OYW1lKCJjb250ZXh0Q29uZmlnTG9jYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBjb25maWdMb2NhdGlvblBhcmFtLnNldFBhcmFtVmFsdWUoIldFQi1JTkYvYmVhbnMueG1sIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICB3ZWJhcHAuZ2V0Q29udGV4dFBhcmFtcygpLmFkZChjb25maWdMb2NhdGlvblBhcmFtKTsKLQotICAgICAgICBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlzdGVuZXIgY29udGV4dExvYWRlckxpc3RlbmVyID0gamF2YWVlRmFjdG9yeS5jcmVhdGVMaXN0ZW5lcigpOwotICAgICAgICBjb250ZXh0TG9hZGVyTGlzdGVuZXIuc2V0TGlzdGVuZXJDbGFzcygib3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuY29udGV4dC5Db250ZXh0TG9hZGVyTGlzdGVuZXIiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIHdlYmFwcC5nZXRMaXN0ZW5lcnMoKS5hZGQoY29udGV4dExvYWRlckxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwcml2YXRlIHZvaWQgYWRkQ1hGSlNUV0VCMjVTZXJ2bGV0KElQcm9qZWN0IHdlYlByb2plY3QsIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCB3ZWJhcHApIHsKLSAgICAgICAgTGlzdCBzZXJ2bGV0cyA9IHdlYmFwcC5nZXRTZXJ2bGV0cygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZsZXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBTZXJ2bGV0IHNlcnZsZXQgPSAoU2VydmxldCkgc2VydmxldHMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKHNlcnZsZXQuZ2V0U2VydmxldE5hbWUoKS5lcXVhbHMoImN4ZiIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDWEYgU2VydmxldAotICAgICAgICBXZWJGYWN0b3J5IGZhY3RvcnkgPSBXZWJGYWN0b3J5LmVJTlNUQU5DRTsKLSAgICAgICAgU2VydmxldCBjeGZTZXJ2bGV0ID0gZmFjdG9yeS5jcmVhdGVTZXJ2bGV0KCk7Ci0KLSAgICAgICAgY3hmU2VydmxldC5zZXRTZXJ2bGV0TmFtZSgiY3hmIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBEaXNwbGF5TmFtZSBjeGZTZXJ2bGV0RGlzcGxheU5hbWUgPSBKYXZhZWVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaXNwbGF5TmFtZSgpOwotICAgICAgICBjeGZTZXJ2bGV0RGlzcGxheU5hbWUuc2V0VmFsdWUoImN4ZiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGN4ZlNlcnZsZXQuZ2V0RGlzcGxheU5hbWVzKCkuYWRkKGN4ZlNlcnZsZXREaXNwbGF5TmFtZSk7Ci0KLSAgICAgICAgRGVzY3JpcHRpb24gY3hmU2VydmxldERlc2NyaXB0aW9uID0gSmF2YWVlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgY3hmU2VydmxldERlc2NyaXB0aW9uLnNldFZhbHVlKCJBcGFjaGUgQ1hGIEVuZHBvaW50Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgY3hmU2VydmxldC5nZXREZXNjcmlwdGlvbnMoKS5hZGQoY3hmU2VydmxldERlc2NyaXB0aW9uKTsKLQotICAgICAgICBjeGZTZXJ2bGV0LnNldFNlcnZsZXRDbGFzcygib3JnLmFwYWNoZS5jeGYudHJhbnNwb3J0LnNlcnZsZXQuQ1hGU2VydmxldCIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgY3hmU2VydmxldC5zZXRMb2FkT25TdGFydHVwKEludGVnZXIudmFsdWVPZigxKSk7Ci0KLSAgICAgICAgd2ViYXBwLmdldFNlcnZsZXRzKCkuYWRkKGN4ZlNlcnZsZXQpOwotCi0gICAgICAgIFNlcnZsZXRNYXBwaW5nIGN4ZlNlcnZsZXRNYXBwaW5nID0gZmFjdG9yeS5jcmVhdGVTZXJ2bGV0TWFwcGluZygpOwotICAgICAgICBjeGZTZXJ2bGV0TWFwcGluZy5zZXRTZXJ2bGV0TmFtZSgiY3hmIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgVXJsUGF0dGVyblR5cGUgdXJsID0gSmF2YWVlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVXJsUGF0dGVyblR5cGUoKTsKLSAgICAgICAgdXJsLnNldFZhbHVlKCIvc2VydmljZXMvKiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGN4ZlNlcnZsZXRNYXBwaW5nLmdldFVybFBhdHRlcm5zKCkuYWRkKHVybCk7Ci0gICAgICAgIHdlYmFwcC5nZXRTZXJ2bGV0TWFwcGluZ3MoKS5hZGQoY3hmU2VydmxldE1hcHBpbmcpOwotCi0gICAgICAgIFNlc3Npb25Db25maWcgc2Vzc2lvbkNvbmZpZyA9IGZhY3RvcnkuY3JlYXRlU2Vzc2lvbkNvbmZpZygpOwotICAgICAgICBzZXNzaW9uQ29uZmlnLnNldFNlc3Npb25UaW1lb3V0KG5ldyBCaWdJbnRlZ2VyKCI2MCIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB3ZWJhcHAuZ2V0U2Vzc2lvbkNvbmZpZ3MoKS5hZGQoc2Vzc2lvbkNvbmZpZyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9KQVhXU0Fubm90YXRlSmF2YUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvY29tbWFuZHMvSkFYV1NBbm5vdGF0ZUphdmFDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYTE4NmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9KQVhXU0Fubm90YXRlSmF2YUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklMb2NhbFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5DWEZNb2RlbFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5DWEZDcmVhdGlvbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLklVbmRvTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dEZpbGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuQW50RW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIEpBWFdTQW5ub3RhdGVKYXZhQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLSAgICBwcml2YXRlIGludCBudW1iZXJPZkNoYW5nZXMgPSAwOwotCi0gICAgcHJpdmF0ZSBKYXZhMldTRGF0YU1vZGVsIG1vZGVsOwotICAgIHByaXZhdGUgSVR5cGUgamF2YUNsYXNzVHlwZTsKLSAgICBwcml2YXRlIElUeXBlIGphdmFJbnRlcmZhY2VUeXBlOwotCi0gICAgcHVibGljIEpBWFdTQW5ub3RhdGVKYXZhQ29tbWFuZChKYXZhMldTRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICBpZiAoZ2V0RW52aXJvbm1lbnQoKSBpbnN0YW5jZW9mIEFudEVudmlyb25tZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobW9kZWwuaXNVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSkgewotICAgICAgICAgICAgICAgIGFubm90YXRlSW50ZXJmYWNlKG1vbml0b3IpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1vZGVsLmdldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGVTRUlDbGFzcyhtb25pdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLmdldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhbm5vdGF0ZUNsYXNzKG1vbml0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coc3RhdHVzKTsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLlBMVUdJTl9JRCwgaXRlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5QTFVHSU5fSUQsIGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYW5ub3RhdGVJbnRlcmZhY2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLSAgICBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGphdmFJbnRlcmZhY2VUeXBlID0gSkRUVXRpbHMuZmluZFR5cGUoSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSksIG1vZGVsCi0gICAgICAgICAgICAgICAgLmdldEZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUoKSk7Ci0KLSAgICAgICAgVGV4dEZpbGVDaGFuZ2UgdGV4dEZpbGVDaGFuZ2UgPSBuZXcgVGV4dEZpbGVDaGFuZ2UoIkFubm90YXRpbmcgSW50ZXJmYWNlIiwKLSAgICAgICAgICAgICAgICAoSUZpbGUpamF2YUludGVyZmFjZVR5cGUuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgIE11bHRpVGV4dEVkaXQgbXVsdGlUZXh0RWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0gICAgICAgIHRleHRGaWxlQ2hhbmdlLnNldEVkaXQobXVsdGlUZXh0RWRpdCk7Ci0KLSAgICAgICAgQ1hGTW9kZWxVdGlscy5nZXRXZWJTZXJ2aWNlQW5ub3RhdGlvbkNoYW5nZShqYXZhSW50ZXJmYWNlVHlwZSwgbW9kZWwsIHRleHRGaWxlQ2hhbmdlKTsKLQotICAgICAgICBJTWV0aG9kW10gdHlwZU1ldGhvZHMgPSBKRFRVdGlscy5nZXRQdWJsaWNNZXRob2RzKGphdmFJbnRlcmZhY2VUeXBlKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlTWV0aG9kcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSB0eXBlTWV0aG9kc1tpXTsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIEJvb2xlYW4+IG1ldGhvZEFubm90YXRpb25NYXAgPSBtb2RlbC5nZXRNZXRob2RNYXAoKS5nZXQobWV0aG9kKTsKLSAgICAgICAgICAgIGlmIChtZXRob2RBbm5vdGF0aW9uTWFwID09IG51bGwgfHwgbWV0aG9kQW5ub3RhdGlvbk1hcC5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1ldGhvZEFubm90YXRpb25NYXAuZ2V0KENYRk1vZGVsVXRpbHMuV0VCX01FVEhPRCkpIHsKLSAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLmdldFdlYk1ldGhvZEFubm90YXRpb25DaGFuZ2UoamF2YUludGVyZmFjZVR5cGUsIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtZXRob2RBbm5vdGF0aW9uTWFwLmdldChDWEZNb2RlbFV0aWxzLlJFUVVFU1RfV1JBUFBFUikpIHsKLSAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLmdldFJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbkNoYW5nZShqYXZhSW50ZXJmYWNlVHlwZSwgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1ldGhvZEFubm90YXRpb25NYXAuZ2V0KENYRk1vZGVsVXRpbHMuUkVTUE9OU0VfV1JBUFBFUikpIHsKLSAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLmdldFJlc3BvbnNlV3JhcHBlckFubm90YXRpb25DaGFuZ2UoamF2YUludGVyZmFjZVR5cGUsIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtZXRob2RBbm5vdGF0aW9uTWFwLmdldChDWEZNb2RlbFV0aWxzLldFQl9QQVJBTSkpIHsKLSAgICAgICAgICAgICAgICBMaXN0PFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24+IHBhcmFtZXRlcnMgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbnMobWV0aG9kKTsKLSAgICAgICAgICAgICAgICBmb3IgKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyIDogcGFyYW1ldGVycykgewotICAgICAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLmdldFdlYlBhcmFtQW5ub3RhdGlvbkNoYW5nZShqYXZhSW50ZXJmYWNlVHlwZSwgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJTG9jYWxWYXJpYWJsZSkgcGFyYW1ldGVyLnJlc29sdmVCaW5kaW5nKCkuZ2V0SmF2YUVsZW1lbnQoKSwgdGV4dEZpbGVDaGFuZ2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIENYRk1vZGVsVXRpbHMuZ2V0SW1wb3J0c0NoYW5nZShqYXZhSW50ZXJmYWNlVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgbW9kZWwsCi0gICAgICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UsIGZhbHNlKTsKLQotICAgICAgICBleGVjdXRlQ2hhbmdlKG1vbml0b3IsIHRleHRGaWxlQ2hhbmdlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYW5ub3RhdGVDbGFzcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotICAgIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgamF2YUNsYXNzVHlwZSA9IEpEVFV0aWxzLmZpbmRUeXBlKEpEVFV0aWxzLmdldEphdmFQcm9qZWN0KG1vZGVsLmdldFByb2plY3ROYW1lKCkpLCBtb2RlbAotICAgICAgICAgICAgICAgIC5nZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoKSk7Ci0KLSAgICAgICAgVGV4dEZpbGVDaGFuZ2UgdGV4dEZpbGVDaGFuZ2UgPSBuZXcgVGV4dEZpbGVDaGFuZ2UoIkFubm90YXRpbmcgQ2xhc3MiLAotICAgICAgICAgICAgICAgIChJRmlsZSkgamF2YUNsYXNzVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKS5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgTXVsdGlUZXh0RWRpdCBtdWx0aVRleHRFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLSAgICAgICAgdGV4dEZpbGVDaGFuZ2Uuc2V0RWRpdChtdWx0aVRleHRFZGl0KTsKLQotICAgICAgICBDWEZNb2RlbFV0aWxzLmdldFdlYlNlcnZpY2VBbm5vdGF0aW9uQ2hhbmdlKGphdmFDbGFzc1R5cGUsIG1vZGVsLCB0ZXh0RmlsZUNoYW5nZSk7Ci0KLSAgICAgICAgSU1ldGhvZFtdIHR5cGVNZXRob2RzID0gSkRUVXRpbHMuZ2V0UHVibGljTWV0aG9kcyhqYXZhQ2xhc3NUeXBlKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlTWV0aG9kcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSB0eXBlTWV0aG9kc1tpXTsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIEJvb2xlYW4+IG1ldGhvZEFubm90YXRpb25NYXAgPSBtb2RlbC5nZXRNZXRob2RNYXAoKS5nZXQobWV0aG9kKTsKLSAgICAgICAgICAgIGlmIChtZXRob2RBbm5vdGF0aW9uTWFwID09IG51bGwgfHwgbWV0aG9kQW5ub3RhdGlvbk1hcC5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobWV0aG9kQW5ub3RhdGlvbk1hcC5nZXQoQ1hGTW9kZWxVdGlscy5XRUJfTUVUSE9EKSkgewotICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuZ2V0V2ViTWV0aG9kQW5ub3RhdGlvbkNoYW5nZShqYXZhQ2xhc3NUeXBlLCBtZXRob2QsIHRleHRGaWxlQ2hhbmdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtZXRob2RBbm5vdGF0aW9uTWFwLmdldChDWEZNb2RlbFV0aWxzLlJFUVVFU1RfV1JBUFBFUikpIHsKLSAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLmdldFJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbkNoYW5nZShqYXZhQ2xhc3NUeXBlLCBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWV0aG9kQW5ub3RhdGlvbk1hcC5nZXQoQ1hGTW9kZWxVdGlscy5SRVNQT05TRV9XUkFQUEVSKSkgewotICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuZ2V0UmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbkNoYW5nZShqYXZhQ2xhc3NUeXBlLCBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWV0aG9kQW5ub3RhdGlvbk1hcC5nZXQoQ1hGTW9kZWxVdGlscy5XRUJfUEFSQU0pKSB7Ci0gICAgICAgICAgICAgICAgTGlzdDxTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzID0gQW5ub3RhdGlvblV0aWxzLmdldFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb25zKG1ldGhvZCk7Ci0gICAgICAgICAgICAgICAgZm9yIChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciA6IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgQ1hGTW9kZWxVdGlscy5nZXRXZWJQYXJhbUFubm90YXRpb25DaGFuZ2UoamF2YUNsYXNzVHlwZSwgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJTG9jYWxWYXJpYWJsZSkgcGFyYW1ldGVyLnJlc29sdmVCaW5kaW5nKCkuZ2V0SmF2YUVsZW1lbnQoKSwgdGV4dEZpbGVDaGFuZ2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIENYRk1vZGVsVXRpbHMuZ2V0SW1wb3J0c0NoYW5nZShqYXZhQ2xhc3NUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCBtb2RlbCwKLSAgICAgICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZSwgZmFsc2UpOwotCi0gICAgICAgIGV4ZWN1dGVDaGFuZ2UobW9uaXRvciwgdGV4dEZpbGVDaGFuZ2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhbm5vdGF0ZVNFSUNsYXNzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0gICAgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICBqYXZhQ2xhc3NUeXBlID0gSkRUVXRpbHMuZmluZFR5cGUoSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSksIG1vZGVsCi0gICAgICAgICAgICAgICAgLmdldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpKTsKLQotICAgICAgICBUZXh0RmlsZUNoYW5nZSB0ZXh0RmlsZUNoYW5nZSA9IG5ldyBUZXh0RmlsZUNoYW5nZSgiQW5ub3RhdGlvbiBDaGFuZ2VzIiwKLSAgICAgICAgICAgICAgICAoSUZpbGUpamF2YUNsYXNzVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKS5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgTXVsdGlUZXh0RWRpdCBtdWx0aVRleHRFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLSAgICAgICAgdGV4dEZpbGVDaGFuZ2Uuc2V0RWRpdChtdWx0aVRleHRFZGl0KTsKLQotICAgICAgICBDWEZNb2RlbFV0aWxzLmdldFdlYlNlcnZpY2VBbm5vdGF0aW9uQ2hhbmdlKGphdmFDbGFzc1R5cGUsIG1vZGVsLCB0ZXh0RmlsZUNoYW5nZSk7Ci0KLSAgICAgICAgQ1hGTW9kZWxVdGlscy5nZXRJbXBvcnRzQ2hhbmdlKGphdmFDbGFzc1R5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksIG1vZGVsLAotICAgICAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLCB0cnVlKTsKLQotICAgICAgICBleGVjdXRlQ2hhbmdlKG1vbml0b3IsIHRleHRGaWxlQ2hhbmdlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZUNoYW5nZShmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGZpbmFsIENoYW5nZSBjaGFuZ2UpIHsKLSAgICAgICAgaWYgKGNoYW5nZSA9PSBudWxsIHx8ICFjaGFuZ2UuaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIElVbmRvTWFuYWdlciBtYW5hZ2VyID0gUmVmYWN0b3JpbmdDb3JlLmdldFVuZG9NYW5hZ2VyKCk7Ci0gICAgICAgIGJvb2xlYW4gc3VjY2Vzc2Z1bCA9IGZhbHNlOwotICAgICAgICBDaGFuZ2UgdW5kb0NoYW5nZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjaGFuZ2UuaW5pdGlhbGl6ZVZhbGlkYXRpb25EYXRhKG1vbml0b3IpOwotICAgICAgICAgICAgUmVmYWN0b3JpbmdTdGF0dXMgdmFsaWQgPSBjaGFuZ2UuaXNWYWxpZChtb25pdG9yKTsKLSAgICAgICAgICAgIGlmICh2YWxpZC5pc09LKCkpIHsKLSAgICAgICAgICAgICAgICBtYW5hZ2VyLmFib3V0VG9QZXJmb3JtQ2hhbmdlKGNoYW5nZSk7Ci0gICAgICAgICAgICAgICAgdW5kb0NoYW5nZSA9IGNoYW5nZS5wZXJmb3JtKG1vbml0b3IpOwotICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWwgPSB0cnVlOwotICAgICAgICAgICAgICAgIG51bWJlck9mQ2hhbmdlcysrOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIG1hbmFnZXIuY2hhbmdlUGVyZm9ybWVkKGNoYW5nZSwgc3VjY2Vzc2Z1bCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHVuZG9DaGFuZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgdW5kb0NoYW5nZS5pbml0aWFsaXplVmFsaWRhdGlvbkRhdGEobW9uaXRvcik7Ci0gICAgICAgICAgICBtYW5hZ2VyLmFkZFVuZG8odW5kb0NoYW5nZS5nZXROYW1lKCksIHVuZG9DaGFuZ2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQotICAgICAgICBJVW5kb01hbmFnZXIgbWFuYWdlciA9IFJlZmFjdG9yaW5nQ29yZS5nZXRVbmRvTWFuYWdlcigpOwotCi0gICAgICAgIGlmIChtYW5hZ2VyLmFueXRoaW5nVG9VbmRvKCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZkNoYW5nZXM7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLnBlcmZvcm1VbmRvKG51bGwsIG1vbml0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLSAgICAgICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL0phdmEyV1NDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL0phdmEyV1NDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NjM4YjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9KYXZhMldTQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLmNvbnRleHQuSmF2YTJXU1BlcnNpc3RlbnRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnJlc291cmNlcy5KYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUucmVzb3VyY2VzLldlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuQ29tbWFuZExpbmVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5MYXVuY2hVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuU3ByaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLkNYRkNyZWF0aW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5KRFRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotCi0vKioKLSAqIFByb3ZpZGVzIGEgd3JhcHBlciBhcm91bmQgdGhlIDxjb2RlPm9yZy5hcGFjaGUuY3hmLnRvb2xzLmphdmEyd3MuSmF2YVRvV1M8L2NvZGU+IG9yIHRoZQotICogPGNvZGU+b3JnLmFwYWNoZS5jeGYudG9vbHMuamF2YTJ3c2RsLkphdmFUb1dTREw8L2NvZGU+IGNvbW1hbmQgZGVwZW5kaW5nIG9uIHRoZSB2ZXJzaW9uCi0gKiBvZiBDWEYgdXNlZC4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhMldTQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgSkFWQTJXU0RMX1RPT0xfQ0xBU1NfTkFNRSA9ICJvcmcuYXBhY2hlLmN4Zi50b29scy5qYXZhMndzZGwuSmF2YVRvV1NETCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19UT09MX0NMQVNTX05BTUUgPSAib3JnLmFwYWNoZS5jeGYudG9vbHMuamF2YTJ3cy5KYXZhVG9XUyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIFN0cmluZyBDWEZfVE9PTF9DTEFTU19OQU1FOwotCi0gICAgcHJpdmF0ZSBKYXZhMldTRGF0YU1vZGVsIG1vZGVsOwotICAgIHByaXZhdGUgU3RyaW5nIHByb2plY3ROYW1lOwotCi0gICAgcHJpdmF0ZSBKYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBqYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLSAgICBwcml2YXRlIFdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lciB3ZWJDb250ZW50Q2hhbmdlTGlzdGVuZXI7Ci0KLSAgICBwdWJsaWMgSmF2YTJXU0NvbW1hbmQoSmF2YTJXU0RhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgICAgIHByb2plY3ROYW1lID0gbW9kZWwuZ2V0UHJvamVjdE5hbWUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICBJVHlwZSBzdGFydGluZ1BvaW50ID0gSkRUVXRpbHMuZmluZFR5cGUocHJvamVjdE5hbWUsIG1vZGVsLmdldEphdmFTdGFydGluZ1BvaW50KCkpOwotICAgICAgICBqYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9IG5ldyBKYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihKRFRVdGlscwotICAgICAgICAgICAgICAgIC5nZXRKYXZhUHJvamVjdFNvdXJjZURpcmVjdG9yeVBhdGgoc3RhcnRpbmdQb2ludCkpOwotICAgICAgICB3ZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIgPSBuZXcgV2ViQ29udGVudENoYW5nZUxpc3RlbmVyKHByb2plY3ROYW1lKTsKLQotICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihqYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwKLSAgICAgICAgICAgICAgICBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0gICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lciwKLSAgICAgICAgICAgICAgICBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0KLSAgICAgICAgaWYgKG1vZGVsLmdldERlZmF1bHRSdW50aW1lVmVyc2lvbigpLmNvbXBhcmVUbyhDWEZDb3JlUGx1Z2luLkNYRl9WRVJTSU9OXzJfMSkgPj0gMCkgewotICAgICAgICAgICAgQ1hGX1RPT0xfQ0xBU1NfTkFNRSA9IEpBVkEyV1NfVE9PTF9DTEFTU19OQU1FOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ1hGX1RPT0xfQ0xBU1NfTkFNRSA9IEpBVkEyV1NETF9UT09MX0NMQVNTX05BTUU7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdbXSBwcm9nQXJncyA9IENvbW1hbmRMaW5lVXRpbHMuZ2V0SmF2YTJXU1Byb2dyYW1Bcmd1bWVudHMobW9kZWwpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gRmlsZVV0aWxzLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotICAgICAgICAgICAgTGF1bmNoVXRpbHMubGF1bmNoKGphdmFQcm9qZWN0LCBDWEZfVE9PTF9DTEFTU19OQU1FLCBwcm9nQXJncyk7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY29weUoyV0ZpbGVzRnJvbVRtcChtb2RlbCk7Ci0KLSAgICAgICAgICAgIGlmIChtb2RlbC5pc0dlbmVyYXRlV1NETCgpKSB7Ci0gICAgICAgICAgICAgICAgU3ByaW5nVXRpbHMubG9hZFNwcmluZ0NvbmZpZ0luZm9ybWF0aW9uRnJvbVdTREwobW9kZWwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaXNJbXBsZW1lbnRhdGlvblNlbGVjdGVkKCkgfHwgaXNHZW5lcmF0ZVNlcnZlcigpKSB7Ci0gICAgICAgICAgICAgICAgU3ByaW5nVXRpbHMuY3JlYXRlSkFYV1NFbmRwb2ludChtb2RlbCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgc3RhdHVzID0gY2UuZ2V0U3RhdHVzKCk7Ci0gICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDcmVhdGlvbkNvcmVQbHVnaW4uUExVR0lOX0lELCBpb2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coc3RhdHVzKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLSAgICAgICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lcik7Ci0gICAgICAgICAgICBGaWxlVXRpbHMucmVmcmVzaFByb2plY3QocHJvamVjdE5hbWUsIG1vbml0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJbXBsZW1lbnRhdGlvblNlbGVjdGVkKCkgewotICAgICAgICByZXR1cm4gbW9kZWwuZ2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCkgIT0gbnVsbCAmJgotICAgICAgICBtb2RlbC5nZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoKS50cmltKCkubGVuZ3RoKCkgPiAwOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0dlbmVyYXRlU2VydmVyKCkgewotICAgICAgICBpZiAobW9kZWwuaXNHZW5lcmF0ZVNlcnZlcigpKSB7Ci0gICAgICAgICAgICBtb2RlbC5zZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUobW9kZWwuZ2V0RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSgpICsgIkltcGwiKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICBMaXN0PElSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8SVJlc291cmNlPigpOwotICAgICAgICBjaGFuZ2VkUmVzb3VyY2VzLmFkZEFsbChqYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lci5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkpOwotICAgICAgICBjaGFuZ2VkUmVzb3VyY2VzLmFkZEFsbCh3ZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIuZ2V0Q2hhbmdlZFJlc291cmNlcygpKTsKLSAgICAgICAgaWYgKGNoYW5nZWRSZXNvdXJjZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgZm9yIChJUmVzb3VyY2UgcmVzb3VyY2UgOiBjaGFuZ2VkUmVzb3VyY2VzKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UuZGVsZXRlKHRydWUsIG1vbml0b3IpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gY2UuZ2V0U3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coc3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgSmF2YTJXU1BlcnNpc3RlbnRDb250ZXh0IGNvbnRleHQgPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKYXZhMldTQ29udGV4dCgpOwotICAgICAgICBtb2RlbC5zZXRHZW5lcmF0ZUNsaWVudChjb250ZXh0LmlzR2VuZXJhdGVDbGllbnQoKSk7Ci0gICAgICAgIG1vZGVsLnNldEdlbmVyYXRlU2VydmVyKGNvbnRleHQuaXNHZW5lcmF0ZVNlcnZlcigpKTsKLSAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucyhjb250ZXh0LmlzR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucygpKTsKLSAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVXU0RMKGNvbnRleHQuaXNHZW5lcmF0ZVdTREwoKSk7Ci0gICAgICAgIG1vZGVsLnNldFNvYXAxMkJpbmRpbmcoY29udGV4dC5pc1NvYXAxMkJpbmRpbmcoKSk7Ci0gICAgICAgIG1vZGVsLnNldEdlbmVyYXRlWFNESW1wb3J0cyhjb250ZXh0LmlzR2VuZXJhdGVYU0RJbXBvcnRzKCkpOwotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHB1YmxpYyBDWEZEYXRhTW9kZWwgZ2V0Q1hGRGF0YU1vZGVsKCkgewotICAgICAgICByZXR1cm4gbW9kZWw7Ci0gICAgfQotCi0gICAgLy9BTlQgRW52aXJvbm1lbnQgTWFwcGluZ3MKLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZUNsaWVudChCb29sZWFuIGdlbmVyYXRlQ2xpZW50KSB7Ci0gICAgICAgIG1vZGVsLnNldEdlbmVyYXRlQ2xpZW50KGdlbmVyYXRlQ2xpZW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVNlcnZlcihCb29sZWFuIGdlbmVyYXRlU2VydmVyKSB7Ci0gICAgICAgIG1vZGVsLnNldEdlbmVyYXRlU2VydmVyKGdlbmVyYXRlU2VydmVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKEJvb2xlYW4gZ2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucykgewotICAgICAgICBtb2RlbC5zZXRHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlV1NETChCb29sZWFuIGdlbmVyYXRlV1NETCkgewotICAgICAgICBtb2RlbC5zZXRHZW5lcmF0ZVdTREwoZ2VuZXJhdGVXU0RMKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXc2RsRmlsZU5hbWUoU3RyaW5nIHdzZGxGaWxlTmFtZSkgewotICAgICAgICBtb2RlbC5zZXRXc2RsRmlsZU5hbWUod3NkbEZpbGVOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVhTREltcG9ydHMoQm9vbGVhbiBnZW5lcmF0ZVhTREltcG9ydHMpIHsKLSAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVYU0RJbXBvcnRzKGdlbmVyYXRlWFNESW1wb3J0cyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXNlU09BUDEyQmluZGluZyhCb29sZWFuIHVzZVNPQVAxMkJpbmRpbmcpIHsKLSAgICAgICAgbW9kZWwuc2V0U29hcDEyQmluZGluZyh1c2VTT0FQMTJCaW5kaW5nKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9KYXZhMldTRGVmYXVsdGluZ0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvY29tbWFuZHMvSmF2YTJXU0RlZmF1bHRpbmdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZGU5YmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9KYXZhMldTRGVmYXVsdGluZ0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLmNvbnRleHQuSmF2YTJXU1BlcnNpc3RlbnRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkNYRk1vZGVsVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLkNYRkNyZWF0aW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5KRFRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5XU0RMVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIEphdmEyV1NEZWZhdWx0aW5nQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLSAgICBwcml2YXRlIEphdmEyV1NEYXRhTW9kZWwgbW9kZWw7Ci0KLSAgICBwdWJsaWMgSmF2YTJXU0RlZmF1bHRpbmdDb21tYW5kKEphdmEyV1NEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBKYXZhMldTUGVyc2lzdGVudENvbnRleHQgY29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCk7Ci0gICAgICAgICAgICBtb2RlbC5zZXREZWZhdWx0UnVudGltZVZlcnNpb24oY29udGV4dC5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKSk7Ci0gICAgICAgICAgICBtb2RlbC5zZXREZWZhdWx0UnVudGltZVR5cGUoY29udGV4dC5nZXREZWZhdWx0UnVudGltZVR5cGUoKSk7Ci0KLSAgICAgICAgICAgIElUeXBlIHN0YXJ0aW5nUG9pbnRUeXBlID0gZ2V0SmF2YVN0YXJ0aW5nUG9pbnRUeXBlKCk7Ci0gICAgICAgICAgICBtb2RlbC5zZXRVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Uoc3RhcnRpbmdQb2ludFR5cGUuaXNJbnRlcmZhY2UoKSk7Ci0gICAgICAgICAgICBtb2RlbC5zZXRFeHRyYWN0SW50ZXJmYWNlKGZhbHNlKTsKLQotICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gc3RhcnRpbmdQb2ludFR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsKLSAgICAgICAgICAgIG1vZGVsLnNldFRhcmdldE5hbWVzcGFjZShKRFRVdGlscy5nZXRUYXJnZXROYW1lc3BhY2VGcm9tUGFja2FnZU5hbWUocGFja2FnZU5hbWUpKTsKLQotICAgICAgICAgICAgbW9kZWwuc2V0QW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKGNvbnRleHQuaXNBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoKSk7Ci0gICAgICAgICAgICBtb2RlbC5zZXRHZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24oY29udGV4dC5pc0dlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbigpKTsKLSAgICAgICAgICAgIG1vZGVsLnNldEdlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbigpKTsKLSAgICAgICAgICAgIG1vZGVsLnNldEdlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbigpKTsKLSAgICAgICAgICAgIG1vZGVsLnNldEdlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbihjb250ZXh0LmlzR2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKCkpOwotICAgICAgICAgICAgbW9kZWwuc2V0QW5ub3RhdGlvbk1hcChDWEZNb2RlbFV0aWxzLmdldEFubm90YXRpb25NYXAobW9kZWwpKTsKLSAgICAgICAgICAgIG1vZGVsLnNldE1ldGhvZE1hcChDWEZNb2RlbFV0aWxzLmdldE1ldGhvZE1hcChzdGFydGluZ1BvaW50VHlwZSwgbW9kZWwpKTsKLQotICAgICAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVYU0RJbXBvcnRzKGNvbnRleHQuaXNHZW5lcmF0ZVhTREltcG9ydHMoKSk7Ci0gICAgICAgICAgICBtb2RlbC5zZXREYXRhYmluZGluZyhjb250ZXh0LmdldERhdGFiaW5kaW5nKCkpOwotICAgICAgICAgICAgbW9kZWwuc2V0RnJvbnRlbmQoY29udGV4dC5nZXRGcm9udGVuZCgpKTsKLSAgICAgICAgICAgIG1vZGVsLnNldEdlbmVyYXRlQ2xpZW50KGNvbnRleHQuaXNHZW5lcmF0ZUNsaWVudCgpKTsKLSAgICAgICAgICAgIG1vZGVsLnNldEdlbmVyYXRlU2VydmVyKGNvbnRleHQuaXNHZW5lcmF0ZVNlcnZlcigpKTsKLSAgICAgICAgICAgIG1vZGVsLnNldFNvYXAxMkJpbmRpbmcoY29udGV4dC5pc1NvYXAxMkJpbmRpbmcoKSk7Ci0gICAgICAgICAgICBtb2RlbC5zZXRHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKGNvbnRleHQuaXNHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKCkpOwotICAgICAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVXU0RMKGNvbnRleHQuaXNHZW5lcmF0ZVdTREwoKSk7Ci0gICAgICAgICAgICBtb2RlbC5zZXRVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoY29udGV4dC5pc1VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCgpKTsKLSAgICAgICAgICAgIG1vZGVsLnNldFZlcmJvc2UoY29udGV4dC5pc1ZlcmJvc2UoKSk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBnZXRDbGFzc05hbWUobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSwgbW9kZWwuZ2V0SmF2YVN0YXJ0aW5nUG9pbnQoKSk7Ci0gICAgICAgICAgICBtb2RlbC5zZXRXc2RsRmlsZU5hbWUoY2xhc3NOYW1lLnRvTG93ZXJDYXNlKCkgKyBXU0RMVXRpbHMuV1NETF9GSUxFX0VYVEVOU0lPTik7Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IGptZS5nZXRTdGF0dXMoKTsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coc3RhdHVzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHB1YmxpYyBDWEZEYXRhTW9kZWwgZ2V0SmF2YTJXU0RhdGFNb2RlbCgpIHsKLSAgICAgICAgcmV0dXJuIG1vZGVsOwotICAgIH0KLQotICAgIHB1YmxpYyBJVHlwZSBnZXRKYXZhU3RhcnRpbmdQb2ludFR5cGUoKSB7Ci0gICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IG1vZGVsLmdldFByb2plY3ROYW1lKCk7Ci0gICAgICAgIFN0cmluZyBqYXZhU3RhcnRpbmdQb2ludCA9IG1vZGVsLmdldEphdmFTdGFydGluZ1BvaW50KCk7Ci0KLSAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICBJVHlwZSBzdGFydGluZ1BvaW50VHlwZSA9IEpEVFV0aWxzLmZpbmRUeXBlKGphdmFQcm9qZWN0LCBqYXZhU3RhcnRpbmdQb2ludCk7Ci0gICAgICAgIHJldHVybiBzdGFydGluZ1BvaW50VHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZShTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBmdWxseVF1YWxpZmllZENsYXNzTmFtZSkgewotICAgICAgICByZXR1cm4gSkRUVXRpbHMuZmluZFR5cGUoSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QocHJvamVjdE5hbWUpLCBmdWxseVF1YWxpZmllZENsYXNzTmFtZSkKLSAgICAgICAgLmdldEVsZW1lbnROYW1lKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvY29tbWFuZHMvSmF2YTJXU1NlbGVjdFNFSUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvY29tbWFuZHMvSmF2YTJXU1NlbGVjdFNFSUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYwM2Y4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL0phdmEyV1NTZWxlY3RTRUlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LnJlZmFjdG9yaW5nLnN0cnVjdHVyZS5FeHRyYWN0SW50ZXJmYWNlUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5hY3Rpb25zLldvcmtiZW5jaFJ1bm5hYmxlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuSmF2YVByZWZlcmVuY2VzU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnV0aWwuQnVzeUluZGljYXRvclJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuQ1hGTW9kZWxVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuQ1hGQ3JlYXRpb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGVja0NvbmRpdGlvbnNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ3JlYXRlQ2hhbmdlT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlBlcmZvcm1DaGFuZ2VPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3Jpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5Qcm9jZXNzb3JCYXNlZFJlZmFjdG9yaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1Byb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuQW50RW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBKYXZhMldTU2VsZWN0U0VJQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLSAgICBwcml2YXRlIENoYW5nZSB1bmRvRXh0cmFjdEludGVyZmFjZUNoYW5nZTsKLQotICAgIHByaXZhdGUgSmF2YTJXU0RhdGFNb2RlbCBtb2RlbDsKLQotICAgIHByaXZhdGUgIElUeXBlIHN0YXJ0aW5nUG9pbnRUeXBlOwotCi0gICAgcHVibGljIEphdmEyV1NTZWxlY3RTRUlDb21tYW5kKEphdmEyV1NEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSBtb2RlbC5nZXRQcm9qZWN0TmFtZSgpOwotICAgICAgICAgICAgU3RyaW5nIGphdmFTdGFydGluZ1BvaW50ID0gbW9kZWwuZ2V0SmF2YVN0YXJ0aW5nUG9pbnQoKTsKLQotICAgICAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICAgICAgc3RhcnRpbmdQb2ludFR5cGUgPSBKRFRVdGlscy5maW5kVHlwZShqYXZhUHJvamVjdCwgamF2YVN0YXJ0aW5nUG9pbnQpOwotCi0gICAgICAgICAgICBpZiAoc3RhcnRpbmdQb2ludFR5cGUuaXNJbnRlcmZhY2UoKSkgewotICAgICAgICAgICAgICAgIG1vZGVsLnNldEZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUoc3RhcnRpbmdQb2ludFR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzdGFydGluZ1BvaW50VHlwZS5pc0NsYXNzKCkpIHsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoc3RhcnRpbmdQb2ludFR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotICAgICAgICAgICAgICAgIGlmIChtb2RlbC5pc1VzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpICYmIG1vZGVsLmlzRXh0cmFjdEludGVyZmFjZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGV4dHJhY3RJbnRlcmZhY2Uoc3RhcnRpbmdQb2ludFR5cGUsIG1vbml0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgc3RhdHVzID0gam1lLmdldFN0YXR1cygpOwotICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhzdGF0dXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZXh0cmFjdEludGVyZmFjZShJVHlwZSB0eXBlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICAgICAgaWYgKGdldEVudmlyb25tZW50KCkgaW5zdGFuY2VvZiBBbnRFbnZpcm9ubWVudCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBFeHRyYWN0SW50ZXJmYWNlUHJvY2Vzc29yIGV4dHJhY3RJbnRlcmZhY2VQcm9jZXNzb3IgPSBuZXcgRXh0cmFjdEludGVyZmFjZVByb2Nlc3Nvcih0eXBlLAotICAgICAgICAgICAgICAgICAgICBKYXZhUHJlZmVyZW5jZXNTZXR0aW5ncy5nZXRDb2RlR2VuZXJhdGlvblNldHRpbmdzKHR5cGUuZ2V0SmF2YVByb2plY3QoKSkpOwotICAgICAgICAgICAgUmVmYWN0b3JpbmcgZXh0cmFjdEludGVyZmFjZVJlZmFjdG9yaW5nID0gbmV3IFByb2Nlc3NvckJhc2VkUmVmYWN0b3JpbmcoZXh0cmFjdEludGVyZmFjZVByb2Nlc3NvcikgewotCi0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIFJlZmFjdG9yaW5nUHJvY2Vzc29yIGdldFByb2Nlc3NvcigpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RJbnRlcmZhY2VQcm9jZXNzb3I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIFN0cmluZyB0eXBlTmFtZSA9IG1vZGVsLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoKTsKLSAgICAgICAgICAgIGlmICh0eXBlTmFtZS5pbmRleE9mKCIuIikgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICB0eXBlTmFtZSA9IHR5cGVOYW1lLnN1YnN0cmluZyh0eXBlTmFtZS5sYXN0SW5kZXhPZigiLiIpICsgMSwgdHlwZU5hbWUubGVuZ3RoKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZXh0cmFjdEludGVyZmFjZVByb2Nlc3Nvci5zZXRUeXBlTmFtZSh0eXBlTmFtZSk7Ci0gICAgICAgICAgICBleHRyYWN0SW50ZXJmYWNlUHJvY2Vzc29yLnNldFJlcGxhY2UoZmFsc2UpOwotCi0gICAgICAgICAgICBTZXQ8SU1ldGhvZD4gbWV0aG9kcyA9IG1vZGVsLmdldE1ldGhvZE1hcCgpLmtleVNldCgpOwotICAgICAgICAgICAgZXh0cmFjdEludGVyZmFjZVByb2Nlc3Nvci5zZXRFeHRyYWN0ZWRNZW1iZXJzKG1ldGhvZHMudG9BcnJheShuZXcgSU1lbWJlclttZXRob2RzLnNpemUoKV0pKTsKLSAgICAgICAgICAgIGV4dHJhY3RJbnRlcmZhY2VQcm9jZXNzb3Iuc2V0QWJzdHJhY3QoZmFsc2UpOwotICAgICAgICAgICAgZXh0cmFjdEludGVyZmFjZVByb2Nlc3Nvci5zZXRQdWJsaWModHJ1ZSk7Ci0gICAgICAgICAgICBleHRyYWN0SW50ZXJmYWNlUHJvY2Vzc29yLnNldENvbW1lbnRzKGZhbHNlKTsKLSAgICAgICAgICAgIGV4dHJhY3RJbnRlcmZhY2VQcm9jZXNzb3Iuc2V0SW5zdGFuY2VPZihmYWxzZSk7Ci0KLSAgICAgICAgICAgIENyZWF0ZUNoYW5nZU9wZXJhdGlvbiBjcmVhdGVDaGFuZ2VPcGVyYXRpb24gPSBuZXcgQ3JlYXRlQ2hhbmdlT3BlcmF0aW9uKAotICAgICAgICAgICAgICAgICAgICBuZXcgQ2hlY2tDb25kaXRpb25zT3BlcmF0aW9uKGV4dHJhY3RJbnRlcmZhY2VSZWZhY3RvcmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0NvbmRpdGlvbnNPcGVyYXRpb24uRklOQUxfQ09ORElUSU9OUyksIFJlZmFjdG9yaW5nQ29yZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb25kaXRpb25DaGVja2luZ0ZhaWxlZFNldmVyaXR5KCkpOwotCi0gICAgICAgICAgICBQZXJmb3JtQ2hhbmdlT3BlcmF0aW9uIHBlcmZvcm1DaGFuZ2VPcGVyYXRpb24gPSBuZXcgUGVyZm9ybUNoYW5nZU9wZXJhdGlvbihjcmVhdGVDaGFuZ2VPcGVyYXRpb24pOwotCi0gICAgICAgICAgICBXb3JrYmVuY2hSdW5uYWJsZUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBXb3JrYmVuY2hSdW5uYWJsZUFkYXB0ZXIocGVyZm9ybUNoYW5nZU9wZXJhdGlvbik7Ci0gICAgICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLnJ1bkluVUkoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBCdXN5SW5kaWNhdG9yUnVubmFibGVDb250ZXh0KCksIGFkYXB0ZXIsIGFkYXB0ZXIuZ2V0U2NoZWR1bGluZ1J1bGUoKSk7Ci0KLSAgICAgICAgICAgIGlmIChwZXJmb3JtQ2hhbmdlT3BlcmF0aW9uLmNoYW5nZUV4ZWN1dGVkKCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSB0eXBlLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUgKz0gIi4iOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmcgZnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSA9IHBhY2thZ2VOYW1lICsgZXh0cmFjdEludGVyZmFjZVByb2Nlc3Nvci5nZXRUeXBlTmFtZSgpOwotICAgICAgICAgICAgICAgIG1vZGVsLnNldEZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUoZnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0TWV0aG9kTWFwKENYRk1vZGVsVXRpbHMuZ2V0TWV0aG9kTWFwKEpEVFV0aWxzLmZpbmRUeXBlKG1vZGVsLmdldFByb2plY3ROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBmdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKSwgbW9kZWwpKTsKLQotICAgICAgICAgICAgICAgIHVuZG9FeHRyYWN0SW50ZXJmYWNlQ2hhbmdlID0gcGVyZm9ybUNoYW5nZU9wZXJhdGlvbi5nZXRVbmRvQ2hhbmdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpIHsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coaXRlKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coaWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgaWYgKHVuZG9FeHRyYWN0SW50ZXJmYWNlQ2hhbmdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgUGVyZm9ybUNoYW5nZU9wZXJhdGlvbiBjaGFuZ2VPcGVyYXRpb24gPSBuZXcgUGVyZm9ybUNoYW5nZU9wZXJhdGlvbih1bmRvRXh0cmFjdEludGVyZmFjZUNoYW5nZSk7Ci0KLSAgICAgICAgICAgICAgICBXb3JrYmVuY2hSdW5uYWJsZUFkYXB0ZXIgYWRhcHRlcj0gbmV3IFdvcmtiZW5jaFJ1bm5hYmxlQWRhcHRlcihjaGFuZ2VPcGVyYXRpb24pOwotICAgICAgICAgICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkucnVuSW5VSSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCdXN5SW5kaWNhdG9yUnVubmFibGVDb250ZXh0KCksIGFkYXB0ZXIsIGFkYXB0ZXIuZ2V0U2NoZWR1bGluZ1J1bGUoKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIXN0YXJ0aW5nUG9pbnRUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLmlzQ29uc2lzdGVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nUG9pbnRUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLm1ha2VDb25zaXN0ZW50KG1vbml0b3IpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1vZGVsLnNldE1ldGhvZE1hcChDWEZNb2RlbFV0aWxzLmdldE1ldGhvZE1hcChzdGFydGluZ1BvaW50VHlwZSwgbW9kZWwpKTsKLQotICAgICAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IGptZS5nZXRTdGF0dXMoKTsKLSAgICAgICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLlBMVUdJTl9JRCwgaXRlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhzdGF0dXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5QTFVHSU5fSUQsIGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhzdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9KYXZhMldTVmFsaWRhdGVJbnB1dENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvY29tbWFuZHMvSmF2YTJXU1ZhbGlkYXRlSW5wdXRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMGNmYjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9KYXZhMldTVmFsaWRhdGVJbnB1dENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuQ1hGQ3JlYXRpb25Db3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLkNYRkNyZWF0aW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5KRFRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YTJXU1ZhbGlkYXRlSW5wdXRDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gewotICAgIAotICAgIHByaXZhdGUgSmF2YTJXU0RhdGFNb2RlbCBtb2RlbDsKLQotICAgIHB1YmxpYyBKYXZhMldTVmFsaWRhdGVJbnB1dENvbW1hbmQoSmF2YTJXU0RhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSk7Ci0gICAgICAgIGlmIChqYXZhUHJvamVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJVHlwZSB0eXBlID0gSkRUVXRpbHMuZmluZFR5cGUoamF2YVByb2plY3QsIG1vZGVsLmdldEphdmFTdGFydGluZ1BvaW50KCkpOwotICAgICAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCB8fCAhdHlwZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLlBMVUdJTl9JRCwgCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVNZXNzYWdlcy5iaW5kKENYRkNyZWF0aW9uQ29yZU1lc3NhZ2VzLkpBVkEyV1NfU0VSVklDRV9JTVBMX05PVF9GT1VORCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHttb2RlbC5nZXRKYXZhU3RhcnRpbmdQb2ludCgpLCBtb2RlbC5nZXRQcm9qZWN0TmFtZSgpfSkpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlLmlzQmluYXJ5KCkpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVNZXNzYWdlcy5KQVZBMldTX1NFUlZJQ0VfSU1QTF9OT1RfQklOQVJZKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvY29tbWFuZHMvV1NETDJKYXZhQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9XU0RMMkphdmFDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNDQ0ZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9XU0RMMkphdmFDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUucmVzb3VyY2VzLkphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5yZXNvdXJjZXMuV2ViQ29udGVudENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5Db21tYW5kTGluZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkxhdW5jaFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5TcHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuQ1hGQ3JlYXRpb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuSVdlYlNlcnZpY2U7Ci0KLS8qKgotICogUHJvdmlkZXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jeGYudG9vbHMud3NkbHRvLldTRExUb0phdmE8L2NvZGU+IGNvbW1hbmQuCi0gKgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIFdTREwySmF2YUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1hGX1RPT0xfQ0xBU1NfTkFNRSA9ICJvcmcuYXBhY2hlLmN4Zi50b29scy53c2RsdG8uV1NETFRvSmF2YSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsOwotICAgIHByaXZhdGUgSVdlYlNlcnZpY2Ugd3M7Ci0KLSAgICBwcml2YXRlIEphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotICAgIHByaXZhdGUgV2ViQ29udGVudENoYW5nZUxpc3RlbmVyIHdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lcjsKLQotICAgIHB1YmxpYyBXU0RMMkphdmFDb21tYW5kKFdTREwySmF2YURhdGFNb2RlbCBtb2RlbCwgSVdlYlNlcnZpY2Ugd3MpIHsKLSAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgICAgICB0aGlzLndzID0gd3M7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgamF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgPSBuZXcgSmF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIobmV3IFBhdGgobW9kZWwuZ2V0SmF2YVNvdXJjZUZvbGRlcigpKSk7Ci0gICAgICAgIHdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lciA9IG5ldyBXZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSk7Ci0KLSAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoamF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih3ZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotCi0gICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IG1vZGVsLmdldFByb2plY3ROYW1lKCk7Ci0KLSAgICAgICAgLy9UT0RPIHJldmlzaXQKLSAgICAgICAgd3MuZ2V0V2ViU2VydmljZUluZm8oKS5zZXRJbXBsVVJMcyhuZXcgU3RyaW5nW10ge3Byb2plY3ROYW1lICsgIi9JbXBsLmphdmEifSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBTdHJpbmdbXSBwcm9nQXJncyA9IENvbW1hbmRMaW5lVXRpbHMuZ2V0V1NETDJKYXZhUHJvZ3JhbUFyZ3VtZW50cyhtb2RlbCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEpEVFV0aWxzLmdldEphdmFQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgICAgIExhdW5jaFV0aWxzLmxhdW5jaChqYXZhUHJvamVjdCwgQ1hGX1RPT0xfQ0xBU1NfTkFNRSwgcHJvZ0FyZ3MpOwotICAgICAgICAgICAgRmlsZVV0aWxzLmNvcHlXMkpGaWxlc0Zyb21UbXAobW9kZWwpOwotCi0gICAgICAgICAgICBpZiAobW9kZWwuaXNHZW5lcmF0ZUltcGxlbWVudGF0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICBTcHJpbmdVdGlscy5jcmVhdGVDb25maWd1cmF0aW9uRnJvbVdTREwobW9kZWwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IGNlLmdldFN0YXR1cygpOwotICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhzdGF0dXMpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLlBMVUdJTl9JRCwgaW9lLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihqYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7Ci0gICAgICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih3ZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIpOwotICAgICAgICAgICAgRmlsZVV0aWxzLnJlZnJlc2hQcm9qZWN0KHByb2plY3ROYW1lLCBtb25pdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgTGlzdDxJUmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PElSZXNvdXJjZT4oKTsKLSAgICAgICAgY2hhbmdlZFJlc291cmNlcy5hZGRBbGwoamF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIuZ2V0Q2hhbmdlZFJlc291cmNlcygpKTsKLSAgICAgICAgY2hhbmdlZFJlc291cmNlcy5hZGRBbGwod2ViQ29udGVudENoYW5nZUxpc3RlbmVyLmdldENoYW5nZWRSZXNvdXJjZXMoKSk7Ci0gICAgICAgIGlmIChjaGFuZ2VkUmVzb3VyY2VzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIGZvciAoSVJlc291cmNlIHJlc291cmNlIDogY2hhbmdlZFJlc291cmNlcykgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc291cmNlLmRlbGV0ZSh0cnVlLCBtb25pdG9yKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNlLmdldFN0YXR1cygpOwotICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgcHVibGljIENYRkRhdGFNb2RlbCBnZXRDWEZEYXRhTW9kZWwoKSB7Ci0gICAgICAgIHJldHVybiBtb2RlbDsKLSAgICB9Ci0KLSAgICAvL0FOVCBFbnZpcm9ubWVudCBNYXBwaW5ncwotICAgIHB1YmxpYyB2b2lkIHNldEphdmFTb3VyY2VGb2xkZXIoU3RyaW5nIGphdmFTb3VyY2VGb2xkZXIpIHsKLSAgICAgICAgbW9kZWwuc2V0SmF2YVNvdXJjZUZvbGRlcihqYXZhU291cmNlRm9sZGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlTmFtZShTdHJpbmcgc2VydmljZU5hbWUpIHsKLSAgICAgICAgbW9kZWwuc2V0U2VydmljZU5hbWUoc2VydmljZU5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlU2VydmVyKGJvb2xlYW4gZ2VuZXJhdGVTZXJ2ZXIpIHsKLSAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVTZXJ2ZXIoZ2VuZXJhdGVTZXJ2ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlSW1wbGVtZW50YXRpb24oYm9vbGVhbiBnZW5lcmF0ZUltcGxlbWVudGF0aW9uKSB7Ci0gICAgICAgIG1vZGVsLnNldEdlbmVyYXRlSW1wbGVtZW50YXRpb24oZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXNlRGVmYXVsdFZhbHVlcyhib29sZWFuIHVzZURlZmF1bHRWYWx1ZXMpIHsKLSAgICAgICAgbW9kZWwuc2V0VXNlRGVmYXVsdFZhbHVlcyh1c2VEZWZhdWx0VmFsdWVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9jZXNzU09BUEhlYWRlcnMoYm9vbGVhbiBwcm9jZXNzU09BUEhlYWRlcnMpIHsKLSAgICAgICAgbW9kZWwuc2V0UHJvY2Vzc1NPQVBIZWFkZXJzKHByb2Nlc3NTT0FQSGVhZGVycyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoYm9vbGVhbiBsb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZykgewotICAgICAgICBtb2RlbC5zZXRMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyhsb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoYm9vbGVhbiBsb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZykgewotICAgICAgICBtb2RlbC5zZXRMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyhsb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXV0b05hbWVSZXNvbHV0aW9uKGJvb2xlYW4gYXV0b05hbWVSZXNvbHV0aW9uKSB7Ci0gICAgICAgIG1vZGVsLnNldEF1dG9OYW1lUmVzb2x1dGlvbihhdXRvTmFtZVJlc29sdXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFhqY1VzZURlZmF1bHRWYWx1ZXMoYm9vbGVhbiB4amNVc2VEZWZhdWx0VmFsdWVzKSB7Ci0gICAgICAgIG1vZGVsLnNldFhqY1VzZURlZmF1bHRWYWx1ZXMoeGpjVXNlRGVmYXVsdFZhbHVlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WGpjVG9TdHJpbmcoYm9vbGVhbiB4amNUb1N0cmluZykgewotICAgICAgICBtb2RlbC5zZXRYamNUb1N0cmluZ1NpbXBsZSh4amNUb1N0cmluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WGpjVG9TdHJpbmdTaW1wbGUoYm9vbGVhbiB4amNUb1N0cmluZ1NpbXBsZSkgewotICAgICAgICBtb2RlbC5zZXRYamNUb1N0cmluZ1NpbXBsZSh4amNUb1N0cmluZ1NpbXBsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WGpjVG9TdHJpbmdNdWx0aUxpbmUoYm9vbGVhbiB4amNUb1N0cmluZ011bHRpTGluZSkgewotICAgICAgICBtb2RlbC5zZXRYamNUb1N0cmluZ011bHRpTGluZSh4amNUb1N0cmluZ011bHRpTGluZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WGpjTG9jYXRvcihib29sZWFuIHhqY0xvY2F0b3IpIHsKLSAgICAgICAgbW9kZWwuc2V0WGpjTG9jYXRvcih4amNMb2NhdG9yKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNTeW5jTWV0aG9kcyhib29sZWFuIHhqY1N5bmNNZXRob2RzKSB7Ci0gICAgICAgIG1vZGVsLnNldFhqY1N5bmNNZXRob2RzKHhqY1N5bmNNZXRob2RzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNNYXJrR2VuZXJhdGVkKGJvb2xlYW4geGpjTWFya0dlbmVyYXRlZCkgewotICAgICAgICBtb2RlbC5zZXRYamNNYXJrR2VuZXJhdGVkKHhqY01hcmtHZW5lcmF0ZWQpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVkTmFtZXNwYWNlcyhNYXAgdmFsdWUpIHsKLSAgICAgICAgbW9kZWwuc2V0SW5jbHVkZWROYW1lc3BhY2VzKHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCaW5kaW5nRmlsZXMoTGlzdDxTdHJpbmc+IGJpbmRpbmdGaWxlcykgewotICAgICAgICBmb3IgKFN0cmluZyBwYXRoIDogYmluZGluZ0ZpbGVzKSB7Ci0gICAgICAgICAgICBtb2RlbC5nZXRCaW5kaW5nRmlsZXMoKS5hZGQocGF0aCk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9XU0RMMkphdmFEZWZhdWx0aW5nQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9XU0RMMkphdmFEZWZhdWx0aW5nQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGMxMTk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvY29tbWFuZHMvV1NETDJKYXZhRGVmYXVsdGluZ0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIEJ1ZyAjMjcxNTYyIC0gc3VkaGFuQHByb2dyZXNzLmNvbQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLmNvbnRleHQuV1NETDJKYXZhUGVyc2lzdGVudENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUucmVzb3VyY2VzLldlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5DWEZDcmVhdGlvbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuV1NETFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnV0aWwuV1NETENvcGllcjsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBXU0RMMkphdmFEZWZhdWx0aW5nQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLSAgICBwcml2YXRlIFdTREwySmF2YURhdGFNb2RlbCBtb2RlbDsKLSAgICBwcml2YXRlIFN0cmluZyBwcm9qZWN0TmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBpbnB1dFVSTDsKLQotICAgIHByaXZhdGUgV2ViQ29udGVudENoYW5nZUxpc3RlbmVyIHdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lcjsKLQotICAgIHB1YmxpYyBXU0RMMkphdmFEZWZhdWx0aW5nQ29tbWFuZChXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIGlucHV0VVJMKSB7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICAgICAgdGhpcy5wcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lOwotICAgICAgICB0aGlzLmlucHV0VVJMID0gaW5wdXRVUkw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyAidW5jaGVja2VkIiwgImRlcHJlY2F0aW9uIiB9KQotICAgIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0KLSAgICAgICAgd2ViQ29udGVudENoYW5nZUxpc3RlbmVyID0gbmV3IFdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lcihwcm9qZWN0TmFtZSk7Ci0gICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lciwKLSAgICAgICAgICAgICAgICBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0KLSAgICAgICAgV1NETDJKYXZhUGVyc2lzdGVudENvbnRleHQgY29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdTREwySmF2YUNvbnRleHQoKTsKLSAgICAgICAgbW9kZWwuc2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCkpOwotICAgICAgICBtb2RlbC5zZXREZWZhdWx0UnVudGltZVR5cGUoY29udGV4dC5nZXREZWZhdWx0UnVudGltZVR5cGUoKSk7Ci0gICAgICAgIC8vCi0gICAgICAgIG1vZGVsLnNldEdlbmVyYXRlSW1wbGVtZW50YXRpb24oY29udGV4dC5pc0dlbmVyYXRlSW1wbGVtZW50YXRpb24oKSk7Ci0gICAgICAgIG1vZGVsLnNldEdlbmVyYXRlU2VydmVyKGNvbnRleHQuaXNHZW5lcmF0ZVNlcnZlcigpKTsKLSAgICAgICAgbW9kZWwuc2V0RGF0YWJpbmRpbmcoY29udGV4dC5nZXREYXRhYmluZGluZygpKTsKLSAgICAgICAgbW9kZWwuc2V0RnJvbnRlbmQoY29udGV4dC5nZXRGcm9udGVuZCgpKTsKLSAgICAgICAgbW9kZWwuc2V0V3NkbFZlcnNpb24oY29udGV4dC5nZXRXc2RsVmVyc2lvbigpKTsKLSAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVBbnRCdWlsZEZpbGUoY29udGV4dC5pc0dlbmVyYXRlQW50QnVpbGRGaWxlKCkpOwotICAgICAgICBtb2RlbC5zZXRJbmNsdWRlZE5hbWVzcGFjZXMobmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCkpOwotICAgICAgICBtb2RlbC5zZXRFeGNsdWRlZE5hbWVzcGFjZXMobmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCkpOwotCi0gICAgICAgIC8vIFhKQwotICAgICAgICBtb2RlbC5zZXRYamNVc2VEZWZhdWx0VmFsdWVzKGNvbnRleHQuaXNYamNVc2VEZWZhdWx0VmFsdWVzKCkpOwotICAgICAgICBtb2RlbC5zZXRYamNUb1N0cmluZyhjb250ZXh0LmlzWGpjVG9TdHJpbmcoKSk7Ci0gICAgICAgIG1vZGVsLnNldFhqY1RvU3RyaW5nTXVsdGlMaW5lKGNvbnRleHQuaXNYamNUb1N0cmluZ011bHRpTGluZSgpKTsKLSAgICAgICAgbW9kZWwuc2V0WGpjVG9TdHJpbmdTaW1wbGUoY29udGV4dC5pc1hqY1RvU3RyaW5nU2ltcGxlKCkpOwotICAgICAgICBtb2RlbC5zZXRYamNMb2NhdG9yKGNvbnRleHQuaXNYamNMb2NhdG9yKCkpOwotICAgICAgICBtb2RlbC5zZXRYamNTeW5jTWV0aG9kcyhjb250ZXh0LmlzWGpjU3luY01ldGhvZHMoKSk7Ci0gICAgICAgIG1vZGVsLnNldFhqY01hcmtHZW5lcmF0ZWQoY29udGV4dC5pc1hqY01hcmtHZW5lcmF0ZWQoKSk7Ci0KLSAgICAgICAgbW9kZWwuc2V0VmFsaWRhdGUoY29udGV4dC5pc1ZhbGlkYXRlKCkpOwotICAgICAgICBtb2RlbC5zZXRQcm9jZXNzU09BUEhlYWRlcnMoY29udGV4dC5pc1Byb2Nlc3NTT0FQSGVhZGVycygpKTsKLSAgICAgICAgbW9kZWwuc2V0TG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoY29udGV4dC5pc0xvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKCkpOwotICAgICAgICBtb2RlbC5zZXRMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyhjb250ZXh0LmlzTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoKSk7Ci0gICAgICAgIG1vZGVsLnNldFVzZURlZmF1bHRWYWx1ZXMoY29udGV4dC5pc1VzZURlZmF1bHRWYWx1ZXMoKSk7Ci0gICAgICAgIG1vZGVsLnNldEF1dG9OYW1lUmVzb2x1dGlvbihjb250ZXh0LmlzQXV0b05hbWVSZXNvbHV0aW9uKCkpOwotICAgICAgICBtb2RlbC5zZXROb0FkZHJlc3NCaW5kaW5nKGNvbnRleHQuaXNOb0FkZHJlc3NCaW5kaW5nKCkpOwotICAgICAgICBtb2RlbC5zZXRVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoY29udGV4dC5pc1VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCgpKTsKLSAgICAgICAgbW9kZWwuc2V0SmF2YVNvdXJjZUZvbGRlcihKRFRVdGlscy5nZXRKYXZhUHJvamVjdFNvdXJjZURpcmVjdG9yeVBhdGgobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSkudG9PU1N0cmluZygpKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbnVsbDsKLSAgICAgICAgICAgIElXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgICAgICAgICBVUkwgd3NkbFVybCA9IG5ldyBVUkwoaW5wdXRVUkwpOwotICAgICAgICAgICAgbW9kZWwuc2V0V3NkbFVSTCh3c2RsVXJsKTsKLSAgICAgICAgICAgIGlmICh3c2RsVXJsLmdldFByb3RvY29sKCkuZXF1YWxzKCJmaWxlIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGlmICghRmlsZVV0aWxzLmlzRmlsZUluV2ViQ29udGVudEZvbGRlcihwcm9qZWN0LCBuZXcgUGF0aCh3c2RsVXJsLmdldFBhdGgoKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIElGb2xkZXIgd3NkbEZvbGRlciA9IFdTRExVdGlscy5nZXRXU0RMRm9sZGVyKHByb2plY3QpOwotICAgICAgICAgICAgICAgICAgICBJUGF0aCB3c2RsRm9sZGVyUGF0aCA9IHdzZGxGb2xkZXIuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgRmlsZSBmaWxlVG9Db3B5ID0gbmV3IEZpbGUod3NkbFVybC50b1VSSSgpKTsKLSAgICAgICAgICAgICAgICAgICAgV1NETENvcGllciBjb3BpZXIgPSBuZXcgV1NETENvcGllcigpOwotICAgICAgICAgICAgICAgICAgICAvL2ZvciBFY2xpcHNlIDMuMyBjb21wYXRpYmlsaXR5Ci0gICAgICAgICAgICAgICAgICAgIGNvcGllci5zZXRTb3VyY2VVUkkod3NkbFVybC50b0V4dGVybmFsRm9ybSgpKTsKLSAgICAgICAgICAgICAgICAgICAgY29waWVyLnNldFRhcmdldEZvbGRlclVSSSh3c2RsRm9sZGVyLmdldExvY2F0aW9uVVJJKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vY29waWVyLnNldFRhcmdldEZvbGRlclVSSSh3c2RsRm9sZGVyUGF0aC50b0ZpbGUoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgd29ya3NwYWNlLnJ1bihjb3BpZXIsIG1vbml0b3IpOwotICAgICAgICAgICAgICAgICAgICB3c2RsRm9sZGVyLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLCBtb25pdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgRmlsZSB3c2RsRmlsZSA9IHdzZGxGb2xkZXJQYXRoLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCkuYXBwZW5kKGZpbGVUb0NvcHkuZ2V0TmFtZSgpKS50b0ZpbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgbW9kZWwuc2V0V3NkbFVSTCh3c2RsRmlsZS50b1VSTCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVmaW5pdGlvbiA9IFdTRExVdGlscy5yZWFkV1NETChtb2RlbC5nZXRXc2RsVVJMKCkpOwotICAgICAgICAgICAgICAgIGlmIChkZWZpbml0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0VE5TT25Nb2RlbChkZWZpbml0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0V1NETExvY2F0aW9uKGRlZmluaXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBkZWZpbml0aW9uID0gV1NETFV0aWxzLnJlYWRXU0RMKHdzZGxVcmwpOwotICAgICAgICAgICAgICAgIGlmIChkZWZpbml0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgTWFwIHNlcnZpY2VzTWFwID0gZGVmaW5pdGlvbi5nZXRTZXJ2aWNlcygpOwotICAgICAgICAgICAgICAgICAgICBTZXQ8TWFwLkVudHJ5PiBzZXJ2aWNlc1NldCA9IHNlcnZpY2VzTWFwLmVudHJ5U2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHNldFROU09uTW9kZWwoZGVmaW5pdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIHNldFdTRExMb2NhdGlvbihkZWZpbml0aW9uKTsKLQotICAgICAgICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeSBzZXJ2aWNlRW50cnkgOiBzZXJ2aWNlc1NldCkgewotICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpIHNlcnZpY2VFbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHBvcnRzTWFwID0gc2VydmljZS5nZXRQb3J0cygpOwotICAgICAgICAgICAgICAgICAgICAgICAgU2V0PE1hcC5FbnRyeT4gcG9ydHNTZXQgPSBwb3J0c01hcC5lbnRyeVNldCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnkgcG9ydEVudHJ5IDogcG9ydHNTZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0IHBvcnQgPSAoUG9ydCkgcG9ydEVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9ydFR5cGUgcG9ydFR5cGUgPSBwb3J0LmdldEJpbmRpbmcoKS5nZXRQb3J0VHlwZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gcG9ydFR5cGUuZ2V0UU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IHFOYW1lLmdldExvY2FsUGFydCgpICsgV1NETFV0aWxzLldTRExfRklMRV9FWFRFTlNJT047Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSVBhdGggd3NkbEZvbGRlclBhdGggPSBXU0RMVXRpbHMuZ2V0V1NETEZvbGRlcihwcm9qZWN0KS5nZXRMb2NhdGlvbigpOwotICAgICAgICAgICAgICAgIFdTRExDb3BpZXIgY29waWVyID0gbmV3IFdTRExDb3BpZXIoKTsKLSAgICAgICAgICAgICAgICBjb3BpZXIuc2V0U291cmNlVVJJKHdzZGxVcmwudG9FeHRlcm5hbEZvcm0oKSk7Ci0gICAgICAgICAgICAgICAgY29waWVyLnNldFRhcmdldEZvbGRlclVSSSh3c2RsRm9sZGVyUGF0aC50b0ZpbGUoKS50b1VSSSgpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGNvcGllci5zZXRUYXJnZXRGaWxlbmFtZShmaWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgd29ya3NwYWNlLnJ1bihjb3BpZXIsIG1vbml0b3IpOwotCi0gICAgICAgICAgICAgICAgRmlsZSB3c2RsRmlsZSA9IHdzZGxGb2xkZXJQYXRoLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCkuYXBwZW5kKGZpbGVuYW1lKS50b0ZpbGUoKTsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRXc2RsVVJMKHdzZGxGaWxlLnRvVVJJKCkudG9VUkwoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtb2RlbC5zZXRXc2RsRmlsZU5hbWUoZ2V0V1NETEZpbGVOYW1lRnJvbVVSTChtb2RlbC5nZXRXc2RsVVJMKCkpKTsKLQotICAgICAgICAgICAgSVBhdGggd3NkbExvY2F0aW9uUGF0aCA9IG5ldyBQYXRoKG1vZGVsLmdldFdzZGxVUkwoKS5nZXRQYXRoKCkpOwotICAgICAgICAgICAgd3NkbExvY2F0aW9uUGF0aCA9IHdzZGxMb2NhdGlvblBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhXU0RMVXRpbHMuZ2V0V2ViQ29udGVudEZvbGRlcihwcm9qZWN0KQotICAgICAgICAgICAgICAgICAgICAuZ2V0TG9jYXRpb24oKS5tYXRjaGluZ0ZpcnN0U2VnbWVudHMod3NkbExvY2F0aW9uUGF0aCkpOwotCi0gICAgICAgICAgICBpZiAod3NkbExvY2F0aW9uUGF0aC5nZXREZXZpY2UoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgd3NkbExvY2F0aW9uUGF0aCA9IHdzZGxMb2NhdGlvblBhdGguc2V0RGV2aWNlKG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbW9kZWwuc2V0V3NkbERlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gICAgICAgICAgICBtb2RlbC5zZXRDb25maWdXc2RsTG9jYXRpb24od3NkbExvY2F0aW9uUGF0aC50b1N0cmluZygpKTsKLQotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coc3RhdHVzKTsKLSAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIHVyaXNlKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNvcmVQbHVnaW4uUExVR0lOX0lELCB1cmlzZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhzdGF0dXMpOwotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVybGUpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ29yZVBsdWdpbi5QTFVHSU5fSUQsIG11cmxlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKG11cmxlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNvcmVQbHVnaW4uUExVR0lOX0lELCBpb2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coaW9lKTsKLSAgICAgICAgfQotICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih3ZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIpOwotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0V1NETEZpbGVOYW1lRnJvbVVSTChVUkwgd3NkbFVSTCkgewotICAgICAgICBJUGF0aCB3c2RsUGF0aCA9IG5ldyBQYXRoKHdzZGxVUkwudG9FeHRlcm5hbEZvcm0oKSk7Ci0gICAgICAgIHJldHVybiB3c2RsUGF0aC5sYXN0U2VnbWVudCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRXU0RMTG9jYXRpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IFdTRExVdGlscy5nZXRXU0RMTG9jYXRpb24oZGVmaW5pdGlvbik7Ci0gICAgICAgIGlmICh3c2RsTG9jYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgbW9kZWwuc2V0V3NkbExvY2F0aW9uKHdzZGxMb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0VE5TT25Nb2RlbChEZWZpbml0aW9uIGRlZmluaXRpb24pIHsKLSAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IFdTRExVdGlscy5nZXRQYWNrYWdlTmFtZUZyb21OYW1lc3BhY2UodGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgbW9kZWwuc2V0VGFyZ2V0TmFtZXNwYWNlKHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgIG1vZGVsLmdldEluY2x1ZGVkTmFtZXNwYWNlcygpLnB1dCh0YXJnZXROYW1lc3BhY2UsIHBhY2thZ2VOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgV1NETDJKYXZhRGF0YU1vZGVsIGdldFdTREwySmF2YURhdGFNb2RlbCgpIHsKLSAgICAgICAgcmV0dXJuIG1vZGVsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIHVuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIExpc3Q8SVJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxJUmVzb3VyY2U+KCk7Ci0gICAgICAgIGNoYW5nZWRSZXNvdXJjZXMuYWRkQWxsKHdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lci5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkpOwotICAgICAgICBpZiAoY2hhbmdlZFJlc291cmNlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBmb3IgKElSZXNvdXJjZSByZXNvdXJjZSA6IGNoYW5nZWRSZXNvdXJjZXMpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByZXNvdXJjZS5kZWxldGUodHJ1ZSwgbW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLSAgICAgICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhzdGF0dXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1vZGVsLmdldEJpbmRpbmdGaWxlcygpLmNsZWFyKCk7Ci0gICAgICAgIG1vZGVsLmdldEluY2x1ZGVkTmFtZXNwYWNlcygpLmNsZWFyKCk7Ci0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL1dTREwySmF2YVByb2plY3RTZWxlY3Rpb25Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL1dTREwySmF2YVByb2plY3RTZWxlY3Rpb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYTBjNDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9XU0RMMkphdmFQcm9qZWN0U2VsZWN0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuQ1hGQ3JlYXRpb25Db3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5TdGF0dXNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLQotLyoqCi0gKiBUaGlzIGlzIHN0b3AgZ2FwIHdvcmthcm91bmQgZm9yIGJ1Z3MgPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MzI4NiI+IzI0MzI4NjwvYT4KLSAqIGFuZCA8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQzMjkwIj4jMjQzMjkwPC9hPgotICoKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMMkphdmFQcm9qZWN0U2VsZWN0aW9uQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLSAgICBwcml2YXRlIFdTREwySmF2YURhdGFNb2RlbCBtb2RlbDsKLSAgICBwcml2YXRlIElQcm9qZWN0IGluaXRpYWxQcm9qZWN0OwotICAgIHByaXZhdGUgSVByb2plY3Qgc2VydmVyUHJvamVjdDsKLSAgICBwcml2YXRlIElQcm9qZWN0IGN1cnJlbnRQcm9qZWN0OwotCi0gICAgcHVibGljIFdTREwySmF2YVByb2plY3RTZWxlY3Rpb25Db21tYW5kKFdTREwySmF2YURhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQotICAgICAgICBpZiAoY3VycmVudFByb2plY3QgPT0gbnVsbCAmJiBpbml0aWFsUHJvamVjdCA9PSBudWxsICYmIHNlcnZlclByb2plY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgICAgIG1vZGVsLnNldFByb2plY3ROYW1lKHNlcnZlclByb2plY3QuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY3VycmVudFByb2plY3QgPT0gbnVsbCAmJiBpbml0aWFsUHJvamVjdCAhPSBudWxsICYmICFpbml0aWFsUHJvamVjdC5lcXVhbHMoc2VydmVyUHJvamVjdCkpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBDWEZDb3JlUGx1Z2luLlBMVUdJTl9JRCwgQ1hGQ3JlYXRpb25Db3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlTWVzc2FnZXMuV1NETDJKQVZBX1BST0pFQ1RfU0VMRUNUSU9OX0VSUk9SLCBuZXcgT2JqZWN0W117Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyUHJvamVjdC5nZXROYW1lKCksIGluaXRpYWxQcm9qZWN0LmdldE5hbWUoKX0pKTsKLSAgICAgICAgfSBlbHNlIGlmIChpbml0aWFsUHJvamVjdCA9PSBudWxsICYmIGN1cnJlbnRQcm9qZWN0ICE9IG51bGwgJiYgIWN1cnJlbnRQcm9qZWN0LmVxdWFscyhzZXJ2ZXJQcm9qZWN0KSkgewotICAgICAgICAgICAgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIENYRkNvcmVQbHVnaW4uUExVR0lOX0lELCBDWEZDcmVhdGlvbkNvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVNZXNzYWdlcy5XU0RMMkpBVkFfUFJPSkVDVF9TRUxFQ1RJT05fRVJST1IsIG5ldyBPYmplY3RbXXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJQcm9qZWN0LmdldE5hbWUoKSwgY3VycmVudFByb2plY3QuZ2V0TmFtZSgpfSkpOwotICAgICAgICB9IGVsc2UgaWYgKGluaXRpYWxQcm9qZWN0ICE9IG51bGwgJiYgY3VycmVudFByb2plY3QgIT0gbnVsbCAmJiAhY3VycmVudFByb2plY3QuZXF1YWxzKHNlcnZlclByb2plY3QpKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgQ1hGQ29yZVBsdWdpbi5QTFVHSU5fSUQsIENYRkNyZWF0aW9uQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZU1lc3NhZ2VzLldTREwySkFWQV9QUk9KRUNUX1NFTEVDVElPTl9FUlJPUiwgbmV3IE9iamVjdFtdewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclByb2plY3QuZ2V0TmFtZSgpLCBjdXJyZW50UHJvamVjdC5nZXROYW1lKCl9KSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoc2VydmVyUHJvamVjdCAhPSBudWxsICYmIHNlcnZlclByb2plY3QuZ2V0UHJvamVjdCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRQcm9qZWN0TmFtZShzZXJ2ZXJQcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXN0YXR1cy5pc09LKCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZ2V0RW52aXJvbm1lbnQoKS5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0KHN0YXR1cyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTdGF0dXNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNvcmVQbHVnaW4uUExVR0lOX0lELCAwLCAiIiwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFRoZSB2YWx1ZSB0byB0ZXN0IGFnYWluc3QuIE1ha2Ugc3VyZSB0aGUgIlNlcnZpY2UgUHJvamVjdCIKLSAgICAgKiBhbmQgdGhlIHByb2plY3QgdGhhdCBjb250YWlucyB0aGUgd3NkbCBmaWxlIG1hdGNoLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZlclByb2plY3QoSVByb2plY3Qgc2VydmVyUHJvamVjdCkgewotICAgICAgICB0aGlzLnNlcnZlclByb2plY3QgPSBzZXJ2ZXJQcm9qZWN0OwotICAgIH0KLQotICAgIC8qCi0gICAgICoKLSAgICAgKiBUaGUgaW5pdGlhbCBwcm9qZWN0IHdpbGwgYmUgbnVsbCB3aGVuIHRoZXJlJ3Mgbm90aGluZyBzZWxlY3RlZCBpbiB0aGUgcHJvamVjdCBleHBsb3JlcgotICAgICAqIFRoaXMgZm9yY2VzIHRoZSB1c2VyIHRvIG1ha2UgYSBzZWxlY3Rpb24gdGh1cyBzZXR0aW5nIHRoZSBjdXJyZW50IHByb2plY3QKLSAgICAgKiBiZWxvdy4KLSAgICAgKgotICAgICAqIElmIHRoZXJlIHdhcyBhbiBpbml0aWFsIHNlbGVjdGlvbiBhbmQgdGhlIHVzZXIgY2hhbmdlcyBmcm9tIG9uZSB0b3AgZG93biBzZXJ2aWNlCi0gICAgICogdHlwZSB0byBhbm90aGVyIHRoZW4gd2UgaGFkIHRvIGNoZWNrLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEluaXRpYWxQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgdGhpcy5pbml0aWFsUHJvamVjdCA9IHByb2plY3Q7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBJZiB0aGVyZSB3YXMgYW4gaW5pdGlhbCBzZWxlY3Rpb24gaW4gdGhlIHByb2plY3QgZXhwbG9yZXIgdGhlIGFib3ZlIHZhbHVlIGlzIHNldCBhbmQKLSAgICAgKiB0aGlzIGlzIHNldCB0byBudWxsLgotICAgICAqCi0gICAgICogVGhpcyB3aWxsIGNoYW5nZSBob3dldmVyIGlmIHRoZSB1c2VyIG1vZGlmaWVzIHRoZSB0ZXh0IGZpZWxkIG9yIGJyb3dzZXMgZm9yIGEKLSAgICAgKiB3c2RsIGZpbGUuIFVwb24gc2VsZWN0aW5nIGEgZmlsZSBpbiBhIHZhbGlkIGxvY2F0aW9uLCB0aGlzIHZhbHVlIGdldHMgc2V0LgotICAgICAqIE5vIHByb2JsZW0gaW4gdGhhdCBzaXR1YXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIHRoaXMuY3VycmVudFByb2plY3QgPSBwcm9qZWN0OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkzMGNiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMjUzZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNhZGQxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jRnJpIE5vdiAwNyAyMzo1ODo1NSBFU1QgMjAwOAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYzNkM2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWk7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLkNYRkNyZWF0aW9uVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkud2lkZ2V0czt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkud3NydDt4LWludGVybmFsOj10cnVlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4yMDQsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3Qud3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMS4zLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52O2J1bmRsZS12ZXJzaW9uPSJbMS4wLjMwNSwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4zMDUsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3M7YnVuZGxlLXZlcnNpb249IlsxLjAuMzA0LDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3Jpbmc7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmNvbW1vbjtidW5kbGUtdmVyc2lvbj0iWzIuNC4wLDMuMC4wKSIsCi0gamF2YXgud3NkbDtidW5kbGUtdmVyc2lvbj0iWzEuNi4yLDEuNy4wKSIsCi0gb3JnLmVjbGlwc2UudWkuZWRpdG9ycztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuYXB0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjMuMTAwLDQuMC4wKSIsCi0gamF2YXguandzO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMi4xLjApIgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUFudC1WZXJzaW9uOiBBcGFjaGUgQW50IDEuNy4wCi1DcmVhdGVkLUJ5OiAxLjUuMF8xNC1iMDMgKFN1biBNaWNyb3N5c3RlbXMgSW5jLikKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QxNjliZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5TZXB0ZW1iZXIgMTIsIDIwMDg8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGYyOTUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9pY29ucy9vYmoxNi9kaXNhYmxlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvaWNvbnMvb2JqMTYvZGlzYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTQyZTc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9pY29ucy9vYmoxNi9kaXNhYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvaWNvbnMvb2JqMTYvZmFsc2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL2ljb25zL29iajE2L2ZhbHNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJkOWIwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvaWNvbnMvb2JqMTYvZmFsc2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL2ljb25zL29iajE2L3RydWUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL2ljb25zL29iajE2L3RydWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2FjYjk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9pY29ucy9vYmoxNi90cnVlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRmMWIzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZT1DWEYgV2ViIFNlcnZpY2VzIENyZWF0aW9uIFVJCi1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi1DWEZfV1NfUlVOVElNRV9MQUJFTD1BcGFjaGUgQ1hGIDIueApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0N2U2N2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkucnVudGltZXMiPgotICAgICAgPHJ1bnRpbWUKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3hmV2ViU2VydmljZVJUIgotICAgICAgICBsYWJlbD0iJUNYRl9XU19SVU5USU1FX0xBQkVMIgotICAgICAgICBzZXJ2ZXJSZXF1aXJlZD0iZmFsc2UiLz4KLSAgICA8L2V4dGVuc2lvbj4KLQotCTwhLS0gZGVmaW5lIHN1cHBvcnQgZm9yIENYRiBKQVgtV1MgSmF2YSBGaXJzdCBhbmQgV1NETCBGaXJzdCBpbiB3ZWIgcHJvamVjdHMgLS0+Ci0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLnNlcnZpY2VSdW50aW1lcyI+Ci0gICAgICA8c2VydmljZVJ1bnRpbWUKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uamF2YSIgCi0gICAgICAgIHNlcnZpY2VJbXBsZW1lbnRhdGlvblR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LndzLndzSW1wbC5qYXZhIgotICAgICAgICBydW50aW1lSWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3hmV2ViU2VydmljZVJUIgotICAgICAgICBib3R0b21VcD0idHJ1ZSIKLSAgICAgICAgdG9wRG93bj0idHJ1ZSIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkud3NydC5DWEZXZWJTZXJ2aWNlUnVudGltZSI+Ci0KLSAgICAgICAgPHJlcXVpcmVkLWZhY2V0LXZlcnNpb24gZmFjZXQ9ImpzdC53ZWIiIHZlcnNpb249IjIuNCIgYWxsb3ctbmV3ZXI9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkLWZhY2V0LXZlcnNpb24gZmFjZXQ9ImpzdC5qYXZhIiB2ZXJzaW9uPSI1LjAiIGFsbG93LW5ld2VyPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZC1mYWNldC12ZXJzaW9uIGZhY2V0PSJjeGYuY29yZSIgdmVyc2lvbj0iMS4wIiBhbGxvdy1uZXdlcj0idHJ1ZSIvPgotICAgICAgPC9zZXJ2aWNlUnVudGltZT4KLSAgICA8L2V4dGVuc2lvbj4KLQotICAgIDwhLS0gZGVmaW5lIHN1cHBvcnQgZm9yIENYRiBKYXZhIGNsaWVudHMgaW4gV2ViIHByb2plY3RzIC0tPgotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5jbGllbnRSdW50aW1lcyI+Ci0gICAgICAgPGNsaWVudFJ1bnRpbWUKLSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi53ZWIiCi0gICAgICAgICAgY2xpZW50SW1wbGVtZW50YXRpb25UeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jbGllbnQudHlwZS5qYXZhIgotICAgICAgICAgIHJ1bnRpbWVJZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jeGZXZWJTZXJ2aWNlUlQiCi0gICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkud3NydC5DWEZXZWJTZXJ2aWNlUnVudGltZSI+Ci0KLSAgICAgICAgICA8cmVxdWlyZWQtZmFjZXQtdmVyc2lvbiBmYWNldD0ianN0LndlYiIgdmVyc2lvbj0iMi40IiBhbGxvdy1uZXdlcj0idHJ1ZSIvPgotICAgICAgICAgIDxyZXF1aXJlZC1mYWNldC12ZXJzaW9uIGZhY2V0PSJqc3QuamF2YSIgdmVyc2lvbj0iNS4wIiBhbGxvdy1uZXdlcj0idHJ1ZSIvPgotICAgICAgICAgIDxyZXF1aXJlZC1mYWNldC12ZXJzaW9uIGZhY2V0PSJjeGYuY29yZSIgdmVyc2lvbj0iMS4wIiBhbGxvdy1uZXdlcj0idHJ1ZSIvPgotICAgICAgIDwvY2xpZW50UnVudGltZT4KLSAgICA8L2V4dGVuc2lvbj4gCi0gICAgCi0gICAgPCEtLSBidWdzICMyNDMyODYgIzI0MzI5MCAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0UmVnaXN0cnkiPgotICAgICAgIDx3aWRnZXRGYWN0b3J5Ci0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkud2lkZ2V0cy5XU0RMMkphdmFQcm9qZWN0U2VsZWN0aW9uV2lkZ2V0RmFjdG9yeSIKLSAgICAgICAgICAgICBpZD0iUHJvamVjdFNlbGVjdGlvbkNvbmZpZyIKLSAgICAgICAgICAgICBpbnNlcnRCZWZvcmVDb21tYW5kSWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFQcm9qZWN0U2VsZWN0aW9uQ29tbWFuZCIvPgotICAgIDwvZXh0ZW5zaW9uPiAKLQotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRSZWdpc3RyeSI+Ci0gICAgICAgPHdpZGdldEZhY3RvcnkKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS53aWRnZXRzLkphdmEyV1NTZWxlY3RTRUlXaWRnZXRGYWN0b3J5IgotICAgICAgICAgICAgIGlkPSJKYXZhMldTUHJlQ2hlY2tDb25maWciCi0gICAgICAgICAgICAgaW5zZXJ0QmVmb3JlQ29tbWFuZElkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuSmF2YTJXU1NlbGVjdFNFSUNvbW1hbmQiPgotICAgICAgIDwvd2lkZ2V0RmFjdG9yeT4KLSAgICA8L2V4dGVuc2lvbj4KLSAgICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRSZWdpc3RyeSI+Ci0gICAgICAgPHdpZGdldEZhY3RvcnkKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS53aWRnZXRzLkpBWFdTQW5ub3RhdGVXaWRnZXRGYWN0b3J5IgotICAgICAgICAgICAgIGlkPSJKQVhXU0Fubm90YXRlQ29uZmlnIgotICAgICAgICAgICAgIGluc2VydEJlZm9yZUNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLkpBWFdTQW5ub3RhdGVKYXZhQ29tbWFuZCI+Ci0gICAgICAgPC93aWRnZXRGYWN0b3J5PgotICAgIDwvZXh0ZW5zaW9uPgotIAotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRSZWdpc3RyeSI+Ci0gICAgICAgPHdpZGdldEZhY3RvcnkKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS53aWRnZXRzLkphdmEyV1NDb25maWdXaWRnZXRGYWN0b3J5IgotICAgICAgICAgICAgIGlkPSJKYXZhMldTQ29uZmlnIgotICAgICAgICAgICAgIGluc2VydEJlZm9yZUNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLkphdmEyV1NDb21tYW5kIj4KLSAgICAgICA8L3dpZGdldEZhY3Rvcnk+Ci0gICAgPC9leHRlbnNpb24+Ci0gICAgCi0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldFJlZ2lzdHJ5Ij4KLSAgICAgICA8d2lkZ2V0RmFjdG9yeQotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLndpZGdldHMuV1NETDJKYXZhQ29uZmlnV2lkZ2V0RmFjdG9yeSIKLSAgICAgICAgICAgICBpZD0iV1NETDJKYXZhQ29uZmlnIgotICAgICAgICAgICAgIGluc2VydEJlZm9yZUNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNvbW1hbmQiPgotICAgICAgIDwvd2lkZ2V0RmFjdG9yeT4KLSAgICA8L2V4dGVuc2lvbj4KLSAgICAKLSAgICA8IS0tIEpBVkEyV1MgLS0+Ci0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmFudERhdGFNYXBwaW5nIj4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJHZW5DbGllbnQiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuSmF2YTJXU0NvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IkdlbmVyYXRlQ2xpZW50IgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0iR2VuU2VydmVyIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLkphdmEyV1NDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJHZW5lcmF0ZVNlcnZlciIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9IkdlbldyYXBwZXJGYXVsdEJlYW5zIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLkphdmEyV1NDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0iR2VuV1NETCIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5KYXZhMldTQ29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iR2VuZXJhdGVXU0RMIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0iV3NkbEZpbGVOYW1lIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLkphdmEyV1NDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJXc2RsRmlsZU5hbWUiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJHZW5YU0RJbXBvcnRzIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLkphdmEyV1NDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJHZW5lcmF0ZVhTREltcG9ydHMiCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJVc2VTT0FQMTJCaW5kaW5nIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLkphdmEyV1NDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJVc2VTT0FQMTJCaW5kaW5nIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgPC9leHRlbnNpb24+Ci0KLSAgICA8IS0tIFdTREwySmF2YSAtLT4KLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuYW50RGF0YU1hcHBpbmciPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9Ik1hcHBpbmdzIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IkluY2x1ZGVkTmFtZXNwYWNlcyIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5lbnYuYW50Lk1hcHBpbmdzVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJCaW5kaW5ncyIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJCaW5kaW5nRmlsZXMiCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuZW52LmFudC5CaW5kaW5nc1RyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0iSmF2YU91dHB1dCIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJKYXZhU291cmNlRm9sZGVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0iU2VydmljZU5hbWUiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iU2VydmljZU5hbWUiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJHZW5TZXJ2ZXIiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iR2VuZXJhdGVTZXJ2ZXIiCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJHZW5JbXBsIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IkdlbmVyYXRlSW1wbGVtZW50YXRpb24iCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJEZWZhdWx0VmFsdWVzIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IlVzZURlZmF1bHRWYWx1ZXMiCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJFeHRTT0FQSGVhZGVycyIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJQcm9jZXNzU09BUEhlYWRlcnMiCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJEZWZhdWx0TmFtZXNwYWNlIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IkxvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0iRGVmYXVsdEV4Y2x1ZGVzTmFtZXNwYWNlIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IkxvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0iQXV0b05hbWVSZXNvbHV0aW9uIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IkF1dG9OYW1lUmVzb2x1dGlvbiIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9InhqY19kdiIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJYamNVc2VEZWZhdWx0VmFsdWVzIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0ieGpjX3RzIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IlhqY1RvU3RyaW5nIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0ieGpjX3RzX211bHRpIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IlhqY1RvU3RyaW5nTXVsdGlMaW5lIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0ieGpjX3RzX3NpbXBsZSIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJYamNUb1N0cmluZ1NpbXBsZSIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9InhqY19sb2NhdG9yIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IlhqY0xvY2F0b3IiCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJ4amNfc3luY19tZXRob2RzIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IlhqY1N5bmNNZXRob2RzIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0ieGpjX21hcmtfZ2VuZXJhdGVkIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IlhqY01hcmtHZW5lcmF0ZWQiCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICA8L2V4dGVuc2lvbj4KLQotIDwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS9DWEZDcmVhdGlvblVJTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS9DWEZDcmVhdGlvblVJTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQzYTQ0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIENYRkNyZWF0aW9uVUlNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gCi0gICAgICAgICJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLkNYRkNyZWF0aW9uVUltZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0VOVEVSX1NFSV9OQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfU0VMRUNUX1NFSV9FWFRSQUNURURfTUVUSE9EUzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX1NFTEVDVF9TRUlfTUVTU0FHRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX1NFTEVDVF9TRUlfT1BUSU9OOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfU0VMRUNUX1NFSV9ESUFMT0dfVElUTEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19TRUxFQ1RfU0VJX0RJQUxPR19ERVNDUklQVElPTjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX1NFTEVDVF9TRUlfV0VCU0VSVklDRV9OQU1FX0FUVFJJQlVURV9QUkVTRU5UOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfU0VMRUNUX0lNUExfRElBTE9HX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfU0VMRUNUX0lNUExfRElBTE9HX0RFU0NSSVBUSU9OOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfRU5URVJfVkFMSURfV1NETF9OQU1FOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19DTEFTU19DT05GSUdfUEFHRV9USVRMRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0NMQVNTX0NPTkZJR19QQUdFX0RFU0NSSVBUSU9OOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19JTlRFUkZBQ0VfQ09ORklHX1BBR0VfVElUTEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19JTlRFUkZBQ0VfQ09ORklHX1BBR0VfREVTQ1JJUFRJT047Ci0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19KQVhXU19BTk5PVEFURV9QQUdFX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfSkFYV1NfQU5OT1RBVEVfUEFHRV9ERVNDUklQVElPTjsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX1BBR0VfVElUTEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19QQUdFX0RFU0NSSVBUSU9OOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0FOTk9UQVRFX0pKQVZBX1dJREdFVF9QUkVWSUVXOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0FOTk9UQVRFX0pKQVZBX1dJREdFVF9TRUxFQ1RfTUVUSE9EX1RPX0FOTk9UQVRFOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1BBR0VfVElUTEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1BBR0VfREVTQ1JJUFRJT047Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfREVGQVVMVFNfUEFHRV9USVRMRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfREVGQVVMVFNfUEFHRV9ERVNDUklQVElPTjsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfR1JPVVBfTEFCRUw7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfR1JPVVBfTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1hKQ19BUkdfR1JPVVBfTEFCRUw7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX01VU1RfSU1QTEVNRU5UOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfRk9VTkQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9JTVBMRU1FTlRBVElPTl9OT1RfRk9VTkQ7Ci0gICAgCi0gICAgc3RhdGljIHsKLSAgICAgICAgLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLSAgICAgICAgTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENYRkNyZWF0aW9uVUlNZXNzYWdlcygpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvQ1hGQ3JlYXRpb25VSVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL0NYRkNyZWF0aW9uVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJjZmU2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvQ1hGQ3JlYXRpb25VSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDWEZDcmVhdGlvblVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLSAgICAvLyBUaGUgcGx1Zy1pbiBJRAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotICAgIHByaXZhdGUgc3RhdGljIENYRkNyZWF0aW9uVUlQbHVnaW4gcGx1Z2luOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIENYRkNyZWF0aW9uVUlQbHVnaW4oKSB7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zdGFydChjb250ZXh0KTsKLSAgICAgICAgcGx1Z2luID0gdGhpczsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBwbHVnaW4gPSBudWxsOwotICAgICAgICBzdXBlci5zdG9wKGNvbnRleHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ1hGQ3JlYXRpb25VSVBsdWdpbiBnZXREZWZhdWx0KCkgewotICAgICAgICByZXR1cm4gcGx1Z2luOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIGltYWdlIGZpbGUgYXQgdGhlIGdpdmVuIHBsdWctaW4KLSAgICAgKiByZWxhdGl2ZSBwYXRoCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhdGgKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXRoCi0gICAgICogQHJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcGF0aCkgewotICAgICAgICByZXR1cm4gaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5fSUQsIHBhdGgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2dNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgQ1hGQ3JlYXRpb25VSVBsdWdpbi5sb2cobmV3IFN0YXR1cyhzZXZlcml0eSwgQ1hGQ3JlYXRpb25VSVBsdWdpbi5QTFVHSU5fSUQsIG1lc3NhZ2UpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgIENYRkNyZWF0aW9uVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSBleGNlcHRpb24pIHsKLSAgICAgICAgQ1hGQ3JlYXRpb25VSVBsdWdpbi5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDcmVhdGlvblVJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgIGV4Y2VwdGlvbi50b1N0cmluZygpLCBleGNlcHRpb24pKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvQ1hGQ3JlYXRpb25VSW1lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvQ1hGQ3JlYXRpb25VSW1lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZTQyZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL0NYRkNyZWF0aW9uVUltZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSNKYXZhMldTIFByZSBDb25maWcgV2lkZ2V0IEZhY3RvcnkKLUpBVkEyV1NfQ0xBU1NfQ09ORklHX1BBR0VfVElUTEU9ezB9IHsxfSBXZWIgU2VydmljZSBKYXZhIENsYXNzIFN0YXJ0aW5nIFBvaW50IENvbmZpZ3VyYXRpb24KLUpBVkEyV1NfQ0xBU1NfQ09ORklHX1BBR0VfREVTQ1JJUFRJT049U2VsZWN0IGFuIGV4aXN0aW5nIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIChTRUkpIG9yIGNyZWF0ZSBhbiBTRUkgYnkgZXh0cmFjdGluZyBhbiBpbnRlcmZhY2UgZnJvbSB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MuCi0KLUpBVkEyV1NfSU5URVJGQUNFX0NPTkZJR19QQUdFX1RJVExFPXswfSB7MX0gV2ViIFNlcnZpY2UgSmF2YSBJbnRlcmZhY2UgU3RhcnRpbmcgUG9pbnQgQ29uZmlndXJhdGlvbgotSkFYV1NfQU5OT1RBVEVfSkpBVkFfV0lER0VUX1BSRVZJRVc9UHJldmlldzoKLUpBVkEyV1NfSU5URVJGQUNFX0NPTkZJR19QQUdFX0RFU0NSSVBUSU9OPVNlbGVjdCBhbiBpbXBsZW1lbnRhdGlvbiB0aGF0IGltcGxlbWVudHMgYWxsIHRoZSBtZXRob2RzIG9mIHRoZSBTRUkuCi0KLSNKYXZhMldTIENvbmZpZyBXaWRnZXQgRmFjdG9yeQotSkFWQTJXU19KQVhXU19BTk5PVEFURV9QQUdFX1RJVExFPXswfSB7MX0gV2ViIFNlcnZpY2UgSkFYLVdTIEFubm90YXRpb25zIENvbmZpZ3VyYXRpb24KLUpBVkEyV1NfSkFYV1NfQU5OT1RBVEVfUEFHRV9ERVNDUklQVElPTj1PcHRpb25hbGx5LCBzZWxlY3QgdGhlIEpBWC1XUyBBbm5vdGF0aW9ucyB0byBhZGQuCi0KLUpBVkEyV1NfUEFHRV9USVRMRT17MH0gezF9IFdlYiBTZXJ2aWNlIEphdmEyV1MgQ29uZmlndXJhdGlvbgotSkFWQTJXU19QQUdFX0RFU0NSSVBUSU9OPUNvbmZpZ3VyZSB0aGUgezB9IEphdmEgdG8gV1Mgb3B0aW9ucy4KLQotI1dTREwySmF2YSBDb25maWcgV2lkZ2V0IEZhY3RvcnkKLVdTREwySkFWQV9QQUdFX1RJVExFPXswfSB7MX0gV2ViIFNlcnZpY2UgV1NETDJKYXZhIENvbmZpZ3VyYXRpb24KLVdTREwySkFWQV9QQUdFX0RFU0NSSVBUSU9OPUNvbmZpZ3VyZSB0aGUgezB9IFdTREwgdG8gSmF2YSBvcHRpb25zLgotCi1XU0RMMkpBVkFfREVGQVVMVFNfUEFHRV9USVRMRT17MH0gezF9IFdlYiBTZXJ2aWNlIFdTREwySmF2YSBDb25maWd1cmF0aW9uCi1XU0RMMkpBVkFfREVGQVVMVFNfUEFHRV9ERVNDUklQVElPTj1UaGUgcGFnZSBhbGxvd3MgdGhlIG92ZXJyaWRpbmcgb2YgdGhlIGRlZmF1bHQgcHJlZmVyZW5jZXMgZm9yIHRoaXMgV2ViIFNlcnZpY2UgZ2VuZXJhdGlvbi4KLQotI0phdmEyV1MgQ29uZmlnIFdpZGdldAotSkFWQTJXU19HUk9VUF9MQUJFTD1KYXZhMldTIEdlbmVyYXRpb24gT3B0aW9uczoKLQotSkFWQTJXU19FTlRFUl9TRUlfTkFNRT1QbGVhc2UgZW50ZXIgdGhlIG5hbWUgb2YgdGhlIFNFSSB0byBleHRyYWN0Ci1KQVZBMldTX1NFTEVDVF9TRUlfRVhUUkFDVEVEX01FVEhPRFM9UGxlYXNlIHNlbGVjdCB0aGUgbWV0aG9kcyB5b3Ugd2lzaCB0byBleHRyYWN0IGZyb20gdGhlIHswfSBjbGFzcwotSkFWQTJXU19TRUxFQ1RfU0VJX01FU1NBR0U9UGxlYXNlIHNlbGVjdCBhIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlCi1KQVZBMldTX1NFTEVDVF9TRUlfT1BUSU9OPVBsZWFzZSBzZWxlY3QgYW4gU0VJIG9wdGlvbgotSkFWQTJXU19TRUxFQ1RfU0VJX0RJQUxPR19USVRMRT1TZWxlY3QgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UKLUpBVkEyV1NfU0VMRUNUX1NFSV9ESUFMT0dfREVTQ1JJUFRJT049U2VsZWN0IHRoZSBJbnRlcmZhY2UgdG8gdXNlIGFzIHRoZSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZQotSkFWQTJXU19TRUxFQ1RfU0VJX1dFQlNFUlZJQ0VfTkFNRV9BVFRSSUJVVEVfUFJFU0VOVD1JbXBsZW1lbnRhdGlvbiBjbGFzcyBjb250YWlucyBhbiBAV2ViU2VydmljZSBhbm5vdGF0aW9uIHdpdGggYSBuYW1lIGF0dHJpYnV0ZSB3aGljaCBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCBhbiBlbmRwb2ludEludGVyZmFjZSBhdHRyaWJ1dGUKLUpBVkEyV1NfU0VMRUNUX0lNUExfRElBTE9HX1RJVExFPVNlbGVjdCBhbiBJbXBsZW1lbnRhdGlvbgotSkFWQTJXU19TRUxFQ1RfSU1QTF9ESUFMT0dfREVTQ1JJUFRJT049U2VsZWN0IHRoZSBJbXBsZW1lbnRhdGlvbiB0byB1c2UgZm9yIHRoZSBXZWIgU2VydmljZQotCi1KQVZBMldTX0VOVEVSX1ZBTElEX1dTRExfTkFNRT1QbGVhc2UgZW50ZXIgYSB2YWxpZCBXU0RMIEZpbGUgbmFtZQotCi0jV1NETDJKYXZhIERlZmF1bHRzIENvbmZpZyBXaWRnZXQKLVdTREwySkFWQV9HUk9VUF9MQUJFTD1XU0RMMkphdmEgR2VuZXJhdGlvbiBPcHRpb25zCi1XU0RMMkpBVkFfWEpDX0FSR19HUk9VUF9MQUJFTD1YSkMgQXJndW1lbnRzCi1KQVhXU19BTk5PVEFURV9KSkFWQV9XSURHRVRfU0VMRUNUX01FVEhPRF9UT19BTk5PVEFURT1TZWxlY3QgdGhlIE1ldGhvZHMgdG8gYW5ub3RhdGU6Ci0KLVdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9NVVNUX0lNUExFTUVOVD1JbXBsZW1lbnRhdGlvbiBjbGFzcyBtdXN0IGltcGxlbWVudCB0aGUgU0VJIG1ldGhvZCAnJ3swfScnCi1XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9UX0ZPVU5EPVRoZSBlbmRwb2ludEludGVyZmFjZSAnJ3swfScnIGNhbm5vdCBiZSBmb3VuZAotV0VCU0VSVklDRV9JTVBMRU1FTlRBVElPTl9OT1RfRk9VTkQ9VGhlIEltcGxlbWVudGF0aW9uICcnezB9JycgY2Fubm90IGJlIGZvdW5kCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvc2VsZWN0aW9uL0lTdHJ1Y3R1cmVkU2VsZWN0aW9uVG9JUHJvamVjdFRyYW5zZm9ybWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvc2VsZWN0aW9uL0lTdHJ1Y3R1cmVkU2VsZWN0aW9uVG9JUHJvamVjdFRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNTQ2NjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3NlbGVjdGlvbi9JU3RydWN0dXJlZFNlbGVjdGlvblRvSVByb2plY3RUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS5zZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLlRyYW5zZm9ybWVyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIElTdHJ1Y3R1cmVkU2VsZWN0aW9uVG9JUHJvamVjdFRyYW5zZm9ybWVyIGltcGxlbWVudHMgVHJhbnNmb3JtZXIgewotCi0gICAgcHVibGljIE9iamVjdCB0cmFuc2Zvcm0oT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZhbHVlOwotICAgICAgICBPYmplY3QgZmlyc3RFbGVtZW50ID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKGZpcnN0RWxlbWVudCBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotICAgICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgZmlyc3RFbGVtZW50OwotICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlLmdldFByb2plY3QoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS92aWV3ZXJzL0Fubm90YXRpb25Db2x1bW5MYWJlbFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvdmlld2Vycy9Bbm5vdGF0aW9uQ29sdW1uTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjU3ZmMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS92aWV3ZXJzL0Fubm90YXRpb25Db2x1bW5MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklMb2NhbFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuU291cmNlTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkNYRk1vZGVsVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS5DWEZDcmVhdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uQ29sdW1uTGFiZWxQcm92aWRlciBleHRlbmRzIENvbHVtbkxhYmVsUHJvdmlkZXIgewotICAgIHByaXZhdGUgSW1hZ2UgYWRkQW5ub3RhdGlvbkltYWdlOwotICAgIHByaXZhdGUgSW1hZ2UgcmVtb3ZlQW5ub3RhdGlvbkltYWdlOwotICAgIHByaXZhdGUgSW1hZ2UgZGlzYWJsZWQ7Ci0KLSAgICBwcml2YXRlIE1hcDxJTWV0aG9kLCBNYXA8U3RyaW5nLCBCb29sZWFuPj4gbWV0aG9kTWFwOwotICAgIHByaXZhdGUgU3RyaW5nIGFubm90YXRpb25LZXk7Ci0gICAgcHJpdmF0ZSBJVHlwZSB0eXBlOwotCi0gICAgcHVibGljIEFubm90YXRpb25Db2x1bW5MYWJlbFByb3ZpZGVyKEphdmEyV1NEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBhbm5vdGF0aW9uS2V5LCBJVHlwZSB0eXBlKSB7Ci0gICAgICAgIHRoaXMubWV0aG9kTWFwID0gbW9kZWwuZ2V0TWV0aG9kTWFwKCk7Ci0gICAgICAgIHRoaXMuYW5ub3RhdGlvbktleSA9IGFubm90YXRpb25LZXk7Ci0gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgICAgIGFkZEFubm90YXRpb25JbWFnZSA9IENYRkNyZWF0aW9uVUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihDWEZDcmVhdGlvblVJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAiaWNvbnMvb2JqMTYvdHJ1ZS5naWYiKS5jcmVhdGVJbWFnZSgpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJlbW92ZUFubm90YXRpb25JbWFnZSA9IENYRkNyZWF0aW9uVUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihDWEZDcmVhdGlvblVJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAiaWNvbnMvb2JqMTYvZmFsc2UuZ2lmIikuY3JlYXRlSW1hZ2UoKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBkaXNhYmxlZCA9IENYRkNyZWF0aW9uVUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihDWEZDcmVhdGlvblVJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAiaWNvbnMvb2JqMTYvZGlzYWJsZWQuZ2lmIikuY3JlYXRlSW1hZ2UoKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTb3VyY2VNZXRob2QpIHsKLSAgICAgICAgICAgIGlmIChtZXRob2RNYXAgPT0gbnVsbCB8fCBhbm5vdGF0aW9uS2V5ID09IG51bGwgfHwgdHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gKFNvdXJjZU1ldGhvZCkgZWxlbWVudDsKLQotICAgICAgICAgICAgaWYgKGFubm90YXRpb25LZXkuZXF1YWxzKENYRk1vZGVsVXRpbHMuV0VCX1BBUkFNKSkgewotICAgICAgICAgICAgICAgIExpc3Q8U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbj4gcGFyYW1ldGVycyA9IEFubm90YXRpb25VdGlscy5nZXRTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9ucyhtZXRob2QpOwotCi0gICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlcnMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRpc2FibGVkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3IgKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyIDogcGFyYW1ldGVycykgewotICAgICAgICAgICAgICAgIAlJTG9jYWxWYXJpYWJsZSB2YXJpYWJsZSA9IChJTG9jYWxWYXJpYWJsZSkgcGFyYW1ldGVyLnJlc29sdmVCaW5kaW5nKCkuZ2V0SmF2YUVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KHZhcmlhYmxlLCBhbm5vdGF0aW9uS2V5KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRpc2FibGVkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBhbm5vdGF0aW9uS2V5KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBkaXNhYmxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKG1ldGhvZE1hcC5nZXQobWV0aG9kKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQm9vbGVhbiBhZGRBbm5vdGF0aW9uID0gIG1ldGhvZE1hcC5nZXQobWV0aG9kKS5nZXQoYW5ub3RhdGlvbktleSk7Ci0gICAgICAgICAgICAgICAgaWYgKGFkZEFubm90YXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFkZEFubm90YXRpb25JbWFnZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVtb3ZlQW5ub3RhdGlvbkltYWdlOwotICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgc3VwZXIuZGlzcG9zZSgpOwotICAgICAgICBhZGRBbm5vdGF0aW9uSW1hZ2UuZGlzcG9zZSgpOwotICAgICAgICByZW1vdmVBbm5vdGF0aW9uSW1hZ2UuZGlzcG9zZSgpOwotICAgICAgICBkaXNhYmxlZC5kaXNwb3NlKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9KQVhXU0Fubm90YXRlSmF2YVdpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvSkFYV1NBbm5vdGF0ZUphdmFXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZjOWY2NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9KQVhXU0Fubm90YXRlSmF2YVdpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTG9jYWxWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dEZpbGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLkphdmFQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLmphdmFlZGl0b3IuSmF2YVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5TaW1wbGVKYXZhU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5QcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5TdGFuZGFyZEphdmFFbGVtZW50Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LklDb2xvck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuSUphdmFQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LkphdmFUZXh0VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkVkaXRpbmdTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuQ1hGTW9kZWxVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLkNYRkNyZWF0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLkNYRkNyZWF0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS52aWV3ZXJzLkFubm90YXRpb25Db2x1bW5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TYXNoRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk1hbGZvcm1lZFRyZWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIEpBWFdTQW5ub3RhdGVKYXZhV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yIHsKLSAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0KLSAgICBwcml2YXRlIElUeXBlIHR5cGU7Ci0gICAgcHJpdmF0ZSBKYXZhMldTRGF0YU1vZGVsIG1vZGVsOwotICAgIHByaXZhdGUgVHJlZVZpZXdlciBqYXZhVHJlZVZpZXdlcjsKLSAgICBwcml2YXRlIFNvdXJjZVZpZXdlciBhbm5vdGF0aW9uUHJldmlld1ZpZXdlcjsKLQotICAgIHByaXZhdGUgVHJlZVZpZXdlckNvbHVtbiB3ZWJNZXRob2RWaWV3ZXJDb2x1bW47Ci0gICAgcHJpdmF0ZSBUcmVlVmlld2VyQ29sdW1uIHdlYlBhcmFtVmlld2VyQ29sdW1uOwotICAgIHByaXZhdGUgVHJlZVZpZXdlckNvbHVtbiByZXF1ZXN0V3JhcHBlclZpZXdlckNvbHVtbjsKLSAgICBwcml2YXRlIFRyZWVWaWV3ZXJDb2x1bW4gcmVzcG9uY2VXcmFwcGVyVmlld2VyQ29sdW1uOwotCi0gICAgcHVibGljIEpBWFdTQW5ub3RhdGVKYXZhV2lkZ2V0KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEphdmEyV1NEYXRhTW9kZWwoSmF2YTJXU0RhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIpIHsKLSAgICAgICAgU2FzaEZvcm0gc2FzaEZvcm0gPSBuZXcgU2FzaEZvcm0ocGFyZW50LCBTV1QuVkVSVElDQUwgfCBTV1QuU01PT1RIKTsKLSAgICAgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIHNhc2hGb3JtLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotICAgICAgICBzYXNoRm9ybS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBDb21wb3NpdGUgamF2YVRyZWVjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHNhc2hGb3JtLCBTV1QuTk9ORSk7Ci0gICAgICAgIGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgamF2YVRyZWVjb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIGphdmFUcmVlY29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIExhYmVsIG91dGxpbmVMYWJlbCA9IG5ldyBMYWJlbChqYXZhVHJlZWNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBvdXRsaW5lTGFiZWwuc2V0VGV4dChDWEZDcmVhdGlvblVJTWVzc2FnZXMuSkFYV1NfQU5OT1RBVEVfSkpBVkFfV0lER0VUX1NFTEVDVF9NRVRIT0RfVE9fQU5OT1RBVEUpOwotCi0gICAgICAgIFRyZWUgamF2YVRyZWUgPSBuZXcgVHJlZShqYXZhVHJlZWNvbXBvc2l0ZSwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTAotICAgICAgICAgICAgICAgIHwgU1dULkhfU0NST0xMKTsKLSAgICAgICAgamF2YVRyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihqYXZhVHJlZSk7Ci0KLSAgICAgICAgamF2YVRyZWUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgZ3JpZERhdGEuaGVpZ2h0SGludCA9IDEwOwotICAgICAgICBncmlkRGF0YS53aWR0aEhpbnQgPSAyMDA7Ci0gICAgICAgIGphdmFUcmVlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIFRyZWVWaWV3ZXJDb2x1bW4gY2xhc3NWaWV3ZXJDb2x1bW4gPSBuZXcgVHJlZVZpZXdlckNvbHVtbihqYXZhVHJlZVZpZXdlciwgU1dULk5PTkUpOwotICAgICAgICBUcmVlQ29sdW1uIGNsYXNzQ29sdW1uID0gY2xhc3NWaWV3ZXJDb2x1bW4uZ2V0Q29sdW1uKCk7Ci0gICAgICAgIGNsYXNzQ29sdW1uLnNldFdpZHRoKDIwMCk7Ci0gICAgICAgIGNsYXNzQ29sdW1uLnNldE1vdmVhYmxlKGZhbHNlKTsKLQotICAgICAgICBmaW5hbCBKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIgamF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyID0gbmV3IEphdmFFbGVtZW50TGFiZWxQcm92aWRlcigpOwotICAgICAgICBjbGFzc1ZpZXdlckNvbHVtbi5zZXRMYWJlbFByb3ZpZGVyKG5ldyBDb2x1bW5MYWJlbFByb3ZpZGVyKCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgICAgIHJldHVybiBqYXZhRWxlbWVudExhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UoZWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGphdmFFbGVtZW50TGFiZWxQcm92aWRlci5nZXRUZXh0KGVsZW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBqYXZhVHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFN0YW5kYXJkSmF2YUVsZW1lbnRDb250ZW50UHJvdmlkZXIodHJ1ZSkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKElDb21waWxhdGlvblVuaXQpIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJVHlwZVtdIHR5cGVzID0gY29tcGlsYXRpb25Vbml0LmdldFR5cGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKElUeXBlIHR5cGUgOiB0eXBlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgSVR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbXSB7dHlwZX07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZSkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgSVR5cGUgc291cmNlVHlwZSA9IChJVHlwZSkgZWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8SU1ldGhvZD4gcHVibGljTWV0aG9kcyA9IG5ldyBBcnJheUxpc3Q8SU1ldGhvZD4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIElNZXRob2RbXSBtZXRob2RzID0gc291cmNlVHlwZS5nZXRNZXRob2RzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlVHlwZS5pc0ludGVyZmFjZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZVR5cGUuaXNDbGFzcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJTWV0aG9kIG1ldGhvZCA6IG1ldGhvZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEpEVFV0aWxzLmlzUHVibGljTWV0aG9kKG1ldGhvZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY01ldGhvZHMuYWRkKG1ldGhvZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHVibGljTWV0aG9kcy50b0FycmF5KG5ldyBPYmplY3RbcHVibGljTWV0aG9kcy5zaXplKCldKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25VSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gTk9fQ0hJTERSRU47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q2hpbGRyZW4oZWxlbWVudCkubGVuZ3RoID4gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgamF2YVRyZWVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGlmIChldmVudC5nZXRTZWxlY3Rpb24oKSBpbnN0YW5jZW9mIElUcmVlU2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIElUcmVlU2VsZWN0aW9uIHRyZWVTZWxlY3Rpb24gPSAoVHJlZVNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBmaXJzdEVsZW1lbnQgPSB0cmVlU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCi0gICAgICAgICAgICAgICAgICAgIElEb2N1bWVudCBkb2N1bWVudCA9IGFubm90YXRpb25QcmV2aWV3Vmlld2VyLmdldERvY3VtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIEZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyIGZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyID0KLSAgICAgICAgICAgICAgICAgICAgCW5ldyBGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlcihkb2N1bWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RFbGVtZW50IGluc3RhbmNlb2YgSVR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVHlwZSBzb3VyY2VUeXBlID0gKElUeXBlKSBmaXJzdEVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVsZW1lbnROYW1lID0gc291cmNlVHlwZS5nZXRFbGVtZW50TmFtZSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciByZWdleCA9IG5ldyBTdHJpbmdCdWlsZGVyKCJcXGJwdWJsaWNcXFcrKD86XFx3K1xcVyspezEsM30/Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXguYXBwZW5kKGVsZW1lbnROYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleC5hcHBlbmQoIlxcYiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElSZWdpb24gcmVnaW9uID0gZmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIuZmluZCgwLCByZWdleC50b1N0cmluZygpLCB0cnVlLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIHRydWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByZXZpZXdWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShyZWdpb24uZ2V0T2Zmc2V0KCksIHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByZXZpZXdWaWV3ZXIucmV2ZWFsUmFuZ2UocmVnaW9uLmdldE9mZnNldCgpLCByZWdpb24uZ2V0TGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaXJzdEVsZW1lbnQgaW5zdGFuY2VvZiBJTWV0aG9kKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1ldGhvZCBzb3VyY2VNZXRob2QgPSAoSU1ldGhvZCkgZmlyc3RFbGVtZW50OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUeXBlIHNvdXJjZVR5cGUgPSAoSVR5cGUpIHNvdXJjZU1ldGhvZC5nZXRQYXJlbnQoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbGVtZW50TmFtZSA9IHNvdXJjZU1ldGhvZC5nZXRFbGVtZW50TmFtZSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciByZWdleCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlVHlwZS5pc0NsYXNzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXguYXBwZW5kKCJcXGJwdWJsaWMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleC5hcHBlbmQoIlxcVysoPzpcXHcrXFxXKyl7MSwzfT8iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleC5hcHBlbmQoZWxlbWVudE5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4LmFwcGVuZCgiXFxzKj9cXChcXHMqPy4qPyIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gcGFyYW1ldGVyVHlwZXMgPSBzb3VyY2VNZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBwYXJhbXRlck5hbWVzID0gc291cmNlTWV0aG9kLmdldFBhcmFtZXRlck5hbWVzKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlclR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4LmFwcGVuZCgiXFxzKj8iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHR5cGVOYW1lID0gU2lnbmF0dXJlLnRvU3RyaW5nKHBhcmFtZXRlclR5cGVzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXguYXBwZW5kKHR5cGVOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXguYXBwZW5kKCJcXHMqPyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleC5hcHBlbmQocGFyYW10ZXJOYW1lc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCWlmIChpIDwgcGFyYW1ldGVyVHlwZXMubGVuZ3RoIC0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgcmVnZXguYXBwZW5kKCJcXHMqPyxcXHMqPy4qPyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAl9Ci0JCQkJCQkJfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4LmFwcGVuZCgiXFxzKj9cXCkiKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgCUlSZWdpb24gcmVnaW9uID0gZmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIuZmluZCgwLCByZWdleC50b1N0cmluZygpLCB0cnVlLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgZmFsc2UsIHRydWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElSZWdpb24gZWxlbWVudE5hbWVSZWdpb24gPSBmaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlci5maW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCXJlZ2lvbi5nZXRPZmZzZXQoKSwgZWxlbWVudE5hbWUsIHRydWUsIHRydWUsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnROYW1lUmVnaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWFubm90YXRpb25QcmV2aWV3Vmlld2VyLnNldFNlbGVjdGVkUmFuZ2UoZWxlbWVudE5hbWVSZWdpb24uZ2V0T2Zmc2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCWVsZW1lbnROYW1lUmVnaW9uLmdldExlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25QcmV2aWV3Vmlld2VyLnJldmVhbFJhbmdlKGVsZW1lbnROYW1lUmVnaW9uLmdldE9mZnNldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQllbGVtZW50TmFtZVJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGJsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25VSVBsdWdpbi5sb2coYmxlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25VSVBsdWdpbi5sb2coam1lKTsKLQkJCQkJfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgY3JlYXRlV2ViTWV0aG9kVmlld2VyQ29sdW1uKGphdmFUcmVlVmlld2VyKTsKLSAgICAgICAgY3JlYXRlV2ViUGFyYW1WaWV3ZXJDb2x1bW4oamF2YVRyZWVWaWV3ZXIpOwotICAgICAgICBjcmVhdGVSZXF1ZXN0V3JhcHBlclZpZXdlckNvbHVtbihqYXZhVHJlZVZpZXdlcik7Ci0gICAgICAgIGNyZWF0ZVJlc3BvbnNlV3JhcHBlclZpZXdlckNvbHVtbihqYXZhVHJlZVZpZXdlcik7Ci0KLSAgICAgICAgamF2YVRyZWVWaWV3ZXIuc2V0QXV0b0V4cGFuZExldmVsKFRyZWVWaWV3ZXIuQUxMX0xFVkVMUyk7Ci0gICAgICAgIGphdmFUcmVlVmlld2VyLmV4cGFuZEFsbCgpOwotCi0gICAgICAgIENvbXBvc2l0ZSBwcmV2aWV3Q29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzYXNoRm9ybSwgU1dULk5PTkUpOwotICAgICAgICBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIHByZXZpZXdDb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIGphdmFUcmVlY29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIExhYmVsIHByZXZpZXdMYWJlbCA9IG5ldyBMYWJlbChwcmV2aWV3Q29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIHByZXZpZXdMYWJlbC5zZXRUZXh0KENYRkNyZWF0aW9uVUlNZXNzYWdlcy5KQVhXU19BTk5PVEFURV9KSkFWQV9XSURHRVRfUFJFVklFVyk7Ci0KLSAgICAgICAgYW5ub3RhdGlvblByZXZpZXdWaWV3ZXIgPSBjcmVhdGVBbm5vdGF0aW9uUHJldmlld2VyKHByZXZpZXdDb21wb3NpdGUsIFNXVC5SRUFEX09OTFkgfCBTV1QuVl9TQ1JPTEwKLSAgICAgICAgICAgICAgICB8IFNXVC5IX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotICAgICAgICBncmlkRGF0YS5oZWlnaHRIaW50ID0gMTA7Ci0gICAgICAgIGdyaWREYXRhLndpZHRoSGludCA9IDIwMDsKLSAgICAgICAgYW5ub3RhdGlvblByZXZpZXdWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIHNhc2hGb3JtLnNldFdlaWdodHMobmV3IGludFtdezUwLCA1MH0pOwotCi0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGludGVybmFsaXplKCkgewotICAgICAgICB0eXBlID0gbnVsbDsKLSAgICAgICAgdXBkYXRlTGFiZWxQcm92aWRlcnMoKTsKLSAgICAgICAgamF2YVRyZWVWaWV3ZXIuc2V0SW5wdXQoZ2V0VHlwZSgpLmdldFR5cGVSb290KCkpOwotICAgICAgICBqYXZhVHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICAgIGhhbmRsZUFubm90YXRpb24oZ2V0VHlwZSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIElUeXBlIGdldFR5cGUoKSB7Ci0gICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0eXBlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtb2RlbC5nZXRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgdHlwZSA9IEpEVFV0aWxzLmZpbmRUeXBlKEpEVFV0aWxzLmdldEphdmFQcm9qZWN0KG1vZGVsLmdldFByb2plY3ROYW1lKCkpLCBtb2RlbAotICAgICAgICAgICAgICAgICAgICAuZ2V0RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSgpKTsKLSAgICAgICAgfSBlbHNlIGlmIChtb2RlbC5nZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0eXBlID1KRFRVdGlscy5maW5kVHlwZShKRFRVdGlscy5nZXRKYXZhUHJvamVjdChtb2RlbC5nZXRQcm9qZWN0TmFtZSgpKSwgbW9kZWwKLSAgICAgICAgICAgICAgICAgICAgLmdldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0eXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIHR5cGUgPSBKRFRVdGlscy5maW5kVHlwZShKRFRVdGlscy5nZXRKYXZhUHJvamVjdChtb2RlbC5nZXRQcm9qZWN0TmFtZSgpKSwgbW9kZWwKLSAgICAgICAgICAgICAgICAgICAgLmdldEphdmFTdGFydGluZ1BvaW50KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbW9kZWwuc2V0TWV0aG9kTWFwKENYRk1vZGVsVXRpbHMuZ2V0TWV0aG9kTWFwKHR5cGUsIG1vZGVsKSk7Ci0KLSAgICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBUcmVlVmlld2VyQ29sdW1uIGNyZWF0ZVdlYk1ldGhvZFZpZXdlckNvbHVtbihUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLSAgICAgICAgd2ViTWV0aG9kVmlld2VyQ29sdW1uID0gbmV3IFRyZWVWaWV3ZXJDb2x1bW4odHJlZVZpZXdlciwgU1dULkNFTlRFUik7Ci0gICAgICAgIFRyZWVDb2x1bW4gd2ViTWV0aG9kQ29sdW1uID0gd2ViTWV0aG9kVmlld2VyQ29sdW1uLmdldENvbHVtbigpOwotICAgICAgICB3ZWJNZXRob2RDb2x1bW4uc2V0VGV4dCgiQCIgKyBDWEZNb2RlbFV0aWxzLldFQl9NRVRIT0QpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHdlYk1ldGhvZENvbHVtbi5zZXRXaWR0aCgxMDApOwotICAgICAgICB3ZWJNZXRob2RDb2x1bW4uc2V0QWxpZ25tZW50KFNXVC5DRU5URVIpOwotICAgICAgICB3ZWJNZXRob2RDb2x1bW4uc2V0TW92ZWFibGUoZmFsc2UpOwotICAgICAgICB3ZWJNZXRob2RWaWV3ZXJDb2x1bW4uc2V0TGFiZWxQcm92aWRlcihuZXcgQW5ub3RhdGlvbkNvbHVtbkxhYmVsUHJvdmlkZXIobW9kZWwsCi0gICAgICAgICAgICAgICAgQ1hGTW9kZWxVdGlscy5XRUJfTUVUSE9ELCBnZXRUeXBlKCkpKTsKLSAgICAgICAgd2ViTWV0aG9kVmlld2VyQ29sdW1uLnNldEVkaXRpbmdTdXBwb3J0KG5ldyBBbm5vdGF0aW9uRWRpdGluZ1N1cHBvcnQodHJlZVZpZXdlciwKLSAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLldFQl9NRVRIT0QpKTsKLSAgICAgICAgcmV0dXJuIHdlYk1ldGhvZFZpZXdlckNvbHVtbjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFRyZWVWaWV3ZXJDb2x1bW4gY3JlYXRlV2ViUGFyYW1WaWV3ZXJDb2x1bW4oVHJlZVZpZXdlciB0cmVlVmlld2VyKSB7Ci0gICAgICAgIHdlYlBhcmFtVmlld2VyQ29sdW1uID0gbmV3IFRyZWVWaWV3ZXJDb2x1bW4odHJlZVZpZXdlciwgU1dULkNFTlRFUik7Ci0gICAgICAgIFRyZWVDb2x1bW4gd2ViUGFyYW1Db2x1bW4gPSB3ZWJQYXJhbVZpZXdlckNvbHVtbi5nZXRDb2x1bW4oKTsKLSAgICAgICAgd2ViUGFyYW1Db2x1bW4uc2V0VGV4dCgiQCIgKyBDWEZNb2RlbFV0aWxzLldFQl9QQVJBTSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgd2ViUGFyYW1Db2x1bW4uc2V0V2lkdGgoMTAwKTsKLSAgICAgICAgd2ViUGFyYW1Db2x1bW4uc2V0QWxpZ25tZW50KFNXVC5DRU5URVIpOwotICAgICAgICB3ZWJQYXJhbUNvbHVtbi5zZXRNb3ZlYWJsZShmYWxzZSk7Ci0gICAgICAgIHdlYlBhcmFtVmlld2VyQ29sdW1uLnNldExhYmVsUHJvdmlkZXIobmV3IEFubm90YXRpb25Db2x1bW5MYWJlbFByb3ZpZGVyKG1vZGVsLAotICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuV0VCX1BBUkFNLCBnZXRUeXBlKCkpKTsKLSAgICAgICAgd2ViUGFyYW1WaWV3ZXJDb2x1bW4uc2V0RWRpdGluZ1N1cHBvcnQobmV3IEFubm90YXRpb25FZGl0aW5nU3VwcG9ydCh0cmVlVmlld2VyLAotICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuV0VCX1BBUkFNKSk7Ci0gICAgICAgIHJldHVybiB3ZWJQYXJhbVZpZXdlckNvbHVtbjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFRyZWVWaWV3ZXJDb2x1bW4gY3JlYXRlUmVxdWVzdFdyYXBwZXJWaWV3ZXJDb2x1bW4oVHJlZVZpZXdlciB0cmVlVmlld2VyKSB7Ci0gICAgICAgIHJlcXVlc3RXcmFwcGVyVmlld2VyQ29sdW1uID0gbmV3IFRyZWVWaWV3ZXJDb2x1bW4odHJlZVZpZXdlciwgU1dULkNFTlRFUik7Ci0gICAgICAgIFRyZWVDb2x1bW4gY3JlYXRlUmVxdWVzdFdyYXBwZXJDb2x1bW4gPSByZXF1ZXN0V3JhcHBlclZpZXdlckNvbHVtbi5nZXRDb2x1bW4oKTsKLSAgICAgICAgY3JlYXRlUmVxdWVzdFdyYXBwZXJDb2x1bW4uc2V0VGV4dCgiQCIgKyBDWEZNb2RlbFV0aWxzLlJFUVVFU1RfV1JBUFBFUik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgY3JlYXRlUmVxdWVzdFdyYXBwZXJDb2x1bW4uc2V0V2lkdGgoMTAwKTsKLSAgICAgICAgY3JlYXRlUmVxdWVzdFdyYXBwZXJDb2x1bW4uc2V0TW92ZWFibGUoZmFsc2UpOwotICAgICAgICByZXF1ZXN0V3JhcHBlclZpZXdlckNvbHVtbi5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBbm5vdGF0aW9uQ29sdW1uTGFiZWxQcm92aWRlcihtb2RlbCwKLSAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLlJFUVVFU1RfV1JBUFBFUiwgZ2V0VHlwZSgpKSk7Ci0gICAgICAgIHJlcXVlc3RXcmFwcGVyVmlld2VyQ29sdW1uLnNldEVkaXRpbmdTdXBwb3J0KG5ldyBBbm5vdGF0aW9uRWRpdGluZ1N1cHBvcnQodHJlZVZpZXdlciwKLSAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLlJFUVVFU1RfV1JBUFBFUikpOwotICAgICAgICByZXR1cm4gcmVxdWVzdFdyYXBwZXJWaWV3ZXJDb2x1bW47Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBUcmVlVmlld2VyQ29sdW1uIGNyZWF0ZVJlc3BvbnNlV3JhcHBlclZpZXdlckNvbHVtbihUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLSAgICAgICAgcmVzcG9uY2VXcmFwcGVyVmlld2VyQ29sdW1uID0gbmV3IFRyZWVWaWV3ZXJDb2x1bW4odHJlZVZpZXdlciwgU1dULkNFTlRFUik7Ci0gICAgICAgIFRyZWVDb2x1bW4gcmVzcG9uY2VXcmFwcGVyQ29sdW1uID0gcmVzcG9uY2VXcmFwcGVyVmlld2VyQ29sdW1uLmdldENvbHVtbigpOwotICAgICAgICByZXNwb25jZVdyYXBwZXJDb2x1bW4uc2V0VGV4dCgiQCIgKyBDWEZNb2RlbFV0aWxzLlJFU1BPTlNFX1dSQVBQRVIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJlc3BvbmNlV3JhcHBlckNvbHVtbi5zZXRXaWR0aCgxMDApOwotICAgICAgICByZXNwb25jZVdyYXBwZXJDb2x1bW4uc2V0TW92ZWFibGUoZmFsc2UpOwotICAgICAgICByZXNwb25jZVdyYXBwZXJWaWV3ZXJDb2x1bW4uc2V0TGFiZWxQcm92aWRlcihuZXcgQW5ub3RhdGlvbkNvbHVtbkxhYmVsUHJvdmlkZXIobW9kZWwsCi0gICAgICAgICAgICAgICAgQ1hGTW9kZWxVdGlscy5SRVNQT05TRV9XUkFQUEVSLCBnZXRUeXBlKCkpKTsKLSAgICAgICAgcmVzcG9uY2VXcmFwcGVyVmlld2VyQ29sdW1uLnNldEVkaXRpbmdTdXBwb3J0KG5ldyBBbm5vdGF0aW9uRWRpdGluZ1N1cHBvcnQodHJlZVZpZXdlciwKLSAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLlJFU1BPTlNFX1dSQVBQRVIpKTsKLSAgICAgICAgcmV0dXJuIHJlc3BvbmNlV3JhcHBlclZpZXdlckNvbHVtbjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlTGFiZWxQcm92aWRlcnMoKSB7Ci0gICAgICAgIHdlYk1ldGhvZFZpZXdlckNvbHVtbi5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBbm5vdGF0aW9uQ29sdW1uTGFiZWxQcm92aWRlcihtb2RlbCwKLSAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLldFQl9NRVRIT0QsIGdldFR5cGUoKSkpOwotICAgICAgICB3ZWJQYXJhbVZpZXdlckNvbHVtbi5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBbm5vdGF0aW9uQ29sdW1uTGFiZWxQcm92aWRlcihtb2RlbCwKLSAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLldFQl9QQVJBTSwgZ2V0VHlwZSgpKSk7Ci0gICAgICAgIHJlcXVlc3RXcmFwcGVyVmlld2VyQ29sdW1uLnNldExhYmVsUHJvdmlkZXIobmV3IEFubm90YXRpb25Db2x1bW5MYWJlbFByb3ZpZGVyKG1vZGVsLAotICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuUkVRVUVTVF9XUkFQUEVSLCBnZXRUeXBlKCkpKTsKLSAgICAgICAgcmVzcG9uY2VXcmFwcGVyVmlld2VyQ29sdW1uLnNldExhYmVsUHJvdmlkZXIobmV3IEFubm90YXRpb25Db2x1bW5MYWJlbFByb3ZpZGVyKG1vZGVsLAotICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuUkVTUE9OU0VfV1JBUFBFUiwgZ2V0VHlwZSgpKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUFubm90YXRpb24oSVR5cGUgdHlwZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYW5ub3RhdGlvblByZXZpZXdWaWV3ZXIuc2V0UmVkcmF3KGZhbHNlKTsKLQotICAgICAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSB0eXBlLmdldENvbXBpbGF0aW9uVW5pdCgpOwotICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0KLSAgICAgICAgICAgIFRleHRGaWxlQ2hhbmdlIHRleHRGaWxlQ2hhbmdlID0gbmV3IFRleHRGaWxlQ2hhbmdlKCJBbm5vdGF0aW9uIENoYW5nZXMiLAotICAgICAgICAgICAgICAgICAgICAoSUZpbGUpY29tcGlsYXRpb25Vbml0LmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgTXVsdGlUZXh0RWRpdCBtdWx0aVRleHRFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLnNldEVkaXQobXVsdGlUZXh0RWRpdCk7Ci0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5zZXRLZWVwUHJldmlld0VkaXRzKHRydWUpOwotCi0gICAgICAgICAgICBDWEZNb2RlbFV0aWxzLmdldFdlYlNlcnZpY2VBbm5vdGF0aW9uQ2hhbmdlKHR5cGUsIG1vZGVsLCB0ZXh0RmlsZUNoYW5nZSk7Ci0KLSAgICAgICAgICAgIElNZXRob2RbXSB0eXBlTWV0aG9kcyA9IEpEVFV0aWxzLmdldFB1YmxpY01ldGhvZHModHlwZSk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVNZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSB0eXBlTWV0aG9kc1tpXTsKLSAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBCb29sZWFuPiBtZXRob2RBbm5vdGF0aW9uTWFwID0gbW9kZWwuZ2V0TWV0aG9kTWFwKCkuZ2V0KG1ldGhvZCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1ldGhvZEFubm90YXRpb25NYXAuZ2V0KENYRk1vZGVsVXRpbHMuV0VCX01FVEhPRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQ1hGTW9kZWxVdGlscy5nZXRXZWJNZXRob2RBbm5vdGF0aW9uQ2hhbmdlKHR5cGUsIG1ldGhvZCwgdGV4dEZpbGVDaGFuZ2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobWV0aG9kQW5ub3RhdGlvbk1hcC5nZXQoQ1hGTW9kZWxVdGlscy5SRVFVRVNUX1dSQVBQRVIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuZ2V0UmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uQ2hhbmdlKHR5cGUsIG1ldGhvZCwgdGV4dEZpbGVDaGFuZ2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobWV0aG9kQW5ub3RhdGlvbk1hcC5nZXQoQ1hGTW9kZWxVdGlscy5SRVNQT05TRV9XUkFQUEVSKSkgewotICAgICAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLmdldFJlc3BvbnNlV3JhcHBlckFubm90YXRpb25DaGFuZ2UodHlwZSwgbWV0aG9kLCB0ZXh0RmlsZUNoYW5nZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtZXRob2RBbm5vdGF0aW9uTWFwLmdldChDWEZNb2RlbFV0aWxzLldFQl9QQVJBTSkpIHsKLQkJCQkJTGlzdDxTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzID0gQW5ub3RhdGlvblV0aWxzLmdldFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb25zKG1ldGhvZCk7Ci0JCQkJCWZvciAoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIgOiBwYXJhbWV0ZXJzKSB7Ci0JCQkJCQlDWEZNb2RlbFV0aWxzLmdldFdlYlBhcmFtQW5ub3RhdGlvbkNoYW5nZSh0eXBlLCBtZXRob2QsCi0JCQkJCQkJCShJTG9jYWxWYXJpYWJsZSkgcGFyYW1ldGVyLnJlc29sdmVCaW5kaW5nKCkuZ2V0SmF2YUVsZW1lbnQoKSwgdGV4dEZpbGVDaGFuZ2UpOwotCQkJCQl9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDWEZNb2RlbFV0aWxzLmdldEltcG9ydHNDaGFuZ2UoY29tcGlsYXRpb25Vbml0LCBtb2RlbCwgdGV4dEZpbGVDaGFuZ2UsIGZhbHNlKTsKLSAgICAgICAgICAgIGFubm90YXRpb25QcmV2aWV3Vmlld2VyLmdldERvY3VtZW50KCkuc2V0KHRleHRGaWxlQ2hhbmdlLmdldFByZXZpZXdDb250ZW50KG1vbml0b3IpKTsKLQotICAgICAgICAgICAgYW5ub3RhdGlvblByZXZpZXdWaWV3ZXIuc2V0UmVkcmF3KHRydWUpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBDWEZDcmVhdGlvblVJUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFRyZWVFeGNlcHRpb24gbXRlKSB7Ci0gICAgICAgICAgICBDWEZDcmVhdGlvblVJUGx1Z2luLmxvZyhtdGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTb3VyY2VWaWV3ZXIgY3JlYXRlQW5ub3RhdGlvblByZXZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGVzKSB7Ci0gICAgICAgIEphdmFQbHVnaW4gamF2YVBsdWdpbiA9IEphdmFQbHVnaW4uZ2V0RGVmYXVsdCgpOwotICAgICAgICBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gamF2YVBsdWdpbi5nZXRDb21iaW5lZFByZWZlcmVuY2VTdG9yZSgpOwotICAgICAgICBKYXZhVGV4dFRvb2xzIGphdmFUZXh0VG9vbHMgPSBqYXZhUGx1Z2luLmdldEphdmFUZXh0VG9vbHMoKTsKLSAgICAgICAgYW5ub3RhdGlvblByZXZpZXdWaWV3ZXIgPSBuZXcgSmF2YVNvdXJjZVZpZXdlcihwYXJlbnQsIG51bGwsIG51bGwsIHRydWUsIHN0eWxlcywgc3RvcmUpOwotICAgICAgICBJQ29sb3JNYW5hZ2VyIGNvbG9yTWFuYWdlciA9IGphdmFUZXh0VG9vbHMuZ2V0Q29sb3JNYW5hZ2VyKCk7Ci0gICAgICAgIFNpbXBsZUphdmFTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBuZXcgU2ltcGxlSmF2YVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oCi0gICAgICAgICAgICAgICAgY29sb3JNYW5hZ2VyLCBzdG9yZSwgbnVsbCwgSUphdmFQYXJ0aXRpb25zLkpBVkFfUEFSVElUSU9OSU5HLCB0cnVlKTsKLQotICAgICAgICBhbm5vdGF0aW9uUHJldmlld1ZpZXdlci5jb25maWd1cmUoY29uZmlndXJhdGlvbik7Ci0KLSAgICAgICAgRm9udCBmb250ID0gSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9URVhUX0ZPTlQpOwotICAgICAgICBhbm5vdGF0aW9uUHJldmlld1ZpZXdlci5nZXRUZXh0V2lkZ2V0KCkuc2V0Rm9udChmb250KTsKLSAgICAgICAgYW5ub3RhdGlvblByZXZpZXdWaWV3ZXIuc2V0RWRpdGFibGUoZmFsc2UpOwotCi0KLSAgICAgICAgU3RyaW5nIHNvdXJjZSA9IGdldFNvdXJjZUZyb21UeXBlKGdldFR5cGUoKSk7Ci0gICAgICAgIElEb2N1bWVudCBkb2N1bWVudCA9IG5ldyBEb2N1bWVudChzb3VyY2UpOwotCi0gICAgICAgIEphdmFQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmFUZXh0VG9vbHMoKS5zZXR1cEphdmFEb2N1bWVudFBhcnRpdGlvbmVyKGRvY3VtZW50LAotICAgICAgICAgICAgICAgIElKYXZhUGFydGl0aW9ucy5KQVZBX1BBUlRJVElPTklORyk7Ci0gICAgICAgIGFubm90YXRpb25QcmV2aWV3Vmlld2VyLnNldERvY3VtZW50KGRvY3VtZW50KTsKLQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvblByZXZpZXdWaWV3ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTb3VyY2VGcm9tVHlwZShJVHlwZSB0eXBlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gdHlwZS5nZXRDb21waWxhdGlvblVuaXQoKS5nZXRCdWZmZXIoKS5nZXRDb250ZW50cygpOwotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBDWEZDcmVhdGlvblVJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIEFubm90YXRpb25FZGl0aW5nU3VwcG9ydCBleHRlbmRzIEVkaXRpbmdTdXBwb3J0IHsKLSAgICAgICAgcHJpdmF0ZSBDaGVja2JveENlbGxFZGl0b3IgY2hlY2tib3hDZWxsRWRpdG9yOwotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGFubm90YXRpb25LZXk7Ci0KLSAgICAgICAgcHVibGljIEFubm90YXRpb25FZGl0aW5nU3VwcG9ydChUcmVlVmlld2VyIHZpZXdlciwgU3RyaW5nIGFubm90YXRpb25LZXkpIHsKLSAgICAgICAgICAgIHN1cGVyKHZpZXdlcik7Ci0gICAgICAgICAgICB0aGlzLmFubm90YXRpb25LZXkgPSBhbm5vdGF0aW9uS2V5OwotICAgICAgICAgICAgY2hlY2tib3hDZWxsRWRpdG9yID0gbmV3IENoZWNrYm94Q2VsbEVkaXRvcih2aWV3ZXIuZ2V0VHJlZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjYW5FZGl0KE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElNZXRob2QpIHsKLSAgICAgICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IChJTWV0aG9kKSBlbGVtZW50OwotICAgICAgICAgICAgICAgIHJldHVybiAhQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQodHlwZS5maW5kTWV0aG9kcyhtZXRob2QpWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbktleSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIENlbGxFZGl0b3IgZ2V0Q2VsbEVkaXRvcihPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgcmV0dXJuIGNoZWNrYm94Q2VsbEVkaXRvcjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICBCb29sZWFuIGFubm90YXRlID0gbW9kZWwuZ2V0TWV0aG9kTWFwKCkuZ2V0KGVsZW1lbnQpLmdldChhbm5vdGF0aW9uS2V5KTsKLSAgICAgICAgICAgIHJldHVybiBhbm5vdGF0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShPYmplY3QgZWxlbWVudCwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElNZXRob2QpIHsKLSAgICAgICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IChJTWV0aG9kKSBlbGVtZW50OwotICAgICAgICAgICAgICAgIEJvb2xlYW4gYW5ub3RhdGUgPSAoQm9vbGVhbikgdmFsdWU7Ci0gICAgICAgICAgICAgICAgTWFwPFN0cmluZywgQm9vbGVhbj4gYW5ub3RhdGlvbk1hcCA9IG1vZGVsLmdldE1ldGhvZE1hcCgpLmdldChlbGVtZW50KTsKLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9uTWFwLnB1dChhbm5vdGF0aW9uS2V5LCBhbm5vdGF0ZSk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlQW5ub3RhdGlvbihtZXRob2QuZ2V0RGVjbGFyaW5nVHlwZSgpKTsKLSAgICAgICAgICAgICAgICBnZXRWaWV3ZXIoKS5yZWZyZXNoKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvSkFYV1NBbm5vdGF0ZVdpZGdldEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL0pBWFdTQW5ub3RhdGVXaWRnZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NTE1NzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvSkFYV1NBbm5vdGF0ZVdpZGdldEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5KYXZhMldTRGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS5DWEZDcmVhdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLklOYW1lZFdpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLklOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgSkFYV1NBbm5vdGF0ZVdpZGdldEZhY3RvcnkgaW1wbGVtZW50cyBJTmFtZWRXaWRnZXRDb250cmlidXRvckZhY3RvcnkgewotICAgIHByaXZhdGUgU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3IgamF4d3NBbm5vdGF0ZVdpZGdldENvbnRyaWJ1dG9yOwotCi0gICAgcHJpdmF0ZSBKQVhXU0Fubm90YXRlSmF2YVdpZGdldCBqYXh3c0Fubm90YXRlSmF2YVdpZGdldCA9IG5ldyBKQVhXU0Fubm90YXRlSmF2YVdpZGdldCgpOwotCi0gICAgcHVibGljIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIGdldEZpcnN0TmFtZWRXaWRnZXQoKSB7Ci0gICAgICAgIGlmIChqYXh3c0Fubm90YXRlV2lkZ2V0Q29udHJpYnV0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgaW5pdCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBqYXh3c0Fubm90YXRlV2lkZ2V0Q29udHJpYnV0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIGdldE5leHROYW1lZFdpZGdldChJTmFtZWRXaWRnZXRDb250cmlidXRvciB3aWRnZXRDb250cmlidXRvcikgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkgewotICAgICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhKYXZhMldTRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsCi0gICAgICAgICAgICAgICAgIkphdmEyV1NEYXRhTW9kZWwiLCBKQVhXU0Fubm90YXRlV2lkZ2V0RmFjdG9yeS5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXZhMldTRGF0YU1vZGVsKEphdmEyV1NEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgamF4d3NBbm5vdGF0ZUphdmFXaWRnZXQuc2V0SmF2YTJXU0RhdGFNb2RlbChtb2RlbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0gICAgICAgIGpheHdzQW5ub3RhdGVXaWRnZXRDb250cmlidXRvciA9IG5ldyBTaW1wbGVXaWRnZXRDb250cmlidXRvcigpOwotICAgICAgICBDWEZDb250ZXh0IGNvbnRleHQgPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKYXZhMldTQ29udGV4dCgpOwotICAgICAgICBTdHJpbmcgdGl0bGUgPSBDWEZDcmVhdGlvblVJTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJTWVzc2FnZXMuSkFWQTJXU19KQVhXU19BTk5PVEFURV9QQUdFX1RJVExFLAotICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXtjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVHlwZSgpLCBjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVmVyc2lvbigpfSk7Ci0gICAgICAgIGpheHdzQW5ub3RhdGVXaWRnZXRDb250cmlidXRvci5zZXRUaXRsZSh0aXRsZSk7Ci0gICAgICAgIGpheHdzQW5ub3RhdGVXaWRnZXRDb250cmlidXRvcgotICAgICAgICAuc2V0RGVzY3JpcHRpb24oQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLkpBVkEyV1NfSkFYV1NfQU5OT1RBVEVfUEFHRV9ERVNDUklQVElPTik7Ci0gICAgICAgIGpheHdzQW5ub3RhdGVXaWRnZXRDb250cmlidXRvci5zZXRGYWN0b3J5KG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBqYXh3c0Fubm90YXRlSmF2YVdpZGdldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvSmF2YTJXU0NsYXNzQ29uZmlnV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9KYXZhMldTQ2xhc3NDb25maWdXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE2NTI3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9KYXZhMldTQ2xhc3NDb25maWdXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uRUZTOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5JRmlsZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkuQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkuQ1hGQ3JlYXRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHMuSmF2YTJXU1dpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5FbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBKYXZhMldTQ2xhc3NDb25maWdXaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IgewotICAgIHByaXZhdGUgSVN0YXR1cyBKQVZBX1RZUEVfTkFNRV9TVEFUVVMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgIHByaXZhdGUgSVN0YXR1cyBKQVZBX1RZUEVfRVhJU1RTX1NUQVRVUyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgcHJpdmF0ZSBJU3RhdHVzIFNFSV9TRUxFQ1RJT05fU1RBVFVTID0gU3RhdHVzLk9LX1NUQVRVUzsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIm5hbWUiOwotCi0gICAgcHJpdmF0ZSBpbnQgTlVNQkVSX09GX1BVQkxJQ19NRVRIT0RTOwotICAgIHByaXZhdGUgaW50IE5VTUJFUl9PRl9DSEVDS0VEX01FVEhPRFM7Ci0gICAgcHJpdmF0ZSBJTWV0aG9kW10gcHVibGljTWV0aG9kczsKLQotICAgIHByaXZhdGUgQnV0dG9uIHVzZVNFSUJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBzZWxlY3RTRUlCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gYnJvd3NlU0VJQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIGV4dHJhY3RTRUlCdXR0b247Ci0KLSAgICBwcml2YXRlIENvbWJvIHNlbGVjdFNFSUNvbWJvOwotICAgIHByaXZhdGUgVGV4dCBzZWlJbnRlcmZhY2VOYW1lVGV4dDsKLQotICAgIHByaXZhdGUgQ2hlY2tib3hUYWJsZVZpZXdlciBzZWlNZW1iZXJzVG9FeHRyYWN0VGFibGVWaWV3ZXI7Ci0gICAgcHJpdmF0ZSBUYWJsZSBzZWlNZW1iZXJzVG9FeHRyYWN0VGFibGU7Ci0gICAgcHJpdmF0ZSBCdXR0b24gc2VsZWN0QWxsQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIGRlc2VsZWN0QWxsQnV0dG9uOwotCi0gICAgcHJpdmF0ZSBKYXZhMldTRGF0YU1vZGVsIG1vZGVsOwotICAgIHByaXZhdGUgSVR5cGUgc3RhcnRpbmdQb2ludFR5cGU7Ci0KLSAgICBwdWJsaWMgSmF2YTJXU0NsYXNzQ29uZmlnV2lkZ2V0KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEphdmEyV1NEYXRhTW9kZWwoSmF2YTJXU0RhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SmF2YVN0YXJ0aW5nUG9pbnRUeXBlKElUeXBlIHN0YXJ0aW5nUG9pbnRUeXBlKSB7Ci0gICAgICAgIHRoaXMuc3RhcnRpbmdQb2ludFR5cGUgPSBzdGFydGluZ1BvaW50VHlwZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbnRlcm5hbGl6ZSgpIHsKLSAgICAgICAgYm9vbGVhbiB1c2VTRUkgPSBtb2RlbC5pc1VzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOwotICAgICAgICB1c2VTRUlCdXR0b24uc2V0U2VsZWN0aW9uKHVzZVNFSSk7Ci0gICAgICAgIHNlbGVjdFNFSUJ1dHRvbi5zZXRTZWxlY3Rpb24odXNlU0VJKTsKLSAgICAgICAgc2VsZWN0U0VJQnV0dG9uLnNldEVuYWJsZWQodXNlU0VJKTsKLSAgICAgICAgaWYgKCF1c2VTRUkpIHsKLSAgICAgICAgICAgIHNlbGVjdFNFSUNvbWJvLmRlc2VsZWN0QWxsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZW5hYmxlU2VsZWN0U0VJQ29udHJvbHModXNlU0VJKTsKLSAgICAgICAgZXh0cmFjdFNFSUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICBleHRyYWN0U0VJQnV0dG9uLnNldEVuYWJsZWQodXNlU0VJKTsKLSAgICAgICAgZW5hYmxlRXh0cmFjdFNFSUNvbnRyb2xzKHVzZVNFSSk7Ci0gICAgICAgIHNlaUludGVyZmFjZU5hbWVUZXh0LnNldFRleHQoIiIpOwotICAgICAgICBzZWlNZW1iZXJzVG9FeHRyYWN0VGFibGVWaWV3ZXIuc2V0QWxsQ2hlY2tlZChmYWxzZSk7Ci0gICAgICAgIE5VTUJFUl9PRl9DSEVDS0VEX01FVEhPRFMgPSAwOwotICAgICAgICB2YWxpZGF0ZVNFSVNlbGVjdGlvbigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyKSB7Ci0gICAgICAgIGZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICB1c2VTRUlCdXR0b24gPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVVc2VTRUlCdXR0b24oY29tcG9zaXRlKTsKLSAgICAgICAgdXNlU0VJQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiB1c2VTRUkgPSB1c2VTRUlCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0VXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKHVzZVNFSSk7Ci0gICAgICAgICAgICAgICAgc2VsZWN0U0VJQnV0dG9uLnNldEVuYWJsZWQodXNlU0VJKTsKLSAgICAgICAgICAgICAgICBleHRyYWN0U0VJQnV0dG9uLnNldEVuYWJsZWQodXNlU0VJKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVTRUlTZWxlY3Rpb25TdGF0dXMoKTsKLSAgICAgICAgICAgICAgICBzdGF0dXNMaXN0ZW5lci5oYW5kbGVFdmVudChudWxsKTsKLSAgICAgICAgICAgICAgICBpZiAoIXVzZVNFSSkgewotICAgICAgICAgICAgICAgICAgICBtb2RlbC5zZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKCIiKTsKLQotICAgICAgICAgICAgICAgICAgICBzZWxlY3RTRUlCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgZW5hYmxlU2VsZWN0U0VJQ29udHJvbHMoZmFsc2UpOwotCi0gICAgICAgICAgICAgICAgICAgIGV4dHJhY3RTRUlCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgZW5hYmxlRXh0cmFjdFNFSUNvbnRyb2xzKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICB1c2VTRUlCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgTGFiZWwgcGFkZGluZ0xhYmVsID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlUGFkZGluZ0xhYmVsKGNvbXBvc2l0ZSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgcGFkZGluZ0xhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIHNlbGVjdFNFSUJ1dHRvbiA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZVNlbGVjdFNFSUJ1dHRvbihjb21wb3NpdGUpOwotICAgICAgICBzZWxlY3RTRUlCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBlbmFibGVTZWxlY3RTRUlDb250cm9scyhzZWxlY3RTRUlCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgICAgIGVuYWJsZUV4dHJhY3RTRUlDb250cm9scyghc2VsZWN0U0VJQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgICAgICBpZiAoc2VsZWN0U0VJQnV0dG9uLmdldFNlbGVjdGlvbigpICYmIHNlbGVjdFNFSUNvbWJvLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVNFSVNlbGVjdGlvblN0YXR1cygpOwotICAgICAgICAgICAgICAgICAgICBzdGF0dXNMaXN0ZW5lci5oYW5kbGVFdmVudChudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHNlbGVjdFNFSUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICBzZWxlY3RTRUlCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgc2VsZWN0U0VJQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIHNlbGVjdFNFSUNvbWJvID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlU2VsZWN0U0VJQ29tYm8oY29tcG9zaXRlLCBtb2RlbCwgc3RhcnRpbmdQb2ludFR5cGUpOwotICAgICAgICBzZWxlY3RTRUlDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVTRUlTZWxlY3Rpb25TdGF0dXMoKTsKLSAgICAgICAgICAgICAgICBzdGF0dXNMaXN0ZW5lci5oYW5kbGVFdmVudChudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgc2VsZWN0U0VJQ29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlU0VJU2VsZWN0aW9uU3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzTGlzdGVuZXIuaGFuZGxlRXZlbnQobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLSAgICAgICAgc2VsZWN0U0VJQ29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgYnJvd3NlU0VJQnV0dG9uID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlQnJvd3NlQnV0dG9uKGNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0gICAgICAgIGJyb3dzZVNFSUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBicm93c2VTRUlCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nIHNlbGVjdGlvbkRpYWxvZyA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZUVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nKAotICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlLmdldFNoZWxsKCksIENYRkNyZWF0aW9uVUlNZXNzYWdlcy5KQVZBMldTX1NFTEVDVF9TRUlfRElBTE9HX1RJVExFLAotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLkpBVkEyV1NfU0VMRUNUX1NFSV9ESUFMT0dfREVTQ1JJUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBKRFRVdGlscy5nZXRKYXZhUHJvamVjdChtb2RlbC5nZXRQcm9qZWN0TmFtZSgpKSwgSUphdmFTZWFyY2hDb25zdGFudHMuSU5URVJGQUNFKTsKLQotICAgICAgICAgICAgICAgIGludCByZXR1cm5Db2RlID0gc2VsZWN0aW9uRGlhbG9nLm9wZW4oKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0dXJuQ29kZSA9PSBXaW5kb3cuT0spIHsKLSAgICAgICAgICAgICAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBzZWxlY3RlZENvbXBpbGF0aW9uVW5pdCA9IChJQ29tcGlsYXRpb25Vbml0KSBzZWxlY3Rpb25EaWFsb2cuZ2V0Rmlyc3RSZXN1bHQoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGVkSW50ZXJmYWNlID0gc2VsZWN0ZWRDb21waWxhdGlvblVuaXQuZmluZFByaW1hcnlUeXBlKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBzZWlzID0gQXJyYXlzLmFzTGlzdChzZWxlY3RTRUlDb21iby5nZXRJdGVtcygpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWlzLmNvbnRhaW5zKHNlbGVjdGVkSW50ZXJmYWNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0U0VJQ29tYm8uYWRkKHNlbGVjdGVkSW50ZXJmYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZWxlY3RTRUlDb21iby5zZXRUZXh0KHNlbGVjdGVkSW50ZXJmYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHBhZGRpbmdMYWJlbCA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZVBhZGRpbmdMYWJlbChjb21wb3NpdGUpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIHBhZGRpbmdMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBleHRyYWN0U0VJQnV0dG9uID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlRXh0cmFjdFNFSUJ1dHRvbihjb21wb3NpdGUpOwotICAgICAgICBleHRyYWN0U0VJQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBleHRyYWN0ID0gZXh0cmFjdFNFSUJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRFeHRyYWN0SW50ZXJmYWNlKGV4dHJhY3QpOwotICAgICAgICAgICAgICAgIGVuYWJsZUV4dHJhY3RTRUlDb250cm9scyhleHRyYWN0KTsKLSAgICAgICAgICAgICAgICBlbmFibGVTZWxlY3RTRUlDb250cm9scyghZXh0cmFjdCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlU0VJU2VsZWN0aW9uU3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzTGlzdGVuZXIuaGFuZGxlRXZlbnQobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBleHRyYWN0U0VJQnV0dG9uLnNldFNlbGVjdGlvbihtb2RlbC5pc0V4dHJhY3RJbnRlcmZhY2UoKSk7Ci0gICAgICAgIGV4dHJhY3RTRUlCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBleHRyYWN0U0VJQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIHNlaUludGVyZmFjZU5hbWVUZXh0ID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlU0VJSW50ZXJmYWNlTmFtZVRleHQoY29tcG9zaXRlKTsKLSAgICAgICAgc2VpSW50ZXJmYWNlTmFtZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGV4dHJhY3RTRUlCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGludGVyZmFjZU5hbWUgPSBzZWlJbnRlcmZhY2VOYW1lVGV4dC5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWlOYW1lID0gaW50ZXJmYWNlTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gc3RhcnRpbmdQb2ludFR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VpTmFtZSA9IHBhY2thZ2VOYW1lICsgIi4iICsgaW50ZXJmYWNlTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtb2RlbC5zZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKHNlaU5hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb21waWxhdGlvblVuaXROYW1lID0gaW50ZXJmYWNlTmFtZSArICIuamF2YSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgSkFWQV9UWVBFX05BTUVfU1RBVFVTID0gSkRUVXRpbHMudmFsaWRhdGVKYXZhVHlwZU5hbWUobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSwgaW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIEpBVkFfVFlQRV9FWElTVFNfU1RBVFVTID0gY2hlY2tUeXBlRXhpc3RzKHN0YXJ0aW5nUG9pbnRUeXBlLCBjb21waWxhdGlvblVuaXROYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlU0VJU2VsZWN0aW9uU3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotICAgICAgICBzZWlJbnRlcmZhY2VOYW1lVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVQYWRkaW5nTGFiZWwoY29tcG9zaXRlKTsKLSAgICAgICAgSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlUGFkZGluZ0xhYmVsKGNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlTWVtZWJlcnNUb0V4dHJhY3RMYWJlbChjb21wb3NpdGUpOwotCi0gICAgICAgIEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZVBhZGRpbmdMYWJlbChjb21wb3NpdGUpOwotICAgICAgICBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVQYWRkaW5nTGFiZWwoY29tcG9zaXRlKTsKLQotICAgICAgICBzZWlNZW1iZXJzVG9FeHRyYWN0VGFibGVWaWV3ZXIgPSBKYXZhMldTV2lkZ2V0RmFjdG9yeQotICAgICAgICAuY3JlYXRlU0VJTWVtYmVyc1RvRXh0cmFjdFRhYmxlVmlld2VyKGNvbXBvc2l0ZSk7Ci0gICAgICAgIHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZSA9IHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZVZpZXdlci5nZXRUYWJsZSgpOwotICAgICAgICBzZWlNZW1iZXJzVG9FeHRyYWN0VGFibGVWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0W10gY2hlY2tlZE1ldGhvZHMgPSBzZWlNZW1iZXJzVG9FeHRyYWN0VGFibGVWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0KLSAgICAgICAgICAgICAgICBNYXA8SU1ldGhvZCwgTWFwPFN0cmluZywgQm9vbGVhbj4+IG1ldGhvZE1hcCA9IG5ldyBIYXNoTWFwPElNZXRob2QsIE1hcDxTdHJpbmcsIEJvb2xlYW4+PigpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hlY2tlZE1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0aG9kTWFwLnB1dCgoSU1ldGhvZCljaGVja2VkTWV0aG9kc1tpXSwgbW9kZWwuZ2V0QW5ub3RhdGlvbk1hcCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0TWV0aG9kTWFwKG1ldGhvZE1hcCk7Ci0KLSAgICAgICAgICAgICAgICBOVU1CRVJfT0ZfQ0hFQ0tFRF9NRVRIT0RTID0gY2hlY2tlZE1ldGhvZHMubGVuZ3RoOwotCi0gICAgICAgICAgICAgICAgaWYgKE5VTUJFUl9PRl9DSEVDS0VEX01FVEhPRFMgPCBOVU1CRVJfT0ZfUFVCTElDX01FVEhPRFMpIHsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChOVU1CRVJfT0ZfQ0hFQ0tFRF9NRVRIT0RTID09IE5VTUJFUl9PRl9QVUJMSUNfTUVUSE9EUykgewotICAgICAgICAgICAgICAgICAgICBzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKE5VTUJFUl9PRl9DSEVDS0VEX01FVEhPRFMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZGVzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHVwZGF0ZVNFSVNlbGVjdGlvblN0YXR1cygpOwotICAgICAgICAgICAgICAgIHN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgZ3JpZERhdGEudmVydGljYWxTcGFuID0gMzsKLSAgICAgICAgZ3JpZERhdGEuaGVpZ2h0SGludCA9IDEwMDsKLSAgICAgICAgc2VpTWVtYmVyc1RvRXh0cmFjdFRhYmxlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIHNlbGVjdEFsbEJ1dHRvbiA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZVNlbGVjdEFsbEJ1dHRvbihjb21wb3NpdGUpOwotICAgICAgICBzZWxlY3RBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBzZWlNZW1iZXJzVG9FeHRyYWN0VGFibGVWaWV3ZXIuc2V0QWxsQ2hlY2tlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgZGVzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQotICAgICAgICAgICAgICAgIFRhYmxlSXRlbVtdIGNoZWNrZWRNZXRob2RzID0gc2VpTWVtYmVyc1RvRXh0cmFjdFRhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbXMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoZWNrZWRNZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRhYmxlSXRlbSB0YWJsZUl0ZW0gPSBjaGVja2VkTWV0aG9kc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uRXZlbnQgc2VsZWN0aW9uRXZlbnQgPSBldmVudDsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uRXZlbnQuZGV0YWlsID0gU1dULkNIRUNLOwotICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25FdmVudC5pdGVtID0gdGFibGVJdGVtOwotICAgICAgICAgICAgICAgICAgICBzZWlNZW1iZXJzVG9FeHRyYWN0VGFibGVWaWV3ZXIuaGFuZGxlU2VsZWN0KHNlbGVjdGlvbkV2ZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdXBkYXRlU0VJU2VsZWN0aW9uU3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzTGlzdGVuZXIuaGFuZGxlRXZlbnQobnVsbCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgc2VsZWN0QWxsQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZVBhZGRpbmdMYWJlbChjb21wb3NpdGUpOwotCi0gICAgICAgIGRlc2VsZWN0QWxsQnV0dG9uID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlRGVzZWxlY3RBbGxCdXR0b24oY29tcG9zaXRlKTsKLSAgICAgICAgZGVzZWxlY3RBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBzZWlNZW1iZXJzVG9FeHRyYWN0VGFibGVWaWV3ZXIuc2V0QWxsQ2hlY2tlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgZGVzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLSAgICAgICAgICAgICAgICBUYWJsZUl0ZW1bXSBjaGVja2VkTWV0aG9kcyA9IHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1zKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGVja2VkTWV0aG9kcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBUYWJsZUl0ZW0gdGFibGVJdGVtID0gY2hlY2tlZE1ldGhvZHNbaV07Ci0gICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkV2ZW50IHNlbGVjdGlvbkV2ZW50ID0gZXZlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkV2ZW50LmRldGFpbCA9IFNXVC5DSEVDSzsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uRXZlbnQuaXRlbSA9IHRhYmxlSXRlbTsKLSAgICAgICAgICAgICAgICAgICAgc2VpTWVtYmVyc1RvRXh0cmFjdFRhYmxlVmlld2VyLmhhbmRsZVNlbGVjdChzZWxlY3Rpb25FdmVudCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdXBkYXRlU0VJU2VsZWN0aW9uU3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzTGlzdGVuZXIuaGFuZGxlRXZlbnQobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGRlc2VsZWN0QWxsQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIHB1YmxpY01ldGhvZHMgPSBKRFRVdGlscy5nZXRQdWJsaWNNZXRob2RzKHN0YXJ0aW5nUG9pbnRUeXBlKTsKLSAgICAgICAgTlVNQkVSX09GX1BVQkxJQ19NRVRIT0RTID0gcHVibGljTWV0aG9kcy5sZW5ndGg7Ci0gICAgICAgIHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZVZpZXdlci5zZXRJbnB1dChwdWJsaWNNZXRob2RzKTsKLQotICAgICAgICBlbmFibGVTZWxlY3RTRUlDb250cm9scyhmYWxzZSk7Ci0gICAgICAgIGVuYWJsZUV4dHJhY3RTRUlDb250cm9scyhmYWxzZSk7Ci0gICAgICAgIHNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgZGVzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLSAgICAgICAgaWYgKG1vZGVsLmlzVXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkpIHsKLSAgICAgICAgICAgIGlmIChzZWxlY3RTRUlDb21iby5pbmRleE9mKG1vZGVsLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoKSkgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBzZWxlY3RTRUlDb21iby5hZGQobW9kZWwuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlbGVjdFNFSUNvbWJvLnNldFRleHQobW9kZWwuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSgpKTsKLSAgICAgICAgICAgIG1vZGVsLnNldEZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUobW9kZWwuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVNFSVNlbGVjdGlvbigpIHsKLSAgICAgICAgaWYgKCF1c2VTRUlCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLSAgICAgICAgICAgIFNFSV9TRUxFQ1RJT05fU1RBVFVTID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBJVHlwZSBzZWlUeXBlID0gSkRUVXRpbHMuZmluZFR5cGUobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSwgc2VsZWN0U0VJQ29tYm8uZ2V0VGV4dCgpKTsKLSAgICAgICAgaWYgKHNlaVR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBJTWV0aG9kW10gc2VpTWV0aG9kcyA9IHNlaVR5cGUuZ2V0TWV0aG9kcygpOwotICAgICAgICAgICAgICAgIGZvciAoSU1ldGhvZCBzZWlNZXRob2QgOiBzZWlNZXRob2RzKSB7Ci0gICAgICAgICAgICAgICAgICAgIElNZXRob2RbXSBpbXBsTWV0aG9kcyA9IHN0YXJ0aW5nUG9pbnRUeXBlLmZpbmRNZXRob2RzKHNlaU1ldGhvZCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbXBsTWV0aG9kcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTRUlfU0VMRUNUSU9OX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25VSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uVUlNZXNzYWdlcy5iaW5kKENYRkNyZWF0aW9uVUlNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTVVTVF9JTVBMRU1FTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SW1wbGVtZW50c01lc3NhZ2Uoc2VpVHlwZSwgc2VpTWV0aG9kKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTRUlfU0VMRUNUSU9OX1NUQVRVUyA9IHZhbGlkYXRlU0VJQWRkaXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKHNlbGVjdFNFSUNvbWJvLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZShzZWxlY3RTRUlDb21iby5nZXRUZXh0KCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTRUlfU0VMRUNUSU9OX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25VSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uVUlNZXNzYWdlcy5iaW5kKENYRkNyZWF0aW9uVUlNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9UX0ZPVU5ELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdFNFSUNvbWJvLmdldFRleHQoKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0SW1wbGVtZW50c01lc3NhZ2UoSVR5cGUgc2VpVHlwZSwgSU1ldGhvZCBzZWlNZXRob2QpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBtZXNzYWdlID0gbmV3IFN0cmluZ0J1aWxkZXIoc2VpVHlwZS5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgbWVzc2FnZS5hcHBlbmQoIi4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBtZXNzYWdlLmFwcGVuZChzZWlNZXRob2QuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgIG1lc3NhZ2UuYXBwZW5kKCIoIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgU3RyaW5nW10gcGFyYW1ldGVyVHlwZXMgPSBzZWlNZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJUeXBlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIHBhcmFtZXRlclR5cGUgPSBTaWduYXR1cmUudG9TdHJpbmcocGFyYW1ldGVyVHlwZXNbaV0pOwotICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQocGFyYW1ldGVyVHlwZSk7Ci0gICAgICAgICAgICBpZiAoaSA8IHBhcmFtZXRlclR5cGVzLmxlbmd0aCAtIDEpIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1lc3NhZ2UuYXBwZW5kKCIpIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2UudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIElTdGF0dXMgdmFsaWRhdGVTRUlBZGRpdGlvbigpIHsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSUFubm90YXRpb24gd2ViU2VydmljZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKFdlYlNlcnZpY2UuY2xhc3MsIHN0YXJ0aW5nUG9pbnRUeXBlKTsKLSAgICAgICAgICAgIGlmICh3ZWJTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgbmFtZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uVmFsdWUod2ViU2VydmljZSwgTkFNRSk7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNyZWF0aW9uVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uVUlNZXNzYWdlcy5KQVZBMldTX1NFTEVDVF9TRUlfV0VCU0VSVklDRV9OQU1FX0FUVFJJQlVURV9QUkVTRU5UKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmFibGVTZWxlY3RTRUlDb250cm9scyhib29sZWFuIGVuYWJsZSkgewotICAgICAgICBzZWxlY3RTRUlDb21iby5zZXRFbmFibGVkKGVuYWJsZSk7Ci0gICAgICAgIGJyb3dzZVNFSUJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5hYmxlRXh0cmFjdFNFSUNvbnRyb2xzKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIHNlaUludGVyZmFjZU5hbWVUZXh0LnNldEVuYWJsZWQoZW5hYmxlKTsKLSAgICAgICAgc2VpTWVtYmVyc1RvRXh0cmFjdFRhYmxlLnNldEVuYWJsZWQoZW5hYmxlKTsKLSAgICAgICAgaWYgKGVuYWJsZSAmJiBOVU1CRVJfT0ZfQ0hFQ0tFRF9NRVRIT0RTIDwgTlVNQkVSX09GX1BVQkxJQ19NRVRIT0RTKSB7Ci0gICAgICAgICAgICBzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlbmFibGUgJiYgTlVNQkVSX09GX0NIRUNLRURfTUVUSE9EUyA+IDApIHsKLSAgICAgICAgICAgIGRlc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWVuYWJsZSkgewotICAgICAgICAgICAgc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgZGVzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0gICAgICAgIHJldHVybiBmaW5kTW9zdFNldmVyZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTRUlTZWxlY3Rpb25TdGF0dXMoKSB7Ci0gICAgICAgIGlmICh1c2VTRUlCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLSAgICAgICAgICAgIGlmICghc2VsZWN0U0VJQnV0dG9uLmdldFNlbGVjdGlvbigpICYmICFleHRyYWN0U0VJQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0gICAgICAgICAgICAgICAgU0VJX1NFTEVDVElPTl9TVEFUVVMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNyZWF0aW9uVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLkpBVkEyV1NfU0VMRUNUX1NFSV9PUFRJT04pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc2VsZWN0U0VJQnV0dG9uLmdldFNlbGVjdGlvbigpICYmIHNlbGVjdFNFSUNvbWJvLmdldFRleHQoKS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgU0VJX1NFTEVDVElPTl9TVEFUVVMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNyZWF0aW9uVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLkpBVkEyV1NfU0VMRUNUX1NFSV9NRVNTQUdFKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0U0VJQnV0dG9uLmdldFNlbGVjdGlvbigpICYmIHNlbGVjdFNFSUNvbWJvLmdldFRleHQoKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZVNFSVNlbGVjdGlvbigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZXh0cmFjdFNFSUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSAmJiBzZWlJbnRlcmZhY2VOYW1lVGV4dC5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBTRUlfU0VMRUNUSU9OX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25VSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJTWVzc2FnZXMuSkFWQTJXU19FTlRFUl9TRUlfTkFNRSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGV4dHJhY3RTRUlCdXR0b24uZ2V0U2VsZWN0aW9uKCkgJiYgTlVNQkVSX09GX1BVQkxJQ19NRVRIT0RTID4gMAotICAgICAgICAgICAgICAgICAgICAmJiBOVU1CRVJfT0ZfQ0hFQ0tFRF9NRVRIT0RTID09IDApIHsKLSAgICAgICAgICAgICAgICBTRUlfU0VMRUNUSU9OX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25VSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLkpBVkEyV1NfU0VMRUNUX1NFSV9FWFRSQUNURURfTUVUSE9EUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRpbmdQb2ludFR5cGUuZ2V0RWxlbWVudE5hbWUoKSkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChleHRyYWN0U0VJQnV0dG9uLmdldFNlbGVjdGlvbigpICYmIHNlaUludGVyZmFjZU5hbWVUZXh0LmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPiAwCi0gICAgICAgICAgICAgICAgICAgICYmIE5VTUJFUl9PRl9QVUJMSUNfTUVUSE9EUyA+IDAgJiYgTlVNQkVSX09GX0NIRUNLRURfTUVUSE9EUyA+IDApIHsKLSAgICAgICAgICAgICAgICBTRUlfU0VMRUNUSU9OX1NUQVRVUyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFNFSV9TRUxFQ1RJT05fU1RBVFVTID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgICAgIEpBVkFfVFlQRV9OQU1FX1NUQVRVUyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgICAgICBKQVZBX1RZUEVfRVhJU1RTX1NUQVRVUyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIElTdGF0dXMgZmluZE1vc3RTZXZlcmUoKSB7Ci0gICAgICAgIGlmIChKQVZBX1RZUEVfTkFNRV9TVEFUVVMubWF0Y2hlcyhJU3RhdHVzLkVSUk9SKSkgewotICAgICAgICAgICAgcmV0dXJuIEpBVkFfVFlQRV9OQU1FX1NUQVRVUzsKLSAgICAgICAgfQotICAgICAgICBpZiAoSkFWQV9UWVBFX0VYSVNUU19TVEFUVVMubWF0Y2hlcyhJU3RhdHVzLkVSUk9SKSkgewotICAgICAgICAgICAgcmV0dXJuIEpBVkFfVFlQRV9FWElTVFNfU1RBVFVTOwotICAgICAgICB9Ci0gICAgICAgIGlmIChTRUlfU0VMRUNUSU9OX1NUQVRVUy5tYXRjaGVzKElTdGF0dXMuRVJST1IpKSB7Ci0gICAgICAgICAgICByZXR1cm4gU0VJX1NFTEVDVElPTl9TVEFUVVM7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoU0VJX1NFTEVDVElPTl9TVEFUVVMuZ2V0U2V2ZXJpdHkoKSA+PSBKQVZBX1RZUEVfTkFNRV9TVEFUVVMuZ2V0U2V2ZXJpdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIFNFSV9TRUxFQ1RJT05fU1RBVFVTOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKEpBVkFfVFlQRV9FWElTVFNfU1RBVFVTLmdldFNldmVyaXR5KCkgPj0gSkFWQV9UWVBFX05BTUVfU1RBVFVTLmdldFNldmVyaXR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBKQVZBX1RZUEVfRVhJU1RTX1NUQVRVUzsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBKQVZBX1RZUEVfTkFNRV9TVEFUVVM7Ci0gICAgfQotCi0gICAgcHVibGljIElTdGF0dXMgY2hlY2tUeXBlRXhpc3RzKElUeXBlIHR5cGUsIFN0cmluZyBjb21waWxhdGlvblVuaXROYW1lKSB7Ci0gICAgICAgIGNvbXBpbGF0aW9uVW5pdE5hbWUgPSBjb21waWxhdGlvblVuaXROYW1lLnRyaW0oKTsKLQotICAgICAgICBJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA9IHR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCk7Ci0gICAgICAgIElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gcGFja2FnZUZyYWdtZW50LmdldENvbXBpbGF0aW9uVW5pdChjb21waWxhdGlvblVuaXROYW1lKTsKLSAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gY29tcGlsYXRpb25Vbml0LmdldFJlc291cmNlKCk7Ci0KLSAgICAgICAgaWYgKHJlc291cmNlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKQVhXU0NvcmVQbHVnaW4uUExVR0lOX0lELCBKQVhXU0NvcmVNZXNzYWdlcwotICAgICAgICAgICAgICAgICAgICAuYmluZChKQVhXU0NvcmVNZXNzYWdlcy5UWVBFX1dJVEhfTkFNRV9BTFJFQURZX0VYSVNUUywgbmV3IE9iamVjdFtdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxhdGlvblVuaXROYW1lLCBwYWNrYWdlRnJhZ21lbnQuZ2V0RWxlbWVudE5hbWUoKSB9KSk7Ci0gICAgICAgIH0KLSAgICAgICAgVVJJIGxvY2F0aW9uID0gcmVzb3VyY2UuZ2V0TG9jYXRpb25VUkkoKTsKLSAgICAgICAgaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgSUZpbGVTdG9yZSBmaWxlU3RvcmUgPSBFRlMuZ2V0U3RvcmUobG9jYXRpb24pOwotICAgICAgICAgICAgICAgIGlmIChmaWxlU3RvcmUuZmV0Y2hJbmZvKCkuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYV1NDb3JlUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5UWVBFX05BTUVfRElGRkVSRU5UX0NBU0VfRVhJU1RTKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvSmF2YTJXU0NvbmZpZ1dpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvSmF2YTJXU0NvbmZpZ1dpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWY0ZjY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL0phdmEyV1NDb25maWdXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkuQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkuQ1hGQ3JlYXRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHMuSmF2YTJXU1dpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuV1NETFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBKYXZhMldTQ29uZmlnV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yIHsKLSAgICBwcml2YXRlIElTdGF0dXMgV1NETF9GSUxFTkFNRV9PS19TVEFUVVMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgIHByaXZhdGUgSVN0YXR1cyBXU0RMX0ZJTEVOQU1FX0VSUk9SX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25VSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICBDWEZDcmVhdGlvblVJTWVzc2FnZXMuSkFWQTJXU19FTlRFUl9WQUxJRF9XU0RMX05BTUUpOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVDbGllbnRCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVTZXJ2ZXJCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVXcmFwZXJGYXVsdEJlYW5zQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIGdlbmVyYXRlV1NETEJ1dHRvbjsKLSAgICBwcml2YXRlIENvbWJvIHNvYXBCaW5kaW5nQ29tYm87Ci0gICAgcHJpdmF0ZSBCdXR0b24gY3JlYXRlWFNESW1wb3J0czsKLSAgICBwcml2YXRlIFRleHQgd3NkbEZpbGVUZXh0OwotICAgIHByaXZhdGUgSmF2YTJXU0RhdGFNb2RlbCBtb2RlbDsKLQotICAgIHB1YmxpYyBKYXZhMldTQ29uZmlnV2lkZ2V0KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEphdmEyV1NEYXRhTW9kZWwoSmF2YTJXU0RhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW50ZXJuYWxpemUoKSB7Ci0gICAgICAgIGlmIChtb2RlbC5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKS5jb21wYXJlVG8oQ1hGQ29yZVBsdWdpbi5DWEZfVkVSU0lPTl8yXzEpID49IDApIHsKLSAgICAgICAgICAgIGdlbmVyYXRlQ2xpZW50QnV0dG9uLnNldFNlbGVjdGlvbihtb2RlbC5pc0dlbmVyYXRlQ2xpZW50KCkpOwotICAgICAgICAgICAgZ2VuZXJhdGVTZXJ2ZXJCdXR0b24uc2V0U2VsZWN0aW9uKG1vZGVsLmlzR2VuZXJhdGVTZXJ2ZXIoKSk7Ci0gICAgICAgICAgICBnZW5lcmF0ZVdyYXBlckZhdWx0QmVhbnNCdXR0b24uc2V0U2VsZWN0aW9uKG1vZGVsLmlzR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucygpKTsKLSAgICAgICAgICAgIGdlbmVyYXRlV1NETEJ1dHRvbi5zZXRTZWxlY3Rpb24obW9kZWwuaXNHZW5lcmF0ZVdTREwoKSk7Ci0gICAgICAgICAgICBlbmFibGVXU0RMR3JvdXAobW9kZWwuaXNHZW5lcmF0ZVdTREwoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1vZGVsLmlzU29hcDEyQmluZGluZygpKSB7Ci0gICAgICAgICAgICBzb2FwQmluZGluZ0NvbWJvLnNldFRleHQoIlNPQVAgMS4yIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNvYXBCaW5kaW5nQ29tYm8uc2V0VGV4dCgiU09BUCAxLjEiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIGNyZWF0ZVhTREltcG9ydHMuc2V0U2VsZWN0aW9uKG1vZGVsLmlzR2VuZXJhdGVYU0RJbXBvcnRzKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyKSB7Ci0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBHcm91cCBqYXZhMndzR3JvdXAgPSBudWxsOwotICAgICAgICBpZiAobW9kZWwuZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCkuY29tcGFyZVRvKENYRkNvcmVQbHVnaW4uQ1hGX1ZFUlNJT05fMl8xKSA+PSAwKSB7Ci0gICAgICAgICAgICAvLyBGcm9udGVuZAotICAgICAgICAgICAgLy8gICAgICAgICAgICBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVGcm9udGVuZExhYmVsKGNvbXBvc2l0ZSk7Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gICAgICAgICAgICBmaW5hbCBDb21ibyBmcm9udGVuZENvbWJvID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlRnJvbnRlbmRDb21ibyhjb21wb3NpdGUsIG1vZGVsKTsKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgICAgICAvLyAgICAgICAgICAgIGZyb250ZW5kQ29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgICAgIC8vIEphdmEyV1MgR3JvdXAKLSAgICAgICAgICAgIGphdmEyd3NHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5TSEFET1dfSU4pOwotICAgICAgICAgICAgamF2YTJ3c0dyb3VwLnNldFRleHQoQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLkpBVkEyV1NfR1JPVVBfTEFCRUwpOwotICAgICAgICAgICAgR3JpZExheW91dCBqYXZhMndzbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQotICAgICAgICAgICAgamF2YTJ3c2xheW91dC5udW1Db2x1bW5zID0gMzsKLQotICAgICAgICAgICAgamF2YTJ3c2xheW91dC5tYXJnaW5IZWlnaHQgPSAxMDsKLSAgICAgICAgICAgIGphdmEyd3NHcm91cC5zZXRMYXlvdXQoamF2YTJ3c2xheW91dCk7Ci0gICAgICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICAgICAgamF2YTJ3c0dyb3VwLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgICAgICAvLyBHZW4gQ2xpZW50Ci0gICAgICAgICAgICBnZW5lcmF0ZUNsaWVudEJ1dHRvbiA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZUdlbmVyYXRlQ2xpZW50QnV0dG9uKGphdmEyd3NHcm91cCwgbW9kZWwpOwotCi0gICAgICAgICAgICAvLyBHZW4gU2VydmVyCi0gICAgICAgICAgICBnZW5lcmF0ZVNlcnZlckJ1dHRvbiA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZUdlbmVyYXRlU2VydmVyQnV0dG9uKGphdmEyd3NHcm91cCwgbW9kZWwpOwotCi0gICAgICAgICAgICAvLyBHZW4gV3JhcHBlciBhbmQgRmF1bHQgQmVhbgotICAgICAgICAgICAgZ2VuZXJhdGVXcmFwZXJGYXVsdEJlYW5zQnV0dG9uID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFuQnV0dG9uKAotICAgICAgICAgICAgICAgICAgICBqYXZhMndzR3JvdXAsIG1vZGVsKTsKLQotICAgICAgICAgICAgLy8gR2VuIFdTREwKLSAgICAgICAgICAgIGdlbmVyYXRlV1NETEJ1dHRvbiA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZUdlbmVyYXRlV1NETEJ1dHRvbihqYXZhMndzR3JvdXAsIG1vZGVsKTsKLSAgICAgICAgICAgIGdlbmVyYXRlV1NETEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuYWJsZVdTRExHcm91cChnZW5lcmF0ZVdTRExCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgICAgIGdlbmVyYXRlV1NETEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgfQotCi0gICAgICAgIEdyb3VwIHdzZGxHcm91cCA9IG5ldyBHcm91cChqYXZhMndzR3JvdXAgPT0gbnVsbCA/IGNvbXBvc2l0ZSA6IGphdmEyd3NHcm91cCwgU1dULlNIQURPV19FVENIRURfSU4pOwotICAgICAgICBHcmlkTGF5b3V0IHdzZGxHcm91cExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLSAgICAgICAgd3NkbEdyb3VwLnNldExheW91dCh3c2RsR3JvdXBMYXlvdXQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIHdzZGxHcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVXU0RMRmlsZU5hbWVMYWJlbCh3c2RsR3JvdXApOwotCi0gICAgICAgIHdzZGxGaWxlVGV4dCA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZVdTRExGaWxlTmFtZVRleHQod3NkbEdyb3VwLCBtb2RlbCk7Ci0gICAgICAgIHdzZGxGaWxlVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXNMaXN0ZW5lci5oYW5kbGVFdmVudChudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgd3NkbEZpbGVUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZVNPQVBCaW5kaW5nTGFiZWwod3NkbEdyb3VwKTsKLQotICAgICAgICBzb2FwQmluZGluZ0NvbWJvID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlU09BUEJpbmdDb21ibyh3c2RsR3JvdXAsIG1vZGVsKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgc29hcEJpbmRpbmdDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBjcmVhdGVYU0RJbXBvcnRzID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlWFNESW1wb3J0c0J1dHRvbih3c2RsR3JvdXAsIG1vZGVsKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgY3JlYXRlWFNESW1wb3J0cy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBlbmFibGVXU0RMR3JvdXAobW9kZWwuaXNHZW5lcmF0ZVdTREwoKSk7Ci0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGVuYWJsZVdTRExHcm91cChib29sZWFuIGVuYWJsZSkgewotICAgICAgICB3c2RsRmlsZVRleHQuc2V0RW5hYmxlZChlbmFibGUpOwotICAgICAgICBzb2FwQmluZGluZ0NvbWJvLnNldEVuYWJsZWQoZW5hYmxlKTsKLSAgICAgICAgY3JlYXRlWFNESW1wb3J0cy5zZXRFbmFibGVkKGVuYWJsZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkgewotICAgICAgICByZXR1cm4gZ2V0V1NETEZpbGVOYW1lU3RhdHVzKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJU3RhdHVzIGdldFdTRExGaWxlTmFtZVN0YXR1cygpIHsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBXU0RMX0ZJTEVOQU1FX09LX1NUQVRVUzsKLSAgICAgICAgU3RyaW5nIHdzZGxGaWxlTmFtZSA9IHdzZGxGaWxlVGV4dC5nZXRUZXh0KCk7Ci0gICAgICAgIGlmICghV1NETFV0aWxzLmlzVmFsaWRXU0RMRmlsZU5hbWUod3NkbEZpbGVOYW1lKSkgewotICAgICAgICAgICAgc3RhdHVzID0gV1NETF9GSUxFTkFNRV9FUlJPUl9TVEFUVVM7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9KYXZhMldTQ29uZmlnV2lkZ2V0RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvSmF2YTJXU0NvbmZpZ1dpZGdldEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc0OWQzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9KYXZhMldTQ29uZmlnV2lkZ2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLkphdmEyV1NEZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLkNYRkNyZWF0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBKYXZhMldTQ29uZmlnV2lkZ2V0RmFjdG9yeSBpbXBsZW1lbnRzIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSB7Ci0KLSAgICBwcml2YXRlIFNpbXBsZVdpZGdldENvbnRyaWJ1dG9yIGphdmEyV1NXaWRnZXRDb250cmlidXRvcjsKLQotICAgIHByaXZhdGUgSmF2YTJXU0NvbmZpZ1dpZGdldCBqYXZhMldTQ29uZmlnV2lkZ2V0ID0gbmV3IEphdmEyV1NDb25maWdXaWRnZXQoKTsKLQotICAgIHB1YmxpYyBKYXZhMldTQ29uZmlnV2lkZ2V0RmFjdG9yeSgpIHsKLQotICAgIH0KLQotICAgIHB1YmxpYyBJTmFtZWRXaWRnZXRDb250cmlidXRvciBnZXRGaXJzdE5hbWVkV2lkZ2V0KCkgewotICAgICAgICBpZiAoamF2YTJXU1dpZGdldENvbnRyaWJ1dG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIGluaXQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gamF2YTJXU1dpZGdldENvbnRyaWJ1dG9yOwotICAgIH0KLQotICAgIHB1YmxpYyBJTmFtZWRXaWRnZXRDb250cmlidXRvciBnZXROZXh0TmFtZWRXaWRnZXQoSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3Igd2lkZ2V0Q29udHJpYnV0b3IpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpIHsKLSAgICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoSmF2YTJXU0RlZmF1bHRpbmdDb21tYW5kLmNsYXNzLAotICAgICAgICAgICAgICAgICJKYXZhMldTRGF0YU1vZGVsIiwgSmF2YTJXU0NvbmZpZ1dpZGdldEZhY3RvcnkuY2xhc3MpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SmF2YTJXU0RhdGFNb2RlbChKYXZhMldTRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIGphdmEyV1NDb25maWdXaWRnZXQuc2V0SmF2YTJXU0RhdGFNb2RlbChtb2RlbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0gICAgICAgIGphdmEyV1NXaWRnZXRDb250cmlidXRvciA9IG5ldyBTaW1wbGVXaWRnZXRDb250cmlidXRvcigpOwotICAgICAgICBDWEZDb250ZXh0IGNvbnRleHQgPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKYXZhMldTQ29udGV4dCgpOwotICAgICAgICBTdHJpbmcgdGl0bGUgPSBDWEZDcmVhdGlvblVJTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJTWVzc2FnZXMuSkFWQTJXU19QQUdFX1RJVExFLCBuZXcgT2JqZWN0W117Y29udGV4dC5nZXREZWZhdWx0UnVudGltZVR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCl9KTsKLQotICAgICAgICBqYXZhMldTV2lkZ2V0Q29udHJpYnV0b3Iuc2V0VGl0bGUodGl0bGUpOwotICAgICAgICBqYXZhMldTV2lkZ2V0Q29udHJpYnV0b3IKLSAgICAgICAgLnNldERlc2NyaXB0aW9uKENYRkNyZWF0aW9uVUlNZXNzYWdlcy5iaW5kKENYRkNyZWF0aW9uVUlNZXNzYWdlcy5KQVZBMldTX1BBR0VfREVTQ1JJUFRJT04sCi0gICAgICAgICAgICAgICAgY29udGV4dC5nZXREZWZhdWx0UnVudGltZVR5cGUoKSkpOwotICAgICAgICBqYXZhMldTV2lkZ2V0Q29udHJpYnV0b3Iuc2V0RmFjdG9yeShuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkgewotICAgICAgICAgICAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gamF2YTJXU0NvbmZpZ1dpZGdldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvSmF2YTJXU0ludGVyZmFjZUNvbmZpZ1dpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvSmF2YTJXU0ludGVyZmFjZUNvbmZpZ1dpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjBhNGY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL0phdmEyV1NJbnRlcmZhY2VDb25maWdXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLkNYRkNyZWF0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLkNYRkNyZWF0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aWRnZXRzLkphdmEyV1NXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5FbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBKYXZhMldTSW50ZXJmYWNlQ29uZmlnV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yIHsKLSAgICBwcml2YXRlIElTdGF0dXMgSU1QTF9TRUxFQ1RJT05fU1RBVFVTID0gU3RhdHVzLk9LX1NUQVRVUzsKLQotICAgIHByaXZhdGUgSmF2YTJXU0RhdGFNb2RlbCBtb2RlbDsKLSAgICBwcml2YXRlIElUeXBlIHN0YXJ0aW5nUG9pbnRUeXBlOwotCi0gICAgcHJpdmF0ZSBDb21ibyBzZWxlY3RJbXBsZW1lbnRhdGlvbkNvbWJvOwotICAgIAotICAgIHB1YmxpYyBKYXZhMldTSW50ZXJmYWNlQ29uZmlnV2lkZ2V0KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEphdmEyV1NEYXRhTW9kZWwoSmF2YTJXU0RhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SmF2YVN0YXJ0aW5nUG9pbnRUeXBlKElUeXBlIHN0YXJ0aW5nUG9pbnRUeXBlKSB7Ci0gICAgICAgIHRoaXMuc3RhcnRpbmdQb2ludFR5cGUgPSBzdGFydGluZ1BvaW50VHlwZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcikgewotICAgICAgICBmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIAotICAgICAgICBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVTZWxlY3RJbXBsZW1lbnRhdGlvbkxhYmVsKGNvbXBvc2l0ZSk7Ci0gICAgICAgIAotICAgICAgICBzZWxlY3RJbXBsZW1lbnRhdGlvbkNvbWJvID0gSmF2YTJXU1dpZGdldEZhY3RvcnkKLSAgICAgICAgICAgIC5jcmVhdGVTZWxlY3RJbXBsZW1lbnRhdGlvbkNvbWJvKGNvbXBvc2l0ZSwgbW9kZWwsIHN0YXJ0aW5nUG9pbnRUeXBlKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIHNlbGVjdEltcGxlbWVudGF0aW9uQ29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIAotICAgICAgICBzZWxlY3RJbXBsZW1lbnRhdGlvbkNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIHZhbGlkYXRlSW1wbGVtZW50YXRpb25TZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBzdGF0dXNMaXN0ZW5lci5oYW5kbGVFdmVudChudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICBzZWxlY3RJbXBsZW1lbnRhdGlvbkNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQotICAgICAgICAJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBldmVudCkgewotICAgICAgICAgICAgCXZhbGlkYXRlSW1wbGVtZW50YXRpb25TZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBzdGF0dXNMaXN0ZW5lci5oYW5kbGVFdmVudChudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICBCdXR0b24gYnJvd3NlSW1wbEJ1dHRvbiA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZUJyb3dzZUJ1dHRvbihjb21wb3NpdGUpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGJyb3dzZUltcGxCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIAotICAgICAgICBicm93c2VJbXBsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyBzZWxlY3Rpb25EaWFsb2cgPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZygKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5nZXRTaGVsbCgpLCBDWEZDcmVhdGlvblVJTWVzc2FnZXMuSkFWQTJXU19TRUxFQ1RfSU1QTF9ESUFMT0dfVElUTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJTWVzc2FnZXMuSkFWQTJXU19TRUxFQ1RfSU1QTF9ESUFMT0dfREVTQ1JJUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBKRFRVdGlscy5nZXRKYXZhUHJvamVjdChtb2RlbC5nZXRQcm9qZWN0TmFtZSgpKSwgSUphdmFTZWFyY2hDb25zdGFudHMuQ0xBU1MpOwotCi0gICAgICAgICAgICAgICAgaW50IHJldHVybkNvZGUgPSBzZWxlY3Rpb25EaWFsb2cub3BlbigpOwotICAgICAgICAgICAgICAgIGlmIChyZXR1cm5Db2RlID09IFdpbmRvdy5PSykgewotICAgICAgICAgICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0IHNlbGVjdGVkQ29tcGlsYXRpb25Vbml0ID0gKElDb21waWxhdGlvblVuaXQpIHNlbGVjdGlvbkRpYWxvZy5nZXRGaXJzdFJlc3VsdCgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VsZWN0ZWRJbXBsZW1lbnRhdGlvbiA9IHNlbGVjdGVkQ29tcGlsYXRpb25Vbml0LmZpbmRQcmltYXJ5VHlwZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gaW1wbHMgPSBBcnJheXMuYXNMaXN0KHNlbGVjdEltcGxlbWVudGF0aW9uQ29tYm8uZ2V0SXRlbXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaW1wbHMuY29udGFpbnMoc2VsZWN0ZWRJbXBsZW1lbnRhdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgCXNlbGVjdEltcGxlbWVudGF0aW9uQ29tYm8uYWRkKHNlbGVjdGVkSW1wbGVtZW50YXRpb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdEltcGxlbWVudGF0aW9uQ29tYm8uc2V0VGV4dChzZWxlY3RlZEltcGxlbWVudGF0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0gICAgICAgIHJldHVybiBJTVBMX1NFTEVDVElPTl9TVEFUVVM7Ci0gICAgfQotICAgIAotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUltcGxlbWVudGF0aW9uU2VsZWN0aW9uKCkgewotICAgICAgICBJVHlwZSBpbXBsVHlwZSA9IEpEVFV0aWxzLmZpbmRUeXBlKG1vZGVsLmdldFByb2plY3ROYW1lKCksIHNlbGVjdEltcGxlbWVudGF0aW9uQ29tYm8uZ2V0VGV4dCgpKTsKLSAgICAgICAgaWYgKGltcGxUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgSU1ldGhvZFtdIHNlaU1ldGhvZHMgPSBzdGFydGluZ1BvaW50VHlwZS5nZXRNZXRob2RzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChJTWV0aG9kIHNlaU1ldGhvZCA6IHNlaU1ldGhvZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgSU1ldGhvZFtdIGltcGxNZXRob2QgPSBpbXBsVHlwZS5maW5kTWV0aG9kcyhzZWlNZXRob2QpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaW1wbE1ldGhvZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIAlJTVBMX1NFTEVDVElPTl9TVEFUVVMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNyZWF0aW9uVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICAJICAgIENYRkNyZWF0aW9uVUlNZXNzYWdlcy5iaW5kKENYRkNyZWF0aW9uVUlNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTVVTVF9JTVBMRU1FTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbXBsZW1lbnRzTWVzc2FnZShzdGFydGluZ1BvaW50VHlwZSwgc2VpTWV0aG9kKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgSU1QTF9TRUxFQ1RJT05fU1RBVFVTID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZShzdGFydGluZ1BvaW50VHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKHNlbGVjdEltcGxlbWVudGF0aW9uQ29tYm8uZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAJSU1QTF9TRUxFQ1RJT05fU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDcmVhdGlvblVJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgCSAgICBDWEZDcmVhdGlvblVJTWVzc2FnZXMuYmluZChDWEZDcmVhdGlvblVJTWVzc2FnZXMuV0VCU0VSVklDRV9JTVBMRU1FTlRBVElPTl9OT1RfRk9VTkQsCi0gICAgICAgICAgICAgICAgICAgIAkJc2VsZWN0SW1wbGVtZW50YXRpb25Db21iby5nZXRUZXh0KCkpKTsgICAKLSAgICAgICAgfSAgICAgICAgCi0JfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0SW1wbGVtZW50c01lc3NhZ2UoSVR5cGUgc2VpVHlwZSwgSU1ldGhvZCBzZWlNZXRob2QpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBtZXNzYWdlID0gbmV3IFN0cmluZ0J1aWxkZXIoc2VpVHlwZS5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgbWVzc2FnZS5hcHBlbmQoIi4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBtZXNzYWdlLmFwcGVuZChzZWlNZXRob2QuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgIG1lc3NhZ2UuYXBwZW5kKCIoIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgU3RyaW5nW10gcGFyYW1ldGVyVHlwZXMgPSBzZWlNZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJUeXBlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIHBhcmFtZXRlclR5cGUgPSBTaWduYXR1cmUudG9TdHJpbmcocGFyYW1ldGVyVHlwZXNbaV0pOwotICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQocGFyYW1ldGVyVHlwZSk7Ci0gICAgICAgICAgICBpZiAoaSA8IHBhcmFtZXRlclR5cGVzLmxlbmd0aCAtIDEpIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1lc3NhZ2UuYXBwZW5kKCIpIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2UudG9TdHJpbmcoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL0phdmEyV1NTZWxlY3RTRUlXaWRnZXRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9KYXZhMldTU2VsZWN0U0VJV2lkZ2V0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjk4YmUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL0phdmEyV1NTZWxlY3RTRUlXaWRnZXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuSmF2YTJXU0RlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkuQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkuQ1hGQ3JlYXRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBKYXZhMldTU2VsZWN0U0VJV2lkZ2V0RmFjdG9yeSBpbXBsZW1lbnRzIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVORFBPSU5UX0lOVEVSRkFDRSA9ICJlbmRwb2ludEludGVyZmFjZSI7Ci0KLSAgICBwcml2YXRlIFNpbXBsZVdpZGdldENvbnRyaWJ1dG9yIGNsYXNzV2lkZ2V0Q29udHJpYnV0b3I7Ci0gICAgcHJpdmF0ZSBTaW1wbGVXaWRnZXRDb250cmlidXRvciBpbnRlcmZhY2VXaWRnZXRDb250cmlidXRvcjsKLQotICAgIHByaXZhdGUgSmF2YTJXU0NsYXNzQ29uZmlnV2lkZ2V0IGphdmEyV1NDbGFzc0NvbmZpZ1dpZGdldCA9IG5ldyBKYXZhMldTQ2xhc3NDb25maWdXaWRnZXQoKTsKLSAgICBwcml2YXRlIEphdmEyV1NJbnRlcmZhY2VDb25maWdXaWRnZXQgamF2YTJXU0ludGVyZmFjZUNvbmZpZ1dpZGdldCA9IG5ldyBKYXZhMldTSW50ZXJmYWNlQ29uZmlnV2lkZ2V0KCk7Ci0KLSAgICBwcml2YXRlIEphdmEyV1NEYXRhTW9kZWwgbW9kZWw7Ci0gICAgcHJpdmF0ZSBJVHlwZSBzdGFydGluZ1BvaW50VHlwZTsKLQotICAgIHB1YmxpYyBJTmFtZWRXaWRnZXRDb250cmlidXRvciBnZXRGaXJzdE5hbWVkV2lkZ2V0KCkgewotICAgICAgICBpZiAoc3RhcnRpbmdQb2ludFR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaW50ZXJmYWNlV2lkZ2V0Q29udHJpYnV0b3IgPT0gbnVsbCB8fCBjbGFzc1dpZGdldENvbnRyaWJ1dG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIGluaXQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoc3RhcnRpbmdQb2ludFR5cGUuaXNJbnRlcmZhY2UoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBpbnRlcmZhY2VXaWRnZXRDb250cmlidXRvcjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnRpbmdQb2ludFR5cGUuaXNDbGFzcygpKSB7Ci0gICAgICAgICAgICAgICAgY2hlY2tGb3JTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gY2xhc3NXaWRnZXRDb250cmlidXRvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgQ1hGQ3JlYXRpb25VSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja0ZvclNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBJQW5ub3RhdGlvbltdIGFubm90YXRpb25zID0gc3RhcnRpbmdQb2ludFR5cGUuZ2V0QW5ub3RhdGlvbnMoKTsKLSAgICAgICAgZm9yIChJQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpIHsKLSAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKFdlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIElNZW1iZXJWYWx1ZVBhaXJbXSBtZW1iZXJWYWx1ZVBhaXJzID0gYW5ub3RhdGlvbi5nZXRNZW1iZXJWYWx1ZVBhaXJzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChJTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpciA6IG1lbWJlclZhbHVlUGFpcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpci5nZXRNZW1iZXJOYW1lKCkuZXF1YWxzKEVORFBPSU5UX0lOVEVSRkFDRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbmRwb2ludEludGVyZmFjZSA9IG1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZSgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJVHlwZSBzZWlUeXBlID0gc3RhcnRpbmdQb2ludFR5cGUuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZShlbmRwb2ludEludGVyZmFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VpVHlwZSAhPSBudWxsICYmIHNlaVR5cGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5zZXRVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuc2V0RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZShlbmRwb2ludEludGVyZmFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuc2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZShlbmRwb2ludEludGVyZmFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgZ2V0TmV4dE5hbWVkV2lkZ2V0KElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIHdpZGdldENvbnRyaWJ1dG9yKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KSB7Ci0gICAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEphdmEyV1NEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywKLSAgICAgICAgICAgICAgICAiSmF2YTJXU0RhdGFNb2RlbCIsIEphdmEyV1NTZWxlY3RTRUlXaWRnZXRGYWN0b3J5LmNsYXNzKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhKYXZhMldTRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsCi0gICAgICAgICAgICAgICAgIkphdmFTdGFydGluZ1BvaW50VHlwZSIsIEphdmEyV1NTZWxlY3RTRUlXaWRnZXRGYWN0b3J5LmNsYXNzKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEphdmEyV1NEYXRhTW9kZWwoSmF2YTJXU0RhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgICAgIGphdmEyV1NDbGFzc0NvbmZpZ1dpZGdldC5zZXRKYXZhMldTRGF0YU1vZGVsKG1vZGVsKTsKLSAgICAgICAgamF2YTJXU0ludGVyZmFjZUNvbmZpZ1dpZGdldC5zZXRKYXZhMldTRGF0YU1vZGVsKG1vZGVsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXZhU3RhcnRpbmdQb2ludFR5cGUoSVR5cGUgc3RhcnRpbmdQb2ludFR5cGUpIHsKLSAgICAgICAgdGhpcy5zdGFydGluZ1BvaW50VHlwZSA9IHN0YXJ0aW5nUG9pbnRUeXBlOwotICAgICAgICBqYXZhMldTQ2xhc3NDb25maWdXaWRnZXQuc2V0SmF2YVN0YXJ0aW5nUG9pbnRUeXBlKHN0YXJ0aW5nUG9pbnRUeXBlKTsKLSAgICAgICAgamF2YTJXU0ludGVyZmFjZUNvbmZpZ1dpZGdldC5zZXRKYXZhU3RhcnRpbmdQb2ludFR5cGUoc3RhcnRpbmdQb2ludFR5cGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0KCkgewotICAgICAgICBjbGFzc1dpZGdldENvbnRyaWJ1dG9yID0gbmV3IFNpbXBsZVdpZGdldENvbnRyaWJ1dG9yKCk7Ci0gICAgICAgIENYRkNvbnRleHQgY29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCk7Ci0gICAgICAgIFN0cmluZyBjbGFzc0NvbmZpZ1RpdGxlID0gQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLkpBVkEyV1NfQ0xBU1NfQ09ORklHX1BBR0VfVElUTEUsCi0gICAgICAgICAgICAgICAgbmV3IE9iamVjdFtde2NvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVUeXBlKCksIGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCl9KTsKLSAgICAgICAgY2xhc3NXaWRnZXRDb250cmlidXRvci5zZXRUaXRsZShjbGFzc0NvbmZpZ1RpdGxlKTsKLSAgICAgICAgY2xhc3NXaWRnZXRDb250cmlidXRvcgotICAgICAgICAuc2V0RGVzY3JpcHRpb24oQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLkpBVkEyV1NfQ0xBU1NfQ09ORklHX1BBR0VfREVTQ1JJUFRJT04pOwotICAgICAgICBjbGFzc1dpZGdldENvbnRyaWJ1dG9yLnNldEZhY3RvcnkobmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGphdmEyV1NDbGFzc0NvbmZpZ1dpZGdldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgaW50ZXJmYWNlV2lkZ2V0Q29udHJpYnV0b3IgPSBuZXcgU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3IoKTsKLSAgICAgICAgU3RyaW5nIGludGVyZmFjZUNvbmZpZ1RpdGxlID0gQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLkpBVkEyV1NfSU5URVJGQUNFX0NPTkZJR19QQUdFX1RJVExFLAotICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXtjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVHlwZSgpLCBjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVmVyc2lvbigpfSk7Ci0gICAgICAgIGludGVyZmFjZVdpZGdldENvbnRyaWJ1dG9yLnNldFRpdGxlKGludGVyZmFjZUNvbmZpZ1RpdGxlKTsKLSAgICAgICAgaW50ZXJmYWNlV2lkZ2V0Q29udHJpYnV0b3IKLSAgICAgICAgLnNldERlc2NyaXB0aW9uKENYRkNyZWF0aW9uVUlNZXNzYWdlcy5KQVZBMldTX0lOVEVSRkFDRV9DT05GSUdfUEFHRV9ERVNDUklQVElPTik7Ci0gICAgICAgIGludGVyZmFjZVdpZGdldENvbnRyaWJ1dG9yLnNldEZhY3RvcnkobmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGphdmEyV1NJbnRlcmZhY2VDb25maWdXaWRnZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvV1NETDJKYXZhQ29uZmlnV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9XU0RMMkphdmFDb25maWdXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY0ZTk1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9XU0RMMkphdmFDb25maWdXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS52aWV3ZXJzLlBhY2thZ2VOYW1lRWRpdGluZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS52aWV3ZXJzLlBhY2thZ2VOYW1lVGFibGVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aWRnZXRzLldTREwySmF2YVdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBXU0RMMkphdmFDb25maWdXaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IgewotICAgIHByaXZhdGUgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgIHByaXZhdGUgQ29tcG9zaXRlIHBhcmVudDsKLSAgICBwcml2YXRlIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyOwotCi0gICAgcHJpdmF0ZSBXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWw7Ci0KLSAgICBwcml2YXRlIENvbWJvIG91dHB1dERpckNvbWJvOwotICAgIHByaXZhdGUgVGV4dCBwYWNrYWdlTmFtZVRleHQ7Ci0gICAgcHJpdmF0ZSBCdXR0b24gbmFtZXNwYWNlTWFwcGluZ0J1dHRvbjsKLSAgICBwcml2YXRlIFRhYmxlVmlld2VyIHBhY2thZ2VOYW1lVGFibGVWaWV3ZXI7Ci0gICAgcHJpdmF0ZSBDb21ibyBzZXJ2aWNlTmFtZUNvbWJvOwotICAgIHByaXZhdGUgTGlzdCBiaW5kaW5nRmlsZXNMaXN0OwotCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgbmFtZXNwYWNlQ29tcG9zaXRlSG9sZGVyOwotICAgIHByaXZhdGUgQ29tcG9zaXRlIG5hbWVzcGFjZUNvbXBvc2l0ZTsKLSAgICBwcml2YXRlIGludCBuYW1lc3BhY2VDb21wb3NpdGVIZWlnaHQgPSAtMTsKLQotICAgIHB1YmxpYyBXU0RMMkphdmFDb25maWdXaWRnZXQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0V1NETDJKYXZhRGF0YU1vZGVsKFdTREwySmF2YURhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW50ZXJuYWxpemUoKSB7Ci0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkucG9wdWxhdGVPdXRwdXREaXJlY3RvcnlDb21ibyhvdXRwdXREaXJDb21ibywgbW9kZWwuZ2V0UHJvamVjdE5hbWUoKSk7Ci0gICAgICAgIHBhY2thZ2VOYW1lVGV4dC5zZXRUZXh0KG1vZGVsLmdldEluY2x1ZGVkTmFtZXNwYWNlcygpLmdldChtb2RlbC5nZXRUYXJnZXROYW1lc3BhY2UoKSkpOwotICAgICAgICBuYW1lc3BhY2VNYXBwaW5nQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgIGV4cGFuZE5hbWVzcGFjZUNvbXBvc2l0ZShmYWxzZSk7Ci0gICAgICAgIGlmIChwYWNrYWdlTmFtZVRhYmxlVmlld2VyICE9IG51bGwgJiYgcGFja2FnZU5hbWVUYWJsZVZpZXdlci5nZXRDb250ZW50UHJvdmlkZXIoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwYWNrYWdlTmFtZVRhYmxlVmlld2VyLnNldElucHV0KG1vZGVsLmdldFdzZGxEZWZpbml0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkucG9wdWxhdGVTZXJ2aWNlTmFtZUNvbWJvKHNlcnZpY2VOYW1lQ29tYm8sIG1vZGVsKTsKLQotICAgICAgICBiaW5kaW5nRmlsZXNMaXN0LnJlbW92ZUFsbCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyKSB7Ci0gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgICAgICB0aGlzLnN0YXR1c0xpc3RlbmVyID0gc3RhdHVzTGlzdGVuZXI7Ci0KLSAgICAgICAgZmluYWwgQ29tcG9zaXRlIG1haW5Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7Ci0gICAgICAgIG1haW5Db21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIG1haW5Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgLy8gT3V0cHV0IERpcgotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZU91dHB1dERpcmVjdG9yeUxhYmVsKG1haW5Db21wb3NpdGUpOwotCi0gICAgICAgIG91dHB1dERpckNvbWJvID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVPdXRwdXREaXJlY3RvcnlDb21ibyhtYWluQ29tcG9zaXRlLCBtb2RlbCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgb3V0cHV0RGlyQ29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgLy8gUGFja2FnZSBOYW1lOgotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVBhY2thZ2VOYW1lTGFiZWwobWFpbkNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgcGFja2FnZU5hbWVUZXh0ID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVQYWNrYWdlTmFtZVRleHQobWFpbkNvbXBvc2l0ZSwgbW9kZWwpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIHBhY2thZ2VOYW1lVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBwYWNrYWdlTmFtZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWVUZXh0LmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBKRFRVdGlscy52YWxpZGF0ZVBhY2thZ2VOYW1lKG1vZGVsLmdldFByb2plY3ROYW1lKCksIHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgICAgICBzdGF0dXNMaXN0ZW5lci5oYW5kbGVFdmVudChudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgbmFtZXNwYWNlTWFwcGluZ0J1dHRvbiA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkKLSAgICAgICAgLmNyZWF0ZU5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uKG1haW5Db21wb3NpdGUpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBuYW1lc3BhY2VNYXBwaW5nQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICBuYW1lc3BhY2VNYXBwaW5nQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgZXhwYW5kTmFtZXNwYWNlQ29tcG9zaXRlKG5hbWVzcGFjZU1hcHBpbmdCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIgPSBuZXcgQ29tcG9zaXRlKG1haW5Db21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlSG9sZGVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIC8vIFNlcnZpY2UgTmFtZToKLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVTZXJ2aWNlTmFtZUxhYmVsKG1haW5Db21wb3NpdGUpOwotCi0gICAgICAgIHNlcnZpY2VOYW1lQ29tYm8gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVNlcnZpY2VOYW1lQ29tYm8obWFpbkNvbXBvc2l0ZSwgbW9kZWwpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIHNlcnZpY2VOYW1lQ29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgTGFiZWwgYmluZGluZ0ZpbGVzTGFiZWwgPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZUJpbmRpbmdGaWxlc0xhYmVsKG1haW5Db21wb3NpdGUpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IDM7Ci0gICAgICAgIGJpbmRpbmdGaWxlc0xhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIGJpbmRpbmdGaWxlc0xpc3QgPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZUJpbmRpbmdGaWxlc0xpc3QobWFpbkNvbXBvc2l0ZSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSAzOwotICAgICAgICBiaW5kaW5nRmlsZXNMaXN0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIEJ1dHRvbiBhZGRCaW5kaW5nRmlsZUJ1dHRvbiA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlQWRkQmluZGluZ0ZpbGVCdXR0b24obWFpbkNvbXBvc2l0ZSwgbW9kZWwsCi0gICAgICAgICAgICAgICAgYmluZGluZ0ZpbGVzTGlzdCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgYWRkQmluZGluZ0ZpbGVCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgQnV0dG9uIHJlbW92ZUJpbmRpbmdGaWxlQnV0dG9uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVSZW1vdmVCaW5kaW5nRmlsZUJ1dHRvbihtYWluQ29tcG9zaXRlLAotICAgICAgICAgICAgICAgIG1vZGVsLCBiaW5kaW5nRmlsZXNMaXN0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICByZW1vdmVCaW5kaW5nRmlsZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVBhZGRpbmdMYWJlbChtYWluQ29tcG9zaXRlKTsKLQotICAgICAgICAvKgotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhNTENhdGFsb2dMYWJlbChtYWluQ29tcG9zaXRlKTsKLQotICAgICAgICBUZXh0IHhtbENhdGFsb2dUZXh0ID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYTUxDYXRhbG9nVGV4dChtYWluQ29tcG9zaXRlLCBtb2RlbCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB4bWxDYXRhbG9nVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhNTENhdGFsb2dCcm93c2VCdXR0b24obWFpbkNvbXBvc2l0ZSk7Ci0gICAgICAgICAqLwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZXhwYW5kTmFtZXNwYWNlQ29tcG9zaXRlKGJvb2xlYW4gZXhwYW5kKSB7Ci0gICAgICAgIGlmIChleHBhbmQpIHsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VDb21wb3NpdGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgICAgICAgICBncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSA3OwotICAgICAgICAgICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZUhvbGRlci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIucGFjaygpOwotCi0gICAgICAgICAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlID0gZ2V0TmFtZXNwYWNlTWFwcGluZ0NvbXBvc2l0ZShuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIpOwotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VDb21wb3NpdGVIZWlnaHQgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgUG9pbnQgZ3JvdXBTaXplID0gbmFtZXNwYWNlQ29tcG9zaXRlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZUhlaWdodCA9IGdyb3VwU2l6ZS55OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTaGVsbCBzaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotICAgICAgICAgICAgICAgIFBvaW50IHNoZWxsU2l6ZSA9IHNoZWxsLmdldFNpemUoKTsKLSAgICAgICAgICAgICAgICBzaGVsbC5zZXRTaXplKHNoZWxsU2l6ZS54LCBzaGVsbFNpemUueSArIG5hbWVzcGFjZUNvbXBvc2l0ZUhlaWdodCk7Ci0KLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIubGF5b3V0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlQ29tcG9zaXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICAgICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZUhvbGRlci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIucGFjaygpOwotICAgICAgICAgICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZS5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlID0gbnVsbDsKLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIubGF5b3V0KCk7Ci0gICAgICAgICAgICAgICAgU2hlbGwgc2hlbGwgPSBwYXJlbnQuZ2V0U2hlbGwoKTsKLSAgICAgICAgICAgICAgICBQb2ludCBzaGVsbFNpemUgPSBzaGVsbC5nZXRTaXplKCk7Ci0gICAgICAgICAgICAgICAgc2hlbGwuc2V0U2l6ZShzaGVsbFNpemUueCwgc2hlbGxTaXplLnkgLSBuYW1lc3BhY2VDb21wb3NpdGVIZWlnaHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgZ2V0TmFtZXNwYWNlTWFwcGluZ0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgVGFibGUgcGFja2FnZU5hbWVUYWJsZSA9IGNyZWF0ZU5hbWVzcGFjZU1hcHBpbmdUYWJsZShuYW1lc3BhY2VDb21wb3NpdGUpOwotCi0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgZ3JpZERhdGEudmVydGljYWxTcGFuID0gNjsKLSAgICAgICAgcGFja2FnZU5hbWVUYWJsZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICByZXR1cm4gbmFtZXNwYWNlQ29tcG9zaXRlOwotICAgIH0KLQotICAgIHByaXZhdGUgVGFibGUgY3JlYXRlTmFtZXNwYWNlTWFwcGluZ1RhYmxlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgcGFja2FnZU5hbWVUYWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihwYXJlbnQsIFNXVC5DSEVDSyB8IFNXVC5NVUxUSSB8IFNXVC5CT1JERVIKLSAgICAgICAgICAgICAgICB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0KLSAgICAgICAgVGFibGUgcGFja2FnZU5hbWVUYWJsZSA9IHBhY2thZ2VOYW1lVGFibGVWaWV3ZXIuZ2V0VGFibGUoKTsKLSAgICAgICAgcGFja2FnZU5hbWVUYWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0gICAgICAgIHBhY2thZ2VOYW1lVGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQotICAgICAgICBUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotICAgICAgICBwYWNrYWdlTmFtZVRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0KLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVXU0RMTmFtZXNwYWNlVmlld2VyQ29sdW1uKHBhY2thZ2VOYW1lVGFibGVWaWV3ZXIpOwotCi0gICAgICAgIENvbHVtbldlaWdodERhdGEgY29sdW1uV2VpZ2h0RGF0YSA9IG5ldyBDb2x1bW5XZWlnaHREYXRhKDEwMCwgMTAwLCB0cnVlKTsKLSAgICAgICAgdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShjb2x1bW5XZWlnaHREYXRhKTsKLQotICAgICAgICBUYWJsZVZpZXdlckNvbHVtbiBwYWNrYWdlTmFtZVZpZXdlckNvbHVtbiA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlUGFja2FnZU5hbWVDb2x1bW4oCi0gICAgICAgICAgICAgICAgcGFja2FnZU5hbWVUYWJsZVZpZXdlciwgbW9kZWwpOwotCi0gICAgICAgIFRleHRDZWxsRWRpdG9yIHRleHRDZWxsRWRpdG9yID0gbmV3IFRleHRDZWxsRWRpdG9yKHBhY2thZ2VOYW1lVGFibGVWaWV3ZXIuZ2V0VGFibGUoKSk7Ci0gICAgICAgIHRleHRDZWxsRWRpdG9yLmFkZExpc3RlbmVyKCBuZXcgSUNlbGxFZGl0b3JMaXN0ZW5lcigpIHsKLQotICAgICAgICAgICAgcHVibGljIHZvaWQgZWRpdG9yVmFsdWVDaGFuZ2VkKGJvb2xlYW4gb2xkVmFsaWRTdGF0ZSwgYm9vbGVhbiBuZXdWYWxpZFN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzTGlzdGVuZXIuaGFuZGxlRXZlbnQobnVsbCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNhbmNlbEVkaXRvcigpIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgYXBwbHlFZGl0b3JWYWx1ZSgpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgdGV4dENlbGxFZGl0b3Iuc2V0VmFsaWRhdG9yKG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBpc1ZhbGlkKE9iamVjdCBwYWNrYWdlTmFtZSkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IEpEVFV0aWxzLnZhbGlkYXRlUGFja2FnZU5hbWUobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSwgcGFja2FnZU5hbWUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0spIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXMuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBwYWNrYWdlTmFtZVZpZXdlckNvbHVtbi5zZXRFZGl0aW5nU3VwcG9ydChuZXcgUGFja2FnZU5hbWVFZGl0aW5nU3VwcG9ydChwYWNrYWdlTmFtZVRhYmxlVmlld2VyLAotICAgICAgICAgICAgICAgIHRleHRDZWxsRWRpdG9yLCBtb2RlbCkpOwotCi0gICAgICAgIGNvbHVtbldlaWdodERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxMDAsIDEwMCwgdHJ1ZSk7Ci0gICAgICAgIHRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoY29sdW1uV2VpZ2h0RGF0YSk7Ci0KLSAgICAgICAgcGFja2FnZU5hbWVUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFBhY2thZ2VOYW1lVGFibGVDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgICAgIHBhY2thZ2VOYW1lVGFibGVWaWV3ZXIuc2V0SW5wdXQobW9kZWwuZ2V0V3NkbERlZmluaXRpb24oKSk7Ci0KLSAgICAgICAgVGFibGVJdGVtW10gdGFibGVJdGVtcyA9IHBhY2thZ2VOYW1lVGFibGUuZ2V0SXRlbXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJsZUl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBUYWJsZUl0ZW0gdGFibGVJdGVtID0gdGFibGVJdGVtc1tpXTsKLSAgICAgICAgICAgIGlmIChtb2RlbC5nZXRJbmNsdWRlZE5hbWVzcGFjZXMoKS5jb250YWluc0tleSh0YWJsZUl0ZW0uZ2V0VGV4dCgwKSkpIHsKLSAgICAgICAgICAgICAgICB0YWJsZUl0ZW0uc2V0Q2hlY2tlZCh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGFja2FnZU5hbWVUYWJsZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvV1NETDJKYXZhQ29uZmlnV2lkZ2V0RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvV1NETDJKYXZhQ29uZmlnV2lkZ2V0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTAwYmM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL1dTREwySmF2YUNvbmZpZ1dpZGdldEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YURlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkuQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5JTmFtZWRXaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5JTmFtZWRXaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIFdTREwySmF2YUNvbmZpZ1dpZGdldEZhY3RvcnkgaW1wbGVtZW50cyBJTmFtZWRXaWRnZXRDb250cmlidXRvckZhY3RvcnkgewotCi0gICAgcHJpdmF0ZSBTaW1wbGVXaWRnZXRDb250cmlidXRvciB3c2RsMkphdmFXaWRnZXRDb250cmlidXRvcjsKLSAgICBwcml2YXRlIFNpbXBsZVdpZGdldENvbnRyaWJ1dG9yIHdzZGwySmF2YURlZmF1bHRzV2lkZ2V0Q29udHJpYnV0b3I7Ci0KLSAgICBwcml2YXRlIFdTREwySmF2YUNvbmZpZ1dpZGdldCB3c2RsMkphdmFDb25maWdXaWRnZXQgPSBuZXcgV1NETDJKYXZhQ29uZmlnV2lkZ2V0KCk7Ci0gICAgcHJpdmF0ZSBXU0RMMkphdmFEZWZhdWx0c0NvbmZpZ1dpZGdldCB3c2RsMkphdmFEZWZhdWx0c0NvbmZpZ1dpZGdldCA9IG5ldyBXU0RMMkphdmFEZWZhdWx0c0NvbmZpZ1dpZGdldCgpOwotCi0gICAgcHVibGljIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIGdldEZpcnN0TmFtZWRXaWRnZXQoKSB7Ci0gICAgICAgIGlmICh3c2RsMkphdmFXaWRnZXRDb250cmlidXRvciA9PSBudWxsIHx8IHdzZGwySmF2YURlZmF1bHRzV2lkZ2V0Q29udHJpYnV0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgaW5pdCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB3c2RsMkphdmFXaWRnZXRDb250cmlidXRvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgZ2V0TmV4dE5hbWVkV2lkZ2V0KElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIHdpZGdldENvbnRyaWJ1dG9yKSB7Ci0gICAgICAgIGlmICh3aWRnZXRDb250cmlidXRvciA9PSB3c2RsMkphdmFXaWRnZXRDb250cmlidXRvcikgewotICAgICAgICAgICAgcmV0dXJuIHdzZGwySmF2YURlZmF1bHRzV2lkZ2V0Q29udHJpYnV0b3I7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpIHsKLSAgICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETDJKYXZhRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsCi0gICAgICAgICAgICAgICAgIldTREwySmF2YURhdGFNb2RlbCIsIFdTREwySmF2YUNvbmZpZ1dpZGdldEZhY3RvcnkuY2xhc3MpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0V1NETDJKYXZhRGF0YU1vZGVsKFdTREwySmF2YURhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICB3c2RsMkphdmFDb25maWdXaWRnZXQuc2V0V1NETDJKYXZhRGF0YU1vZGVsKG1vZGVsKTsKLSAgICAgICAgd3NkbDJKYXZhRGVmYXVsdHNDb25maWdXaWRnZXQuc2V0V1NETDJKYXZhRGF0YU1vZGVsKG1vZGVsKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHsKLSAgICAgICAgd3NkbDJKYXZhV2lkZ2V0Q29udHJpYnV0b3IgPSBuZXcgU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3IoKTsKLSAgICAgICAgQ1hGQ29udGV4dCBjb250ZXh0ID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V1NETDJKYXZhQ29udGV4dCgpOwotICAgICAgICBTdHJpbmcgd3NkbDJKYXZhUGFnZVRpdGxlID0gQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLldTREwySkFWQV9QQUdFX1RJVExFLCBuZXcgT2JqZWN0W117Y29udGV4dC5nZXREZWZhdWx0UnVudGltZVR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCl9KTsKLSAgICAgICAgd3NkbDJKYXZhV2lkZ2V0Q29udHJpYnV0b3Iuc2V0VGl0bGUod3NkbDJKYXZhUGFnZVRpdGxlKTsKLSAgICAgICAgd3NkbDJKYXZhV2lkZ2V0Q29udHJpYnV0b3IKLSAgICAgICAgLnNldERlc2NyaXB0aW9uKENYRkNyZWF0aW9uVUlNZXNzYWdlcy5iaW5kKENYRkNyZWF0aW9uVUlNZXNzYWdlcy5XU0RMMkpBVkFfUEFHRV9ERVNDUklQVElPTiwKLSAgICAgICAgICAgICAgICBjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVHlwZSgpKSk7Ci0gICAgICAgIHdzZGwySmF2YVdpZGdldENvbnRyaWJ1dG9yLnNldEZhY3RvcnkobmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHdzZGwySmF2YUNvbmZpZ1dpZGdldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgd3NkbDJKYXZhRGVmYXVsdHNXaWRnZXRDb250cmlidXRvciA9IG5ldyBTaW1wbGVXaWRnZXRDb250cmlidXRvcigpOwotICAgICAgICBTdHJpbmcgd3NkbDJKYXZhRGVmYXVsdHNQYWdlVGl0bGUgPSBDWEZDcmVhdGlvblVJTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJTWVzc2FnZXMuV1NETDJKQVZBX0RFRkFVTFRTX1BBR0VfVElUTEUsIG5ldyBPYmplY3RbXXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVUeXBlKCksIGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCl9KTsKLSAgICAgICAgd3NkbDJKYXZhRGVmYXVsdHNXaWRnZXRDb250cmlidXRvci5zZXRUaXRsZSh3c2RsMkphdmFEZWZhdWx0c1BhZ2VUaXRsZSk7Ci0gICAgICAgIHdzZGwySmF2YURlZmF1bHRzV2lkZ2V0Q29udHJpYnV0b3IKLSAgICAgICAgLnNldERlc2NyaXB0aW9uKENYRkNyZWF0aW9uVUlNZXNzYWdlcy5XU0RMMkpBVkFfREVGQVVMVFNfUEFHRV9ERVNDUklQVElPTik7Ci0gICAgICAgIHdzZGwySmF2YURlZmF1bHRzV2lkZ2V0Q29udHJpYnV0b3Iuc2V0RmFjdG9yeShuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkgewotICAgICAgICAgICAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gd3NkbDJKYXZhRGVmYXVsdHNDb25maWdXaWRnZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL1dTREwySmF2YURlZmF1bHRzQ29uZmlnV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9XU0RMMkphdmFEZWZhdWx0c0NvbmZpZ1dpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGNiZWM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL1dTREwySmF2YURlZmF1bHRzQ29uZmlnV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5DWEZNb2RlbFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkuQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0cy5XU0RMMkphdmFXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIFdTREwySmF2YURlZmF1bHRzQ29uZmlnV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yIHsKLSAgICBwcml2YXRlIFdTREwySmF2YURhdGFNb2RlbCBtb2RlbDsKLQotICAgIHB1YmxpYyBXU0RMMkphdmFEZWZhdWx0c0NvbmZpZ1dpZGdldCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXU0RMMkphdmFEYXRhTW9kZWwoV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyhmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcikgewotICAgICAgICBmaW5hbCBDb21wb3NpdGUgbWFpbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKTsKLSAgICAgICAgbWFpbkNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgbWFpbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBHcm91cCB3c2RsMmphdmFHcm91cCA9IG5ldyBHcm91cChtYWluQ29tcG9zaXRlLCBTV1QuU0hBRE9XX0lOKTsKLSAgICAgICAgd3NkbDJqYXZhR3JvdXAuc2V0VGV4dChDWEZDcmVhdGlvblVJTWVzc2FnZXMuV1NETDJKQVZBX0dST1VQX0xBQkVMKTsKLSAgICAgICAgR3JpZExheW91dCB3c2RsMmphdmFsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgd3NkbDJqYXZhR3JvdXAuc2V0TGF5b3V0KHdzZGwyamF2YWxheW91dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB3c2RsMmphdmFHcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZUdlbmVyYXRlU2VydmVyQnV0dG9uKHdzZGwyamF2YUdyb3VwLCBtb2RlbCk7Ci0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlR2VuZXJhdGVJbXBsZW1lbnRhdGlvbkJ1dHRvbih3c2RsMmphdmFHcm91cCwgbW9kZWwpOwotCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlRGVmYXVsdFZhbHVlc0J1dHRvbih3c2RsMmphdmFHcm91cCwgbW9kZWwpOwotCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlUHJvY2Vzc1NPQVBIZWFkZXJzQnV0dG9uKHdzZGwyamF2YUdyb3VwLCBtb2RlbCk7Ci0KLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVOYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbih3c2RsMmphdmFHcm91cCwgbW9kZWwpOwotCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlRXhjbHVkZXNOYW1lc3BhY2VNYXBwaW5nQnV0dG9uKHdzZGwyamF2YUdyb3VwLCBtb2RlbCk7Ci0KLSAgICAgICAgaWYgKENYRk1vZGVsVXRpbHMuaXNBdXRvTmFtZVJlc29sdXRpb25QZXJtaXR0ZWQoKSkgewotICAgICAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVBdXRvTmFtZVJlc29sdXRpb25CdXR0b24od3NkbDJqYXZhR3JvdXAsIG1vZGVsKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtb2RlbC5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKS5jb21wYXJlVG8oQ1hGQ29yZVBsdWdpbi5DWEZfVkVSU0lPTl8yXzEpID49IDApIHsKLSAgICAgICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlTm9BZGRyZXNzQmluZGluZ0J1dHRvbih3c2RsMmphdmFHcm91cCwgbW9kZWwpOwotICAgICAgICB9Ci0KLSAgICAgICAgR3JvdXAgeGpjQXJnR3JvdXAgPSBuZXcgR3JvdXAobWFpbkNvbXBvc2l0ZSwgU1dULlNIQURPV19JTik7Ci0gICAgICAgIHhqY0FyZ0dyb3VwLnNldFRleHQoQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLldTREwySkFWQV9YSkNfQVJHX0dST1VQX0xBQkVMKTsKLSAgICAgICAgR3JpZExheW91dCB4amNBcmdMYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgeGpjQXJnR3JvdXAuc2V0TGF5b3V0KHhqY0FyZ0xheW91dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB4amNBcmdHcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBUYWJsZSB4amNBcmdzVGFibGUgPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ0FyZ1RhYmxlKHhqY0FyZ0dyb3VwLCBtb2RlbCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgZ3JpZERhdGEudmVydGljYWxTcGFuID0gNjsKLSAgICAgICAgeGpjQXJnc1RhYmxlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDRGVmYXVsdFZhbHVlc1RhYmxlSXRlbSh4amNBcmdzVGFibGUsIG1vZGVsKTsKLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNUb1N0cmluZ1RhYmxlSXRlbSh4amNBcmdzVGFibGUsIG1vZGVsKTsKLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNUb1N0cmluZ011bHRpTGluZVRhYmxlSXRlbSh4amNBcmdzVGFibGUsIG1vZGVsKTsKLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNUb1N0cmluZ1NpbXBsZVRhYmxlSXRlbSh4amNBcmdzVGFibGUsIG1vZGVsKTsKLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNMb2NhdG9yVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgbW9kZWwpOwotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ1N5bmNNZXRob2RzVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgbW9kZWwpOwotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ01hcmtHZW5lcmF0ZWRUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBtb2RlbCk7Ci0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvV1NETDJKYXZhUHJvamVjdFNlbGVjdGlvbldpZGdldEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL1dTREwySmF2YVByb2plY3RTZWxlY3Rpb25XaWRnZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkN2MwNDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvV1NETDJKYXZhUHJvamVjdFNlbGVjdGlvbldpZGdldEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnMuU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHMuU2VydmVyV2l6YXJkV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzLlNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFQcm9qZWN0U2VsZWN0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotCi0vKioKLSAqIFRoaXMgaXMgc3RvcCBnYXAgd29ya2Fyb3VuZCBmb3IgYnVncyA8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQzMjg2Ij4jMjQzMjg2PC9hPgotICogYW5kIDxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDMyOTAiPiMyNDMyOTA8L2E+Ci0gKiA8cD4KLSAqIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCA8Y29kZT5XU0RMMkphdmFQcm9qZWN0U2VsZWN0aW9uQ29tbWFuZDwvY29kZT4KLSAqIAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIFdTREwySmF2YVByb2plY3RTZWxlY3Rpb25XaWRnZXRGYWN0b3J5IGltcGxlbWVudHMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5IHsKLQotCXB1YmxpYyBJTmFtZWRXaWRnZXRDb250cmlidXRvciBnZXRGaXJzdE5hbWVkV2lkZ2V0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgZ2V0TmV4dE5hbWVkV2lkZ2V0KElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIHdpZGdldENvbnRyaWJ1dG9yKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KSB7Ci0JCWRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiSW5pdGlhbFByb2plY3QiLCAgLy8kTk9OLU5MUy0xJAotCQkJCVdTREwySmF2YVByb2plY3RTZWxlY3Rpb25Db21tYW5kLmNsYXNzKTsKLQkgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgIC8vJE5PTi1OTFMtMSQKLQkgICAgCQlXU0RMMkphdmFQcm9qZWN0U2VsZWN0aW9uQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpOyAvLyROT04tTkxTLTEkCi0JICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldC5jbGFzcywgIlByb2plY3QiLCBXU0RMMkphdmFQcm9qZWN0U2VsZWN0aW9uQ29tbWFuZC5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd3NydC9DWEZXZWJTZXJ2aWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd3NydC9DWEZXZWJTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NjA0YjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dzcnQvQ1hGV2ViU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkud3NydDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zLkNsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLkNYRkRlcGxveUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLkNyZWF0ZURlcGxveW1lbnREZXNjcmlwdG9yQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuSkFYV1NBbm5vdGF0ZUphdmFDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5KYXZhMldTQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuSmF2YTJXU0RlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5KYXZhMldTU2VsZWN0U0VJQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuSmF2YTJXU1ZhbGlkYXRlSW5wdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFEZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhUHJvamVjdFNlbGVjdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuSUNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuZWNsaXBzZS5FY2xpcHNlRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuQWJzdHJhY3RXZWJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuV2ViU2VydmljZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuV2ViU2VydmljZVNjZW5hcmlvOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIENYRldlYlNlcnZpY2UgZXh0ZW5kcyBBYnN0cmFjdFdlYlNlcnZpY2UgewotCi0gICAgcHVibGljIENYRldlYlNlcnZpY2UoV2ViU2VydmljZUluZm8gaW5mbykgewotICAgICAgICBzdXBlcihpbmZvKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGFzc2VtYmxlKElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbGVjdGlvbiwKLSAgICAgICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIGVhclByb2plY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElDb21tYW5kRmFjdG9yeSBkZXBsb3koSUVudmlyb25tZW50IGVudmlyb25tZW50LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsZWN0aW9uLAotICAgICAgICAgICAgU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgZWFyUHJvamVjdCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGRldmVsb3AoSUVudmlyb25tZW50IGVudmlyb25tZW50LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsZWN0aW9uLAotICAgICAgICAgICAgU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgZWFyUHJvamVjdCkgewotICAgICAgICBWZWN0b3IgY29tbWFuZHMgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICAgICAgRWNsaXBzZUVudmlyb25tZW50IGVjbGlwc2VFbnZpcm9ubWVudCA9IChFY2xpcHNlRW52aXJvbm1lbnQpIGVudmlyb25tZW50OwotICAgICAgICByZWdpc3RlckRhdGFNYXBwaW5ncyhlY2xpcHNlRW52aXJvbm1lbnQuZ2V0Q29tbWFuZE1hbmFnZXIoKS5nZXRNYXBwaW5nUmVnaXN0cnkoKSk7Ci0KLSAgICAgICAgaWYgKGN0eC5nZXRTY2VuYXJpbygpLmdldFZhbHVlKCkgPT0gV2ViU2VydmljZVNjZW5hcmlvLkJPVFRPTVVQKSB7Ci0gICAgICAgICAgICBKYXZhMldTRGF0YU1vZGVsIGphdmEyV1NEYXRhTW9kZWwgPSBDWEZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKYXZhMldTRGF0YU1vZGVsKCk7Ci0gICAgICAgICAgICBqYXZhMldTRGF0YU1vZGVsLnNldFByb2plY3ROYW1lKHByb2plY3ROYW1lKTsKLSAgICAgICAgICAgIGphdmEyV1NEYXRhTW9kZWwuc2V0SmF2YVN0YXJ0aW5nUG9pbnQodGhpcy5nZXRXZWJTZXJ2aWNlSW5mbygpLmdldEltcGxVUkwoKSk7Ci0gICAgICAgICAgICBjb21tYW5kcy5hZGQobmV3IEphdmEyV1NWYWxpZGF0ZUlucHV0Q29tbWFuZChqYXZhMldTRGF0YU1vZGVsKSk7Ci0gICAgICAgICAgICBjb21tYW5kcy5hZGQobmV3IENyZWF0ZURlcGxveW1lbnREZXNjcmlwdG9yQ29tbWFuZChwcm9qZWN0TmFtZSkpOwotICAgICAgICAgICAgY29tbWFuZHMuYWRkKG5ldyBKYXZhMldTRGVmYXVsdGluZ0NvbW1hbmQoamF2YTJXU0RhdGFNb2RlbCkpOwotICAgICAgICAgICAgY29tbWFuZHMuYWRkKG5ldyBKYXZhMldTU2VsZWN0U0VJQ29tbWFuZChqYXZhMldTRGF0YU1vZGVsKSk7Ci0gICAgICAgICAgICBjb21tYW5kcy5hZGQobmV3IEpBWFdTQW5ub3RhdGVKYXZhQ29tbWFuZChqYXZhMldTRGF0YU1vZGVsKSk7Ci0gICAgICAgICAgICBjb21tYW5kcy5hZGQobmV3IEphdmEyV1NDb21tYW5kKGphdmEyV1NEYXRhTW9kZWwpKTsKLSAgICAgICAgfSBlbHNlIGlmIChjdHguZ2V0U2NlbmFyaW8oKS5nZXRWYWx1ZSgpID09IFdlYlNlcnZpY2VTY2VuYXJpby5UT1BET1dOKSB7Ci0gICAgICAgICAgICBXU0RMMkphdmFEYXRhTW9kZWwgd3NkbDJKYXZhRGF0YU1vZGVsID0gQ1hGRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV1NETDJKYXZhRGF0YU1vZGVsKCk7Ci0gICAgICAgICAgICB3c2RsMkphdmFEYXRhTW9kZWwuc2V0UHJvamVjdE5hbWUocHJvamVjdE5hbWUpOwotICAgICAgICAgICAgY29tbWFuZHMuYWRkKG5ldyBXU0RMMkphdmFQcm9qZWN0U2VsZWN0aW9uQ29tbWFuZCh3c2RsMkphdmFEYXRhTW9kZWwpKTsKLSAgICAgICAgICAgIGNvbW1hbmRzLmFkZChuZXcgQ3JlYXRlRGVwbG95bWVudERlc2NyaXB0b3JDb21tYW5kKHByb2plY3ROYW1lKSk7Ci0gICAgICAgICAgICBjb21tYW5kcy5hZGQobmV3IFdTREwySmF2YURlZmF1bHRpbmdDb21tYW5kKHdzZGwySmF2YURhdGFNb2RlbCwgcHJvamVjdE5hbWUsCi0gICAgICAgICAgICAgICAgICAgIGdldFdlYlNlcnZpY2VJbmZvKCkuZ2V0V3NkbFVSTCgpKSk7Ci0gICAgICAgICAgICBjb21tYW5kcy5hZGQobmV3IFdTREwySmF2YUNvbW1hbmQod3NkbDJKYXZhRGF0YU1vZGVsLCB0aGlzKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgU2ltcGxlQ29tbWFuZEZhY3RvcnkoY29tbWFuZHMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KSB7Ci0gICAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEphdmEyV1NDb21tYW5kLmNsYXNzLCAiQ1hGRGF0YU1vZGVsIiwgQ1hGRGVwbG95Q29tbWFuZC5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETDJKYXZhQ29tbWFuZC5jbGFzcywgIkNYRkRhdGFNb2RlbCIsIENYRkRlcGxveUNvbW1hbmQuY2xhc3MpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENYRkRlcGxveUNvbW1hbmQuY2xhc3MsICJDbGllbnRDb21wb25lbnRUeXBlIiwgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElDb21tYW5kRmFjdG9yeSBpbnN0YWxsKElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbGVjdGlvbiwKLSAgICAgICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIGVhclByb2plY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIElDb21tYW5kRmFjdG9yeSBydW4oSUVudmlyb25tZW50IGVudmlyb25tZW50LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsZWN0aW9uLAotICAgICAgICAgICAgU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgZWFyUHJvamVjdCkgewotICAgICAgICBWZWN0b3IgY29tbWFuZHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIGNvbW1hbmRzLmFkZChuZXcgQ1hGRGVwbG95Q29tbWFuZChwcm9qZWN0TmFtZSwgdGhpcykpOwotICAgICAgICByZXR1cm4gbmV3IFNpbXBsZUNvbW1hbmRGYWN0b3J5KGNvbW1hbmRzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgV2ViU2VydmljZUluZm8gZ2V0V2ViU2VydmljZUluZm8oKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRXZWJTZXJ2aWNlSW5mbygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93c3J0L0NYRldlYlNlcnZpY2VSdW50aW1lLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd3NydC9DWEZXZWJTZXJ2aWNlUnVudGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OThjNjg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93c3J0L0NYRldlYlNlcnZpY2VSdW50aW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLndzcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLnVpLndzcnQuQ1hGV2ViU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5BYnN0cmFjdFdlYlNlcnZpY2VSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LklXZWJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LklXZWJTZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LldlYlNlcnZpY2VDbGllbnRJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LldlYlNlcnZpY2VJbmZvOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIENYRldlYlNlcnZpY2VSdW50aW1lIGV4dGVuZHMgQWJzdHJhY3RXZWJTZXJ2aWNlUnVudGltZSB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVdlYlNlcnZpY2UgZ2V0V2ViU2VydmljZShXZWJTZXJ2aWNlSW5mbyBpbmZvKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ1hGV2ViU2VydmljZShpbmZvKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVdlYlNlcnZpY2VDbGllbnQgZ2V0V2ViU2VydmljZUNsaWVudChXZWJTZXJ2aWNlQ2xpZW50SW5mbyBpbmZvKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ1hGV2ViU2VydmljZUNsaWVudChpbmZvKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzIxZDBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MDM0MWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNhZGQxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jRnJpIE5vdiAwNyAyMzo1ODo1NSBFU1QgMjAwOAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNThmY2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5jeGYudWk7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLkNYRlVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLmRpYWxvZ3M7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLnZpZXdlcnM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aSxvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aSxvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpIgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIGphdmF4LndzZGw7YnVuZGxlLXZlcnNpb249IlsxLjYuMiwxLjcuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52O2J1bmRsZS12ZXJzaW9uPSJbMS4wLjMwNSwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjIwNCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWk7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwxLjUuMCkiCi1BbnQtVmVyc2lvbjogQXBhY2hlIEFudCAxLjcuMAotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1DcmVhdGVkLUJ5OiAxLjUuMF8xNC1iMDMgKFN1biBNaWNyb3N5c3RlbXMgSW5jLikKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDE2OWJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPlNlcHRlbWJlciAxMiwgMjAwODwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNjdjNDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGljb25zLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL2ljb25zL29iajE2L2xpYnJhcnlfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9pY29ucy9vYmoxNi9saWJyYXJ5X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNTVlMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL2ljb25zL29iajE2L2xpYnJhcnlfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9pY29ucy93aXpiYW4vbGlicmFyeV93aXoucG5nIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL2ljb25zL3dpemJhbi9saWJyYXJ5X3dpei5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNWRjMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL2ljb25zL3dpemJhbi9saWJyYXJ5X3dpei5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MjMwOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWU9Q1hGIFdlYiBTZXJ2aWNlcyBVSQotcGx1Z2luUHJvdmlkZXI9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotUFJFRkVSRU5DRV9DQVRFR09SWV9DWEZfUlVOVElNRT1DWEYgMi54IFByZWZlcmVuY2VzCi1QUk9QRVJUSUVTX0NBVEVHT1JZX0NYRl9SVU5USU1FPUNYRiAyLnggU2V0dGluZ3MKLQotQ1hGX1JVTlRJTUVfTkFNRT1DWEYgUnVudGltZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJiMTk0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLSAgICAgIDxwYWdlCi0gICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLnByZWZlcmVuY2VzLm5hbWUiCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5wcmVmZXJlbmNlcy5DWEZSdW50aW1lUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS5DWEZSdW50aW1lUHJlZmVyZW5jZXNQYWdlIgotICAgICAgICAgbmFtZT0iJVBSRUZFUkVOQ0VfQ0FURUdPUllfQ1hGX1JVTlRJTUUiPgotICAgICAgPC9wYWdlPiAKLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8IS0tPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJvcGVydHlQYWdlcyI+Ci0gICAgICA8cGFnZQotICAgICAgICAgbmFtZT0iJVBST1BFUlRJRVNfQ0FURUdPUllfQ1hGX1JVTlRJTUUiCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5wcm9wZXJ0aWVzLkNYRlByb3BlcnR5UGFnZSIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnByb3BlcnR5UGFnZXMuQ1hGUHJlZmVyZW5jZVBhZ2UiPgotICAgICAgICAgPGVuYWJsZWRXaGVuPgotICAgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLSAgICAgICAgICAgICAgIDx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgIHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0gICAgICAgICAgICAgICAgICB2YWx1ZT0iY3hmLmNvcmUiIC8+Ci0gICAgICAgICAgICA8L2FkYXB0PiAgICAgICAgIAotICAgICAgICAgPC9lbmFibGVkV2hlbj4KLSAgICAgIDwvcGFnZT4KLSAgIDwvZXh0ZW5zaW9uPiAtLT4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLndpemFyZFBhZ2VzIj4KLSAgICAgIDx3aXphcmQtcGFnZXMgYWN0aW9uPSJjeGYuY29yZS5pbnN0YWxsIj4KLSAgICAgICAgIDxwYWdlCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aXphcmRzLkNYRkZhY2V0SW5zdGFsbFdpemFyZFBhZ2UiPgotICAgICAgICAgPC9wYWdlPgotICAgICAgPC93aXphcmQtcGFnZXM+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuamR0LnVpLmNsYXNzcGF0aENvbnRhaW5lclBhZ2UiPgotICAgICAgPGNsYXNzcGF0aENvbnRhaW5lclBhZ2UKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpemFyZHMuQ1hGQ2xhc3NwYXRoQ29udGFpbmVyUGFnZSIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUuQ1hGX0NMQVNTUEFUSF9DT05UQUlORVIiCi0gICAgICAgICBuYW1lPSIlQ1hGX1JVTlRJTUVfTkFNRSI+Ci0gICAgICA8L2NsYXNzcGF0aENvbnRhaW5lclBhZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvQ1hGVUlNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL0NYRlVJTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ5NjQ3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvQ1hGVUlNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgQ1hGVUlNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuQ1hGVUltZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfUlVOVElNRV9IT01FX1RBQl9OQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9SVU5USU1FX0hPTUVfVEFCX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0NYRl9IT01FX0RJUl9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfUlVOVElNRV9OT1RfU0VUOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9BRERfQlVUVE9OX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9FRElUX0JVVFRPTl9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfUkVNT1ZFX0JVVFRPTl9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfQlJPV1NFX0JVVFRPTl9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfQ1hGX1ZFUlNJT05fTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0NYRl9UWVBFX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9FWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0RFU0NSSVBUSU9OX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9WRVJTSU9OX0NPTFVNTl9OQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9MT0NBVElPTl9DT0xVTU5fTkFNRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfVFlQRV9DT0xVTU5fTkFNRTsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9FTlRFUl9UWVBFX05BTUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0lOVkFMSURfVFlQRV9OQU1FOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1hGX1BST1BFUlRZX1BBR0VfUlVOVElNRV9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDWEZfQ09ORklHVVJFX0lOU1RBTExFRF9SVU5USU1FU19MQUJFTDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9JTlNUQUxMX1dJWkFSRF9QQUdFX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9JTlNUQUxMX1dJWkFSRF9QQUdFX0RFU0NSSVBUSU9OOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9JTlNUQUxMX1dJWkFSRF9BRERfV0lORE9XX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9JTlNUQUxMX1dJWkFSRF9FRElUX1dJTkRPV19USVRMRTsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9GQUNFVF9JTlNUQUxMX1dJWkFSRF9QQUdFX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9GQUNFVF9JTlNUQUxMX1dJWkFSRF9QQUdFX0RFU0NSSVBUSU9OOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19QUkVGRVJFTkNFU19UQUJfTkFNRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX1BSRUZFUkVOQ0VTX1RBQl9UT09MVElQOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU0RMX1BSRUZFUkVOQ0VTX1RBQl9OQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NETF9QUkVGRVJFTkNFU19UQUJfVE9PTFRJUDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05TX1BSRUZFUkVOQ0VTX1RBQl9OQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05TX1BSRUZFUkVOQ0VTX1RBQl9UT09MVElQOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1BSRUZFUkVOQ0VTX1RBQl9OQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9QUkVGRVJFTkNFU19UQUJfVE9PTFRJUDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNQUklOR19DT05GSUdfUFJFRkVSRU5DRVNfVEFCX05BTUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU1BSSU5HX0NPTkZJR19QUkVGRVJFTkNFU19UQUJfVE9PTFRJUDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05TX1BSRUZFUkVOQ0VTX0xJTks7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDWEZfREVGQVVMVF9GUk9OVEVORF9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDWEZfREVGQVVMVF9EQVRBQklORElOR19MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0dST1VQX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NETF9HUk9VUF9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfR1JPVVBfTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19HRU5fQ0xJRU5UX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfR0VOX1NFUlZFUl9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0dFTl9JTVBMRU1FTlRBVElPTl9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0dFTl9XUkFQUEVSX0ZBVUxUX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfR0VOX1dTRExfTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19ERUZBVUxUX1NPQVBCSU5ESU5HX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfR0VOX1hTRF9JTVBPUlRTOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9JTlZBTElEX1ZFUlNJT05fRk9STUFUOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9WRVJTSU9OX05PVF9TUEVDSUZJRUQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU1BSSU5HX0NPTkZJR19HUk9VUF9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTUFJJTkdfQ09ORklHX1VTRV9DWEZfU0VSVkxFVDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTUFJJTkdfQ09ORklHX1VTRV9DWEZfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1BST0NFU1NfU09BUF9IRUFERVJTOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9MT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VfTUFQUElORzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfVVNFX0RFRkFVTFRfRVhDTFVERVNfTkFNRVNQQUNFX01BUFBJTkc7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1dTRExfVkVSU0lPTl9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfVVNFX0RFRkFVTFRfVkFMVUVTOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfQU5OT1RBVElPTlNfR1JPVVBfTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfQU5OT1RBVElPTlNfR1JPVVBfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19HRU5FUkFURV9XRUJfTUVUSE9EOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0dFTkVSQVRFX1dFQl9QQVJBTTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19HRU5FUkFURV9SRVFVRVNUX1dSQVBQRVI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfR0VORVJBVEVfUkVTUE9OU0VfV1JBUFBFUjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19BTk5PVEFUSU9OU19QUk9DRVNTSU5HX0dST1VQX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0VOQUJMRV9BTk5PVEFUSU9OX1BST0NFU1NJTkc7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfRU5BQkxFX0FOTk9UQVRJT05fUFJPQ0VTU0lOR19UT09MVElQOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19TT0FQMTJfQklORElOR19UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfQ1JFQVRFX1hTRF9JTVBPUlRTX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19EQVRBQklORElOR19UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfRlJPTlRFTkRfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0dFTkVSQVRFX1dTRExfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0dFTkVSQVRFX1dSQVBQRVJCRUFOX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19HRU5FUkFURV9DTElFTlRfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0dFTkVSQVRFX1NFUlZFUl9UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfR0VORVJBVEVfQU5UX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19CRUFOU19UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfVEFSR0VUX05BTUVTUEFDRV9UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfU0VSVklDRV9OQU1FX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19QT1JUX05BTUVfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0FERFJFU1NfVE9PTFRJUDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfV1NETF9GSUxFX05BTUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19PVVRQVVRfRklMRV9UT09MVElQOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19VU0VfU0VJX0JVVFRPTjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX1VTRV9TRUlfSU5GT19MQUJFTDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfU0VMRUNUX1NFSTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX1NFTEVDVF9TRUlfTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19TRUxFQ1RfU0VJX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19CUk9XU0VfTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19FWFRSQUNUX1NFSTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0VYVFJBQ1RfU0VJX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfRVhUUkFDVF9TRUlfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0VYVFJBQ1RfTUVNQkVSU19MQUJFTDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfU0VMRUNUX0FMTF9CVVRUT047Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19ERVNFTEVDVF9BTExfQlVUVE9OOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19TRUxFQ1RfSU1QTEVNRU5UQVRJT047Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19TRUxFQ1RfSU1QTEVNRU5UQVRJT05fVE9PTFRJUDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9GUk9OVEVORF9UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9EQVRBQklORElOR19UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9XU0RMX1ZFUlNJT05fVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfR0VORVJBVEVfSU1QTEVNRU5UQVRJT05fVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfR0VORVJBVEVfQ0xJRU5UX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX0dFTkVSQVRFX1NFUlZFUl9UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9ERUZBVUxUX1ZBTFVFU19UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9FWENMVURFX05BTUVTUEFDRV9UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9QUk9DRVNTX1NPQVBfSEVBREVSU19UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9ERUZBVUxUX05BTUVTUEFDRV9MT0FESU5HX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX0VYQ0xVREVfTkFNRVNQQUNFX0xPQURJTkdfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfV1NETF9MT0NBVElPTl9UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9OT19BRERSRVNTX0JJTkRJTkc7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX05PX0FERFJFU1NfQklORElOR19UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9BVVRPX05BTUVfUkVTT0xVVElPTjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfQVVUT19OQU1FX1JFU09MVVRJT05fVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWE1MX0NBVEFMT0dfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWEpDX0FSR1NfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWEpDX0FSR19HUk9VUF9USVRMRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWEpDX0FSR19DT0xVTU5fTkFNRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWEpDX0RFU0NSSVBUSU9OX0NPTFVNTl9OQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9YSkNfREVGQVVMVF9WQUxVRVM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1hKQ19UT1NUUklORzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWEpDX1RPU1RSSU5HX01VTFRJTElORTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWEpDX1RPU1RSSU5HX1NJTVBMRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWEpDX0xPQ0FUT1I7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1hKQ19TWU5DX01FVEhPRFM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1hKQ19NQVJLX0dFTkVSQVRFRDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWEpDX0VQSVNPREVfRklMRTsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFU09VUkNFX1NFTEVDVElOX0RJQUxPR19CUk9XU0VfV09SS1NQQUNFX0JVVFRPTjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRVNPVVJDRV9TRUxFQ1RJTl9ESUFMT0dfQlJPV1NFX0ZJTEVfU1lTVEVNX0JVVFRPTjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRVNPVVJDRV9TRUxFQ1RJTl9ESUFMT0dfQlJPV1NFX0ZJTEVfTk9UX0ZPVU5EX0VSUk9SOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX09VVFBVVF9ESVJFQ1RPUlk7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX09VVFBVVF9ESVJFQ1RPUllfVE9PTFRJUDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9QQUNLQUdFX05BTUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1BBQ0tBR0VfTkFNRV9UT09MVElQOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1BBQ0tBR0VfTkFNRV9PUFRJT05BTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfUEFDS0FHRV9OQU1FX09QVElPTkFMX1RPT0xUSVA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfV1NETF9OQU1FU1BBQ0VfQ09MVU1OX0hFQURFUjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfUEFDS0FHRV9OQU1FX0NPTFVNTl9IRUFERVI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfU0VSVklDRV9OQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9TRVJWSUNFX05BTUVfVE9PTFRJUDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9CSU5ESU5HX0ZJTEVTOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9CSU5ESU5HX05BTUVfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfQklORElOR19GSUxFU19BREQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX0JJTkRJTkdfRklMRVNfUkVNT1ZFOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX0JJTkRJTkdfRklMRV9ESUFMT0dfVElUTEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX0JJTkRJTkdfRklMRV9ESUFMT0dfTUVTU0FHRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfQklORElOR19GSUxFX0RJQUxPR19GSUxURVJfTkFNRTsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9YTUxfQ0FUTE9HOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9YTUxfQ0FUTE9HX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1hNTF9DQVRMT0dfQlJPV1NFOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIC8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0gICAgICAgIE5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIENYRlVJTWVzc2FnZXMuY2xhc3MpOwotICAgIH0KLQotICAgIHByaXZhdGUgQ1hGVUlNZXNzYWdlcygpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvQ1hGVUlQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS9DWEZVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDEyMjk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS9DWEZVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENYRlVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLSAgICAvLyBUaGUgcGx1Zy1pbiBJRAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotICAgIHByaXZhdGUgc3RhdGljIENYRlVJUGx1Z2luIHBsdWdpbjsKLQotICAgIC8qKgotICAgICAqIFRoZSBjb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBDWEZVSVBsdWdpbigpIHsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnN0YXJ0KGNvbnRleHQpOwotICAgICAgICBwbHVnaW4gPSB0aGlzOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHBsdWdpbiA9IG51bGw7Ci0gICAgICAgIHN1cGVyLnN0b3AoY29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDWEZVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotICAgICAgICByZXR1cm4gcGx1Z2luOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2dNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgQ1hGVUlQbHVnaW4ubG9nKG5ldyBTdGF0dXMoc2V2ZXJpdHksIENYRlVJUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgQ1hGVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSBleGNlcHRpb24pIHsKLSAgICAgICAgQ1hGVUlQbHVnaW4ubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGVUlQbHVnaW4uUExVR0lOX0lELCAKLSAgICAgICAgICAgIGV4Y2VwdGlvbi50b1N0cmluZygpLCBleGNlcHRpb24pKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvQ1hGVUltZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL0NYRlVJbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRmMzIzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvQ1hGVUltZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jQ1hGIFByZWZlcmVuY2UgUGFnZXMKLUNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9SVU5USU1FX0hPTUVfVEFCX05BTUU9JkNYRiBSdW50aW1lCi1DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfUlVOVElNRV9IT01FX1RBQl9UT09MVElQPUJyb3dzZSBhbmQgc2VsZWN0IENYRiBCaW5hcnkgZGlzdHJpYnV0aW9uIGZvbGRlcgotQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0NYRl9IT01FX0RJUl9MQUJFTD1DWEYgJmhvbWU6Ci1DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfUlVOVElNRV9OT1RfU0VUPU1pc3NpbmcgQ1hGIGphcjogUGxlYXNlIHNlbGVjdCB0aGUgQ1hGIGhvbWUgZGlyZWN0b3J5LgotQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0FERF9CVVRUT05fTEFCRUw9JkFkZC4uLgotQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0VESVRfQlVUVE9OX0xBQkVMPUUmZGl0Li4uCi1DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfUkVNT1ZFX0JVVFRPTl9MQUJFTD0mUmVtb3ZlCi1DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfQlJPV1NFX0JVVFRPTl9MQUJFTD0mQnJvd3NlLi4uCi1DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfQ1hGX1ZFUlNJT05fTEFCRUw9JlZlcnNpb246Ci1DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfQ1hGX1RZUEVfTEFCRUw9JlR5cGU6Ci1DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSPUV4JnBvcnQgcnVudGltZSBsaWJyYXJpZXMgdG8gV0VCLUlORi9saWIgYXQgZGVwbG95bWVudCB0aW1lCi1DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfREVTQ1JJUFRJT05fTEFCRUw9QWRkLCByZW1vdmUgb3IgZWRpdCBDWEYgcnVudGltZXMuIEJ5IGRlZmF1bHQsIHRoZSBjaGVja2VkIENYRiBydW50aW1lIGlzIGFkZGVkIHRvIHRoZSBidWlsZCBwYXRoIG9mIGEgcHJvamVjdCB3aGVuIGluc3RhbGxpbmcgdGhlIENYRiBmYWNldC4KLUNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9WRVJTSU9OX0NPTFVNTl9OQU1FPVZlcnNpb24KLUNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9MT0NBVElPTl9DT0xVTU5fTkFNRT1Mb2NhdGlvbgotQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX1RZUEVfQ09MVU1OX05BTUU9VHlwZQotQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0VOVEVSX1RZUEVfTkFNRT1FbnRlciB0eXBlIG5hbWUKLUNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9JTlZBTElEX1RZUEVfTkFNRT1JbnZhbGlkIHR5cGUgbmFtZTogezB9Ci1DWEZfUFJPUEVSVFlfUEFHRV9SVU5USU1FX0xBQkVMPUMmWEYgcnVudGltZToKLUNYRl9DT05GSUdVUkVfSU5TVEFMTEVEX1JVTlRJTUVTX0xBQkVMPTxBPkNvbmZpZ3VyZSBpbnN0YWxsZWQgcnVudGltZXM8L0E+Ci0KLUNYRl9JTlNUQUxMX1dJWkFSRF9QQUdFX1RJVExFPUNYRiBSdW50aW1lCi1DWEZfSU5TVEFMTF9XSVpBUkRfUEFHRV9ERVNDUklQVElPTj1TcGVjaWZ5IHRoZSBob21lIGRpcmVjdG9yeSBvZiB0aGUgQ1hGIHJ1bnRpbWUuCi1DWEZfSU5TVEFMTF9XSVpBUkRfQUREX1dJTkRPV19USVRMRT1BZGQgQ1hGIFJ1bnRpbWUKLUNYRl9JTlNUQUxMX1dJWkFSRF9FRElUX1dJTkRPV19USVRMRT1FZGl0IENYRiBSdW50aW1lCi0KLUNYRl9GQUNFVF9JTlNUQUxMX1dJWkFSRF9QQUdFX1RJVExFPUNYRiBGYWNldAotQ1hGX0ZBQ0VUX0lOU1RBTExfV0laQVJEX1BBR0VfREVTQ1JJUFRJT049Q29uZmlndXJlIHRoZSBDWEYgZmFjZXQgc2V0dGluZ3MuCi0gICAgCi1KQVZBMldTRExfUFJFRkVSRU5DRVNfVEFCX05BTUU9SmF2YTJXU0RMCi1KQVZBMldTRExfUFJFRkVSRU5DRVNfVEFCX1RPT0xUSVA9UGxlYXNlIHNlbGVjdCB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlcyBmb3IgdGhlIEphdmEyV1NETCB0b29sCi0KLUpBVkEyV1NfUFJFRkVSRU5DRVNfVEFCX05BTUU9JkphdmEyV1MKLUpBVkEyV1NfUFJFRkVSRU5DRVNfVEFCX1RPT0xUSVA9UGxlYXNlIHNlbGVjdCB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlcyBmb3IgdGhlIEphdmEyV1MgdG9vbAotCi1BTk5PVEFUSU9OU19QUkVGRVJFTkNFU19MSU5LPVNlZSB0aGUgPEE+J0pBWC1XUyc8L0E+IHRhYiBmb3IgdGhlIGFubm90YXRpb24gcHJlZmVyZW5jZXMuCi0KLUFOTk9UQVRJT05TX1BSRUZFUkVOQ0VTX1RBQl9OQU1FPUpBJlgtV1MKLUFOTk9UQVRJT05TX1BSRUZFUkVOQ0VTX1RBQl9UT09MVElQPVBsZWFzZSBzZWxlY3QgdGhlIEpBWC1XUyBhbm5vdGF0aW9ucyB0aGF0IGFyZSBnZW5lcmF0ZWQgYnkgZGVmYXVsdCBvbiB0aGUgY2xhc3Mgb3IgaW50ZXJmYWNlIGJlZm9yZSBpbnB1dCB0byBKYXZhMldTCi0KLVdTREwySkFWQV9QUkVGRVJFTkNFU19UQUJfTkFNRT0mV1NETDJKYXZhCi1XU0RMMkpBVkFfUFJFRkVSRU5DRVNfVEFCX1RPT0xUSVA9UGxlYXNlIHNlbGVjdCB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlcyBmb3IgdGhlIFdTREwySmF2YSB0b29sCi0KLVNQUklOR19DT05GSUdfUFJFRkVSRU5DRVNfVEFCX05BTUU9RSZuZHBvaW50IENvbmZpZwotU1BSSU5HX0NPTkZJR19QUkVGRVJFTkNFU19UQUJfVE9PTFRJUD1QbGVhc2Ugc2VsZWN0IHRoZSBkZWZhdWx0IG9wdGlvbiBmb3IgU3ByaW5nIGNvbmZpZ3VyYXRpb24gZ2VuZXJhdGlvbgotU1BSSU5HX0NPTkZJR19VU0VfQ1hGX1NFUlZMRVQ9VXNlIENYJkYgU2VydmxldAotU1BSSU5HX0NPTkZJR19VU0VfQ1hGX1NQUklOR19BUFBMSUNBVElPTl9DT05URVhUPVVzZSBTcHJpbmcgJkFwcGxpY2F0aW9uIENvbnRleHQKLQotQ1hGX0RFRkFVTFRfRlJPTlRFTkRfTEFCRUw9RGVmYXVsdCAmRnJvbnRlbmQ6Ci1DWEZfREVGQVVMVF9EQVRBQklORElOR19MQUJFTD1EZWZhdWx0ICZEYXRhYmluZG5nOgotSkFWQTJXU19HUk9VUF9MQUJFTD1KYXZhMldTIEdlbmVyYXRpb24gT3B0aW9uczoKLUpBVkEyV1NETF9HUk9VUF9MQUJFTD1KYXZhMldTREwgR2VuZXJhdGlvbiBPcHRpb25zOgotV1NETDJKQVZBX0dST1VQX0xBQkVMPVdTREwySmF2YSBHZW5lcmF0aW9uIE9wdGlvbnM6Ci1KQVZBMldTX0dFTl9DTElFTlRfTEFCRUw9JkdlbmVyYXRlIENsaWVudAotSkFWQTJXU19HRU5fU0VSVkVSX0xBQkVMPUdlbmVyYXRlIFNlciZ2ZXIKLUpBVkEyV1NfR0VOX0lNUExFTUVOVEFUSU9OX0xBQkVMPUdlbmVyYXRlICZJbXBsZW1lbnRhdGlvbgotSkFWQTJXU19HRU5fV1JBUFBFUl9GQVVMVF9MQUJFTD1HZW5lcmF0ZSBXcmFwcGVyIGFuZCBGYXVsdCAmQmVhbnMKLUpBVkEyV1NfR0VOX1dTRExfTEFCRUw9R2VuZXJhdGUgV1NEJkwKLUpBVkEyV1NfREVGQVVMVF9TT0FQQklORElOR19MQUJFTD1EZWZhdWx0IFMmT0FQIEJpbmRpbmc6Ci1KQVZBMldTX0dFTl9YU0RfSU1QT1JUUz1HZW5lcmF0ZSBzZXBhcmF0ZSBYU0QgZm9yIHRoZSAmdHlwZXMKLUNYRl9JTlZBTElEX1ZFUlNJT05fRk9STUFUPUludmFsaWQgVmVyc2lvbiBGb3JtYXQKLUNYRl9WRVJTSU9OX05PVF9TUEVDSUZJRUQ9Q1hGIHZlcnNpb24gdmFsdWUgbm90IHNwZWNpZmllZAotU1BSSU5HX0NPTkZJR19HUk9VUF9MQUJFTD1DWEYgRW5kcG9pbnQgQ29uZmlndXJhdGlvbiBPcHRpb25zOgotV1NETDJKQVZBX1BST0NFU1NfU09BUF9IRUFERVJTPUVuYWJsZSAmcHJvY2Vzc2luZyBvZiBpbXBsaWNpdCBTT0FQIGhlYWRlcnMKLVdTREwySkFWQV9MT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VfTUFQUElORz1FbmFibGUgJmxvYWRpbmcgb2YgdGhlIGRlZmF1bHQgbmFtZXNwYWNlIHBhY2thZ2UgbmFtZSBtYXBwaW5nCi1XU0RMMkpBVkFfVVNFX0RFRkFVTFRfRVhDTFVERVNfTkFNRVNQQUNFX01BUFBJTkc9RW5hYmxlIHRoZSB1c2Ugb2YgdGhlIGRlZmF1bHQgJmV4Y2x1ZGVzIG5hbWVzcGFjZSBtYXBwaW5nCi1XU0RMMkpBVkFfV1NETF9WRVJTSU9OX0xBQkVMPVdTREwgVmVyc2lvbjoKLVdTREwySkFWQV9VU0VfREVGQVVMVF9WQUxVRVM9R2VuZXJhdGUgJmRlZmF1bHQgdmFsdWVzIGZvciB0aGUgZ2VuZXJhdGVkIGFydGlmYWN0cwotCi1KQVhXU19BTk5PVEFUSU9OU19HUk9VUF9MQUJFTD1KQVgtV1MgQW5ub3RhdGlvbiBHZW5lcmF0aW9uCi1KQVhXU19BTk5PVEFUSU9OU19HUk9VUF9UT09MVElQPVNlbGVjdCB0aGUgYW5ub3RhdGlvbnMgd2hpY2ggYXJlIGdlbmVyYXRlZCBieSBkZWZhdWx0IG9uIHRoZSBjbGFzcyBvciBpbnRlcmZhY2UgYmVmb3JlIGlucHV0IHRvIEphdmEyV1MKLUpBWFdTX0dFTkVSQVRFX1dFQl9NRVRIT0Q9QFdlYiZNZXRob2QKLUpBWFdTX0dFTkVSQVRFX1dFQl9QQVJBTT1AV2ViJlBhcmFtCi1KQVhXU19HRU5FUkFURV9SRVFVRVNUX1dSQVBQRVI9QFJlJnF1ZXN0V3JhcHBlcgotSkFYV1NfR0VORVJBVEVfUkVTUE9OU0VfV1JBUFBFUj1AJlJlc3BvbnNlV3JhcHBlcgotSkFYV1NfQU5OT1RBVElPTlNfUFJPQ0VTU0lOR19HUk9VUF9MQUJFTD1KQVgtV1MgQW5ub3RhdGlvbiBQcm9jZXNzaW5nCi1KQVhXU19FTkFCTEVfQU5OT1RBVElPTl9QUk9DRVNTSU5HPSZFbmFibGUgYW5ub3RhdGlvbiB2YWxpZGF0aW9uIHByb2Nlc3NpbmcKLUpBWFdTX0VOQUJMRV9BTk5PVEFUSU9OX1BST0NFU1NJTkdfVE9PTFRJUD1UdXJuIEpBWC1XUyBhbm5vdGF0aW9uIHByb2Nlc3Npbmcgb24gb3Igb2ZmIGluIHByb2plY3RzIGNvbmZpZ3VyZWQgZm9yIHswfSB3ZWIgc2VydmljZXMKLSAgICAKLUpBVkEyV1NfU09BUDEyX0JJTkRJTkdfVE9PTFRJUD1TcGVjaWZ5IHRvIGdlbmVyYXRlIFNPQVAgMS4yIGJpbmRpbmcKLUpBVkEyV1NfQ1JFQVRFX1hTRF9JTVBPUlRTX1RPT0xUSVA9IE91dHB1dCBzY2hlbWFzIHRvIHNlcGFyYXRlIGZpbGVzIGFuZCB1c2UgaW1wb3J0cyB0byBsb2FkIHRoZW0gaW5zdGVhZCBvZiBpbmxpbmluZyB0aGVtIGludG8gdGhlIHdzZGwKLUpBVkEyV1NfREFUQUJJTkRJTkdfVE9PTFRJUD0gU3BlY2lmeSB0aGUgZGF0YSBiaW5kaW5nLiBEZWZhdWx0IGlzIGpheGIgZm9yIGpheHdzIGZyb250ZW5kCi0jSkFWQTJXU19EQVRBQklORElOR19UT09MVElQPSBTcGVjaWZ5IHRoZSBkYXRhIGJpbmRpbmcgKGFlZ2lzIG9yIGpheGIpLiBEZWZhdWx0IGlzIGpheGIgZm9yIGpheHdzIGZyb250ZW5kLCBhbmQgYWVnaXMgZm9yIHNpbXBsZSBmcm9udGVuZAotSkFWQTJXU19GUk9OVEVORF9UT09MVElQPVNwZWNpZnkgdGhlIGZyb250ZW5kIHRvIHVzZQotI0pBVkEyV1NfRlJPTlRFTkRfVE9PTFRJUD1TcGVjaWZ5IHRoZSBmcm9udGVuZCB0byB1c2UuIGpheHdzIGFuZCB0aGUgc2ltcGxlIGZyb250ZW5kIGFyZSBzdXBwb3J0ZWQKLUpBVkEyV1NfR0VORVJBVEVfV1NETF9UT09MVElQPVNwZWNpZnkgdG8gZ2VuZXJhdGUgdGhlIFdTREwgZmlsZQotSkFWQTJXU19HRU5FUkFURV9XUkFQUEVSQkVBTl9UT09MVElQPVNwZWNpZnkgdG8gZ2VuZXJhdGUgdGhlIHdyYXBwZXIgYW5kIGZhdWx0IGJlYW4KLUpBVkEyV1NfR0VORVJBVEVfQ0xJRU5UX1RPT0xUSVA9R2VuZXJhdGUgYSBjbGllbnQgbWFpbmxpbmUgdXNpbmcgSkFYLVdTIEFQSXNcbi4uLi4uXG4gamF2YXgueG1sLndzLlNlcnZpY2Ugc2VydmljZSA9IGphdmF4LnhtbC53cy5TZXJ2aWNlLmNyZWF0ZSguLi4pO1xuLi4uIGNsaWVudCA9IHNlcnZpY2UuZ2V0UG9ydCguLi4pO1xuCi1KQVZBMldTX0dFTkVSQVRFX1NFUlZFUl9UT09MVElQPUdlbmVyYXRlIGEgc2VydmVyIG1haW5saW5lIHVzaW5nIEpBWC1XUyBBUElzXG4uLi4uLlxuIGphdmF4LnhtbC53cy5FbmRwb2ludC5wdWJsaXNoKC4uLik7XG4uLi4uLlxuCi1KQVZBMldTX0dFTkVSQVRFX0FOVF9UT09MVElQPVNwZWNpZnkgdG8gZ2VuZXJhdGUgYW4gQW50IGJ1aWxkLnhtbCBmaWxlCi1KQVZBMldTX0JFQU5TX1RPT0xUSVA9U3BlY2lmeSB0aGUgcGF0aG5hbWUgb2YgYSBmaWxlIGRlZmluaW5nIGFkZGl0aW9uYWwgU3ByaW5nIGJlYW5zIHRvIGN1c3RvbWlzZSBkYXRhIGJpbmRpbmcgY29uZmlndXJhdGlvbgotSkFWQTJXU19UQVJHRVRfTkFNRVNQQUNFX1RPT0xUSVA9U3BlY2lmeSB0aGUgdGFyZ2V0IG5hbWVzcGFjZSB0byB1c2UgaW4gdGhlIHdzZGwKLUpBVkEyV1NfU0VSVklDRV9OQU1FX1RPT0xUSVA9U3BlY2lmeSB0aGUgc2VydmljZSBuYW1lIHRvIHVzZSBpbiB0aGUgZ2VuZXJhdGVkIHdzZGwKLUpBVkEyV1NfUE9SVF9OQU1FX1RPT0xUSVA9U3BlY2lmeSB0aGUgcG9ydCBuYW1lIHRvIHVzZSBpbiB0aGUgZ2VuZXJhdGVkIHdzZGwKLUpBVkEyV1NfQUREUkVTU19UT09MVElQPSBTcGVjaWZ5IHRoZSBwb3J0IGFkZHJlc3MKLQotSkFWQTJXU19XU0RMX0ZJTEVfTkFNRT0mV1NETCBGaWxlOgotSkFWQTJXU19PVVRQVVRfRklMRV9UT09MVElQPVNwZWNpZnkgdGhlIG91dHB1dCB3c2RsIGZpbGUgbmFtZQotCi1KQVZBMldTX1VTRV9TRUlfQlVUVE9OPSZVc2UgYSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZToKLUpBVkEyV1NfVVNFX1NFSV9JTkZPX0xBQkVMPShZb3UgbWF5IHdvcmsgZGlyZWN0bHkgd2l0aCB0aGUgezB9IEphdmEgY2xhc3MuIEJ1dCB3b3JraW5nIGZyb20gYW4gaW50ZXJmYWNlIGlzIHRoZSByZWNvbW1lbmRlZCBhcHByb2FjaC4gVHdvIG9wdGlvbnMgYXJlIHByb3ZpZGVkIGhlcmUuKQotSkFWQTJXU19TRUxFQ1RfU0VJPVNlbGVjdCBTRUk6Ci0jSkFWQTJXU19TRUxFQ1RfU0VJX0xBQkVMPVNlbGVjdCBTRUkgZnJvbSAmVHlwZSBIaWVyYXJjaHk6Ci1KQVZBMldTX1NFTEVDVF9TRUlfTEFCRUw9U2VsZWMmdCBhbiBTRUk6Ci1KQVZBMldTX1NFTEVDVF9TRUlfVE9PTFRJUD1TZWxlY3QgdGhlIEludGVyZmFjZSBmcm9tIHRoZSBUeXBlIEhpZXJhcmNoeSB0byB1c2UgYXMgdGhlIFNFSQotSkFWQTJXU19CUk9XU0VfTEFCRUw9QnJvJndzZS4uLgotSkFWQTJXU19FWFRSQUNUX1NFST1FeHRyYWN0IFNFSToKLUpBVkEyV1NfRVhUUkFDVF9TRUlfTEFCRUw9JkNyZWF0ZSBhbiBTRUk6Ci1KQVZBMldTX0VYVFJBQ1RfU0VJX1RPT0xUSVA9VHlwZSB0aGUgbmFtZSBvZiB0aGUgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgdG8gZXh0cmFjdAotSkFWQTJXU19FWFRSQUNUX01FTUJFUlNfTEFCRUw9TWVtYmVycyB0byBkZWNsYXJlIGluIHRoZSBleHRyYWN0ZWQgU0VJOgotSkFWQTJXU19TRUxFQ1RfQUxMX0JVVFRPTj0mU2VsZWN0IEFsbC4uLgotSkFWQTJXU19ERVNFTEVDVF9BTExfQlVUVE9OPSZEZXNlbGVjdCBBbGwuLi4KLUpBVkEyV1NfU0VMRUNUX0lNUExFTUVOVEFUSU9OPVNlbGVjdCAmSW1wbGVtZW50YXRpb246Ci1KQVZBMldTX1NFTEVDVF9JTVBMRU1FTlRBVElPTl9UT09MVElQPVNlbGVjdCB0aGUgSW1wbGVtZW50YXRpb24KLQotV1NETDJKQVZBX0ZST05URU5EX1RPT0xUSVA9U3BlY2lmeSB0aGUgZnJvbnRlbmQuIERlZmF1bHQgaXMgSkFYV1MuIEN1cnJlbnRseSBzdXBwb3J0cyBvbmx5IEpBWFdTIGZyb250ZW5kCi1XU0RMMkpBVkFfREFUQUJJTkRJTkdfVE9PTFRJUD1TcGVjaWZ5IHRoZSBkYXRhYmluZGluZy4gRGVmYXVsdCBpcyBKQVhCLiBDdXJyZW50bHkgc3VwcG9ydHMgb25seSBKQVhCIGRhdGFiaW5kaW5nCi1XU0RMMkpBVkFfV1NETF9WRVJTSU9OX1RPT0xUSVA9U3BlY2lmeSB0aGUgd3NkbCB2ZXJzaW9uIC5EZWZhdWx0IGlzIFdTREwxLjEuIEN1cnJlbnRseSBzdXBwb3J0cyBvbmx5IFdTREwxLjEgdmVyc2lvbgotV1NETDJKQVZBX0dFTkVSQVRFX0lNUExFTUVOVEFUSU9OX1RPT0xUSVA9R2VuZXJhdGUgc3RhcnRpbmcgcG9pbnQgY29kZSBmb3IgYW4gaW1wbGVtZW50YXRpb24gb2JqZWN0Ci1XU0RMMkpBVkFfR0VORVJBVEVfQ0xJRU5UX1RPT0xUSVA9R2VuZXJhdGUgdGhlIGNsaWVudCBjb2RlCi1XU0RMMkpBVkFfR0VORVJBVEVfU0VSVkVSX1RPT0xUSVA9R2VuZXJhdGUgdGhlIHNlcnZlciBjb2RlCi1XU0RMMkpBVkFfREVGQVVMVF9WQUxVRVNfVE9PTFRJUD1HZW5lcmF0ZSBkZWZhdWx0IHZhbHVlcyBpbiB0aGUgaW1wbGVtZW50YXRpb24gYW5kIGNsaWVudC4gSWdub3JlZCBpZiBpbXBsZW1lbnRhdGlvbiBvciBjbGllbnQgaXMgbm90IGJlaW5nIGdlbmVyYXRlZAotV1NETDJKQVZBX0VYQ0xVREVfTkFNRVNQQUNFX1RPT0xUSVA9SWdub3JlIHRoZSBzcGVjaWZpZWQgV1NETCBzY2hlbWEgbmFtZXNwYWNlcyB3aGVuIGdlbmVyYXRpbmcgY29kZQotV1NETDJKQVZBX1BST0NFU1NfU09BUF9IRUFERVJTX1RPT0xUSVA9RW5hYmxlcyBvciBkaXNhYmxlcyBwcm9jZXNzaW5nIG9mIGV4dGVuZGVkIHNvYXAgaGVhZGVyIG1lc3NhZ2UgYmluZGluZwotV1NETDJKQVZBX0RFRkFVTFRfTkFNRVNQQUNFX0xPQURJTkdfVE9PTFRJUD1FbmFibGVzIG9yIGRpc2FibGVzIGxvYWRpbmcgb2YgdGhlIGRlZmF1bHQgbmFtZXNwYWNlIHBhY2thZ2UgbmFtZSBtYXBwaW5nCi1XU0RMMkpBVkFfRVhDTFVERV9OQU1FU1BBQ0VfTE9BRElOR19UT09MVElQPUVuYWJsZXMgb3IgZGlzYWJsZXMgbG9hZGluZyBvZiB0aGUgZGVmYXVsdCBleGNsdWRlcyBuYW1lc3BhY2UgbWFwcGluZwotV1NETDJKQVZBX1dTRExfTE9DQVRJT05fVE9PTFRJUD1TcGVjaWZpZXMgdGhlIHZhbHVlIG9mIHRoZSBAV2ViU2VydmljZSBhbm5vdGF0aW9uJ3Mgd3NkbExvY2F0aW9uIHByb3BlcnR5Ci1XU0RMMkpBVkFfWE1MX0NBVEFMT0dfVE9PTFRJUD1TcGVjaWZ5IHRoZSBVUkwgb2YgYW4gWE1MIGNhdGFsb2cgdG8gdXNlIGZvciByZXNvbHZpbmcgaW1wb3J0ZWQgc2NoZW1hcyBhbmQgV1NETCBkb2N1bWVudHMKLVdTREwySkFWQV9OT19BRERSRVNTX0JJTkRJTkc9VXNlIHRoZSB7MH0gcHJvcHJpZXRhcnkgV1MtJkFkZHJlc3NpbmcgdHlwZQotV1NETDJKQVZBX05PX0FERFJFU1NfQklORElOR19UT09MVElQPVVzZSB0aGUgezB9IHByb3ByaWV0YXJ5IFdTLUFkZHJlc3NpbmcgdHlwZSBpbnN0ZWFkIG9mIHRoZSBKQVgtV1MgMi4xIGNvbXBsaWFudCBtYXBwaW5nCi1XU0RMMkpBVkFfQVVUT19OQU1FX1JFU09MVVRJT049RW5hYmxlIEF1dG8gTmFtZSAmUmVzb2x1dGlvbgotV1NETDJKQVZBX0FVVE9fTkFNRV9SRVNPTFVUSU9OX1RPT0xUSVA9QXV0b21hdGljYWxseSByZXNvbHZlIG5hbWluZyBjb25mbGljdHMgd2l0aG91dCByZXF1aXJpbmcgdGhlIHVzZSBvZiBiaW5kaW5nIGN1c3RvbWl6YXRpb25zCi1XU0RMMkpBVkFfWEpDX0FSR1NfVE9PTFRJUD1TcGVjaWZ5IHRoZSBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIGRpcmVjdGx5IHRvIHRoZSBYSkMKLVdTREwySkFWQV9YSkNfQVJHX0dST1VQX1RJVExFPVhKQyBBcmd1bWVudHMKLVdTREwySkFWQV9YSkNfQVJHX0NPTFVNTl9OQU1FPVhKQyBBcmcKLVdTREwySkFWQV9YSkNfREVTQ1JJUFRJT05fQ09MVU1OX05BTUU9RGVzY3JpcHRpb24KLVdTREwySkFWQV9YSkNfREVGQVVMVF9WQUxVRVM9SW5pdGlhbGlzZSBmaWVsZHMgbWFwcGVkIGZyb20gZWxlbWVudHMgd2l0aCB0aGVpciBkZWZhdWx0IHZhbHVlcwotV1NETDJKQVZBX1hKQ19UT1NUUklORz1BY3RpdmF0ZSBwbHVnaW4gdG8gYWRkIGEgdG9TdHJpbmcoKSBtZXRob2QgdG8gZ2VuZXJhdGVkIGNsYXNzZXMKLVdTREwySkFWQV9YSkNfVE9TVFJJTkdfTVVMVElMSU5FPUhhdmUgdG9TdHJpbmcgcHJvZHVjZSBtdWx0aSBsaW5lIG91dHB1dAotV1NETDJKQVZBX1hKQ19UT1NUUklOR19TSU1QTEU9SGF2ZSB0b1N0cmluZyBwcm9kdWNlIHNpbmdsZSBsaW5lIHRlcnNlIG91dHB1dAotV1NETDJKQVZBX1hKQ19MT0NBVE9SPUVuYWJsZSBzb3VyY2UgbG9jYXRpb24gc3VwcG9ydCBmb3IgZ2VuZXJhdGVkIGNvZGUKLVdTREwySkFWQV9YSkNfU1lOQ19NRVRIT0RTPUdlbmVyYXRlIGFjY2Vzc29yIG1ldGhvZHMgd2l0aCB0aGUgJ3N5bmNocm9uaXplZCcga2V5d29yZAotV1NETDJKQVZBX1hKQ19NQVJLX0dFTkVSQVRFRD1BZGQgQEdlbmVyYXRlZCBhbm5vdGF0aW9ucyB0byB0aGUgZ2VuZXJhdGVkIGNvZGUKLSNNYXJrIHRoZSBnZW5lcmF0ZWQgY29kZSBhcyBAamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQKLVdTREwySkFWQV9YSkNfRVBJU09ERV9GSUxFPSBHZW5lcmF0ZSB0aGUgZXBpc29kZSBmaWxlIGZvciBzZXBhcmF0ZSBjb21waWxhdGlvbgotI1Jlc291cmNlIFNlbGVjdGlvbiBEaWFsb2cKLVJFU09VUkNFX1NFTEVDVElOX0RJQUxPR19CUk9XU0VfV09SS1NQQUNFX0JVVFRPTj1Ccm93c2UgJldvcmtzcGFjZS4uLgotUkVTT1VSQ0VfU0VMRUNUSU5fRElBTE9HX0JST1dTRV9GSUxFX1NZU1RFTV9CVVRUT049QnJvd3NlICZGaWxlIFN5c3RlbS4uLgotUkVTT1VSQ0VfU0VMRUNUSU5fRElBTE9HX0JST1dTRV9GSUxFX05PVF9GT1VORF9FUlJPUj1GaWxlIE5vdCBGb3VuZAotCi1XU0RMMkpBVkFfT1VUUFVUX0RJUkVDVE9SWT0mT3V0cHV0IERpcmVjdG9yeToKLVdTREwySkFWQV9PVVRQVVRfRElSRUNUT1JZX1RPT0xUSVA9U3BlY2lmeSB0aGUgZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIGdlbmVyYXRlZCBjb2RlIGZpbGVzIGFyZSB3cml0dGVuCi0KLVdTREwySkFWQV9QQUNLQUdFX05BTUU9JlBhY2thZ2UgTmFtZToKLVdTREwySkFWQV9QQUNLQUdFX05BTUVfVE9PTFRJUD1UaGUgamF2YSBwYWNrYWdlIG5hbWUgdG8gdXNlIGZvciB0aGUgZ2VuZXJhdGVkIGNvZGUKLQotV1NETDJKQVZBX1BBQ0tBR0VfTkFNRV9PUFRJT05BTD1TcGVjaWZ5ICZXU0RMIE5hbWVwc2FjZSB0byBQYWNrYWdlIE5hbWUgTWFwcGluZ3MKLVdTREwySkFWQV9QQUNLQUdFX05BTUVfT1BUSU9OQUxfVE9PTFRJUD1PcHRpb25hbGx5IHNwZWNpZnkgdGhlIHdzZGwgbmFtZXNwYWNlIG1hcHBpbmcgdG8gYSBwYXJ0aWN1bGFyIGphdmEgcGFja2FnZSBuYW1lCi0KLVdTREwySkFWQV9XU0RMX05BTUVTUEFDRV9DT0xVTU5fSEVBREVSPVdTREwgTmFtZXNwYWNlCi1XU0RMMkpBVkFfUEFDS0FHRV9OQU1FX0NPTFVNTl9IRUFERVI9UGFja2FnZSBOYW1lCi0KLVdTREwySkFWQV9TRVJWSUNFX05BTUU9JlNlcnZpY2UgTmFtZToKLVdTREwySkFWQV9TRVJWSUNFX05BTUVfVE9PTFRJUD1TcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBXU0RMIHNlcnZpY2UgZm9yIHdoaWNoIGNvZGUgaXMgdG8gYmUgZ2VuZXJhdGVkLiBUaGUgZGVmYXVsdCBpcyB0byBnZW5lcmF0ZSBjb2RlIGZvciBldmVyeSBzZXJ2aWNlIGluIHRoZSBXU0RMIGRvY3VtZW50Ci0KLVdTREwySkFWQV9CSU5ESU5HX0ZJTEVTPSZCaW5kaW5nIEZpbGVzOgotV1NETDJKQVZBX0JJTkRJTkdfTkFNRV9UT09MVElQPVNwZWNpZnkgemVybywgb3IgbW9yZSwgSkFYV1Mgb3IgSkFYQiBiaW5kaW5nIGZpbGVzCi1XU0RMMkpBVkFfQklORElOR19GSUxFU19BREQ9JkFkZC4uLgotV1NETDJKQVZBX0JJTkRJTkdfRklMRVNfUkVNT1ZFPSZSZW1vdmUuLi4KLQotV1NETDJKQVZBX0JJTkRJTkdfRklMRV9ESUFMT0dfVElUTEU9QnJvd3NlIGZvciBCaW5kaW5nIEZpbGUKLVdTREwySkFWQV9CSU5ESU5HX0ZJTEVfRElBTE9HX01FU1NBR0U9QmluZGluZyBGaWxlOgotV1NETDJKQVZBX0JJTkRJTkdfRklMRV9ESUFMT0dfRklMVEVSX05BTUU9SkFYV1Mgb3IgSkFYQiBCaW5kaW5nIEZpbGVzICgqLnhtbCkKLQotV1NETDJKQVZBX1hNTF9DQVRMT0c9WE1MIENhdGFsb2c6Ci1XU0RMMkpBVkFfWE1MX0NBVExPR19UT09MVElQPVNwZWNpZnkgY2F0YWxvZyBmaWxlIHRvIG1hcCB0aGUgaW1wb3J0ZWQgd3NkbC9zY2hlbWEKLVdTREwySkFWQV9YTUxfQ0FUTE9HX0JST1dTRT1Ccm93c2UuLi4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS9kaWFsb2dzL1Jlc291cmNlU2VsZWN0aW9uRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvZGlhbG9ncy9SZXNvdXJjZVNlbGVjdGlvbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmVmY2QxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS9kaWFsb2dzL1Jlc291cmNlU2VsZWN0aW9uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5DWEZVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuQ1hGVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNlbGVjdGlvblN0YXR1c0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLQotLyoqCi0gKiBBIDxjb2RlPlNlbGVjdGlvblN0YXR1c0RpYWxvZzwvY29kZT4gd2hpY2ggYWxsb3dzIHRoZSBzZWxlY3Rpb24gb2YgZmlsZXMKLSAqIHdpdGggYSBzcGVjaWZpYyBleHRlbnNpb24gZnJvbSB0aGUgd29ya3NwYWNlIG9yIGZpbGUgc3lzdGVtLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZVNlbGVjdGlvbkRpYWxvZyBleHRlbmRzIFNlbGVjdGlvblN0YXR1c0RpYWxvZyB7Ci0gICAgcHJpdmF0ZSBJU3RhdHVzIE9LX0ZJTEVfU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBDWEZVSVBsdWdpbi5QTFVHSU5fSUQsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBJU3RhdHVzIEVSUk9SX0ZJTEVfU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZVSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICBDWEZVSU1lc3NhZ2VzLlJFU09VUkNFX1NFTEVDVElOX0RJQUxPR19CUk9XU0VfRklMRV9OT1RfRk9VTkRfRVJST1IpOwotCi0gICAgcHJpdmF0ZSBJU3RhdHVzIFZBTElEQVRFX1NFTEVDVElPTl9TVEFUVVMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRlVJUGx1Z2luLlBMVUdJTl9JRCwgIiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIFRleHQgcmVzb3VyY2VUZXh0OwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmlsdGVyRXh0ZW5zaW9uOwotICAgIHByaXZhdGUgU3RyaW5nIGZpbHRlck5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIDxjb2RlPlJlc291cmNlU2VsZWN0aW9uRGlhbG9nPC9jb2RlPgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKiBAcGFyYW0gZmlsdGVyRXh0ZW5zaW9uCi0gICAgICogICAgICAgICAgICB0aGUgZmlsZSBuYW1lIGV4dGVuc2lvbiB3aGljaCB0aGUgZGlhbG9ncyB3aWxsIHVzZSB0byBmaWx0ZXIKLSAgICAgKiAgICAgICAgICAgIGZpbGVzCi0gICAgICogQHBhcmFtIGZpbHRlck5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIHRoYXQgZGVzY3JpYmVzIHRoZSBmaWx0ZXJFeHRlbnNpb24KLSAgICAgKiBAcGFyYW0gZGlhbG9nVGl0bGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBkaWFsb2cgdGl0bGUKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VTZWxlY3Rpb25EaWFsb2coU2hlbGwgcGFyZW50LCBTdHJpbmcgZmlsdGVyRXh0ZW5zaW9uLCBTdHJpbmcgZmlsdGVyTmFtZSwgU3RyaW5nIGRpYWxvZ1RpdGxlKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudCk7Ci0KLSAgICAgICAgdGhpcy5maWx0ZXJFeHRlbnNpb24gPSBmaWx0ZXJFeHRlbnNpb247Ci0gICAgICAgIHRoaXMuZmlsdGVyTmFtZSA9IGZpbHRlck5hbWU7Ci0KLSAgICAgICAgc2V0VGl0bGUoZGlhbG9nVGl0bGUpOwotICAgICAgICBzZXRTdGF0dXNMaW5lQWJvdmVCdXR0b25zKHRydWUpOwotICAgICAgICBpbnQgc2hlbGxTdHlsZSA9IGdldFNoZWxsU3R5bGUoKTsKLSAgICAgICAgc2V0U2hlbGxTdHlsZShzaGVsbFN0eWxlIHwgU1dULk1BWCB8IFNXVC5SRVNJWkUpOwotICAgICAgICB1cGRhdGVTdGF0dXMoVkFMSURBVEVfU0VMRUNUSU9OX1NUQVRVUyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIGZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0KLSAgICAgICAgQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS53aWR0aEhpbnQgPSA1MDA7Ci0gICAgICAgIGJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7Ci0gICAgICAgIGJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAgICAgTGFiZWwgbWVzc2FnZUxhYmVsID0gY3JlYXRlTWVzc2FnZUFyZWEoYnV0dG9uQ29tcG9zaXRlKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBtZXNzYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgQnV0dG9uIGJyb3dzZVdvcmtzcGFjZSA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0gICAgICAgIGJyb3dzZVdvcmtzcGFjZS5zZXRUZXh0KENYRlVJTWVzc2FnZXMuUkVTT1VSQ0VfU0VMRUNUSU5fRElBTE9HX0JST1dTRV9XT1JLU1BBQ0VfQlVUVE9OKTsKLSAgICAgICAgYnJvd3NlV29ya3NwYWNlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgU2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IGNyZWF0ZVdvcmtzcGFjZVJlc291cmNlRGlhbG9nKGNvbXBvc2l0ZS5nZXRTaGVsbCgpKTsKLSAgICAgICAgICAgICAgICBpZiAoZGlhbG9nLm9wZW4oKSA9PSBTZWxlY3Rpb25EaWFsb2cuT0spIHsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gcmVzdWx0ID0gZGlhbG9nLmdldFJlc3VsdCgpOwotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSByZXN1bHRbMF07Ci0gICAgICAgICAgICAgICAgICAgIHJlc291cmNlVGV4dC5zZXRUZXh0KHJlc291cmNlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5FTkQsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBicm93c2VXb3Jrc3BhY2Uuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgQnV0dG9uIGJyb3dzZUZpbGVTeXN0ZW0gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotICAgICAgICBicm93c2VGaWxlU3lzdGVtLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5SRVNPVVJDRV9TRUxFQ1RJTl9ESUFMT0dfQlJPV1NFX0ZJTEVfU1lTVEVNX0JVVFRPTik7Ci0gICAgICAgIGJyb3dzZUZpbGVTeXN0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBGaWxlRGlhbG9nIGRpYWxvZyA9IGNyZWF0ZUZpbGVTeXN0ZW1SZXNvdXJjZURpYWxvZyhjb21wb3NpdGUuZ2V0U2hlbGwoKSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IGRpYWxvZy5vcGVuKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSVBhdGggZmlsdGVyUGF0aCA9IG5ldyBQYXRoKGRpYWxvZy5nZXRGaWx0ZXJQYXRoKCkpOwotICAgICAgICAgICAgICAgIFN0cmluZyBidWlsZEZpbGVOYW1lID0gZGlhbG9nLmdldEZpbGVOYW1lKCk7Ci0gICAgICAgICAgICAgICAgSVBhdGggcGF0aCA9IGZpbHRlclBhdGguYXBwZW5kKGJ1aWxkRmlsZU5hbWUpLm1ha2VBYnNvbHV0ZSgpOwotCi0gICAgICAgICAgICAgICAgcmVzb3VyY2VUZXh0LnNldFRleHQocGF0aC50b09TU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkVORCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGJyb3dzZUZpbGVTeXN0ZW0uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgcmVzb3VyY2VUZXh0ID0gbmV3IFRleHQoYnV0dG9uQ29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIHJlc291cmNlVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2UgPSByZXNvdXJjZVRleHQuZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHJlc291cmNlKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICBzZXRSZXN1bHQoQXJyYXlzLmFzTGlzdChyZXNvdXJjZSkpOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVTdGF0dXMoT0tfRklMRV9TVEFUVVMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhFUlJPUl9GSUxFX1NUQVRVUyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICByZXNvdXJjZVRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNlbGVjdGlvbkRpYWxvZyBjcmVhdGVXb3Jrc3BhY2VSZXNvdXJjZURpYWxvZyhTaGVsbCBzaGVsbCkgewotICAgICAgICBFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyB3b3Jrc3BhY2VSZXNvdXJjZURpYWxvZyA9IG5ldyBFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyhzaGVsbCwKLSAgICAgICAgICAgICAgICBuZXcgV29ya2JlbmNoTGFiZWxQcm92aWRlcigpLCBuZXcgV29ya2JlbmNoQ29udGVudFByb3ZpZGVyKCkpOwotCi0gICAgICAgIHdvcmtzcGFjZVJlc291cmNlRGlhbG9nLnNldFRpdGxlKGdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIHdvcmtzcGFjZVJlc291cmNlRGlhbG9nLnNldE1lc3NhZ2UoZmlsdGVyTmFtZSk7Ci0gICAgICAgIHdvcmtzcGFjZVJlc291cmNlRGlhbG9nLnNldEFsbG93TXVsdGlwbGUoZmFsc2UpOwotCi0gICAgICAgIHdvcmtzcGFjZVJlc291cmNlRGlhbG9nLmFkZEZpbHRlcihuZXcgVmlld2VyRmlsdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudEVsZW1lbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRmlsZSkgewotICAgICAgICAgICAgICAgICAgICBJRmlsZSBmaWxlID0gKElGaWxlKSBlbGVtZW50OwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZS5pc0FjY2Vzc2libGUoKSAmJiBmaWxlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHMoZmlsdGVyRXh0ZW5zaW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQcm9qZWN0ICYmICEoKElQcm9qZWN0KSBlbGVtZW50KS5pc09wZW4oKSkgewotICAgICAgICAgICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBlbGVtZW50OwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvamVjdC5pc0FjY2Vzc2libGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElDb250YWluZXIgY29udGFpbmVyID0gKElDb250YWluZXIpIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBjb250YWluZXIubWVtYmVycygpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJUmVzb3VyY2UgcmVzb3VyY2UgOiByZXNvdXJjZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0KHZpZXdlciwgcGFyZW50RWxlbWVudCwgcmVzb3VyY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGVUlQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHdvcmtzcGFjZVJlc291cmNlRGlhbG9nLnNldFZhbGlkYXRvcihuZXcgSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcigpIHsKLQotICAgICAgICAgICAgcHVibGljIElTdGF0dXMgdmFsaWRhdGUoT2JqZWN0W10gc2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbi5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBzZWxlY3RlZCA9IHNlbGVjdGlvblswXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgSUZpbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElGaWxlIGZpbGUgPSAoSUZpbGUpIHNlbGVjdGVkOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFscyhmaWx0ZXJFeHRlbnNpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9LX0ZJTEVfU1RBVFVTOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBWQUxJREFURV9TRUxFQ1RJT05fU1RBVFVTOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB3b3Jrc3BhY2VSZXNvdXJjZURpYWxvZy5zZXRJbnB1dChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLQotICAgICAgICByZXR1cm4gd29ya3NwYWNlUmVzb3VyY2VEaWFsb2c7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBGaWxlRGlhbG9nIGNyZWF0ZUZpbGVTeXN0ZW1SZXNvdXJjZURpYWxvZyhTaGVsbCBzaGVsbCkgewotICAgICAgICBGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsLCBTV1QuT1BFTik7Ci0gICAgICAgIGRpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7ICIqIiArIGZpbHRlckV4dGVuc2lvbiB9KTsgLy8kTk9OLU5MUy0xJDsKLSAgICAgICAgZGlhbG9nLnNldEZpbHRlck5hbWVzKG5ldyBTdHJpbmdbXSB7IGZpbHRlck5hbWUgfSk7Ci0gICAgICAgIHJldHVybiBkaWFsb2c7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgY29tcHV0ZVJlc3VsdCgpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3ByZWZlcmVuY2VzL0NYRlJ1bnRpbWVQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3ByZWZlcmVuY2VzL0NYRlJ1bnRpbWVQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzhmM2M1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS9wcmVmZXJlbmNlcy9DWEZSdW50aW1lUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZJbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5DWEZNb2RlbFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuQ1hGVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLkNYRlVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0cy5Bbm5vdGF0aW9uc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHMuQmxhbmtSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aWRnZXRzLkNYRjIwV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aWRnZXRzLkNYRjIxV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aWRnZXRzLkphdmEyV1NETFJ1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHMuSmF2YTJXU1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHMuU3ByaW5nQ29uZmlnQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2l6YXJkcy5DWEZJbnN0YWxsV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLQotcHVibGljIGNsYXNzIENYRlJ1bnRpbWVQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLSAgICAvLyAgICBwcml2YXRlIElTdGF0dXMgQ1hGX0xPQ0FUSU9OX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgQ1hGVUlQbHVnaW4uUExVR0lOX0lELCBudWxsKTsKLSAgICAvLyAgICBwcml2YXRlIElTdGF0dXMgT0tfU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBDWEZVSVBsdWdpbi5QTFVHSU5fSUQsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgIC8vCi0gICAgcHJpdmF0ZSBJU2VsZWN0aW9uIHByZXZpb3VzSW5zdGFsbCA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCk7Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBhZGRCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gZWRpdEJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiByZW1vdmVCdXR0b247Ci0KLSAgICBwcml2YXRlIENoZWNrYm94VGFibGVWaWV3ZXIgY3hmSW5zdGFsbGF0aW9uczsKLQotICAgIHByaXZhdGUgQnV0dG9uIGV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lckJ1dHRvbjsKLQotICAgIHByaXZhdGUgQ1hGQ29udGV4dCBjb250ZXh0OwotCi0gICAgcHJpdmF0ZSBKYXZhMldTRExSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUgamF2YTJXU0RMUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlOwotICAgIHByaXZhdGUgSmF2YTJXU1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZSBqYXZhMldTUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlIDsKLQotICAgIHByaXZhdGUgQ1hGMjBXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZSBjeGYyMFdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlOwotICAgIHByaXZhdGUgQ1hGMjFXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZSBjeGYyMVdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlOwotCi0gICAgcHJpdmF0ZSBBbm5vdGF0aW9uc0NvbXBvc2l0ZSBhbm5vdGF0aW9uc0NvbXBvc2l0ZTsKLQotICAgIHByaXZhdGUgU3ByaW5nQ29uZmlnQ29tcG9zaXRlIHNwcmluZ0NvbmZpZ0NvbXBvc2l0ZTsKLQotICAgIHByaXZhdGUgU3RhY2tMYXlvdXQgamF2YTJXU1N0YWNrTGF5b3V0OwotICAgIHByaXZhdGUgU3RhY2tMYXlvdXQgd3NkbDJqYXZhU3RhY2tMYXlvdXQ7Ci0gICAgcHJpdmF0ZSBTdGFja0xheW91dCBqYXh3c1N0YWNrTGF5b3V0OwotICAgIHByaXZhdGUgU3RhY2tMYXlvdXQgc3ByaW5nQ29uZmlnU3RhY2tMYXlvdXQ7Ci0KLSAgICBwcml2YXRlIENvbXBvc2l0ZSBqYXZhMldTUHJlZmVybmNlc0dyb3VwOwotICAgIHByaXZhdGUgQ29tcG9zaXRlIHdzZGwySmF2YVByZWZlcmVuY2VzR3JvdXA7Ci0gICAgcHJpdmF0ZSBDb21wb3NpdGUgamF4d3NQcmVmZXJlbmNlc0dyb3VwOwotICAgIHByaXZhdGUgQ29tcG9zaXRlIHNwcmluZ0NvbmZpZ1ByZWZlcm5jZXNHcm91cDsKLQotICAgIHByaXZhdGUgQ29tcG9zaXRlIGphdmEyV1NETFByZWZlcmVuY2VzQ29tcG9zaXRlOwotICAgIHByaXZhdGUgQ29tcG9zaXRlIGphdmEyV1NQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLQotICAgIHByaXZhdGUgQ29tcG9zaXRlIGpheHdzUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0KLSAgICBwcml2YXRlIENvbXBvc2l0ZSB3c2RsMkphdmEyMFByZWZlcmVuY2VzQ29tcG9zaXRlOwotICAgIHByaXZhdGUgQ29tcG9zaXRlIHdzZGwySmF2YTIxUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0KLSAgICBwcml2YXRlIENvbXBvc2l0ZSBzcHJpbmdQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLQotICAgIHByaXZhdGUgQmxhbmtSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUgamF2YTJXU0JsYW5rUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0gICAgcHJpdmF0ZSBCbGFua1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZSB3c2RsMkphdmFCbGFua1ByZWZlcmVuY2VzQ29tcG9zaXRlOwotICAgIHByaXZhdGUgQmxhbmtSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUgamF4d3NCbGFua1ByZWZlcmVuY2VzQ29tcG9zaXRlOwotICAgIHByaXZhdGUgQmxhbmtSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUgc3ByaW5nQ29uZmlnQmxhbmtQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLQotICAgIHByaXZhdGUgSW1hZ2UgbGlicmFyeUltYWdlOwotCi0gICAgcHVibGljIENYRlJ1bnRpbWVQcmVmZXJlbmNlUGFnZSgpIHsKLSAgICAgICAgbGlicmFyeUltYWdlID0gQ1hGVUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihDWEZVSVBsdWdpbi5QTFVHSU5fSUQsICJpY29ucy9vYmoxNi9saWJyYXJ5X29iai5naWYiKS5jcmVhdGVJbWFnZSgpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgY29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCk7Ci0KLSAgICAgICAgZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLSAgICAgICAgR3JpZExheW91dCBtYWluTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChtYWluTGF5b3V0KTsKLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIFRhYkZvbGRlciBjeGZQcmVmZXJlbmNlVGFiID0gbmV3IFRhYkZvbGRlcihjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAgICAgY3hmUHJlZmVyZW5jZVRhYi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICAvL0NYRiBSdW50aW1lIExvY2F0aW9uCi0gICAgICAgIFRhYkl0ZW0gcnVudGltZUluc3RhbExvY2F0aW9uSXRlbSA9IG5ldyBUYWJJdGVtKGN4ZlByZWZlcmVuY2VUYWIsIFNXVC5OT05FKTsKLSAgICAgICAgcnVudGltZUluc3RhbExvY2F0aW9uSXRlbS5zZXRUZXh0KENYRlVJTWVzc2FnZXMuQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX1JVTlRJTUVfSE9NRV9UQUJfTkFNRSk7Ci0gICAgICAgIHJ1bnRpbWVJbnN0YWxMb2NhdGlvbkl0ZW0uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfUlVOVElNRV9IT01FX1RBQl9UT09MVElQKTsKLQotICAgICAgICBmaW5hbCBDb21wb3NpdGUgcnVudGltZUdyb3VwID0gbmV3IENvbXBvc2l0ZShjeGZQcmVmZXJlbmNlVGFiLCBTV1QuTk9ORSk7Ci0KLSAgICAgICAgcnVudGltZUluc3RhbExvY2F0aW9uSXRlbS5zZXRDb250cm9sKHJ1bnRpbWVHcm91cCk7Ci0gICAgICAgIHJ1bnRpbWVHcm91cC5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLkNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9SVU5USU1FX0hPTUVfVEFCX1RPT0xUSVApOwotCi0gICAgICAgIEdyaWRMYXlvdXQgcnVudGltZUxvYWN0aW9ubGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgcnVudGltZUxvYWN0aW9ubGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotICAgICAgICBydW50aW1lTG9hY3Rpb25sYXlvdXQubWFyZ2luSGVpZ2h0ID0gMTA7Ci0gICAgICAgIHJ1bnRpbWVHcm91cC5zZXRMYXlvdXQocnVudGltZUxvYWN0aW9ubGF5b3V0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAgICAgcnVudGltZUdyb3VwLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIExhYmVsIHJ1bnRpbWVUYWJEZXNjcmlwdGlvbkxhYmVsID0gbmV3IExhYmVsKHJ1bnRpbWVHcm91cCwgU1dULldSQVApOwotICAgICAgICBydW50aW1lVGFiRGVzY3JpcHRpb25MYWJlbC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0RFU0NSSVBUSU9OX0xBQkVMKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIGdyaWREYXRhLndpZHRoSGludCA9IDMwMDsKLSAgICAgICAgcnVudGltZVRhYkRlc2NyaXB0aW9uTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgVGFibGUgaW5zdGFsbFRhYmxlID0gbmV3IFRhYmxlKHJ1bnRpbWVHcm91cCwgU1dULkNIRUNLIHwgU1dULk1VTFRJIHwgU1dULkJPUkRFUgotICAgICAgICAgICAgICAgIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLSAgICAgICAgaW5zdGFsbFRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLSAgICAgICAgaW5zdGFsbFRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0KLSAgICAgICAgVGFibGVMYXlvdXQgdGFibGVMYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLSAgICAgICAgaW5zdGFsbFRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0KLSAgICAgICAgY3hmSW5zdGFsbGF0aW9ucyA9IG5ldyBDaGVja2JveFRhYmxlVmlld2VyKGluc3RhbGxUYWJsZSk7Ci0gICAgICAgIGN4Zkluc3RhbGxhdGlvbnMuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGlmIChldmVudC5nZXRDaGVja2VkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0Q2hlY2tlZEluc3RhbGwoZXZlbnQuZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzZXRDaGVja2VkSW5zdGFsbChudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGN4Zkluc3RhbGxhdGlvbnMuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaW50IG5vRWxlbWVudHMgPSBzZWxlY3Rpb24uc2l6ZSgpOwotICAgICAgICAgICAgICAgIGlmIChub0VsZW1lbnRzID4gMSkgewotICAgICAgICAgICAgICAgICAgICBlZGl0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGVkaXRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoIXNlbGVjdGlvbi5pc0VtcHR5KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgVGFibGVWaWV3ZXJDb2x1bW4gdmVyc2lvblZpZXdlckNvbHVtbiA9IG5ldyBUYWJsZVZpZXdlckNvbHVtbihjeGZJbnN0YWxsYXRpb25zLCBTV1QuTEVGVCk7Ci0gICAgICAgIHZlcnNpb25WaWV3ZXJDb2x1bW4uc2V0TGFiZWxQcm92aWRlcihuZXcgQ29sdW1uTGFiZWxQcm92aWRlcigpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENYRkluc3RhbGwpIHsKLSAgICAgICAgICAgICAgICAgICAgQ1hGSW5zdGFsbCBpbnN0YWxsID0gKENYRkluc3RhbGwpIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB2ZXJzaW9uID0gaW5zdGFsbC5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKS50cmltKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENYRkluc3RhbGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpYnJhcnlJbWFnZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBUYWJsZUNvbHVtbiB2ZXJzaW9uQ29sdW1uID0gdmVyc2lvblZpZXdlckNvbHVtbi5nZXRDb2x1bW4oKTsKLSAgICAgICAgdmVyc2lvbkNvbHVtbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX1ZFUlNJT05fQ09MVU1OX05BTUUpOwotICAgICAgICB2ZXJzaW9uQ29sdW1uLnBhY2soKTsKLQotICAgICAgICBDb2x1bW5XZWlnaHREYXRhIGNvbHVtbldlaWdodERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSg1MCwgNTAsIHRydWUpOwotICAgICAgICB0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKGNvbHVtbldlaWdodERhdGEpOwotCi0gICAgICAgIFRhYmxlVmlld2VyQ29sdW1uIGxvY2F0aW9uVmlld2VyQ29sdW1uID0gbmV3IFRhYmxlVmlld2VyQ29sdW1uKGN4Zkluc3RhbGxhdGlvbnMsIFNXVC5MRUZUKTsKLSAgICAgICAgbG9jYXRpb25WaWV3ZXJDb2x1bW4uc2V0TGFiZWxQcm92aWRlcihuZXcgQ29sdW1uTGFiZWxQcm92aWRlcigpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENYRkluc3RhbGwpIHsKLSAgICAgICAgICAgICAgICAgICAgQ1hGSW5zdGFsbCBpbnN0YWxsID0gKENYRkluc3RhbGwpIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YWxsLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKS50cmltKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBUYWJsZUNvbHVtbiBsb2NhdGlvbkNvbHVtbiA9IGxvY2F0aW9uVmlld2VyQ29sdW1uLmdldENvbHVtbigpOwotICAgICAgICBsb2NhdGlvbkNvbHVtbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0xPQ0FUSU9OX0NPTFVNTl9OQU1FKTsKLSAgICAgICAgbG9jYXRpb25Db2x1bW4ucGFjaygpOwotCi0gICAgICAgIGNvbHVtbldlaWdodERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSg1MCwgMTUwLCB0cnVlKTsKLSAgICAgICAgdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShjb2x1bW5XZWlnaHREYXRhKTsKLQotICAgICAgICBUYWJsZVZpZXdlckNvbHVtbiB0eXBlVmlld2VyQ29sdW1uID0gbmV3IFRhYmxlVmlld2VyQ29sdW1uKGN4Zkluc3RhbGxhdGlvbnMsIFNXVC5MRUZUKTsKLSAgICAgICAgdHlwZVZpZXdlckNvbHVtbi5zZXRMYWJlbFByb3ZpZGVyKG5ldyBDb2x1bW5MYWJlbFByb3ZpZGVyKCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQ1hGSW5zdGFsbCkgewotICAgICAgICAgICAgICAgICAgICBDWEZJbnN0YWxsIGluc3RhbGwgPSAoQ1hGSW5zdGFsbCkgZWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbGwuZ2V0VHlwZSgpLnRvU3RyaW5nKCkudHJpbSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgVGFibGVDb2x1bW4gdHlwZUNvbHVtbiA9IHR5cGVWaWV3ZXJDb2x1bW4uZ2V0Q29sdW1uKCk7Ci0gICAgICAgIHR5cGVDb2x1bW4uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9UWVBFX0NPTFVNTl9OQU1FKTsKLSAgICAgICAgdHlwZUNvbHVtbi5wYWNrKCk7Ci0KLSAgICAgICAgY29sdW1uV2VpZ2h0RGF0YSA9IG5ldyBDb2x1bW5XZWlnaHREYXRhKDUwLCAxMDAsIHRydWUpOwotICAgICAgICB0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKGNvbHVtbldlaWdodERhdGEpOwotCi0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgZ3JpZERhdGEudmVydGljYWxTcGFuID0gNTsKLSAgICAgICAgY3hmSW5zdGFsbGF0aW9ucy5nZXRUYWJsZSgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIGN4Zkluc3RhbGxhdGlvbnMuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpIHsKLQotICAgICAgICAgICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgQ29sbGVjdGlvbjw/PikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChDb2xsZWN0aW9uPD8+KSBpbnB1dEVsZW1lbnQpLnRvQXJyYXkoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbXSB7fTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGN4Zkluc3RhbGxhdGlvbnMuc2V0Q29tcGFyYXRvcihuZXcgVmlld2VyQ29tcGFyYXRvcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvYmoxLCBPYmplY3Qgb2JqMikgewotICAgICAgICAgICAgICAgIGlmIChvYmoxIGluc3RhbmNlb2YgQ1hGSW5zdGFsbCAmJiBvYmoyIGluc3RhbmNlb2YgQ1hGSW5zdGFsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChDWEZJbnN0YWxsKSBvYmoxKS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKS50cmltKCkuY29tcGFyZVRvKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ1hGSW5zdGFsbCkgb2JqMikuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCkudHJpbSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmNvbXBhcmUodmlld2VyLCBvYmoxLCBvYmoyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgY3hmSW5zdGFsbGF0aW9ucy5zZXRJbnB1dChjb250ZXh0LmdldEluc3RhbGxhdGlvbnMoKS52YWx1ZXMoKSk7Ci0KLSAgICAgICAgYWRkQnV0dG9uID0gbmV3IEJ1dHRvbihydW50aW1lR3JvdXAsIFNXVC5OT05FKTsKLSAgICAgICAgYWRkQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfQUREX0JVVFRPTl9MQUJFTCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQkVHSU5OSU5HLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBhZGRCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIGFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBDWEZJbnN0YWxsV2l6YXJkIGluc3RhbGxXaXphcmQgPSBuZXcgQ1hGSW5zdGFsbFdpemFyZCgpOwotICAgICAgICAgICAgICAgIFdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKGdldFNoZWxsKCksIGluc3RhbGxXaXphcmQpOwotICAgICAgICAgICAgICAgIGlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotICAgICAgICAgICAgICAgICAgICBjeGZJbnN0YWxsYXRpb25zLnJlZnJlc2goKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGVkaXRCdXR0b24gPSBuZXcgQnV0dG9uKHJ1bnRpbWVHcm91cCwgU1dULk5PTkUpOwotICAgICAgICBlZGl0QnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfRURJVF9CVVRUT05fTEFCRUwpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkJFR0lOTklORywgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgZWRpdEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgZWRpdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGN4Zkluc3RhbGxhdGlvbnMuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIENYRkluc3RhbGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY3hmSW5zdGFsbGF0aW9ucy5nZXRDaGVja2VkRWxlbWVudHMoKTsKLSAgICAgICAgICAgICAgICAgICAgLy9pbnQgc2VsZWN0ZWRJbnN0YWxsID0gY3hmSW5zdGFsbGF0aW9ucy5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjaGVja2VkVmVyc2lvbiA9IGdldENoZWNrZWRWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIENYRkluc3RhbGxXaXphcmQgaW5zdGFsbFdpemFyZCA9IG5ldyBDWEZJbnN0YWxsV2l6YXJkKChDWEZJbnN0YWxsKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpOwotICAgICAgICAgICAgICAgICAgICBXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhnZXRTaGVsbCgpLCBpbnN0YWxsV2l6YXJkKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjeGZJbnN0YWxsYXRpb25zLnJlZnJlc2goKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja2VkVmVyc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q2hlY2tlZFZlcnNpb24oY2hlY2tlZFZlcnNpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZWRpdEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotICAgICAgICByZW1vdmVCdXR0b24gPSBuZXcgQnV0dG9uKHJ1bnRpbWVHcm91cCwgU1dULk5PTkUpOwotICAgICAgICByZW1vdmVCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9SRU1PVkVfQlVUVE9OX0xBQkVMKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5CRUdJTk5JTkcsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIHJlbW92ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgcmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY3hmSW5zdGFsbGF0aW9ucy5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgICAgICAgICBJdGVyYXRvcjxDWEZJbnN0YWxsPiBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgTWFwPFN0cmluZywgQ1hGSW5zdGFsbD4gaW5zdGFsbGF0aW9ucyA9IGNvbnRleHQuZ2V0SW5zdGFsbGF0aW9ucygpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBDWEZJbnN0YWxsIGluc3RhbGwgPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaW5zdGFsbGF0aW9ucy5yZW1vdmUoaW5zdGFsbC5nZXRWZXJzaW9uKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldEluc3RhbGxhdGlvbnMoaW5zdGFsbGF0aW9ucyk7Ci0gICAgICAgICAgICAgICAgY3hmSW5zdGFsbGF0aW9ucy5yZWZyZXNoKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGN4Zkluc3RhbGxhdGlvbnMuZ2V0Q2hlY2tlZEVsZW1lbnRzKCkubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0Q2hlY2tlZEluc3RhbGwobnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0gICAgICAgIExhYmVsIHBhZGRpbmdMYWJlbCA9IG5ldyBMYWJlbChydW50aW1lR3JvdXAsIFNXVC5OT05FKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIHBhZGRpbmdMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBleHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXJCdXR0b24gPSBuZXcgQnV0dG9uKHJ1bnRpbWVHcm91cCwgU1dULkNIRUNLKTsKLSAgICAgICAgZXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyQnV0dG9uLnNldFRleHQoCi0gICAgICAgICAgICAgICAgQ1hGVUlNZXNzYWdlcy5DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSKTsKLSAgICAgICAgZXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzRXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyKCkpOwotICAgICAgICBleHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldEV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcigoKEJ1dHRvbikgZS53aWRnZXQpLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBleHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXJCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgaWYgKGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBleHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXJCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lckJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vSmF2YTJXUwotICAgICAgICBUYWJJdGVtIGphdmEyV1NUYWJJdGVtID0gbmV3IFRhYkl0ZW0oY3hmUHJlZmVyZW5jZVRhYiwgU1dULk5PTkUpOwotICAgICAgICBqYXZhMldTVGFiSXRlbS5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19QUkVGRVJFTkNFU19UQUJfTkFNRSk7Ci0gICAgICAgIGphdmEyV1NUYWJJdGVtLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19QUkVGRVJFTkNFU19UQUJfVE9PTFRJUCk7Ci0KLSAgICAgICAgamF2YTJXU1ByZWZlcm5jZXNHcm91cCA9IG5ldyBDb21wb3NpdGUoY3hmUHJlZmVyZW5jZVRhYiwgU1dULk5PTkUpOwotCi0gICAgICAgIGphdmEyV1NTdGFja0xheW91dCA9IG5ldyBTdGFja0xheW91dCgpOwotICAgICAgICBqYXZhMldTUHJlZmVybmNlc0dyb3VwLnNldExheW91dChqYXZhMldTU3RhY2tMYXlvdXQpOwotCi0gICAgICAgIGphdmEyV1NETFByZWZlcmVuY2VzQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShqYXZhMldTUHJlZmVybmNlc0dyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgamF2YTJXU0dyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgamF2YTJXU0RMUHJlZmVyZW5jZXNDb21wb3NpdGUuc2V0TGF5b3V0KGphdmEyV1NHcmlkTGF5b3V0KTsKLQotICAgICAgICBqYXZhMldTRExSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUgPSBuZXcgSmF2YTJXU0RMUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlKAotICAgICAgICAgICAgICAgIGphdmEyV1NETFByZWZlcmVuY2VzQ29tcG9zaXRlLCBTV1QuTk9ORSwgY3hmUHJlZmVyZW5jZVRhYik7Ci0gICAgICAgIGphdmEyV1NETFJ1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZS5hZGRDb250cm9scygpOwotCi0gICAgICAgIGphdmEyV1NQcmVmZXJlbmNlc0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoamF2YTJXU1ByZWZlcm5jZXNHcm91cCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGphdmEyV1NETEdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgamF2YTJXU1ByZWZlcmVuY2VzQ29tcG9zaXRlLnNldExheW91dChqYXZhMldTRExHcmlkTGF5b3V0KTsKLQotICAgICAgICBqYXZhMldTUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlID0gbmV3IEphdmEyV1NSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUoCi0gICAgICAgICAgICAgICAgamF2YTJXU1ByZWZlcmVuY2VzQ29tcG9zaXRlLCBTV1QuTk9ORSwgY3hmUHJlZmVyZW5jZVRhYik7Ci0gICAgICAgIGphdmEyV1NSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUuYWRkQ29udHJvbHMoKTsKLQotICAgICAgICBqYXZhMldTQmxhbmtQcmVmZXJlbmNlc0NvbXBvc2l0ZSA9IG5ldyBCbGFua1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZShqYXZhMldTUHJlZmVybmNlc0dyb3VwLAotICAgICAgICAgICAgICAgIFNXVC5OT05FKTsKLQotICAgICAgICBqYXZhMldTVGFiSXRlbS5zZXRDb250cm9sKGphdmEyV1NQcmVmZXJuY2VzR3JvdXApOwotCi0gICAgICAgIC8vV1NETDJKYXZhCi0gICAgICAgIFRhYkl0ZW0gd3NkbDJKYXZhVGFiSXRlbSA9IG5ldyBUYWJJdGVtKGN4ZlByZWZlcmVuY2VUYWIsIFNXVC5OT05FKTsKLSAgICAgICAgd3NkbDJKYXZhVGFiSXRlbS5zZXRUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1BSRUZFUkVOQ0VTX1RBQl9OQU1FKTsKLSAgICAgICAgd3NkbDJKYXZhVGFiSXRlbS5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9QUkVGRVJFTkNFU19UQUJfVE9PTFRJUCk7Ci0KLSAgICAgICAgd3NkbDJKYXZhUHJlZmVyZW5jZXNHcm91cCA9IG5ldyBDb21wb3NpdGUoY3hmUHJlZmVyZW5jZVRhYiwgU1dULk5PTkUpOwotCi0gICAgICAgIHdzZGwyamF2YVN0YWNrTGF5b3V0ID0gbmV3IFN0YWNrTGF5b3V0KCk7Ci0gICAgICAgIHdzZGwySmF2YVByZWZlcmVuY2VzR3JvdXAuc2V0TGF5b3V0KHdzZGwyamF2YVN0YWNrTGF5b3V0KTsKLQotICAgICAgICB3c2RsMkphdmEyMFByZWZlcmVuY2VzQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSh3c2RsMkphdmFQcmVmZXJlbmNlc0dyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgd3NkbDJKYXZhMjBHcmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIHdzZGwySmF2YTIwUHJlZmVyZW5jZXNDb21wb3NpdGUuc2V0TGF5b3V0KHdzZGwySmF2YTIwR3JpZExheW91dCk7Ci0KLSAgICAgICAgY3hmMjBXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZSA9IG5ldyBDWEYyMFdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlKAotICAgICAgICAgICAgICAgIHdzZGwySmF2YTIwUHJlZmVyZW5jZXNDb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgY3hmMjBXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZS5hZGRDb250cm9scygpOwotCi0gICAgICAgIHdzZGwySmF2YTIxUHJlZmVyZW5jZXNDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHdzZGwySmF2YVByZWZlcmVuY2VzR3JvdXAsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCB3c2RsMkphdmEyMUdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgd3NkbDJKYXZhMjFQcmVmZXJlbmNlc0NvbXBvc2l0ZS5zZXRMYXlvdXQod3NkbDJKYXZhMjFHcmlkTGF5b3V0KTsKLQotICAgICAgICBjeGYyMVdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlID0gbmV3IENYRjIxV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGUoCi0gICAgICAgICAgICAgICAgd3NkbDJKYXZhMjFQcmVmZXJlbmNlc0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBjeGYyMVdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlLmFkZENvbnRyb2xzKCk7Ci0KLSAgICAgICAgd3NkbDJKYXZhQmxhbmtQcmVmZXJlbmNlc0NvbXBvc2l0ZSA9IG5ldyBCbGFua1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZSh3c2RsMkphdmFQcmVmZXJlbmNlc0dyb3VwLAotICAgICAgICAgICAgICAgIFNXVC5OT05FKTsKLQotICAgICAgICB3c2RsMkphdmFUYWJJdGVtLnNldENvbnRyb2wod3NkbDJKYXZhUHJlZmVyZW5jZXNHcm91cCk7Ci0KLSAgICAgICAgLy9KQVgtV1MKLSAgICAgICAgVGFiSXRlbSBhbm5vdGF0aW9uc1RhYkl0ZW0gPSBuZXcgVGFiSXRlbShjeGZQcmVmZXJlbmNlVGFiLCBTV1QuTk9ORSk7Ci0gICAgICAgIGFubm90YXRpb25zVGFiSXRlbS5zZXRUZXh0KENYRlVJTWVzc2FnZXMuQU5OT1RBVElPTlNfUFJFRkVSRU5DRVNfVEFCX05BTUUpOwotICAgICAgICBhbm5vdGF0aW9uc1RhYkl0ZW0uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5BTk5PVEFUSU9OU19QUkVGRVJFTkNFU19UQUJfVE9PTFRJUCk7Ci0KLSAgICAgICAgamF4d3NQcmVmZXJlbmNlc0dyb3VwID0gbmV3IENvbXBvc2l0ZShjeGZQcmVmZXJlbmNlVGFiLCBTV1QuTk9ORSk7Ci0KLSAgICAgICAgamF4d3NTdGFja0xheW91dCA9IG5ldyBTdGFja0xheW91dCgpOwotICAgICAgICBqYXh3c1ByZWZlcmVuY2VzR3JvdXAuc2V0TGF5b3V0KGpheHdzU3RhY2tMYXlvdXQpOwotCi0gICAgICAgIGpheHdzUHJlZmVyZW5jZXNDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGpheHdzUHJlZmVyZW5jZXNHcm91cCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGpheHdzR3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICBqYXh3c1ByZWZlcmVuY2VzQ29tcG9zaXRlLnNldExheW91dChqYXh3c0dyaWRMYXlvdXQpOwotICAgICAgICBhbm5vdGF0aW9uc0NvbXBvc2l0ZSA9IG5ldyBBbm5vdGF0aW9uc0NvbXBvc2l0ZShqYXh3c1ByZWZlcmVuY2VzQ29tcG9zaXRlLCAgU1dULlNIQURPV19JTik7Ci0KLSAgICAgICAgamF4d3NCbGFua1ByZWZlcmVuY2VzQ29tcG9zaXRlID0gbmV3IEJsYW5rUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlKGpheHdzUHJlZmVyZW5jZXNHcm91cCwKLSAgICAgICAgICAgICAgICBTV1QuTk9ORSk7Ci0KLSAgICAgICAgYW5ub3RhdGlvbnNUYWJJdGVtLnNldENvbnRyb2woamF4d3NQcmVmZXJlbmNlc0dyb3VwKTsKLQotICAgICAgICAvL1NwcmluZyBDb25maWcKLSAgICAgICAgVGFiSXRlbSBzcHJpbmdDb25maWdUYWJJdGVtID0gbmV3IFRhYkl0ZW0oY3hmUHJlZmVyZW5jZVRhYiwgU1dULk5PTkUpOwotICAgICAgICBzcHJpbmdDb25maWdUYWJJdGVtLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5TUFJJTkdfQ09ORklHX1BSRUZFUkVOQ0VTX1RBQl9OQU1FKTsKLSAgICAgICAgc3ByaW5nQ29uZmlnVGFiSXRlbS5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLlNQUklOR19DT05GSUdfUFJFRkVSRU5DRVNfVEFCX1RPT0xUSVApOwotCi0gICAgICAgIHNwcmluZ0NvbmZpZ1ByZWZlcm5jZXNHcm91cCA9IG5ldyBDb21wb3NpdGUoY3hmUHJlZmVyZW5jZVRhYiwgU1dULk5PTkUpOwotCi0gICAgICAgIHNwcmluZ0NvbmZpZ1N0YWNrTGF5b3V0ID0gbmV3IFN0YWNrTGF5b3V0KCk7Ci0gICAgICAgIHNwcmluZ0NvbmZpZ1ByZWZlcm5jZXNHcm91cC5zZXRMYXlvdXQoc3ByaW5nQ29uZmlnU3RhY2tMYXlvdXQpOwotCi0gICAgICAgIHNwcmluZ1ByZWZlcmVuY2VzQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzcHJpbmdDb25maWdQcmVmZXJuY2VzR3JvdXAsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBzcHJpbmdHcmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIHNwcmluZ1ByZWZlcmVuY2VzQ29tcG9zaXRlLnNldExheW91dChzcHJpbmdHcmlkTGF5b3V0KTsKLSAgICAgICAgc3ByaW5nQ29uZmlnQ29tcG9zaXRlID0gbmV3IFNwcmluZ0NvbmZpZ0NvbXBvc2l0ZShzcHJpbmdQcmVmZXJlbmNlc0NvbXBvc2l0ZSwgU1dULlNIQURPV19JTik7Ci0KLSAgICAgICAgc3ByaW5nQ29uZmlnQmxhbmtQcmVmZXJlbmNlc0NvbXBvc2l0ZSA9IG5ldyBCbGFua1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZShzcHJpbmdDb25maWdQcmVmZXJuY2VzR3JvdXAsCi0gICAgICAgICAgICAgICAgU1dULk5PTkUpOwotCi0gICAgICAgIHNwcmluZ0NvbmZpZ1RhYkl0ZW0uc2V0Q29udHJvbChzcHJpbmdDb25maWdQcmVmZXJuY2VzR3JvdXApOwotCi0gICAgICAgIENYRkluc3RhbGwgZGVmYXVsdEluc3RhbGwgPSBnZXREZWZhdWx0SW5zdGFsbCgpOwotICAgICAgICBpZiAoZGVmYXVsdEluc3RhbGwgIT0gbnVsbCkgewotICAgICAgICAgICAgc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGRlZmF1bHRJbnN0YWxsKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBoYW5kbGVQcmVmZXJlbmNlQ29udHJvbHMoKTsKLQotICAgICAgICBjb21wb3NpdGUucGFjaygpOwotICAgICAgICByZXR1cm4gY29tcG9zaXRlOwotICAgIH0KLQotICAgIHByaXZhdGUgQ1hGSW5zdGFsbCBnZXREZWZhdWx0SW5zdGFsbCgpIHsKLSAgICAgICAgQ29sbGVjdGlvbjxDWEZJbnN0YWxsPiBzZXQgPSBjb250ZXh0LmdldEluc3RhbGxhdGlvbnMoKS52YWx1ZXMoKTsKLSAgICAgICAgSXRlcmF0b3I8Q1hGSW5zdGFsbD4gc2V0SXRlcmF0b3IgPSBzZXQuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKHNldEl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgQ1hGSW5zdGFsbCBlbnRyeSA9IHNldEl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChlbnRyeS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKS50cmltKCkuZXF1YWxzKGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldENoZWNrZWRWZXJzaW9uKCkgewotICAgICAgICBPYmplY3RbXSBjaGVja2VkRWxlbWVudHMgPSBjeGZJbnN0YWxsYXRpb25zLmdldENoZWNrZWRFbGVtZW50cygpOwotICAgICAgICBpZiAoY2hlY2tlZEVsZW1lbnRzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiAoKENYRkluc3RhbGwpIGNoZWNrZWRFbGVtZW50c1swXSkuZ2V0VmVyc2lvbigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRDaGVja2VkVmVyc2lvbihTdHJpbmcgdmVyc2lvbikgewotICAgICAgICBUYWJsZUl0ZW1bXSB0YWJsZUl0ZW1zID0gY3hmSW5zdGFsbGF0aW9ucy5nZXRUYWJsZSgpLmdldEl0ZW1zKCk7Ci0gICAgICAgIGZvciAoVGFibGVJdGVtIGluc3RhbGwgOiB0YWJsZUl0ZW1zKSB7Ci0gICAgICAgICAgICBpZiAoaW5zdGFsbC5nZXRUZXh0KDApLmVxdWFscyh2ZXJzaW9uKSkgewotICAgICAgICAgICAgICAgIGluc3RhbGwuc2V0Q2hlY2tlZCh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRDaGVja2VkSW5zdGFsbChPYmplY3QgZWxlbWVudCkgewotICAgICAgICBpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWxlbWVudCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotICAgICAgICAgICAgaWYgKCFzZWxlY3Rpb24uZXF1YWxzKHByZXZpb3VzSW5zdGFsbCkpIHsKLSAgICAgICAgICAgICAgICBwcmV2aW91c0luc3RhbGwgPSBzZWxlY3Rpb247Ci0gICAgICAgICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotICAgICAgICAgICAgICAgIENYRkluc3RhbGwgaW5zdGFsbCA9IChDWEZJbnN0YWxsKSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIGlmIChpbnN0YWxsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY3hmSW5zdGFsbGF0aW9ucy5zZXRDaGVja2VkRWxlbWVudHMobmV3IE9iamVjdFtdeyBpbnN0YWxsIH0pOwotICAgICAgICAgICAgICAgICAgICBjeGZJbnN0YWxsYXRpb25zLnJldmVhbChpbnN0YWxsKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXREZWZhdWx0UnVudGltZVZlcnNpb24oaW5zdGFsbC5nZXRWZXJzaW9uKCkpOwotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldERlZmF1bHRSdW50aW1lTG9jYXRpb24oaW5zdGFsbC5nZXRMb2NhdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXREZWZhdWx0UnVudGltZVR5cGUoaW5zdGFsbC5nZXRUeXBlKCkpOwotICAgICAgICAgICAgICAgICAgICBleHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXJCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldERlZmF1bHRSdW50aW1lVmVyc2lvbigiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXREZWZhdWx0UnVudGltZUxvY2F0aW9uKCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldERlZmF1bHRSdW50aW1lVHlwZSgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgZXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBoYW5kbGVQcmVmZXJlbmNlQ29udHJvbHMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVQcmVmZXJlbmNlQ29udHJvbHMoKSB7Ci0gICAgICAgIGlmIChjb250ZXh0LmdldERlZmF1bHRSdW50aW1lTG9jYXRpb24oKS5lcXVhbHMoIiIpIHx8IGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgIGphdmEyV1NTdGFja0xheW91dC50b3BDb250cm9sID0gamF2YTJXU0JsYW5rUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0gICAgICAgICAgICB3c2RsMmphdmFTdGFja0xheW91dC50b3BDb250cm9sID0gd3NkbDJKYXZhQmxhbmtQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLSAgICAgICAgICAgIGpheHdzU3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IGpheHdzQmxhbmtQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLSAgICAgICAgICAgIHNwcmluZ0NvbmZpZ1N0YWNrTGF5b3V0LnRvcENvbnRyb2wgPSBzcHJpbmdDb25maWdCbGFua1ByZWZlcmVuY2VzQ29tcG9zaXRlOwotICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCkuY29tcGFyZVRvKENYRkNvcmVQbHVnaW4uQ1hGX1ZFUlNJT05fMl8xKSA+PSAwKSB7Ci0gICAgICAgICAgICBqYXZhMldTU3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IGphdmEyV1NQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLSAgICAgICAgICAgIHdzZGwyamF2YVN0YWNrTGF5b3V0LnRvcENvbnRyb2wgPSB3c2RsMkphdmEyMVByZWZlcmVuY2VzQ29tcG9zaXRlOwotICAgICAgICAgICAgamF4d3NTdGFja0xheW91dC50b3BDb250cm9sID0gamF4d3NQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLSAgICAgICAgICAgIHNwcmluZ0NvbmZpZ1N0YWNrTGF5b3V0LnRvcENvbnRyb2wgPSBzcHJpbmdQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGphdmEyV1NTdGFja0xheW91dC50b3BDb250cm9sID0gamF2YTJXU0RMUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0gICAgICAgICAgICB3c2RsMmphdmFTdGFja0xheW91dC50b3BDb250cm9sID0gd3NkbDJKYXZhMjBQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLSAgICAgICAgICAgIGpheHdzU3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IGpheHdzUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0gICAgICAgICAgICBzcHJpbmdDb25maWdTdGFja0xheW91dC50b3BDb250cm9sID0gc3ByaW5nUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0gICAgICAgIH0KLSAgICAgICAgamF2YTJXU1ByZWZlcm5jZXNHcm91cC5sYXlvdXQoKTsKLSAgICAgICAgd3NkbDJKYXZhUHJlZmVyZW5jZXNHcm91cC5sYXlvdXQoKTsKLSAgICAgICAgamF4d3NQcmVmZXJlbmNlc0dyb3VwLmxheW91dCgpOwotICAgICAgICBzcHJpbmdDb25maWdQcmVmZXJuY2VzR3JvdXAubGF5b3V0KCk7Ci0gICAgICAgIHJlZnJlc2goKTsKLSAgICB9Ci0KLSAgICAvLyAgICBwcml2YXRlIHZvaWQgdXBkYXRlU3RhdHVzKCkgewotICAgIC8vICAgICAgICAvLyAgICBDWEZfTE9DQVRJT05fU1RBVFVTID0gY2hlY2tSdW50aW1lRXhpc3QoY3hmSG9tZURpclRleHQuZ2V0VGV4dCgpKTsKLSAgICAvLyAgICAgICAgYXBwbHlTdGF0dXNUb1BhZ2UoZmluZE1vc3RTZXZlcmUoKSk7Ci0gICAgLy8gICAgfQotCi0gICAgLy8gICAgcHJpdmF0ZSB2b2lkIGFwcGx5U3RhdHVzVG9QYWdlKElTdGF0dXMgc3RhdHVzKSB7Ci0gICAgLy8gICAgICAgIFN0cmluZyBtZXNzYWdlID0gc3RhdHVzLmdldE1lc3NhZ2UoKTsKLSAgICAvLyAgICAgICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID4gSVN0YXR1cy5PSykgewotICAgIC8vICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKG1lc3NhZ2UpOwotICAgIC8vICAgICAgICB9IGVsc2UgewotICAgIC8vICAgICAgICAgICAgc2V0TWVzc2FnZShnZXRUaXRsZSgpKTsKLSAgICAvLyAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICAvLyAgICAgICAgfQotICAgIC8vCi0gICAgLy8gICAgfQotICAgIC8vCi0gICAgLy8gICAgcHJpdmF0ZSBJU3RhdHVzIGZpbmRNb3N0U2V2ZXJlKCkgewotICAgIC8vICAgICAgICByZXR1cm4gQ1hGX0xPQ0FUSU9OX1NUQVRVUzsKLSAgICAvLyAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0RGVmYXVsdHMoKSB7Ci0gICAgICAgIGV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lckJ1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuQ1hGX0NPTlRFWFQsIENYRlBhY2thZ2UuQ1hGX0NPTlRFWFRfX0VYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUikpOwotCi0gICAgICAgIGphdmEyV1NETFJ1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZS5zZXREZWZhdWx0cygpOwotICAgICAgICBqYXZhMldTUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlLnNldERlZmF1bHRzKCk7Ci0gICAgICAgIGN4ZjIwV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGUuc2V0RGVmYXVsdHMoKTsKLSAgICAgICAgY3hmMjFXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZS5zZXREZWZhdWx0cygpOwotICAgICAgICBhbm5vdGF0aW9uc0NvbXBvc2l0ZS5zZXREZWZhdWx0cygpOwotICAgICAgICBzcHJpbmdDb25maWdDb21wb3NpdGUuc2V0RGVmYXVsdHMoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVmcmVzaCgpIHsKLSAgICAgICAgaWYgKGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCkuY29tcGFyZVRvKENYRkNvcmVQbHVnaW4uQ1hGX1ZFUlNJT05fMl8xKSA+PSAwKSB7Ci0gICAgICAgICAgICBqYXZhMldTUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlLnJlZnJlc2goKTsKLSAgICAgICAgICAgIGN4ZjIxV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGUucmVmcmVzaCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamF2YTJXU0RMUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlLnJlZnJlc2goKTsKLSAgICAgICAgICAgIGN4ZjIwV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGUucmVmcmVzaCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHN0b3JlVmFsdWVzKCkgewotICAgICAgICBjb250ZXh0LnNldEV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcihleHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXJCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCi0gICAgICAgIGlmIChjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVmVyc2lvbigpLmNvbXBhcmVUbyhDWEZDb3JlUGx1Z2luLkNYRl9WRVJTSU9OXzJfMSkgPj0gMCkgewotICAgICAgICAgICAgamF2YTJXU1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZS5zdG9yZVZhbHVlcygpOwotICAgICAgICAgICAgY3hmMjFXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZS5zdG9yZVZhbHVlcygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamF2YTJXU0RMUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlLnN0b3JlVmFsdWVzKCk7Ci0gICAgICAgICAgICBjeGYyMFdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlLnN0b3JlVmFsdWVzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYW5ub3RhdGlvbnNDb21wb3NpdGUuc3RvcmVWYWx1ZXMoKTsKLSAgICAgICAgc3ByaW5nQ29uZmlnQ29tcG9zaXRlLnN0b3JlVmFsdWVzKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFwcGx5KCkgewotICAgICAgICBzdXBlci5wZXJmb3JtQXBwbHkoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2FuY2VsKCkgewotICAgICAgICByZXR1cm4gc3VwZXIucGVyZm9ybUNhbmNlbCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLSAgICAgICAgc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0gICAgICAgIHNldERlZmF1bHRzKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotICAgICAgICBzdG9yZVZhbHVlcygpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBzdXBlci5kaXNwb3NlKCk7Ci0gICAgICAgIGlmIChsaWJyYXJ5SW1hZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgbGlicmFyeUltYWdlLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIGxpYnJhcnlJbWFnZSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvcHJvcGVydGllcy9DWEZQcm9wZXJ0eVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS9wcm9wZXJ0aWVzL0NYRlByb3BlcnR5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDQ5ZGFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS9wcm9wZXJ0aWVzL0NYRlByb3BlcnR5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5DbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ2xhc3NwYXRoQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZJbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuQ1hGVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eVBhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBDWEZQcm9wZXJ0eVBhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UgewotCi0gICAgcHJpdmF0ZSBJSmF2YVByb2plY3QgamF2YVByb2plY3Q7Ci0gICAgcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotICAgIHByaXZhdGUgQ29tYm9WaWV3ZXIgaW5zdGFsbGF0aW9uc0NvbWJvVmlld2VyOwotICAgIHByaXZhdGUgTGluayBsaW5rOwotICAgIHByaXZhdGUgQ1hGSW5zdGFsbCBkZWZhdWx0SW5zdGFsbDsKLSAgICBwcml2YXRlIENYRkNvbnRleHQgY29udGV4dDsKLQotICAgIHB1YmxpYyBDWEZQcm9wZXJ0eVBhZ2UoKSB7Ci0gICAgICAgIGNvbnRleHQgPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKYXZhMldTQ29udGV4dCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgSUFkYXB0YWJsZSBlbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotCi0gICAgICAgIGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBJSmF2YVByb2plY3QpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGphdmFQcm9qZWN0ID0gKElKYXZhUHJvamVjdCkgZWxlbWVudDsKLSAgICAgICAgdGhpcy5wcm9qZWN0ID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpOwotCi0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0gICAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgICAgICBsaW5rID0gbmV3IExpbmsoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGxpbmsuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkNYRl9DT05GSUdVUkVfSU5TVEFMTEVEX1JVTlRJTUVTX0xBQkVMKTsKLSAgICAgICAgbGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGludCBzZWxlY3RlZEluZGV4ID0gaW5zdGFsbGF0aW9uc0NvbWJvVmlld2VyLmdldENvbWJvKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbihnZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkuQ1hGUnVudGltZVByZWZlcmVuY2VzUGFnZSIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkuQ1hGUnVudGltZVByZWZlcmVuY2VzUGFnZSJ9LCBudWxsKS5vcGVuKCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IFdpbmRvdy5PSykgewotICAgICAgICAgICAgICAgICAgICBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXIucmVmcmVzaCgpOwotICAgICAgICAgICAgICAgICAgICBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXIuZ2V0Q29tYm8oKS5zZWxlY3Qoc2VsZWN0ZWRJbmRleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRU5ELCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIGxpbmsuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGxhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5DWEZfUFJPUEVSVFlfUEFHRV9SVU5USU1FX0xBQkVMKTsKLQotICAgICAgICBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXIgPSBuZXcgQ29tYm9WaWV3ZXIoY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXIuZ2V0Q29tYm8oKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpIHsKLQotICAgICAgICAgICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIENvbGxlY3Rpb248Pz4pIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoQ29sbGVjdGlvbjw/PikgaW5wdXRFbGVtZW50KS50b0FycmF5KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0W10ge307Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQ1hGSW5zdGFsbCkgewotICAgICAgICAgICAgICAgICAgICBDWEZJbnN0YWxsIGN4Zkluc3RhbGwgPSAoQ1hGSW5zdGFsbCkgZWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN4Zkluc3RhbGwuZ2V0VHlwZSgpICsgIiAiICsgY3hmSW5zdGFsbC5nZXRWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotCi0gICAgICAgIH0pOwotCi0gICAgICAgIENvbGxlY3Rpb248Q1hGSW5zdGFsbD4gaW5zdGFsbGF0aW9ucyA9IGNvbnRleHQuZ2V0SW5zdGFsbGF0aW9ucygpLnZhbHVlcygpOwotCi0gICAgICAgIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlci5zZXRJbnB1dChpbnN0YWxsYXRpb25zKTsKLQotICAgICAgICBTdHJpbmcgaW50YWxsZWRWZXJzaW9uID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Q1hGUnVudGltZVZlcnNpb24ocHJvamVjdCk7Ci0gICAgICAgIGRlZmF1bHRJbnN0YWxsID0gY29udGV4dC5nZXRJbnN0YWxsYXRpb25zKCkuZ2V0KGludGFsbGVkVmVyc2lvbik7Ci0gICAgICAgIGlmIChkZWZhdWx0SW5zdGFsbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGRlZmF1bHRJbnN0YWxsKSwgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0gICAgICAgIENYRkluc3RhbGwgc2VsZWN0ZWRJbnN0YWxsID0gZ2V0U2VsZWN0ZWRJbnN0YWxsKCk7Ci0gICAgICAgIC8vaWYgKGlzVXBkYXRlUmVxdWlyZWQocHJvamVjdCwgc2VsZWN0ZWRJbnN0YWxsKSkgewotICAgICAgICAvL2lmICghZGVmYXVsdEluc3RhbGwuZ2V0VmVyc2lvbigpLmVxdWFscyhzZWxlY3RlZEluc3RhbGwuZ2V0VmVyc2lvbigpKSkgewotICAgICAgICBpZiAoc2VsZWN0ZWRJbnN0YWxsICE9IG51bGwpIHsKLSAgICAgICAgICAgIENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNldENYRlJ1bnRpbWVWZXJzaW9uKHByb2plY3QsIHNlbGVjdGVkSW5zdGFsbC5nZXRWZXJzaW9uKCkpOwotCi0gICAgICAgICAgICBDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciBjbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciA9IEphdmFDb3JlLmdldENsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyKAotICAgICAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLkNYRl9DTEFTU1BBVEhfQ09OVEFJTkVSX0lEKTsKLSAgICAgICAgICAgIGlmIChjbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSVBhdGggY29udGFpbmVyUGF0aCA9IG5ldyBQYXRoKENYRkNvcmVQbHVnaW4uQ1hGX0NMQVNTUEFUSF9DT05UQUlORVJfSUQpOwotICAgICAgICAgICAgICAgIENYRkNsYXNzcGF0aENvbnRhaW5lciBjeGZDbGFzc3BhdGhDb250YWluZXIgPSBuZXcgQ1hGQ2xhc3NwYXRoQ29udGFpbmVyKGNvbnRhaW5lclBhdGgsIGphdmFQcm9qZWN0KTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBjbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplci5yZXF1ZXN0Q2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlKGNvbnRhaW5lclBhdGgsIGphdmFQcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN4ZkNsYXNzcGF0aENvbnRhaW5lcik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgQ1hGSW5zdGFsbCBnZXRTZWxlY3RlZEluc3RhbGwoKSB7Ci0gICAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGlmICghc3RydWN0dXJlZFNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIENYRkluc3RhbGwgc2VsZWN0ZWRJbnN0YWxsID0gKENYRkluc3RhbGwpIHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRJbnN0YWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLSAgICAgICAgQ1hGSW5zdGFsbCBkZWZhdWx0SW5zdGFsbCA9IGNvbnRleHQuZ2V0SW5zdGFsbGF0aW9ucygpLmdldChjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVmVyc2lvbigpKTsKLSAgICAgICAgaWYgKGRlZmF1bHRJbnN0YWxsICE9IG51bGwpIHsKLSAgICAgICAgICAgIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZGVmYXVsdEluc3RhbGwpLCB0cnVlKTsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3ZpZXdlcnMvSmF2YVZpZXdlckZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3ZpZXdlcnMvSmF2YVZpZXdlckZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDQwMDA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS92aWV3ZXJzL0phdmFWaWV3ZXJGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5DWEZVSVBsdWdpbjsKLQotLyoqCi0gKiA8Y29kZT5WaWV3ZXJGaWx0ZXI8L2NvZGU+IHRoYXQgZmlsdGVycyBvbiBjbGFzc2VzIG9yIGludGVyZmFjZXMgd2l0aGluIGEgPGNvZGU+SUphdmFQcm9qZWN0PC9jb2RlPgotICoKLSAqLwotcHVibGljIGNsYXNzIEphdmFWaWV3ZXJGaWx0ZXIgZXh0ZW5kcyBWaWV3ZXJGaWx0ZXIgewotCi0gICAgcHJpdmF0ZSBJSmF2YVByb2plY3QgamF2YVByb2plY3Q7Ci0gICAgcHJpdmF0ZSBpbnQgZWxlbWVudEtpbmRzOwotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+SmF2YVZpZXdlckZpbHRlcjwvY29kZT4gZ2l2ZW4gYSA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+IGFuZCBhbgotICAgICAqIDxjb2RlPklKYXZhU2VhcmNoQ29uc3RhbnRzPC9jb2RlPiBlbGVtZW50IGtpbmQgdG8gc2VhcmNoIGZvci4gQWxsIG90aGVyIGVsZW1lbnRzIGFyZSBmaWx0ZXJlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gamF2YVByb2plY3QgdGhlIGphdmEgcHJvamVjdCB0byBmaWx0ZXIKLSAgICAgKiBAcGFyYW0gZWxlbWVudEtpbmRzIGEgZmxhZyBkZWZpbmluZyBuYXR1cmUgb2Ygc2VhcmNoZWQgZWxlbWVudHM7IHRoZSBvbmx5IHZhbGlkIHZhbHVlcyBhcmU6IAotICAgICAqICA8Y29kZT5JSmF2YVNlYXJjaENvbnN0YW50cy5DTEFTUzwvY29kZT4KLSAgICAgKiAgPGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHMuSU5URVJGQUNFPC9jb2RlPgotICAgICAqICA8Y29kZT5JSmF2YVNlYXJjaENvbnN0YW50cy5DTEFTU19BTkRfSU5URVJGQUNFPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBKYXZhVmlld2VyRmlsdGVyKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgaW50IGVsZW1lbnRLaW5kcykgewotICAgICAgICB0aGlzLmphdmFQcm9qZWN0ID0gamF2YVByb2plY3Q7Ci0gICAgICAgIHRoaXMuZWxlbWVudEtpbmRzID0gZWxlbWVudEtpbmRzOwotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJSmF2YVByb2plY3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gamF2YVByb2plY3QuZXF1YWxzKChJSmF2YVByb2plY3QpIGVsZW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50Um9vdCkgewotICAgICAgICAgICAgICAgIElQYWNrYWdlRnJhZ21lbnRSb290IHBhY2thZ2VGcmFnbWVudFJvb3QgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3QpIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBhY2thZ2VGcmFnbWVudFJvb3QuZ2V0S2luZCgpID09IElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50KSB7Ci0gICAgICAgICAgICAgICAgSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQgPSAoSVBhY2thZ2VGcmFnbWVudCkgZWxlbWVudDsKLSAgICAgICAgICAgICAgICByZXR1cm4gcGFja2FnZUZyYWdtZW50Lmhhc0NoaWxkcmVuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQpIHsKLSAgICAgICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChJQ29tcGlsYXRpb25Vbml0KSBlbGVtZW50OwotICAgICAgICAgICAgICAgIElUeXBlIHR5cGUgPSBjb21waWxhdGlvblVuaXQuZmluZFByaW1hcnlUeXBlKCk7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChlbGVtZW50S2luZHMpIHsKLSAgICAgICAgICAgICAgICBjYXNlIElKYXZhU2VhcmNoQ29uc3RhbnRzLkNMQVNTOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZS5pc0NsYXNzKCk7Ci0gICAgICAgICAgICAgICAgY2FzZSBJSmF2YVNlYXJjaENvbnN0YW50cy5JTlRFUkZBQ0U6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlLmlzSW50ZXJmYWNlKCkgJiYgIXR5cGUuaXNBbm5vdGF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgY2FzZSBJSmF2YVNlYXJjaENvbnN0YW50cy5DTEFTU19BTkRfSU5URVJGQUNFOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZS5pc0NsYXNzKCkgfHwgKHR5cGUuaXNJbnRlcmZhY2UoKSAmJiAhdHlwZS5pc0Fubm90YXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIENYRlVJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS92aWV3ZXJzL1BhY2thZ2VOYW1lQ29sdW1uTGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3ZpZXdlcnMvUGFja2FnZU5hbWVDb2x1bW5MYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MDY3NDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3ZpZXdlcnMvUGFja2FnZU5hbWVDb2x1bW5MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuV1NETFV0aWxzOwotCi1wdWJsaWMgY2xhc3MgUGFja2FnZU5hbWVDb2x1bW5MYWJlbFByb3ZpZGVyIGV4dGVuZHMgQ29sdW1uTGFiZWxQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGluY2x1ZGVkTmFtZXNwYWNlczsKLQotICAgIHB1YmxpYyBQYWNrYWdlTmFtZUNvbHVtbkxhYmVsUHJvdmlkZXIoV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIGluY2x1ZGVkTmFtZXNwYWNlcyA9IG1vZGVsLmdldEluY2x1ZGVkTmFtZXNwYWNlcygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotICAgICAgICBpZiAoaW5jbHVkZWROYW1lc3BhY2VzLmNvbnRhaW5zS2V5KGVsZW1lbnQudG9TdHJpbmcoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBpbmNsdWRlZE5hbWVzcGFjZXMuZ2V0KGVsZW1lbnQudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdTRExVdGlscy5nZXRQYWNrYWdlTmFtZUZyb21OYW1lc3BhY2UoZWxlbWVudC50b1N0cmluZygpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS92aWV3ZXJzL1BhY2thZ2VOYW1lRWRpdGluZ1N1cHBvcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS92aWV3ZXJzL1BhY2thZ2VOYW1lRWRpdGluZ1N1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ2NTdmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvdmlld2Vycy9QYWNrYWdlTmFtZUVkaXRpbmdTdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRWRpdGluZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLldTRExVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci0KLXB1YmxpYyBjbGFzcyBQYWNrYWdlTmFtZUVkaXRpbmdTdXBwb3J0IGV4dGVuZHMgRWRpdGluZ1N1cHBvcnQgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lciB7Ci0gICAgcHJpdmF0ZSBDZWxsRWRpdG9yIHBhY2thZ2VOYW1lQ2VsbEVkaXRvcjsKLSAgICBwcml2YXRlIFRhYmxlIHRhYmxlOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBpbmNsdWRlZE5hbWVzcGFjZXM7Ci0KLSAgICBwdWJsaWMgUGFja2FnZU5hbWVFZGl0aW5nU3VwcG9ydChUYWJsZVZpZXdlciB0YWJsZVZpZXdlciwgQ2VsbEVkaXRvciBwYWNrYWdlTmFtZUNlbGxFZGl0b3IsCi0gICAgICAgICAgICBXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgc3VwZXIodGFibGVWaWV3ZXIpOwotICAgICAgICB0aGlzLnRhYmxlID0gdGFibGVWaWV3ZXIuZ2V0VGFibGUoKTsKLSAgICAgICAgdGhpcy5wYWNrYWdlTmFtZUNlbGxFZGl0b3IgPSBwYWNrYWdlTmFtZUNlbGxFZGl0b3I7Ci0gICAgICAgIGluY2x1ZGVkTmFtZXNwYWNlcyA9IG1vZGVsLmdldEluY2x1ZGVkTmFtZXNwYWNlcygpOwotICAgICAgICB0YWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjYW5FZGl0KE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIHJldHVybiB0YWJsZS5nZXRTZWxlY3Rpb24oKVswXS5nZXRDaGVja2VkKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIENlbGxFZGl0b3IgZ2V0Q2VsbEVkaXRvcihPYmplY3QgZWxlbWVudCkgewotICAgICAgICByZXR1cm4gcGFja2FnZU5hbWVDZWxsRWRpdG9yOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgaWYgKGluY2x1ZGVkTmFtZXNwYWNlcy5jb250YWluc0tleShlbGVtZW50LnRvU3RyaW5nKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gaW5jbHVkZWROYW1lc3BhY2VzLmdldChlbGVtZW50LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXU0RMVXRpbHMuZ2V0UGFja2FnZU5hbWVGcm9tTmFtZXNwYWNlKGVsZW1lbnQudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoT2JqZWN0IG5hbWVzcGFjZSwgT2JqZWN0IHBhY2thZ2VOYW1lKSB7Ci0gICAgICAgIGlmIChuYW1lc3BhY2UgIT0gbnVsbCAmJiBwYWNrYWdlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbmNsdWRlZE5hbWVzcGFjZXMucHV0KG5hbWVzcGFjZS50b1N0cmluZygpLCBwYWNrYWdlTmFtZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIGdldFZpZXdlcigpLnVwZGF0ZShuYW1lc3BhY2UsIG51bGwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKGV2ZW50LmRldGFpbCA9PSBTV1QuQ0hFQ0spIHsKLSAgICAgICAgICAgIFRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSkgZXZlbnQuaXRlbTsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2VLZXkgPSBpdGVtLmdldFRleHQoMCk7Ci0gICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBpdGVtLmdldFRleHQoMSk7Ci0gICAgICAgICAgICBpZiAoaXRlbS5nZXRDaGVja2VkKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWluY2x1ZGVkTmFtZXNwYWNlcy5jb250YWluc0tleShuYW1lc3BhY2VLZXkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluY2x1ZGVkTmFtZXNwYWNlcy5wdXQobmFtZXNwYWNlS2V5LCBwYWNrYWdlTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZWROYW1lc3BhY2VzLmNvbnRhaW5zS2V5KG5hbWVzcGFjZUtleSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5jbHVkZWROYW1lc3BhY2VzLnJlbW92ZShuYW1lc3BhY2VLZXkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3ZpZXdlcnMvUGFja2FnZU5hbWVUYWJsZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3ZpZXdlcnMvUGFja2FnZU5hbWVUYWJsZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWNiNmU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS92aWV3ZXJzL1BhY2thZ2VOYW1lVGFibGVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkudmlld2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLXB1YmxpYyBjbGFzcyBQYWNrYWdlTmFtZVRhYmxlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLSAgICAgICAgTGlzdDxPYmplY3Q+IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0gICAgICAgIGlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBEZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgaW5wdXRFbGVtZW50OwotICAgICAgICAgICAgTWFwIG5hbWVzcGFjZXMgPSBkZWZpbml0aW9uLmdldE5hbWVzcGFjZXMoKTsKLSAgICAgICAgICAgIENvbGxlY3Rpb24gdmFsdWVzID0gbmFtZXNwYWNlcy52YWx1ZXMoKTsKLSAgICAgICAgICAgIGZvciAoT2JqZWN0IG5hbWVzcGFjZVZhbHVlIDogdmFsdWVzKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IG5hbWVzcGFjZVZhbHVlLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFuYW1lc3BhY2UuZXF1YWxzKGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpICYmICFlbGVtZW50cy5jb250YWlucyhuYW1lc3BhY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLmFkZChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZWxlbWVudHMudG9BcnJheShuZXcgT2JqZWN0W2VsZW1lbnRzLnNpemUoKV0pOwotICAgIH0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9Bbm5vdGF0aW9uc0NvbXBvc2l0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvQW5ub3RhdGlvbnNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNiMDk0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9Bbm5vdGF0aW9uc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5jb250ZXh0LkphdmEyV1NQZXJzaXN0ZW50Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuQ1hGTW9kZWxVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLkNYRlVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbnNDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgewotICAgIHByaXZhdGUgSmF2YTJXU1BlcnNpc3RlbnRDb250ZXh0IGNvbnRleHQgPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKYXZhMldTQ29udGV4dCgpOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVXZWJNZXRob2RCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVXZWJQYXJhbUJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBnZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIGdlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQnV0dG9uOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gZW5hYmxlQVBUQnV0dG9uOwotCi0gICAgcHVibGljIEFubm90YXRpb25zQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotICAgICAgICBzdXBlcihwYXJlbnQsIHN0eWxlKTsKLSAgICAgICAgYWRkQ29udHJvbHMoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkQ29udHJvbHMoKSB7Ci0gICAgICAgIEdyaWRMYXlvdXQgcHJlZmxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICB0aGlzLnNldExheW91dChwcmVmbGF5b3V0KTsKLQotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgdGhpcy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBHcm91cCBqYXh3c0Fubm90YXRpb25zR3JvdXAgPSBuZXcgR3JvdXAodGhpcywgU1dULlNIQURPV19JTik7Ci0gICAgICAgIGpheHdzQW5ub3RhdGlvbnNHcm91cC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFYV1NfQU5OT1RBVElPTlNfR1JPVVBfTEFCRUwpOwotICAgICAgICBqYXh3c0Fubm90YXRpb25zR3JvdXAuc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5KQVhXU19BTk5PVEFUSU9OU19HUk9VUF9UT09MVElQKTsKLSAgICAgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIGpheHdzQW5ub3RhdGlvbnNHcm91cC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBqYXh3c0Fubm90YXRpb25zR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgZ2VuZXJhdGVXZWJNZXRob2RCdXR0b24gPSBuZXcgQnV0dG9uKGpheHdzQW5ub3RhdGlvbnNHcm91cCwgU1dULkNIRUNLKTsKLSAgICAgICAgZ2VuZXJhdGVXZWJNZXRob2RCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBWFdTX0dFTkVSQVRFX1dFQl9NRVRIT0QpOwotICAgICAgICBnZW5lcmF0ZVdlYk1ldGhvZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VsZWN0ZWQgPSAoKEJ1dHRvbikgZS53aWRnZXQpLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uKHNlbGVjdGVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGdlbmVyYXRlV2ViTWV0aG9kQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzR2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uKCkpOwotCi0gICAgICAgIGdlbmVyYXRlV2ViUGFyYW1CdXR0b24gPSBuZXcgQnV0dG9uKGpheHdzQW5ub3RhdGlvbnNHcm91cCwgU1dULkNIRUNLKTsKLSAgICAgICAgZ2VuZXJhdGVXZWJQYXJhbUJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFYV1NfR0VORVJBVEVfV0VCX1BBUkFNKTsKLSAgICAgICAgZ2VuZXJhdGVXZWJQYXJhbUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VsZWN0ZWQgPSAoKEJ1dHRvbikgZS53aWRnZXQpLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24oc2VsZWN0ZWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZ2VuZXJhdGVXZWJQYXJhbUJ1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0dlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKCkpOwotCi0gICAgICAgIGdlbmVyYXRlUmVxdWVzdFdyYXBwZXJCdXR0b24gPSBuZXcgQnV0dG9uKGpheHdzQW5ub3RhdGlvbnNHcm91cCwgU1dULkNIRUNLKTsKLSAgICAgICAgZ2VuZXJhdGVSZXF1ZXN0V3JhcHBlckJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFYV1NfR0VORVJBVEVfUkVRVUVTVF9XUkFQUEVSKTsKLSAgICAgICAgZ2VuZXJhdGVSZXF1ZXN0V3JhcHBlckJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VsZWN0ZWQgPSAoKEJ1dHRvbikgZS53aWRnZXQpLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24oc2VsZWN0ZWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZ2VuZXJhdGVSZXF1ZXN0V3JhcHBlckJ1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0dlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKCkpOwotCi0gICAgICAgIGdlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQnV0dG9uID0gbmV3IEJ1dHRvbihqYXh3c0Fubm90YXRpb25zR3JvdXAsIFNXVC5DSEVDSyk7Ci0gICAgICAgIGdlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVhXU19HRU5FUkFURV9SRVNQT05TRV9XUkFQUEVSKTsKLSAgICAgICAgZ2VuZXJhdGVSZXNwb25zZVdyYXBwZXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHNlbGVjdGVkID0gKChCdXR0b24pIGUud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldEdlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbihzZWxlY3RlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBnZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckJ1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0dlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbigpKTsKLQotICAgICAgICBHcm91cCBhbm5vdGF0aW9uUHJvY2Vzc2luZ0dyb3VwID0gbmV3IEdyb3VwKHRoaXMsIFNXVC5TSEFET1dfSU4pOwotICAgICAgICBhbm5vdGF0aW9uUHJvY2Vzc2luZ0dyb3VwLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVhXU19BTk5PVEFUSU9OU19QUk9DRVNTSU5HX0dST1VQX0xBQkVMKTsKLSAgICAgICAgYW5ub3RhdGlvblByb2Nlc3NpbmdHcm91cC5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgQ1hGVUlNZXNzYWdlcy5KQVhXU19FTkFCTEVfQU5OT1RBVElPTl9QUk9DRVNTSU5HX1RPT0xUSVAsCi0gICAgICAgICAgICAgICAgY29udGV4dC5nZXREZWZhdWx0UnVudGltZVR5cGUoKSkpOwotICAgICAgICBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIGFubm90YXRpb25Qcm9jZXNzaW5nR3JvdXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgYW5ub3RhdGlvblByb2Nlc3NpbmdHcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBlbmFibGVBUFRCdXR0b24gPSBuZXcgQnV0dG9uKGFubm90YXRpb25Qcm9jZXNzaW5nR3JvdXAsIFNXVC5DSEVDSyk7Ci0gICAgICAgIGVuYWJsZUFQVEJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFYV1NfRU5BQkxFX0FOTk9UQVRJT05fUFJPQ0VTU0lORyk7Ci0gICAgICAgIGVuYWJsZUFQVEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VsZWN0ZWQgPSAoKEJ1dHRvbikgZS53aWRnZXQpLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0QW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKHNlbGVjdGVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGVuYWJsZUFQVEJ1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0cygpIHsKLSAgICAgICAgZ2VuZXJhdGVXZWJNZXRob2RCdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9XRUJfTUVUSE9EX0FOTk9UQVRJT04pKTsKLQotICAgICAgICBnZW5lcmF0ZVdlYlBhcmFtQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV0VCX1BBUkFNX0FOTk9UQVRJT04pKTsKLQotICAgICAgICBnZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfUkVRVUVTVF9XUkFQUEVSX0FOTk9UQVRJT04pKTsKLQotICAgICAgICBnZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckJ1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1JFU1BPTlNFX1dSQVBQRVJfQU5OT1RBVElPTikpOwotCi0gICAgICAgIGVuYWJsZUFQVEJ1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0FOTk9UQVRJT05fUFJPQ0VTU0lOR19FTkFCTEVEKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0gICAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uKGdlbmVyYXRlV2ViTWV0aG9kQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgY29udGV4dC5zZXRHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbihnZW5lcmF0ZVdlYlBhcmFtQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgY29udGV4dC5zZXRHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbihnZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgY29udGV4dC5zZXRHZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24oZ2VuZXJhdGVSZXNwb25zZVdyYXBwZXJCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBjb250ZXh0LnNldEFubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZChlbmFibGVBUFRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL0JsYW5rUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9CbGFua1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGU0MWYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL0JsYW5rUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLkNYRlVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi1wdWJsaWMgY2xhc3MgQmxhbmtSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgewotCi0gICAgcHVibGljIEJsYW5rUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotICAgICAgICBzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQotICAgICAgICBhZGRDb250cm9scygpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRDb250cm9scygpIHsKLSAgICAgICAgdGhpcy5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0gICAgICAgIENMYWJlbCBzZXRJbnRhbGxEaXJMYWJlbCA9IG5ldyBDTGFiZWwodGhpcywgU1dULk5PTkUpOwotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuQ0VOVEVSLCBTV1QuQ0VOVEVSLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgc2V0SW50YWxsRGlyTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIHNldEludGFsbERpckxhYmVsLnNldEltYWdlKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoCi0gICAgICAgICAgICAgICAgSVNoYXJlZEltYWdlcy5JTUdfT0JKU19FUlJPUl9UU0spKTsKLSAgICAgICAgc2V0SW50YWxsRGlyTGFiZWwuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9SVU5USU1FX05PVF9TRVQpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvQ1hGMjBXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvQ1hGMjBXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDFkOWM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL0NYRjIwV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuQ1hGTW9kZWxVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLkNYRlVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLQotcHVibGljIGNsYXNzIENYRjIwV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgewotICAgIFdTREwySmF2YUNvbnRleHQgY29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdTREwySmF2YUNvbnRleHQoKTsKLQotICAgIHByaXZhdGUgQnV0dG9uIGdlbmVyYXRlU2VydmVyQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIGdlbmVyYXRlSW1wbGVtZW50YXRpb25CdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gcHJvY2Vzc1NPQVBIZWFkZXJzQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIG5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIGV4Y2x1ZGVzTmFtZXNwYWNlTWFwcGluZ0J1dHRvbjsKLQotICAgIHByaXZhdGUgQnV0dG9uIHVzZURlZmF1bHRWYWx1ZXNCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gYXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uOwotCi0gICAgcHJpdmF0ZSBUYWJsZSB4amNBcmdzVGFibGU7Ci0KLSAgICBwcml2YXRlIFRhYmxlSXRlbSB4amNEZWZhdWx0VmFsdWVzVGFibGVJdGVtOwotICAgIHByaXZhdGUgVGFibGVJdGVtIHhqY1RvU3RyaW5nVGFibGVJdGVtOwotICAgIHByaXZhdGUgVGFibGVJdGVtIHhqY1RvU3RyaW5nTXVsdGlMaW5lVGFibGVJdGVtOwotICAgIHByaXZhdGUgVGFibGVJdGVtIHhqY1RvU3RyaW5nU2ltcGxlVGFibGVJdGVtOwotICAgIHByaXZhdGUgVGFibGVJdGVtIHhqY0xvY2F0b3JUYWJsZUl0ZW07Ci0gICAgcHJpdmF0ZSBUYWJsZUl0ZW0geGpjU3luY01ldGhvZHNUYWJsZUl0ZW07Ci0gICAgcHJpdmF0ZSBUYWJsZUl0ZW0geGpjTWFya0dlbmVyYXRlZFRhYmxlSXRlbTsKLQotICAgIHB1YmxpYyBDWEYyMFdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotICAgICAgICBzdXBlcihwYXJlbnQsIHN0eWxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRDb250cm9scygpIHsKLSAgICAgICAgR3JpZExheW91dCBwcmVmbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIHRoaXMuc2V0TGF5b3V0KHByZWZsYXlvdXQpOwotCi0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB0aGlzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIEdyb3VwIHdzZGwyamF2YUdyb3VwID0gbmV3IEdyb3VwKHRoaXMsIFNXVC5TSEFET1dfSU4pOwotICAgICAgICB3c2RsMmphdmFHcm91cC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX0dST1VQX0xBQkVMKTsKLSAgICAgICAgR3JpZExheW91dCB3c2RsMmphdmFsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgd3NkbDJqYXZhR3JvdXAuc2V0TGF5b3V0KHdzZGwyamF2YWxheW91dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB3c2RsMmphdmFHcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBnZW5lcmF0ZVNlcnZlckJ1dHRvbiA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlR2VuZXJhdGVTZXJ2ZXJCdXR0b24od3NkbDJqYXZhR3JvdXAsIGNvbnRleHQpOwotICAgICAgICBnZW5lcmF0ZUltcGxlbWVudGF0aW9uQnV0dG9uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVHZW5lcmF0ZUltcGxlbWVudGF0aW9uQnV0dG9uKAotICAgICAgICAgICAgICAgIHdzZGwyamF2YUdyb3VwLCBjb250ZXh0KTsKLSAgICAgICAgCi0gICAgICAgIHVzZURlZmF1bHRWYWx1ZXNCdXR0b24gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZURlZmF1bHRWYWx1ZXNCdXR0b24od3NkbDJqYXZhR3JvdXAsIGNvbnRleHQpOwotCi0gICAgICAgIHByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbiA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlUHJvY2Vzc1NPQVBIZWFkZXJzQnV0dG9uKHdzZGwyamF2YUdyb3VwLAotICAgICAgICAgICAgICAgIGNvbnRleHQpOwotCi0gICAgICAgIG5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVOYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbigKLSAgICAgICAgICAgICAgICB3c2RsMmphdmFHcm91cCwgY29udGV4dCk7Ci0KLSAgICAgICAgZXhjbHVkZXNOYW1lc3BhY2VNYXBwaW5nQnV0dG9uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVFeGNsdWRlc05hbWVzcGFjZU1hcHBpbmdCdXR0b24oCi0gICAgICAgICAgICAgICAgd3NkbDJqYXZhR3JvdXAsIGNvbnRleHQpOwotICAgICAgICAKLSAgICAgICAgaWYgKENYRk1vZGVsVXRpbHMuaXNBdXRvTmFtZVJlc29sdXRpb25QZXJtaXR0ZWQoKSkgewotICAgICAgICAgICAgYXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVBdXRvTmFtZVJlc29sdXRpb25CdXR0b24od3NkbDJqYXZhR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgR3JvdXAgeGpjQXJnR3JvdXAgPSBuZXcgR3JvdXAodGhpcywgU1dULlNIQURPV19JTik7Ci0gICAgICAgIHhqY0FyZ0dyb3VwLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfWEpDX0FSR19HUk9VUF9USVRMRSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgeGpjQXJnTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIHhqY0FyZ0dyb3VwLnNldExheW91dCh4amNBcmdMYXlvdXQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgeGpjQXJnR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgeGpjQXJnc1RhYmxlID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNBcmdUYWJsZSh4amNBcmdHcm91cCwgY29udGV4dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgZ3JpZERhdGEudmVydGljYWxTcGFuID0gNjsKLSAgICAgICAgeGpjQXJnc1RhYmxlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIHhqY0RlZmF1bHRWYWx1ZXNUYWJsZUl0ZW0gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ0RlZmF1bHRWYWx1ZXNUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLAotICAgICAgICAgICAgICAgIGNvbnRleHQpOwotICAgICAgICB4amNUb1N0cmluZ1RhYmxlSXRlbSA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDVG9TdHJpbmdUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBjb250ZXh0KTsKLSAgICAgICAgeGpjVG9TdHJpbmdNdWx0aUxpbmVUYWJsZUl0ZW0gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ1RvU3RyaW5nTXVsdGlMaW5lVGFibGVJdGVtKAotICAgICAgICAgICAgICAgIHhqY0FyZ3NUYWJsZSwgY29udGV4dCk7Ci0gICAgICAgIHhqY1RvU3RyaW5nU2ltcGxlVGFibGVJdGVtID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNUb1N0cmluZ1NpbXBsZVRhYmxlSXRlbSh4amNBcmdzVGFibGUsCi0gICAgICAgICAgICAgICAgY29udGV4dCk7Ci0gICAgICAgIHhqY0xvY2F0b3JUYWJsZUl0ZW0gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ0xvY2F0b3JUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBjb250ZXh0KTsKLSAgICAgICAgeGpjU3luY01ldGhvZHNUYWJsZUl0ZW0gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ1N5bmNNZXRob2RzVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgY29udGV4dCk7Ci0gICAgICAgIHhqY01hcmtHZW5lcmF0ZWRUYWJsZUl0ZW0gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ01hcmtHZW5lcmF0ZWRUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLAotICAgICAgICAgICAgICAgIGNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRzKCkgewotICAgICAgICB1c2VEZWZhdWx0VmFsdWVzQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19VU0VfREVGQVVMVF9WQUxVRVMpKTsKLQotICAgICAgICBnZW5lcmF0ZVNlcnZlckJ1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuQ1hGX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVF9fR0VORVJBVEVfU0VSVkVSKSk7Ci0gICAgICAgIGdlbmVyYXRlSW1wbGVtZW50YXRpb25CdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX0dFTkVSQVRFX0lNUExFTUVOVEFUSU9OKSk7Ci0gICAgICAgIHByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fUFJPQ0VTU19TT0FQX0hFQURFUlMpKTsKLSAgICAgICAgbmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fTE9BRF9ERUZBVUxUX05BTUVTUEFDRV9QQUNLQUdFX05BTUVfTUFQUElORykpOwotICAgICAgICBleGNsdWRlc05hbWVzcGFjZU1hcHBpbmdCdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fTE9BRF9ERUZBVUxUX0VYQ0xVREVTX05BTUVQU0FDRV9NQVBQSU5HKSk7Ci0KLSAgICAgICAgaWYgKGNhblVwZGF0ZUF1dG9OYW1lUmVzb2x1dGlvbigpKSB7Ci0gICAgICAgICAgICBhdXRvTmFtZVJlc29sdXRpb25CdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX0FVVE9fTkFNRV9SRVNPTFVUSU9OKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB4amNEZWZhdWx0VmFsdWVzVGFibGVJdGVtLnNldENoZWNrZWQoQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1VTRV9ERUZBVUxUX1ZBTFVFUykpOwotICAgICAgICB4amNUb1N0cmluZ1RhYmxlSXRlbS5zZXRDaGVja2VkKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1RPX1NUUklORykpOwotICAgICAgICB4amNUb1N0cmluZ011bHRpTGluZVRhYmxlSXRlbS5zZXRDaGVja2VkKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19UT19TVFJJTkdfTVVMVElfTElORSkpOwotICAgICAgICB4amNUb1N0cmluZ1NpbXBsZVRhYmxlSXRlbS5zZXRDaGVja2VkKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19UT19TVFJJTkdfU0lNUExFKSk7Ci0gICAgICAgIHhqY0xvY2F0b3JUYWJsZUl0ZW0uc2V0Q2hlY2tlZChDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19MT0NBVE9SKSk7Ci0gICAgICAgIHhqY1N5bmNNZXRob2RzVGFibGVJdGVtLnNldENoZWNrZWQoQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1NZTkNfTUVUSE9EUykpOwotICAgICAgICB4amNNYXJrR2VuZXJhdGVkVGFibGVJdGVtLnNldENoZWNrZWQoQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX01BUktfR0VORVJBVEVEKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0gICAgICAgIHVzZURlZmF1bHRWYWx1ZXNCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNVc2VEZWZhdWx0VmFsdWVzKCkpOwotICAgICAgICBnZW5lcmF0ZVNlcnZlckJ1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0dlbmVyYXRlU2VydmVyKCkpOwotICAgICAgICBnZW5lcmF0ZUltcGxlbWVudGF0aW9uQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzR2VuZXJhdGVJbXBsZW1lbnRhdGlvbigpKTsKLSAgICAgICAgcHJvY2Vzc1NPQVBIZWFkZXJzQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzUHJvY2Vzc1NPQVBIZWFkZXJzKCkpOwotICAgICAgICBuYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0xvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKCkpOwotICAgICAgICBleGNsdWRlc05hbWVzcGFjZU1hcHBpbmdCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZygpKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChjYW5VcGRhdGVBdXRvTmFtZVJlc29sdXRpb24oKSkgewotICAgICAgICAgICAgYXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzQXV0b05hbWVSZXNvbHV0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB4amNEZWZhdWx0VmFsdWVzVGFibGVJdGVtLnNldENoZWNrZWQoY29udGV4dC5pc1hqY1VzZURlZmF1bHRWYWx1ZXMoKSk7Ci0gICAgICAgIHhqY1RvU3RyaW5nVGFibGVJdGVtLnNldENoZWNrZWQoY29udGV4dC5pc1hqY1RvU3RyaW5nKCkpOwotICAgICAgICB4amNUb1N0cmluZ011bHRpTGluZVRhYmxlSXRlbS5zZXRDaGVja2VkKGNvbnRleHQuaXNYamNUb1N0cmluZ011bHRpTGluZSgpKTsKLSAgICAgICAgeGpjVG9TdHJpbmdTaW1wbGVUYWJsZUl0ZW0uc2V0Q2hlY2tlZChjb250ZXh0LmlzWGpjVG9TdHJpbmdTaW1wbGUoKSk7Ci0gICAgICAgIHhqY0xvY2F0b3JUYWJsZUl0ZW0uc2V0Q2hlY2tlZChjb250ZXh0LmlzWGpjTG9jYXRvcigpKTsKLSAgICAgICAgeGpjU3luY01ldGhvZHNUYWJsZUl0ZW0uc2V0Q2hlY2tlZChjb250ZXh0LmlzWGpjU3luY01ldGhvZHMoKSk7Ci0gICAgICAgIHhqY01hcmtHZW5lcmF0ZWRUYWJsZUl0ZW0uc2V0Q2hlY2tlZChjb250ZXh0LmlzWGpjTWFya0dlbmVyYXRlZCgpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0gICAgICAgIGNvbnRleHQuc2V0VXNlRGVmYXVsdFZhbHVlcyh1c2VEZWZhdWx0VmFsdWVzQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgY29udGV4dC5zZXRHZW5lcmF0ZVNlcnZlcihnZW5lcmF0ZVNlcnZlckJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVJbXBsZW1lbnRhdGlvbihnZW5lcmF0ZUltcGxlbWVudGF0aW9uQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgY29udGV4dC5zZXRQcm9jZXNzU09BUEhlYWRlcnMocHJvY2Vzc1NPQVBIZWFkZXJzQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgY29udGV4dC5zZXRMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyhuYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0TG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoZXhjbHVkZXNOYW1lc3BhY2VNYXBwaW5nQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChjYW5VcGRhdGVBdXRvTmFtZVJlc29sdXRpb24oKSkgewotICAgICAgICAgICAgY29udGV4dC5zZXRBdXRvTmFtZVJlc29sdXRpb24oYXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgY29udGV4dC5zZXRYamNVc2VEZWZhdWx0VmFsdWVzKHhqY0RlZmF1bHRWYWx1ZXNUYWJsZUl0ZW0uZ2V0Q2hlY2tlZCgpKTsKLSAgICAgICAgY29udGV4dC5zZXRYamNUb1N0cmluZyh4amNUb1N0cmluZ1RhYmxlSXRlbS5nZXRDaGVja2VkKCkpOwotICAgICAgICBjb250ZXh0LnNldFhqY1RvU3RyaW5nTXVsdGlMaW5lKHhqY1RvU3RyaW5nTXVsdGlMaW5lVGFibGVJdGVtLmdldENoZWNrZWQoKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0WGpjVG9TdHJpbmdTaW1wbGUoeGpjVG9TdHJpbmdTaW1wbGVUYWJsZUl0ZW0uZ2V0Q2hlY2tlZCgpKTsKLSAgICAgICAgY29udGV4dC5zZXRYamNMb2NhdG9yKHhqY0xvY2F0b3JUYWJsZUl0ZW0uZ2V0Q2hlY2tlZCgpKTsKLSAgICAgICAgY29udGV4dC5zZXRYamNTeW5jTWV0aG9kcyh4amNTeW5jTWV0aG9kc1RhYmxlSXRlbS5nZXRDaGVja2VkKCkpOwotICAgICAgICBjb250ZXh0LnNldFhqY01hcmtHZW5lcmF0ZWQoeGpjTWFya0dlbmVyYXRlZFRhYmxlSXRlbS5nZXRDaGVja2VkKCkpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gY2FuVXBkYXRlQXV0b05hbWVSZXNvbHV0aW9uKCkgewotICAgICAgICByZXR1cm4gYXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uICE9IG51bGwgJiYgQ1hGTW9kZWxVdGlscy5pc0F1dG9OYW1lUmVzb2x1dGlvblBlcm1pdHRlZCgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvQ1hGMjFXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvQ1hGMjFXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDJjYjMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL0NYRjIxV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuQ1hGTW9kZWxVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLkNYRlVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLQotcHVibGljIGNsYXNzIENYRjIxV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgewotICAgIFdTREwySmF2YUNvbnRleHQgY29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdTREwySmF2YUNvbnRleHQoKTsKLQotICAgIHByaXZhdGUgQnV0dG9uIGdlbmVyYXRlU2VydmVyQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIGdlbmVyYXRlSW1wbGVtZW50YXRpb25CdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gcHJvY2Vzc1NPQVBIZWFkZXJzQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIG5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIGV4Y2x1ZGVzTmFtZXNwYWNlTWFwcGluZ0J1dHRvbjsKLQotICAgIHByaXZhdGUgVGFibGUgeGpjQXJnc1RhYmxlOwotCi0gICAgcHJpdmF0ZSBUYWJsZUl0ZW0geGpjRGVmYXVsdFZhbHVlc1RhYmxlSXRlbTsKLSAgICBwcml2YXRlIFRhYmxlSXRlbSB4amNUb1N0cmluZ1RhYmxlSXRlbTsKLSAgICBwcml2YXRlIFRhYmxlSXRlbSB4amNUb1N0cmluZ011bHRpTGluZVRhYmxlSXRlbTsKLSAgICBwcml2YXRlIFRhYmxlSXRlbSB4amNUb1N0cmluZ1NpbXBsZVRhYmxlSXRlbTsKLSAgICBwcml2YXRlIFRhYmxlSXRlbSB4amNMb2NhdG9yVGFibGVJdGVtOwotICAgIHByaXZhdGUgVGFibGVJdGVtIHhqY1N5bmNNZXRob2RzVGFibGVJdGVtOwotICAgIHByaXZhdGUgVGFibGVJdGVtIHhqY01hcmtHZW5lcmF0ZWRUYWJsZUl0ZW07Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiB1c2VEZWZhdWx0VmFsdWVzQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIG5vQWRkcmVzc0JpbmRpbmdCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gYXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uOwotCi0gICAgcHVibGljIENYRjIxV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudCwgc3R5bGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZENvbnRyb2xzKCkgewotICAgICAgICBHcmlkTGF5b3V0IHByZWZsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgdGhpcy5zZXRMYXlvdXQocHJlZmxheW91dCk7Ci0KLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIHRoaXMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgR3JvdXAgd3NkbDJqYXZhR3JvdXAgPSBuZXcgR3JvdXAodGhpcywgU1dULlNIQURPV19JTik7Ci0gICAgICAgIHdzZGwyamF2YUdyb3VwLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfR1JPVVBfTEFCRUwpOwotICAgICAgICBHcmlkTGF5b3V0IHdzZGwyamF2YWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLSAgICAgICAgd3NkbDJqYXZhR3JvdXAuc2V0TGF5b3V0KHdzZGwyamF2YWxheW91dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB3c2RsMmphdmFHcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICAvLyBGcm9udGVuZAotICAgICAgICAvLyBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZUZyb250ZW5kTGFiZWwod3NkbDJqYXZhR3JvdXApOwotICAgICAgICAvLyBDb21ibyBmcm9udGVuZENvbWJvID0KLSAgICAgICAgLy8gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVGcm9udGVuZENvbWJvKHdzZGwyamF2YUdyb3VwLCBjb250ZXh0KTsKLSAgICAgICAgLy8gZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIC8vIGZyb250ZW5kQ29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgLy8gRGF0YWJpbmRpbmcKLSAgICAgICAgLy8gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVEYXRhYmluZGluZ0xhYmVsKHdzZGwyamF2YUdyb3VwKTsKLSAgICAgICAgLy8gQ29tYm8gZGF0YWJpbmRpbmdDb21ibyA9Ci0gICAgICAgIC8vIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlRGF0YWJpbmRpbmdDb21ibyh3c2RsMmphdmFHcm91cCwKLSAgICAgICAgLy8gY29udGV4dCk7Ci0gICAgICAgIC8vIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICAvLyBkYXRhYmluZGluZ0NvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIC8vIFdTREwgVmVyc2lvbgotICAgICAgICAvLyBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LiBjcmVhdGVXU0RMVmVyc2lvbkxhYmVsKHdzZGwyamF2YUdyb3VwKTsKLSAgICAgICAgLy8gQ29tYm8gd3NkbFZlcnNpb25Db21ibyA9Ci0gICAgICAgIC8vIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlV1NETFZlcnNpb25Db21ibyh3c2RsMmphdmFHcm91cCwKLSAgICAgICAgLy8gY29udGV4dCk7Ci0gICAgICAgIC8vIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICAvLyB3c2RsVmVyc2lvbkNvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIGdlbmVyYXRlU2VydmVyQnV0dG9uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVHZW5lcmF0ZVNlcnZlckJ1dHRvbih3c2RsMmphdmFHcm91cCwgY29udGV4dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIGdlbmVyYXRlU2VydmVyQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIGdlbmVyYXRlSW1wbGVtZW50YXRpb25CdXR0b24gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZUdlbmVyYXRlSW1wbGVtZW50YXRpb25CdXR0b24oCi0gICAgICAgICAgICAgICAgd3NkbDJqYXZhR3JvdXAsIGNvbnRleHQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBnZW5lcmF0ZUltcGxlbWVudGF0aW9uQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIHVzZURlZmF1bHRWYWx1ZXNCdXR0b24gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZURlZmF1bHRWYWx1ZXNCdXR0b24od3NkbDJqYXZhR3JvdXAsIGNvbnRleHQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICB1c2VEZWZhdWx0VmFsdWVzQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICAKLSAgICAgICAgcHJvY2Vzc1NPQVBIZWFkZXJzQnV0dG9uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVQcm9jZXNzU09BUEhlYWRlcnNCdXR0b24od3NkbDJqYXZhR3JvdXAsCi0gICAgICAgICAgICAgICAgY29udGV4dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIHByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBuYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbiA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlTmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b24oCi0gICAgICAgICAgICAgICAgd3NkbDJqYXZhR3JvdXAsIGNvbnRleHQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBuYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBleGNsdWRlc05hbWVzcGFjZU1hcHBpbmdCdXR0b24gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZUV4Y2x1ZGVzTmFtZXNwYWNlTWFwcGluZ0J1dHRvbigKLSAgICAgICAgICAgICAgICB3c2RsMmphdmFHcm91cCwgY29udGV4dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIGV4Y2x1ZGVzTmFtZXNwYWNlTWFwcGluZ0J1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBpZiAoQ1hGTW9kZWxVdGlscy5pc0F1dG9OYW1lUmVzb2x1dGlvblBlcm1pdHRlZCgpKSB7Ci0gICAgICAgICAgICBhdXRvTmFtZVJlc29sdXRpb25CdXR0b24gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZUF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbih3c2RsMmphdmFHcm91cCwgY29udGV4dCk7Ci0gICAgICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgICAgIGF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgbm9BZGRyZXNzQmluZGluZ0J1dHRvbiA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlTm9BZGRyZXNzQmluZGluZ0J1dHRvbih3c2RsMmphdmFHcm91cCwgY29udGV4dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIG5vQWRkcmVzc0JpbmRpbmdCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIAotICAgICAgICBHcm91cCB4amNBcmdHcm91cCA9IG5ldyBHcm91cCh0aGlzLCBTV1QuU0hBRE9XX0lOKTsKLSAgICAgICAgeGpjQXJnR3JvdXAuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9YSkNfQVJHX0dST1VQX1RJVExFKTsKLSAgICAgICAgR3JpZExheW91dCB4amNBcmdMYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgeGpjQXJnR3JvdXAuc2V0TGF5b3V0KHhqY0FyZ0xheW91dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB4amNBcmdHcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICB4amNBcmdzVGFibGUgPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ0FyZ1RhYmxlKHhqY0FyZ0dyb3VwLCBjb250ZXh0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSA2OwotICAgICAgICB4amNBcmdzVGFibGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgeGpjRGVmYXVsdFZhbHVlc1RhYmxlSXRlbSA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDRGVmYXVsdFZhbHVlc1RhYmxlSXRlbSh4amNBcmdzVGFibGUsCi0gICAgICAgICAgICAgICAgY29udGV4dCk7Ci0gICAgICAgIHhqY1RvU3RyaW5nVGFibGVJdGVtID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNUb1N0cmluZ1RhYmxlSXRlbSh4amNBcmdzVGFibGUsIGNvbnRleHQpOwotICAgICAgICB4amNUb1N0cmluZ011bHRpTGluZVRhYmxlSXRlbSA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDVG9TdHJpbmdNdWx0aUxpbmVUYWJsZUl0ZW0oCi0gICAgICAgICAgICAgICAgeGpjQXJnc1RhYmxlLCBjb250ZXh0KTsKLSAgICAgICAgeGpjVG9TdHJpbmdTaW1wbGVUYWJsZUl0ZW0gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ1RvU3RyaW5nU2ltcGxlVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwKLSAgICAgICAgICAgICAgICBjb250ZXh0KTsKLSAgICAgICAgeGpjTG9jYXRvclRhYmxlSXRlbSA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDTG9jYXRvclRhYmxlSXRlbSh4amNBcmdzVGFibGUsIGNvbnRleHQpOwotICAgICAgICB4amNTeW5jTWV0aG9kc1RhYmxlSXRlbSA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDU3luY01ldGhvZHNUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBjb250ZXh0KTsKLSAgICAgICAgeGpjTWFya0dlbmVyYXRlZFRhYmxlSXRlbSA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDTWFya0dlbmVyYXRlZFRhYmxlSXRlbSh4amNBcmdzVGFibGUsCi0gICAgICAgICAgICAgICAgY29udGV4dCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoKSB7Ci0gICAgICAgIHVzZURlZmF1bHRWYWx1ZXNCdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1VTRV9ERUZBVUxUX1ZBTFVFUykpOwotICAgICAgICAKLSAgICAgICAgbm9BZGRyZXNzQmluZGluZ0J1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fTk9fQUREUkVTU19CSU5ESU5HKSk7Ci0KLSAgICAgICAgZ2VuZXJhdGVTZXJ2ZXJCdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLkNYRl9DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuQ1hGX0NPTlRFWFRfX0dFTkVSQVRFX1NFUlZFUikpOwotICAgICAgICAKLSAgICAgICAgZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbkJ1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fR0VORVJBVEVfSU1QTEVNRU5UQVRJT04pKTsKLSAgICAgICAgCi0gICAgICAgIHByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fUFJPQ0VTU19TT0FQX0hFQURFUlMpKTsKLSAgICAgICAgCi0gICAgICAgIG5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX0xPQURfREVGQVVMVF9OQU1FU1BBQ0VfUEFDS0FHRV9OQU1FX01BUFBJTkcpKTsKLSAgICAgICAgCi0gICAgICAgIGV4Y2x1ZGVzTmFtZXNwYWNlTWFwcGluZ0J1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19MT0FEX0RFRkFVTFRfRVhDTFVERVNfTkFNRVBTQUNFX01BUFBJTkcpKTsKLQotICAgICAgICBpZiAoY2FuVXBkYXRlQXV0b05hbWVSZXNvbHV0aW9uKCkpIHsKLSAgICAgICAgICAgIGF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fQVVUT19OQU1FX1JFU09MVVRJT04pKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgeGpjRGVmYXVsdFZhbHVlc1RhYmxlSXRlbS5zZXRDaGVja2VkKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19VU0VfREVGQVVMVF9WQUxVRVMpKTsKLSAgICAgICAgCi0gICAgICAgIHhqY1RvU3RyaW5nVGFibGVJdGVtLnNldENoZWNrZWQoQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfVE9fU1RSSU5HKSk7Ci0gICAgICAgIAotICAgICAgICB4amNUb1N0cmluZ011bHRpTGluZVRhYmxlSXRlbS5zZXRDaGVja2VkKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19UT19TVFJJTkdfTVVMVElfTElORSkpOwotICAgICAgICAKLSAgICAgICAgeGpjVG9TdHJpbmdTaW1wbGVUYWJsZUl0ZW0uc2V0Q2hlY2tlZChDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfVE9fU1RSSU5HX1NJTVBMRSkpOwotICAgICAgICAKLSAgICAgICAgeGpjTG9jYXRvclRhYmxlSXRlbS5zZXRDaGVja2VkKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX0xPQ0FUT1IpKTsKLSAgICAgICAgCi0gICAgICAgIHhqY1N5bmNNZXRob2RzVGFibGVJdGVtLnNldENoZWNrZWQoQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1NZTkNfTUVUSE9EUykpOwotICAgICAgICAKLSAgICAgICAgeGpjTWFya0dlbmVyYXRlZFRhYmxlSXRlbS5zZXRDaGVja2VkKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19NQVJLX0dFTkVSQVRFRCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotICAgICAgICB1c2VEZWZhdWx0VmFsdWVzQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzVXNlRGVmYXVsdFZhbHVlcygpKTsKLSAgICAgICAgbm9BZGRyZXNzQmluZGluZ0J1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc05vQWRkcmVzc0JpbmRpbmcoKSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoY2FuVXBkYXRlQXV0b05hbWVSZXNvbHV0aW9uKCkpIHsKLSAgICAgICAgICAgIGF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0F1dG9OYW1lUmVzb2x1dGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZ2VuZXJhdGVTZXJ2ZXJCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZVNlcnZlcigpKTsKLSAgICAgICAgZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbkJ1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0dlbmVyYXRlSW1wbGVtZW50YXRpb24oKSk7Ci0gICAgICAgIHByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc1Byb2Nlc3NTT0FQSGVhZGVycygpKTsKLSAgICAgICAgbmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZygpKTsKLSAgICAgICAgZXhjbHVkZXNOYW1lc3BhY2VNYXBwaW5nQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoKSk7Ci0KLSAgICAgICAgeGpjRGVmYXVsdFZhbHVlc1RhYmxlSXRlbS5zZXRDaGVja2VkKGNvbnRleHQuaXNYamNVc2VEZWZhdWx0VmFsdWVzKCkpOwotICAgICAgICB4amNUb1N0cmluZ1RhYmxlSXRlbS5zZXRDaGVja2VkKGNvbnRleHQuaXNYamNUb1N0cmluZygpKTsKLSAgICAgICAgeGpjVG9TdHJpbmdNdWx0aUxpbmVUYWJsZUl0ZW0uc2V0Q2hlY2tlZChjb250ZXh0LmlzWGpjVG9TdHJpbmdNdWx0aUxpbmUoKSk7Ci0gICAgICAgIHhqY1RvU3RyaW5nU2ltcGxlVGFibGVJdGVtLnNldENoZWNrZWQoY29udGV4dC5pc1hqY1RvU3RyaW5nU2ltcGxlKCkpOwotICAgICAgICB4amNMb2NhdG9yVGFibGVJdGVtLnNldENoZWNrZWQoY29udGV4dC5pc1hqY0xvY2F0b3IoKSk7Ci0gICAgICAgIHhqY1N5bmNNZXRob2RzVGFibGVJdGVtLnNldENoZWNrZWQoY29udGV4dC5pc1hqY1N5bmNNZXRob2RzKCkpOwotICAgICAgICB4amNNYXJrR2VuZXJhdGVkVGFibGVJdGVtLnNldENoZWNrZWQoY29udGV4dC5pc1hqY01hcmtHZW5lcmF0ZWQoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHN0b3JlVmFsdWVzKCkgewotICAgICAgICBjb250ZXh0LnNldFVzZURlZmF1bHRWYWx1ZXModXNlRGVmYXVsdFZhbHVlc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0Tm9BZGRyZXNzQmluZGluZyhub0FkZHJlc3NCaW5kaW5nQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChjYW5VcGRhdGVBdXRvTmFtZVJlc29sdXRpb24oKSkgewotICAgICAgICAgICAgY29udGV4dC5zZXRBdXRvTmFtZVJlc29sdXRpb24oYXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgY29udGV4dC5zZXRHZW5lcmF0ZVNlcnZlcihnZW5lcmF0ZVNlcnZlckJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVJbXBsZW1lbnRhdGlvbihnZW5lcmF0ZUltcGxlbWVudGF0aW9uQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgY29udGV4dC5zZXRQcm9jZXNzU09BUEhlYWRlcnMocHJvY2Vzc1NPQVBIZWFkZXJzQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgY29udGV4dC5zZXRMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyhuYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0TG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoZXhjbHVkZXNOYW1lc3BhY2VNYXBwaW5nQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQotICAgICAgICBjb250ZXh0LnNldFhqY1VzZURlZmF1bHRWYWx1ZXMoeGpjRGVmYXVsdFZhbHVlc1RhYmxlSXRlbS5nZXRDaGVja2VkKCkpOwotICAgICAgICBjb250ZXh0LnNldFhqY1RvU3RyaW5nKHhqY1RvU3RyaW5nVGFibGVJdGVtLmdldENoZWNrZWQoKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0WGpjVG9TdHJpbmdNdWx0aUxpbmUoeGpjVG9TdHJpbmdNdWx0aUxpbmVUYWJsZUl0ZW0uZ2V0Q2hlY2tlZCgpKTsKLSAgICAgICAgY29udGV4dC5zZXRYamNUb1N0cmluZ1NpbXBsZSh4amNUb1N0cmluZ1NpbXBsZVRhYmxlSXRlbS5nZXRDaGVja2VkKCkpOwotICAgICAgICBjb250ZXh0LnNldFhqY0xvY2F0b3IoeGpjTG9jYXRvclRhYmxlSXRlbS5nZXRDaGVja2VkKCkpOwotICAgICAgICBjb250ZXh0LnNldFhqY1N5bmNNZXRob2RzKHhqY1N5bmNNZXRob2RzVGFibGVJdGVtLmdldENoZWNrZWQoKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0WGpjTWFya0dlbmVyYXRlZCh4amNNYXJrR2VuZXJhdGVkVGFibGVJdGVtLmdldENoZWNrZWQoKSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBjYW5VcGRhdGVBdXRvTmFtZVJlc29sdXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBhdXRvTmFtZVJlc29sdXRpb25CdXR0b24gIT0gbnVsbCAmJiBDWEZNb2RlbFV0aWxzLmlzQXV0b05hbWVSZXNvbHV0aW9uUGVybWl0dGVkKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9KYXZhMldTRExSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL0phdmEyV1NETFJ1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmI1ZWFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL0phdmEyV1NETFJ1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5jb250ZXh0LkphdmEyV1NQZXJzaXN0ZW50Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuQ1hGTW9kZWxVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLkNYRlVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiRm9sZGVyOwotCi1wdWJsaWMgY2xhc3MgSmF2YTJXU0RMUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLSAgICBwcml2YXRlIEphdmEyV1NQZXJzaXN0ZW50Q29udGV4dCBjb250ZXh0ID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKTsKLQotICAgIHByaXZhdGUgQ29tYm8gc29hcEJpbmRpbmdDb21ibzsKLSAgICBwcml2YXRlIEJ1dHRvbiBjcmVhdGVYU0RJbXBvcnRzQnV0dG9uOyAgICAKLSAgICBwcml2YXRlIFRhYkZvbGRlciB0YWJGb2xkZXI7Ci0gICAgCi0gICAgcHVibGljIEphdmEyV1NETFJ1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIFRhYkZvbGRlciB0YWJGb2xkZXIpIHsKLSAgICAgICAgc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0gICAgICAgIHRoaXMudGFiRm9sZGVyID0gdGFiRm9sZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZENvbnRyb2xzKCkgewotICAgICAgICBHcmlkTGF5b3V0IHByZWZsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgdGhpcy5zZXRMYXlvdXQocHJlZmxheW91dCk7Ci0KLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIHRoaXMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgR3JvdXAgamF2YTJ3c2RsR3JvdXAgPSBuZXcgR3JvdXAodGhpcywgU1dULlNIQURPV19JTik7Ci0gICAgICAgIGphdmEyd3NkbEdyb3VwLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTRExfR1JPVVBfTEFCRUwpOwotICAgICAgICBHcmlkTGF5b3V0IGphdmEyd3NsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBqYXZhMndzbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgICAgICBqYXZhMndzZGxHcm91cC5zZXRMYXlvdXQoamF2YTJ3c2xheW91dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBqYXZhMndzZGxHcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVTT0FQQmluZGluZ0xhYmVsKGphdmEyd3NkbEdyb3VwKTsKLQotICAgICAgICBzb2FwQmluZGluZ0NvbWJvID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlU09BUEJpbmdDb21ibyhqYXZhMndzZGxHcm91cCwgY29udGV4dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIHNvYXBCaW5kaW5nQ29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgY3JlYXRlWFNESW1wb3J0c0J1dHRvbiA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZVhTREltcG9ydHNCdXR0b24oamF2YTJ3c2RsR3JvdXAsIGNvbnRleHQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIGNyZWF0ZVhTREltcG9ydHNCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIAotICAgICAgICBMaW5rIGxpbmsgPSBuZXcgTGluayh0aGlzLCBTV1QuTk9ORSk7Ci0gICAgICAgIGxpbmsuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkFOTk9UQVRJT05TX1BSRUZFUkVOQ0VTX0xJTkspOwotICAgICAgICBsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHRhYkZvbGRlci5zZXRTZWxlY3Rpb24oMyk7IAotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoKSB7Ci0gICAgICAgIGlmIChDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fU09BUDEyX0JJTkRJTkcpKSB7Ci0gICAgICAgICAgICBzb2FwQmluZGluZ0NvbWJvLnNldFRleHQoIlNPQVAgMS4yIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNvYXBCaW5kaW5nQ29tYm8uc2V0VGV4dCgiU09BUCAxLjEiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0KLSAgICAgICAgY3JlYXRlWFNESW1wb3J0c0J1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1hTRF9JTVBPUlRTKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0gICAgICAgIGlmIChjb250ZXh0LmlzU29hcDEyQmluZGluZygpKSB7Ci0gICAgICAgICAgICBzb2FwQmluZGluZ0NvbWJvLnNldFRleHQoIlNPQVAgMS4yIik7IC8vJE5PTi1OTFMtMSQgICAgCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzb2FwQmluZGluZ0NvbWJvLnNldFRleHQoIlNPQVAgMS4xIik7IC8vJE5PTi1OTFMtMSQgICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBjcmVhdGVYU0RJbXBvcnRzQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzR2VuZXJhdGVYU0RJbXBvcnRzKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzdG9yZVZhbHVlcygpIHsKLSAgICAgICAgaWYgKHNvYXBCaW5kaW5nQ29tYm8uZ2V0VGV4dCgpLmVxdWFscygiU09BUCAxLjIiKSkgewotICAgICAgICAgICAgY29udGV4dC5zZXRTb2FwMTJCaW5kaW5nKHRydWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29udGV4dC5zZXRTb2FwMTJCaW5kaW5nKGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVYU0RJbXBvcnRzKGNyZWF0ZVhTREltcG9ydHNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL0phdmEyV1NSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL0phdmEyV1NSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ2MmZmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9KYXZhMldTUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLmNvbnRleHQuSmF2YTJXU1BlcnNpc3RlbnRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5DWEZNb2RlbFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuQ1hGVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJGb2xkZXI7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhMldTUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLSAgICBwcml2YXRlIEphdmEyV1NQZXJzaXN0ZW50Q29udGV4dCBjb250ZXh0ID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKTsKLSAgICAKLSAgICBwcml2YXRlIENvbWJvIHNvYXBCaW5kaW5nQ29tYm87Ci0gICAgcHJpdmF0ZSBCdXR0b24gY3JlYXRlWFNESW1wb3J0c0J1dHRvbjsKLQotICAgIHByaXZhdGUgQnV0dG9uIGdlbmVyYXRlQ2xpZW50QnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIGdlbmVyYXRlU2VydmVyQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIGdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbkJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBnZW5lcmF0ZVdTRExCdXR0b247Ci0gICAgCi0gICAgcHJpdmF0ZSBUYWJGb2xkZXIgdGFiRm9sZGVyOwotICAgIAotICAgIHB1YmxpYyBKYXZhMldTUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgVGFiRm9sZGVyIHRhYkZvbGRlcikgewotICAgICAgICBzdXBlcihwYXJlbnQsIHN0eWxlKTsKLSAgICAgICAgdGhpcy50YWJGb2xkZXIgPSB0YWJGb2xkZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkQ29udHJvbHMoKSB7Ci0gICAgICAgIEdyaWRMYXlvdXQgcHJlZmxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0KLSAgICAgICAgcHJlZmxheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICAgICAgcHJlZmxheW91dC5tYXJnaW5IZWlnaHQgPSAxMDsKLSAgICAgICAgdGhpcy5zZXRMYXlvdXQocHJlZmxheW91dCk7Ci0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB0aGlzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIC8vIEphdmEyV1MgR3JvdXAKLSAgICAgICAgR3JvdXAgamF2YTJ3c0dyb3VwID0gbmV3IEdyb3VwKHRoaXMsIFNXVC5TSEFET1dfSU4pOwotICAgICAgICBqYXZhMndzR3JvdXAuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfR1JPVVBfTEFCRUwpOwotICAgICAgICBHcmlkTGF5b3V0IGphdmEyd3NsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCi0gICAgICAgIGphdmEyd3NsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0KLSAgICAgICAgamF2YTJ3c2xheW91dC5tYXJnaW5IZWlnaHQgPSAxMDsKLSAgICAgICAgamF2YTJ3c0dyb3VwLnNldExheW91dChqYXZhMndzbGF5b3V0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBqYXZhMndzR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgLy8gRnJvbnRlbmQKLSAgICAgICAgSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlRnJvbnRlbmRMYWJlbChqYXZhMndzR3JvdXApOwotICAgICAgICBDb21ibyBmcm9udGVuZENvbWJvID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlRnJvbnRlbmRDb21ibyhqYXZhMndzR3JvdXAsIGNvbnRleHQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBmcm9udGVuZENvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIC8vIERhdGFiaW5kaW5nCi0gICAgICAgIEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZURhdGFiaW5kaW5nTGFiZWwoamF2YTJ3c0dyb3VwKTsKLSAgICAgICAgQ29tYm8gZGF0YWJpbmRpbmdDb21ibyA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZURhdGFiaW5kaW5nQ29tYm8oamF2YTJ3c0dyb3VwLCBjb250ZXh0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgZGF0YWJpbmRpbmdDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICAvLyBHZW4gQ2xpZW50Ci0gICAgICAgIGdlbmVyYXRlQ2xpZW50QnV0dG9uID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlR2VuZXJhdGVDbGllbnRCdXR0b24oamF2YTJ3c0dyb3VwLCBjb250ZXh0KTsKLQotICAgICAgICAvLyBHZW4gU2VydmVyCi0gICAgICAgIGdlbmVyYXRlU2VydmVyQnV0dG9uID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlR2VuZXJhdGVTZXJ2ZXJCdXR0b24oamF2YTJ3c0dyb3VwLCBjb250ZXh0KTsKLQotICAgICAgICAvLyBHZW4gV3JhcHBlciBhbmQgRmF1bHQgQmVhbgotICAgICAgICBnZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5CdXR0b24gPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5CdXR0b24oCi0gICAgICAgICAgICAgICAgamF2YTJ3c0dyb3VwLCBjb250ZXh0KTsKLQotICAgICAgICAvLyBHZW4gV1NETAotICAgICAgICBnZW5lcmF0ZVdTRExCdXR0b24gPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVHZW5lcmF0ZVdTRExCdXR0b24oamF2YTJ3c0dyb3VwLCBjb250ZXh0KTsKLSAgICAgICAgZ2VuZXJhdGVXU0RMQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGVuYWJsZVdTRExHcm91cChnZW5lcmF0ZVdTRExCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIGdlbmVyYXRlV1NETEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBHcm91cCB3c2RsR3JvdXAgPSBuZXcgR3JvdXAoamF2YTJ3c0dyb3VwLCBTV1QuU0hBRE9XX0VUQ0hFRF9JTik7Ci0gICAgICAgIEdyaWRMYXlvdXQgd3NkbEdyb3VwTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotICAgICAgICB3c2RsR3JvdXAuc2V0TGF5b3V0KHdzZGxHcm91cExheW91dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgd3NkbEdyb3VwLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZVNPQVBCaW5kaW5nTGFiZWwod3NkbEdyb3VwKTsKLQotICAgICAgICBzb2FwQmluZGluZ0NvbWJvID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlU09BUEJpbmdDb21ibyh3c2RsR3JvdXAsIGNvbnRleHQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBzb2FwQmluZGluZ0NvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIGNyZWF0ZVhTREltcG9ydHNCdXR0b24gPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVYU0RJbXBvcnRzQnV0dG9uKHdzZGxHcm91cCwgY29udGV4dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgY3JlYXRlWFNESW1wb3J0c0J1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgCi0gICAgICAgIExpbmsgbGluayA9IG5ldyBMaW5rKHRoaXMsIFNXVC5OT05FKTsKLSAgICAgICAgbGluay5zZXRUZXh0KENYRlVJTWVzc2FnZXMuQU5OT1RBVElPTlNfUFJFRkVSRU5DRVNfTElOSyk7Ci0gICAgICAgIGxpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgdGFiRm9sZGVyLnNldFNlbGVjdGlvbigzKTsgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBlbmFibGVXU0RMR3JvdXAoY29udGV4dC5pc0dlbmVyYXRlV1NETCgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBlbmFibGVXU0RMR3JvdXAoYm9vbGVhbiBlbmFibGUpIHsKLSAgICAgICAgc29hcEJpbmRpbmdDb21iby5zZXRFbmFibGVkKGVuYWJsZSk7Ci0gICAgICAgIGNyZWF0ZVhTREltcG9ydHNCdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0cygpIHsKLSAgICAgICAgaWYgKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19TT0FQMTJfQklORElORykpIHsKLSAgICAgICAgICAgIHNvYXBCaW5kaW5nQ29tYm8uc2V0VGV4dCgiU09BUCAxLjIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc29hcEJpbmRpbmdDb21iby5zZXRUZXh0KCJTT0FQIDEuMSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGNyZWF0ZVhTREltcG9ydHNCdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9YU0RfSU1QT1JUUykpOwotCi0gICAgICAgIGdlbmVyYXRlQ2xpZW50QnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5DWEZfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkNYRl9DT05URVhUX19HRU5FUkFURV9DTElFTlQpKTsKLSAgICAgICAgCi0gICAgICAgIGdlbmVyYXRlU2VydmVyQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5DWEZfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkNYRl9DT05URVhUX19HRU5FUkFURV9TRVJWRVIpKTsKLSAgICAgICAgCi0gICAgICAgIGdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbkJ1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVCwgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9XUkFQUEVSX0ZBVUxUX0JFQU5TKSk7Ci0gICAgICAgIAotICAgICAgICBnZW5lcmF0ZVdTRExCdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9XU0RMKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0gICAgICAgIGlmIChjb250ZXh0LmlzU29hcDEyQmluZGluZygpKSB7Ci0gICAgICAgICAgICBzb2FwQmluZGluZ0NvbWJvLnNldFRleHQoIlNPQVAgMS4yIik7IC8vJE5PTi1OTFMtMSQgICAgCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzb2FwQmluZGluZ0NvbWJvLnNldFRleHQoIlNPQVAgMS4xIik7IC8vJE5PTi1OTFMtMSQgICAgICAgICAgICAKLSAgICAgICAgfQotCi0gICAgICAgIGNyZWF0ZVhTREltcG9ydHNCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZVhTREltcG9ydHMoKSk7Ci0gICAgICAgIGdlbmVyYXRlQ2xpZW50QnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzR2VuZXJhdGVDbGllbnQoKSk7Ci0gICAgICAgIGdlbmVyYXRlU2VydmVyQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzR2VuZXJhdGVTZXJ2ZXIoKSk7Ci0gICAgICAgIGdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbkJ1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0dlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMoKSk7Ci0gICAgICAgIGdlbmVyYXRlV1NETEJ1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0dlbmVyYXRlV1NETCgpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0gICAgICAgIGlmIChzb2FwQmluZGluZ0NvbWJvLmdldFRleHQoKS5lcXVhbHMoIlNPQVAgMS4yIikpIHsKLSAgICAgICAgICAgIGNvbnRleHQuc2V0U29hcDEyQmluZGluZyh0cnVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbnRleHQuc2V0U29hcDEyQmluZGluZyhmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBjb250ZXh0LnNldEdlbmVyYXRlWFNESW1wb3J0cyhjcmVhdGVYU0RJbXBvcnRzQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgY29udGV4dC5zZXRHZW5lcmF0ZUNsaWVudChnZW5lcmF0ZUNsaWVudEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVTZXJ2ZXIoZ2VuZXJhdGVTZXJ2ZXJCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBjb250ZXh0LnNldEdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMoZ2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFuQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgY29udGV4dC5zZXRHZW5lcmF0ZVdTREwoZ2VuZXJhdGVXU0RMQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9KYXZhMldTV2lkZ2V0RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvSmF2YTJXU1dpZGdldEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY0Y2NhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9KYXZhMldTV2lkZ2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlSGllcmFyY2h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5TdGFuZGFyZEphdmFFbGVtZW50Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5EYXRhQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuRnJvbnRlbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuQ1hGVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLkNYRlVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkudmlld2Vycy5KYXZhVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcjsKLQotLyoqCi0gKiBQcm92aWRlcyB3aWRnZXRzIGZvciBKYXZhMldTIHByZWZlcmVuY2VzLCB3aXphcmRzLCBkaWFsb2dzLiBFbmFibGVzIHRoZSByZXVzZQotICogb2Ygd2lkZ2V0cyBpbiBtdWx0aXBsZSBsb2NhdGlvbnMuIFdpZGdldHMgaGF2ZSB0aGVyZSBsYWJlbGluZyBhbmQgdG9vbHRpcHMKLSAqIHNldCBoZXJlIGFuZCB3aGVyZSBwb3NzaWJsZSBsaXN0ZW5lcnMgYXJlIHNldCB3aGljaCB1cGRhdGUgaW5zdGFuY2VzIG9mCi0gKiA8Y29kZT5KYXZhMldTQ29udGV4dDwvY29kZT4gYW5kIDxjb2RlPkphdmEyV1NEYXRhTW9kZWw8L2NvZGU+LgotICogCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBKYXZhMldTV2lkZ2V0RmFjdG9yeSB7Ci0KLSAgICBwcml2YXRlIEphdmEyV1NXaWRnZXRGYWN0b3J5KCkgewotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlU09BUEJpbmRpbmdMYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIExhYmVsIGRlZmF1bHRTb2FwQmluZGluZyA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgZGVmYXVsdFNvYXBCaW5kaW5nLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX0RFRkFVTFRfU09BUEJJTkRJTkdfTEFCRUwpOwotICAgICAgICByZXR1cm4gZGVmYXVsdFNvYXBCaW5kaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29tYm8gY3JlYXRlU09BUEJpbmdDb21ibyhDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBKYXZhMldTQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIENvbWJvIHNvYXBCaW5kaW5nQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuUkVBRF9PTkxZKTsKLSAgICAgICAgc29hcEJpbmRpbmdDb21iby5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfU09BUDEyX0JJTkRJTkdfVE9PTFRJUCk7Ci0gICAgICAgIHNvYXBCaW5kaW5nQ29tYm8uYWRkKCJTT0FQIDEuMSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHNvYXBCaW5kaW5nQ29tYm8uYWRkKCJTT0FQIDEuMiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHNvYXBCaW5kaW5nQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc29hcEJpbmRpbmcgPSAoKENvbWJvKSBlLndpZGdldCkuZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChzb2FwQmluZGluZy5lcXVhbHMoIlNPQVAgMS4yIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldFNvYXAxMkJpbmRpbmcodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXRTb2FwMTJCaW5kaW5nKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBpZiAoY29udGV4dC5pc1NvYXAxMkJpbmRpbmcoKSkgewotICAgICAgICAgICAgc29hcEJpbmRpbmdDb21iby5zZXRUZXh0KCJTT0FQIDEuMiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzb2FwQmluZGluZ0NvbWJvLnNldFRleHQoIlNPQVAgMS4xIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzb2FwQmluZGluZ0NvbWJvOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZVhTREltcG9ydHNCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgSmF2YTJXU0NvbnRleHQgY29udGV4dCkgewotICAgICAgICBCdXR0b24gY3JlYXRlWFNESW1wb3J0cyA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotICAgICAgICBjcmVhdGVYU0RJbXBvcnRzLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX0dFTl9YU0RfSU1QT1JUUyk7Ci0gICAgICAgIGNyZWF0ZVhTREltcG9ydHMuc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX0NSRUFURV9YU0RfSU1QT1JUU19UT09MVElQKTsKLSAgICAgICAgY3JlYXRlWFNESW1wb3J0cy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVYU0RJbXBvcnRzKCgoQnV0dG9uKSBlLndpZGdldCkuZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgY3JlYXRlWFNESW1wb3J0cy5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0dlbmVyYXRlWFNESW1wb3J0cygpKTsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVhTREltcG9ydHM7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVGcm9udGVuZExhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgTGFiZWwgZnJvbnRlbmRMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgZnJvbnRlbmRMYWJlbC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuQ1hGX0RFRkFVTFRfRlJPTlRFTkRfTEFCRUwpOwotICAgICAgICByZXR1cm4gZnJvbnRlbmRMYWJlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENvbWJvIGNyZWF0ZUZyb250ZW5kQ29tYm8oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgSmF2YTJXU0NvbnRleHQgY29udGV4dCkgewotICAgICAgICBmaW5hbCBDb21ibyBmcm9udGVuZENvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0gICAgICAgIGZyb250ZW5kQ29tYm8uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX0ZST05URU5EX1RPT0xUSVApOwotICAgICAgICBmcm9udGVuZENvbWJvLmFkZChGcm9udGVuZC5KQVhXUy5nZXRMaXRlcmFsKCkpOwotICAgICAgICBmcm9udGVuZENvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZyb250ZW5kID0gZnJvbnRlbmRDb21iby5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRGcm9udGVuZChGcm9udGVuZC5nZXQoZnJvbnRlbmQpKTsKLSAgICAgICAgICAgICAgICBpZiAoZnJvbnRlbmQuZXF1YWxzKEZyb250ZW5kLkpBWFdTLmdldExpdGVyYWwoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXREYXRhYmluZGluZyhEYXRhQmluZGluZy5nZXQoRGF0YUJpbmRpbmcuSkFYQi5nZXRMaXRlcmFsKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgaWYgKGZyb250ZW5kLmVxdWFscygic2ltcGxlIikpIHsKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXREYXRhYmluZGluZygiYWVnaXMiKTsKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBmcm9udGVuZENvbWJvLnNldFRleHQoY29udGV4dC5nZXRGcm9udGVuZCgpLmdldExpdGVyYWwoKSk7Ci0KLSAgICAgICAgcmV0dXJuIGZyb250ZW5kQ29tYm87Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVEYXRhYmluZGluZ0xhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgTGFiZWwgZGF0YWJpbmRpbmdMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgZGF0YWJpbmRpbmdMYWJlbC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuQ1hGX0RFRkFVTFRfREFUQUJJTkRJTkdfTEFCRUwpOwotICAgICAgICByZXR1cm4gZGF0YWJpbmRpbmdMYWJlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENvbWJvIGNyZWF0ZURhdGFiaW5kaW5nQ29tYm8oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgSmF2YTJXU0NvbnRleHQgY29udGV4dCkgewotICAgICAgICBmaW5hbCBDb21ibyBkYXRhYmluZGluZ0NvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0gICAgICAgIGRhdGFiaW5kaW5nQ29tYm8uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX0RBVEFCSU5ESU5HX1RPT0xUSVApOwotICAgICAgICBkYXRhYmluZGluZ0NvbWJvLmFkZChEYXRhQmluZGluZy5KQVhCLmdldExpdGVyYWwoKSk7Ci0gICAgICAgIGRhdGFiaW5kaW5nQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldERhdGFiaW5kaW5nKERhdGFCaW5kaW5nLmdldChkYXRhYmluZGluZ0NvbWJvLmdldFRleHQoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZGF0YWJpbmRpbmdDb21iby5zZXRUZXh0KGNvbnRleHQuZ2V0RGF0YWJpbmRpbmcoKS5nZXRMaXRlcmFsKCkpOwotICAgICAgICByZXR1cm4gZGF0YWJpbmRpbmdDb21ibzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVHZW5lcmF0ZUNsaWVudEJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBKYXZhMldTQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGZpbmFsIEJ1dHRvbiBnZW5DbGllbnRCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICAgICAgZ2VuQ2xpZW50QnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX0dFTl9DTElFTlRfTEFCRUwpOwotICAgICAgICBnZW5DbGllbnRCdXR0b24uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX0dFTkVSQVRFX0NMSUVOVF9UT09MVElQKTsKLSAgICAgICAgZ2VuQ2xpZW50QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRHZW5lcmF0ZUNsaWVudChnZW5DbGllbnRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZ2VuQ2xpZW50QnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzR2VuZXJhdGVDbGllbnQoKSk7Ci0gICAgICAgIHJldHVybiBnZW5DbGllbnRCdXR0b247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlR2VuZXJhdGVTZXJ2ZXJCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgSmF2YTJXU0NvbnRleHQgY29udGV4dCkgewotICAgICAgICBmaW5hbCBCdXR0b24gZ2VuU2VydmVyQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0gICAgICAgIGdlblNlcnZlckJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19HRU5fU0VSVkVSX0xBQkVMKTsKLSAgICAgICAgZ2VuU2VydmVyQnV0dG9uLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19HRU5FUkFURV9TRVJWRVJfVE9PTFRJUCk7Ci0gICAgICAgIGdlblNlcnZlckJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVTZXJ2ZXIoZ2VuU2VydmVyQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGdlblNlcnZlckJ1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0dlbmVyYXRlU2VydmVyKCkpOwotICAgICAgICByZXR1cm4gZ2VuU2VydmVyQnV0dG9uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZUdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbkJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBKYXZhMldTQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGZpbmFsIEJ1dHRvbiBnZW5XcmFwcGVyRmF1bHRCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICAgICAgZ2VuV3JhcHBlckZhdWx0QnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX0dFTl9XUkFQUEVSX0ZBVUxUX0xBQkVMKTsKLSAgICAgICAgZ2VuV3JhcHBlckZhdWx0QnV0dG9uLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19HRU5FUkFURV9XUkFQUEVSQkVBTl9UT09MVElQKTsKLSAgICAgICAgZ2VuV3JhcHBlckZhdWx0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKGdlbldyYXBwZXJGYXVsdEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBnZW5XcmFwcGVyRmF1bHRCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKCkpOwotICAgICAgICByZXR1cm4gZ2VuV3JhcHBlckZhdWx0QnV0dG9uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZUdlbmVyYXRlV1NETEJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBKYXZhMldTQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGZpbmFsIEJ1dHRvbiBnZW5XU0RMQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0gICAgICAgIGdlbldTRExCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfR0VOX1dTRExfTEFCRUwpOwotICAgICAgICBnZW5XU0RMQnV0dG9uLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19HRU5FUkFURV9XU0RMX1RPT0xUSVApOwotICAgICAgICBnZW5XU0RMQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRHZW5lcmF0ZVdTREwoZ2VuV1NETEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBnZW5XU0RMQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzR2VuZXJhdGVXU0RMKCkpOwotICAgICAgICByZXR1cm4gZ2VuV1NETEJ1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZVdTRExGaWxlTmFtZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgTGFiZWwgd3NkbEZpbGVOYW1lTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIHdzZGxGaWxlTmFtZUxhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX1dTRExfRklMRV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIHdzZGxGaWxlTmFtZUxhYmVsOwotCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZVdTRExGaWxlTmFtZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgSmF2YTJXU0RhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICBmaW5hbCBUZXh0IHdzZGxGaWxlVGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUik7Ci0gICAgICAgIHdzZGxGaWxlVGV4dC5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfT1VUUFVUX0ZJTEVfVE9PTFRJUCk7Ci0gICAgICAgIHdzZGxGaWxlVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRXc2RsRmlsZU5hbWUod3NkbEZpbGVUZXh0LmdldFRleHQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICB3c2RsRmlsZVRleHQuc2V0VGV4dChtb2RlbC5nZXRXc2RsRmlsZU5hbWUoKSk7Ci0gICAgICAgIHJldHVybiB3c2RsRmlsZVRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlVXNlU0VJQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQnV0dG9uIHVzZVNFSUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotICAgICAgICB1c2VTRUlCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfVVNFX1NFSV9CVVRUT04pOwotICAgICAgICByZXR1cm4gdXNlU0VJQnV0dG9uOwotICAgIH0KLQotICAgIC8vICAgIHB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlSW5mb3JtYXRpb25MYWJlbChDb21wb3NpdGUgcGFyZW50LCBJVHlwZSBzdGFydGluZ1BvaW50VHlwZSkgewotICAgIC8vICAgICAgICBMYWJlbCBpbmZvTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuV1JBUCk7Ci0gICAgLy8gICAgICAgIGluZm9MYWJlbC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuYmluZChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfVVNFX1NFSV9JTkZPX0xBQkVMLCBzdGFydGluZ1BvaW50VHlwZQotICAgIC8vICAgICAgICAgICAgICAgIC5nZXRFbGVtZW50TmFtZSgpKSk7Ci0gICAgLy8gICAgICAgIHJldHVybiBpbmZvTGFiZWw7Ci0gICAgLy8gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVQYWRkaW5nTGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICByZXR1cm4gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZVNlbGVjdFNFSUJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIEJ1dHRvbiBzZWxlY3RTRUlCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlJBRElPKTsKLSAgICAgICAgc2VsZWN0U0VJQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX1NFTEVDVF9TRUlfTEFCRUwpOwotICAgICAgICByZXR1cm4gc2VsZWN0U0VJQnV0dG9uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlU2VsZWN0U0VJTGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBMYWJlbCBzZWxlY3RTRUlMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgc2VsZWN0U0VJTGFiZWwuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfU0VMRUNUX1NFSV9MQUJFTCk7Ci0gICAgICAgIHJldHVybiBzZWxlY3RTRUlMYWJlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENvbWJvIGNyZWF0ZVNlbGVjdFNFSUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIEphdmEyV1NEYXRhTW9kZWwgbW9kZWwsCi0gICAgICAgICAgICBJVHlwZSBqYXZhU3RhcnRpbmdQb2ludFR5cGUpIHsKLSAgICAgICAgZmluYWwgQ29tYm8gc2VpQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuQk9SREVSKTsKLSAgICAgICAgc2VpQ29tYm8uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX1NFTEVDVF9TRUlfVE9PTFRJUCk7Ci0KLSAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJVHlwZUhpZXJhcmNoeSB0eXBlSGllcmFyY2h5ID0gamF2YVN0YXJ0aW5nUG9pbnRUeXBlLm5ld1R5cGVIaWVyYXJjaHkoamF2YVByb2plY3QsIG51bGwpOwotICAgICAgICAgICAgSVR5cGVbXSBhbGxJbnRlcmZhY2VzID0gdHlwZUhpZXJhcmNoeS5nZXRBbGxJbnRlcmZhY2VzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsbEludGVyZmFjZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBJVHlwZSBpdHlwZSA9IGFsbEludGVyZmFjZXNbaV07Ci0gICAgICAgICAgICAgICAgaWYgKCFpdHlwZS5pc0JpbmFyeSgpICYmIGl0eXBlLmdldFJlc291cmNlKCkuZ2V0UHJvamVjdCgpLmVxdWFscyhqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlaUNvbWJvLmFkZChpdHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBDWEZVSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNlaUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBzZWlJbnRlcmZhY2VOYW1lID0gc2VpQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgIG1vZGVsLnNldEZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUoc2VpSW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHNlaUNvbWJvLmRlc2VsZWN0QWxsKCk7Ci0gICAgICAgIHJldHVybiBzZWlDb21ibzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVCcm93c2VCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBCdXR0b24gYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLSAgICAgICAgYnJvd3NlQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX0JST1dTRV9MQUJFTCk7Ci0gICAgICAgIHJldHVybiBicm93c2VCdXR0b247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlRXh0cmFjdFNFSUJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIEJ1dHRvbiBleHRyYWN0U0VJQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5SQURJTyk7Ci0gICAgICAgIGV4dHJhY3RTRUlCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfRVhUUkFDVF9TRUlfTEFCRUwpOwotICAgICAgICByZXR1cm4gZXh0cmFjdFNFSUJ1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZUV4dHJhY3RTRUlMYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIExhYmVsIGV4dHJhY3RTRUlMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgZXh0cmFjdFNFSUxhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX0VYVFJBQ1RfU0VJX0xBQkVMKTsKLSAgICAgICAgcmV0dXJuIGV4dHJhY3RTRUlMYWJlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRleHQgY3JlYXRlU0VJSW50ZXJmYWNlTmFtZVRleHQoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBUZXh0IHNlaUludGVyZmFjZU5hbWVUZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSKTsKLSAgICAgICAgc2VpSW50ZXJmYWNlTmFtZVRleHQuc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX0VYVFJBQ1RfU0VJX1RPT0xUSVApOwotICAgICAgICByZXR1cm4gc2VpSW50ZXJmYWNlTmFtZVRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVNZW1lYmVyc1RvRXh0cmFjdExhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgTGFiZWwgc2VpTWVtYmVyc1RvRXh0cmFjdExhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBzZWlNZW1iZXJzVG9FeHRyYWN0TGFiZWwuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfRVhUUkFDVF9NRU1CRVJTX0xBQkVMKTsKLSAgICAgICAgcmV0dXJuIHNlaU1lbWJlcnNUb0V4dHJhY3RMYWJlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENoZWNrYm94VGFibGVWaWV3ZXIgY3JlYXRlU0VJTWVtYmVyc1RvRXh0cmFjdFRhYmxlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ2hlY2tib3hUYWJsZVZpZXdlciBzZWlNZW1iZXJzVG9FeHRyYWN0VGFibGVWaWV3ZXIgPSBDaGVja2JveFRhYmxlVmlld2VyLm5ld0NoZWNrTGlzdChwYXJlbnQsCi0gICAgICAgICAgICAgICAgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0gICAgICAgIHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIoKSk7Ci0gICAgICAgIHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotICAgICAgICByZXR1cm4gc2VpTWVtYmVyc1RvRXh0cmFjdFRhYmxlVmlld2VyOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZVNlbGVjdEFsbEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIEJ1dHRvbiBzZWxlY3RBbGxCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotICAgICAgICBzZWxlY3RBbGxCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfU0VMRUNUX0FMTF9CVVRUT04pOwotICAgICAgICByZXR1cm4gc2VsZWN0QWxsQnV0dG9uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZURlc2VsZWN0QWxsQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQnV0dG9uIGRlc2VsZWN0QWxsQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLSAgICAgICAgZGVzZWxlY3RBbGxCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfREVTRUxFQ1RfQUxMX0JVVFRPTik7Ci0gICAgICAgIHJldHVybiBkZXNlbGVjdEFsbEJ1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZVNlbGVjdEltcGxlbWVudGF0aW9uTGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBMYWJlbCBzZWxlY3RJbXBsZW1lbnRhdGlvbkxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBzZWxlY3RJbXBsZW1lbnRhdGlvbkxhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX1NFTEVDVF9JTVBMRU1FTlRBVElPTik7Ci0gICAgICAgIHJldHVybiBzZWxlY3RJbXBsZW1lbnRhdGlvbkxhYmVsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29tYm8gY3JlYXRlU2VsZWN0SW1wbGVtZW50YXRpb25Db21ibyhDb21wb3NpdGUgcGFyZW50LAotICAgICAgICAgICAgZmluYWwgSmF2YTJXU0RhdGFNb2RlbCBtb2RlbCwgSVR5cGUgamF2YVN0YXJ0aW5nUG9pbnRUeXBlKSB7Ci0gICAgICAgIGZpbmFsIENvbWJvIHNlbGVjdEltcGxlbWVudGF0aW9uQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuQk9SREVSKTsKLSAgICAgICAgc2VsZWN0SW1wbGVtZW50YXRpb25Db21iby5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfU0VMRUNUX0lNUExFTUVOVEFUSU9OX1RPT0xUSVApOwotCi0gICAgICAgIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEpEVFV0aWxzLmdldEphdmFQcm9qZWN0KG1vZGVsLmdldFByb2plY3ROYW1lKCkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSVR5cGVIaWVyYXJjaHkgdHlwZUhpZXJhcmNoeSA9IGphdmFTdGFydGluZ1BvaW50VHlwZS5uZXdUeXBlSGllcmFyY2h5KGphdmFQcm9qZWN0LCBudWxsKTsKLSAgICAgICAgICAgIElUeXBlW10gYWxsSW1wbGVtZW50YXRpb25zID0gdHlwZUhpZXJhcmNoeS5nZXRBbGxTdWJ0eXBlcyhqYXZhU3RhcnRpbmdQb2ludFR5cGUpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxJbXBsZW1lbnRhdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBJVHlwZSBpdHlwZSA9IGFsbEltcGxlbWVudGF0aW9uc1tpXTsKLSAgICAgICAgICAgICAgICBpZiAoIWl0eXBlLmlzQmluYXJ5KCkgJiYgaXR5cGUuZ2V0UmVzb3VyY2UoKS5nZXRQcm9qZWN0KCkuZXF1YWxzKGphdmFQcm9qZWN0LmdldFByb2plY3QoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gaXR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lICs9ICIuIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBxdWFsaWZpZWROYW1lID0gcGFja2FnZU5hbWUgKyBpdHlwZS5nZXRQcmltYXJ5RWxlbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdEltcGxlbWVudGF0aW9uQ29tYm8uYWRkKHF1YWxpZmllZE5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgQ1hGVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzZWxlY3RJbXBsZW1lbnRhdGlvbkNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBpbXBsZW1lbnRhdGlvbk5hbWUgPSBzZWxlY3RJbXBsZW1lbnRhdGlvbkNvbWJvLmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoaW1wbGVtZW50YXRpb25OYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgc2VsZWN0SW1wbGVtZW50YXRpb25Db21iby5kZXNlbGVjdEFsbCgpOwotICAgICAgICByZXR1cm4gc2VsZWN0SW1wbGVtZW50YXRpb25Db21ibzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIDxjb2RlPkVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nPC9jb2RlPiB0aGF0IGRpc3BsYXlzIGFsbCB0aGUgY2xhc3NlcyBvciBhbGwgdGhlIGludGVyZmFjZXMKLSAgICAgKiB3aXRoaW4gYSA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+IGFsbG93aW5nIG9uZSBjbGFzcyBvciBpbnRlcmZhY2UgdG8gYmUgc2VsZWN0ZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IHNoZWxsCi0gICAgICogQHBhcmFtIHRpdGxlIHRoZSBkaWFsb2cgdGl0bGUKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZGlhbG9nIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gamF2YVByb2plY3QgdGhlIGphdmEgcHJvamVjdCB0aGF0IGlzIGZpbHRlcmVkCi0gICAgICogQHBhcmFtIGVsZW1lbnRLaW5kcyBhIGZsYWcgZGVmaW5pbmcgbmF0dXJlIG9mIHNlYXJjaGVkIGVsZW1lbnRzOyB0aGUgb25seSB2YWxpZCB2YWx1ZXMgYXJlOgotICAgICAqICA8Y29kZT5JSmF2YVNlYXJjaENvbnN0YW50cy5DTEFTUzwvY29kZT4KLSAgICAgKiAgPGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHMuSU5URVJGQUNFPC9jb2RlPgotICAgICAqICA8Y29kZT5JSmF2YVNlYXJjaENvbnN0YW50cy5DTEFTU19BTkRfSU5URVJGQUNFPC9jb2RlPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGVsZW1lbnQgdHJlZSBzZWxlY3Rpb24gZGlhbG9nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyBjcmVhdGVFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyhTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlLCBJSmF2YVByb2plY3QgamF2YVByb2plY3QsIGludCBlbGVtZW50S2luZHMpIHsKLSAgICAgICAgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2cgc2VsZWN0aW9uRGlhbG9nID0gbmV3IEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nKHBhcmVudCwKLSAgICAgICAgICAgICAgICBuZXcgSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyKCksIG5ldyBTdGFuZGFyZEphdmFFbGVtZW50Q29udGVudFByb3ZpZGVyKCkpOwotICAgICAgICBzZWxlY3Rpb25EaWFsb2cuc2V0VGl0bGUodGl0bGUpOwotICAgICAgICBzZWxlY3Rpb25EaWFsb2cuc2V0TWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgc2VsZWN0aW9uRGlhbG9nLnNldEFsbG93TXVsdGlwbGUoZmFsc2UpOwotICAgICAgICBzZWxlY3Rpb25EaWFsb2cuc2V0SW5wdXQoSmF2YUNvcmUuY3JlYXRlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpKTsKLQotICAgICAgICBzZWxlY3Rpb25EaWFsb2cuYWRkRmlsdGVyKG5ldyBKYXZhVmlld2VyRmlsdGVyKGphdmFQcm9qZWN0LCBlbGVtZW50S2luZHMpKTsKLQotICAgICAgICBzZWxlY3Rpb25EaWFsb2cuc2V0VmFsaWRhdG9yKG5ldyBJU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yKCkgewotCi0gICAgICAgICAgICBwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShPYmplY3RbXSBzZWxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uLmxlbmd0aCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25bMF0gaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBDWEZVSVBsdWdpbi5QTFVHSU5fSUQsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRlVJUGx1Z2luLlBMVUdJTl9JRCwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHJldHVybiBzZWxlY3Rpb25EaWFsb2c7Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL1NwcmluZ0NvbmZpZ0NvbXBvc2l0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvU3ByaW5nQ29uZmlnQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDM1OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvU3ByaW5nQ29uZmlnQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuQ1hGTW9kZWxVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLkNYRlVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotCi1wdWJsaWMgY2xhc3MgU3ByaW5nQ29uZmlnQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLSAgICBwcml2YXRlIENYRkNvbnRleHQgY29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCk7Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiB1c2VDWEZTZXJ2bGV0QnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIHVzZVNwcmluZ0FwcENvbnRleHRCdXR0b247Ci0gICAgCi0gICAgcHVibGljIFNwcmluZ0NvbmZpZ0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLSAgICAgICAgc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0gICAgICAgIGFkZENvbnRyb2xzKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZENvbnRyb2xzKCkgewotICAgICAgICBHcmlkTGF5b3V0IHByZWZsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgdGhpcy5zZXRMYXlvdXQocHJlZmxheW91dCk7Ci0KLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIHRoaXMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgR3JvdXAgc3ByaW5nQ29uZmlnR3JvdXAgPSBuZXcgR3JvdXAodGhpcywgU1dULlNIQURPV19JTik7Ci0gICAgICAgIHNwcmluZ0NvbmZpZ0dyb3VwLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5TUFJJTkdfQ09ORklHX0dST1VQX0xBQkVMKTsKLSAgICAgICAgR3JpZExheW91dCBzcHJpbmdDb25maWdMYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCB0cnVlKTsKLSAgICAgICAgc3ByaW5nQ29uZmlnR3JvdXAuc2V0TGF5b3V0KHNwcmluZ0NvbmZpZ0xheW91dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIHNwcmluZ0NvbmZpZ0dyb3VwLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIHVzZUNYRlNlcnZsZXRCdXR0b24gPSBuZXcgQnV0dG9uKHNwcmluZ0NvbmZpZ0dyb3VwLCBTV1QuUkFESU8pOwotICAgICAgICB1c2VDWEZTZXJ2bGV0QnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5TUFJJTkdfQ09ORklHX1VTRV9DWEZfU0VSVkxFVCk7Ci0gICAgICAgIHVzZUNYRlNlcnZsZXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBzZWxlY3RlZCA9ICgoQnV0dG9uKSBlLndpZGdldCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoIXNlbGVjdGVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgdXNlU3ByaW5nQXBwQ29udGV4dEJ1dHRvbiA9IG5ldyBCdXR0b24oc3ByaW5nQ29uZmlnR3JvdXAsIFNXVC5SQURJTyk7Ci0gICAgICAgIHVzZVNwcmluZ0FwcENvbnRleHRCdXR0b24KLSAgICAgICAgICAgICAgICAuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLlNQUklOR19DT05GSUdfVVNFX0NYRl9TUFJJTkdfQVBQTElDQVRJT05fQ09OVEVYVCk7Ci0gICAgICAgIHVzZVNwcmluZ0FwcENvbnRleHRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBzZWxlY3RlZCA9ICgoQnV0dG9uKSBlLndpZGdldCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoc2VsZWN0ZWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBpZiAoY29udGV4dC5pc1VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCgpKSB7Ci0gICAgICAgICAgICB1c2VTcHJpbmdBcHBDb250ZXh0QnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHVzZUNYRlNlcnZsZXRCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRzKCkgewotICAgICAgICBib29sZWFuIHVzZVNwcmluZ0FwcGNvbnRleHQgPSBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5DWEZfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkNYRl9DT05URVhUX19VU0VfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFQpOwotICAgICAgICB1c2VTcHJpbmdBcHBDb250ZXh0QnV0dG9uLnNldFNlbGVjdGlvbih1c2VTcHJpbmdBcHBjb250ZXh0KTsKLSAgICAgICAgdXNlQ1hGU2VydmxldEJ1dHRvbi5zZXRTZWxlY3Rpb24oIXVzZVNwcmluZ0FwcGNvbnRleHQpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzdG9yZVZhbHVlcygpIHsKLSAgICAgICAgY29udGV4dC5zZXRVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQodXNlU3ByaW5nQXBwQ29udGV4dEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTRjYWM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL1dTREwySmF2YVdpZGdldEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXJDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLkNYRlVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5DWEZVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLmRpYWxvZ3MuUmVzb3VyY2VTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS52aWV3ZXJzLlBhY2thZ2VOYW1lQ29sdW1uTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5KRFRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNlbGVjdGlvbkRpYWxvZzsKLQotLyoqCi0gKiBQcm92aWRlcyB3aWRnZXRzIGZvciBXU0RMMkphdmEgcHJlZmVyZW5jZXMsIHdpemFyZHMsIGRpYWxvZ3MuIEVuYWJsZXMgdGhlCi0gKiByZXVzZSBvZiB3aWRnZXRzIGluIG11bHRpcGxlIGxvY2F0aW9ucy4gV2lkZ2V0cyBoYXZlIHRoZXJlIGxhYmVsaW5nIGFuZAotICogdG9vbHRpcHMgc2V0IGhlcmUgYW5kIHdoZXJlIHBvc3NpYmxlIGxpc3RlbmVycyBhcmUgc2V0IHdoaWNoIHVwZGF0ZSBpbnN0YW5jZXMKLSAqIG9mIDxjb2RlPldTREwySmF2YUNvbnRleHQ8L2NvZGU+IGFuZCA8Y29kZT5XU0RMMkphdmFEYXRhTW9kZWw8L2NvZGU+LgotICogCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBXU0RMMkphdmFXaWRnZXRGYWN0b3J5IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEpDX0RWX0FSRyA9ICItWGR2IjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfVFNfQVJHID0gIi1YdHMiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhKQ19UU19NVUxUSV9BUkcgPSAiLVh0czpzdHlsZTptdWx0aWxpbmUiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhKQ19UU19TSU1QTEUgPSAiLVh0czpzdHlsZTpzaW1wbGUiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhKQ19MT0NBVE9SX0FSRyA9ICItWGxvY2F0b3IiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhKQ19TWU5DX01FVEhPRFNfQVJHID0gIi1Yc3luYy1tZXRob2RzIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfTUFSS19HRU5FUkFURURfQVJHID0gIi1tYXJrLWdlbmVyYXRlZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEpDX0VQSVNPREVfRklMRV9BUkcgPSAiLWVwaXNvZGUiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIFdTREwySmF2YVdpZGdldEZhY3RvcnkoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlR2VuZXJhdGVDbGllbnRCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgV1NETDJKYXZhQ29udGV4dCBtb2RlbCkgewotICAgICAgICBmaW5hbCBCdXR0b24gZ2VuQ2xpZW50QnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0gICAgICAgIGdlbkNsaWVudEJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19HRU5fQ0xJRU5UX0xBQkVMKTsKLSAgICAgICAgZ2VuQ2xpZW50QnV0dG9uLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX0dFTkVSQVRFX0NMSUVOVF9UT09MVElQKTsKLSAgICAgICAgZ2VuQ2xpZW50QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVDbGllbnQoZ2VuQ2xpZW50QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGdlbkNsaWVudEJ1dHRvbi5zZXRTZWxlY3Rpb24obW9kZWwuaXNHZW5lcmF0ZUNsaWVudCgpKTsKLSAgICAgICAgcmV0dXJuIGdlbkNsaWVudEJ1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVHZW5lcmF0ZVNlcnZlckJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBXU0RMMkphdmFDb250ZXh0IG1vZGVsKSB7Ci0gICAgICAgIGZpbmFsIEJ1dHRvbiBnZW5TZXJ2ZXJCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICAgICAgZ2VuU2VydmVyQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX0dFTl9TRVJWRVJfTEFCRUwpOwotICAgICAgICBnZW5TZXJ2ZXJCdXR0b24uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfR0VORVJBVEVfU0VSVkVSX1RPT0xUSVApOwotICAgICAgICBnZW5TZXJ2ZXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRHZW5lcmF0ZVNlcnZlcihnZW5TZXJ2ZXJCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZ2VuU2VydmVyQnV0dG9uLnNldFNlbGVjdGlvbihtb2RlbC5pc0dlbmVyYXRlU2VydmVyKCkpOwotICAgICAgICByZXR1cm4gZ2VuU2VydmVyQnV0dG9uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZUdlbmVyYXRlSW1wbGVtZW50YXRpb25CdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgV1NETDJKYXZhQ29udGV4dCBtb2RlbCkgewotICAgICAgICBmaW5hbCBCdXR0b24gZ2VuSW1wbGVtZW50YXRpbkJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotICAgICAgICBnZW5JbXBsZW1lbnRhdGluQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX0dFTl9JTVBMRU1FTlRBVElPTl9MQUJFTCk7Ci0gICAgICAgIGdlbkltcGxlbWVudGF0aW5CdXR0b24uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfR0VORVJBVEVfSU1QTEVNRU5UQVRJT05fVE9PTFRJUCk7Ci0gICAgICAgIGdlbkltcGxlbWVudGF0aW5CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRHZW5lcmF0ZUltcGxlbWVudGF0aW9uKGdlbkltcGxlbWVudGF0aW5CdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZ2VuSW1wbGVtZW50YXRpbkJ1dHRvbi5zZXRTZWxlY3Rpb24obW9kZWwuaXNHZW5lcmF0ZUltcGxlbWVudGF0aW9uKCkpOwotICAgICAgICByZXR1cm4gZ2VuSW1wbGVtZW50YXRpbkJ1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVQcm9jZXNzU09BUEhlYWRlcnNCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgV1NETDJKYXZhQ29udGV4dCBtb2RlbCkgewotICAgICAgICBmaW5hbCBCdXR0b24gcHJvY2Vzc1NPQVBIZWFkZXJzQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0gICAgICAgIHByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1BST0NFU1NfU09BUF9IRUFERVJTKTsKLSAgICAgICAgcHJvY2Vzc1NPQVBIZWFkZXJzQnV0dG9uLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1BST0NFU1NfU09BUF9IRUFERVJTX1RPT0xUSVApOwotICAgICAgICBwcm9jZXNzU09BUEhlYWRlcnNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRQcm9jZXNzU09BUEhlYWRlcnMocHJvY2Vzc1NPQVBIZWFkZXJzQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbi5zZXRTZWxlY3Rpb24obW9kZWwuaXNQcm9jZXNzU09BUEhlYWRlcnMoKSk7Ci0gICAgICAgIHJldHVybiBwcm9jZXNzU09BUEhlYWRlcnNCdXR0b247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlTmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgV1NETDJKYXZhQ29udGV4dCBtb2RlbCkgewotICAgICAgICBmaW5hbCBCdXR0b24gbmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICAgICAgbmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b24KLSAgICAgICAgLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfTE9BRF9ERUZBVUxUX05BTUVTUEFDRV9QQUNLQUdFX01BUFBJTkcpOwotICAgICAgICBuYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbgotICAgICAgICAuc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfREVGQVVMVF9OQU1FU1BBQ0VfTE9BRElOR19UT09MVElQKTsKLSAgICAgICAgbmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyhuYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBuYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbi5zZXRTZWxlY3Rpb24obW9kZWwuaXNMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZygpKTsKLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZUV4Y2x1ZGVzTmFtZXNwYWNlTWFwcGluZ0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBXU0RMMkphdmFDb250ZXh0IG1vZGVsKSB7Ci0gICAgICAgIGZpbmFsIEJ1dHRvbiBleGNsdWRlc05hbWVzcGFjZU1hcHBpbmdCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICAgICAgZXhjbHVkZXNOYW1lc3BhY2VNYXBwaW5nQnV0dG9uCi0gICAgICAgIC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1VTRV9ERUZBVUxUX0VYQ0xVREVTX05BTUVTUEFDRV9NQVBQSU5HKTsKLSAgICAgICAgZXhjbHVkZXNOYW1lc3BhY2VNYXBwaW5nQnV0dG9uCi0gICAgICAgIC5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9FWENMVURFX05BTUVTUEFDRV9MT0FESU5HX1RPT0xUSVApOwotICAgICAgICBleGNsdWRlc05hbWVzcGFjZU1hcHBpbmdCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyhleGNsdWRlc05hbWVzcGFjZU1hcHBpbmdCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZXhjbHVkZXNOYW1lc3BhY2VNYXBwaW5nQnV0dG9uLnNldFNlbGVjdGlvbihtb2RlbC5pc0xvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKCkpOwotICAgICAgICByZXR1cm4gZXhjbHVkZXNOYW1lc3BhY2VNYXBwaW5nQnV0dG9uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZU5vQWRkcmVzc0JpbmRpbmdCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgV1NETDJKYXZhQ29udGV4dCBtb2RlbCkgewotICAgICAgICBmaW5hbCBCdXR0b24gbm9BZGRyZXNzQmluZGluZ0J1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotICAgICAgICBub0FkZHJlc3NCaW5kaW5nQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5iaW5kKENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX05PX0FERFJFU1NfQklORElORywKLSAgICAgICAgICAgICAgICBtb2RlbC5nZXREZWZhdWx0UnVudGltZVR5cGUoKSkpOwotICAgICAgICBub0FkZHJlc3NCaW5kaW5nQnV0dG9uLnNldFRvb2xUaXBUZXh0KAotICAgICAgICAgICAgICAgIENYRlVJTWVzc2FnZXMuYmluZChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9OT19BRERSRVNTX0JJTkRJTkdfVE9PTFRJUCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmdldERlZmF1bHRSdW50aW1lVHlwZSgpKSk7Ci0gICAgICAgIG5vQWRkcmVzc0JpbmRpbmdCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXROb0FkZHJlc3NCaW5kaW5nKG5vQWRkcmVzc0JpbmRpbmdCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgbm9BZGRyZXNzQmluZGluZ0J1dHRvbi5zZXRTZWxlY3Rpb24obW9kZWwuaXNOb0FkZHJlc3NCaW5kaW5nKCkpOwotICAgICAgICByZXR1cm4gbm9BZGRyZXNzQmluZGluZ0J1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVBdXRvTmFtZVJlc29sdXRpb25CdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgV1NETDJKYXZhQ29udGV4dCBtb2RlbCkgewotICAgICAgICBmaW5hbCBCdXR0b24gYXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0gICAgICAgIGF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX0FVVE9fTkFNRV9SRVNPTFVUSU9OKTsKLSAgICAgICAgYXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX0FVVE9fTkFNRV9SRVNPTFVUSU9OX1RPT0xUSVApOwotICAgICAgICBhdXRvTmFtZVJlc29sdXRpb25CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRBdXRvTmFtZVJlc29sdXRpb24oYXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbi5zZXRTZWxlY3Rpb24obW9kZWwuaXNBdXRvTmFtZVJlc29sdXRpb24oKSk7Ci0gICAgICAgIHJldHVybiBhdXRvTmFtZVJlc29sdXRpb25CdXR0b247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUYWJsZUl0ZW0gY3JlYXRlWEpDRGVmYXVsdFZhbHVlc1RhYmxlSXRlbShUYWJsZSB4amNBcmdzVGFibGUsIGZpbmFsIFdTREwySmF2YUNvbnRleHQgbW9kZWwpIHsKLSAgICAgICAgVGFibGVJdGVtIHhqY0RlZmF1bHRWYWx1ZXNJdGVtID0gbmV3IFRhYmxlSXRlbSh4amNBcmdzVGFibGUsIFNXVC5OT05FKTsKLSAgICAgICAgeGpjRGVmYXVsdFZhbHVlc0l0ZW0uc2V0VGV4dCgwLCBYSkNfRFZfQVJHKTsKLSAgICAgICAgeGpjRGVmYXVsdFZhbHVlc0l0ZW0uc2V0VGV4dCgxLCBDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9YSkNfREVGQVVMVF9WQUxVRVMpOwotICAgICAgICB4amNEZWZhdWx0VmFsdWVzSXRlbS5zZXRDaGVja2VkKG1vZGVsLmlzWGpjVXNlRGVmYXVsdFZhbHVlcygpKTsKLSAgICAgICAgcmV0dXJuIHhqY0RlZmF1bHRWYWx1ZXNJdGVtOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGFibGVJdGVtIGNyZWF0ZVhKQ1RvU3RyaW5nVGFibGVJdGVtKFRhYmxlIHhqY0FyZ3NUYWJsZSwgZmluYWwgV1NETDJKYXZhQ29udGV4dCBtb2RlbCkgewotICAgICAgICBUYWJsZUl0ZW0geGpjVG9TdHJpbmdJdGVtID0gbmV3IFRhYmxlSXRlbSh4amNBcmdzVGFibGUsIFNXVC5OT05FKTsKLSAgICAgICAgeGpjVG9TdHJpbmdJdGVtLnNldFRleHQoMCwgWEpDX1RTX0FSRyk7Ci0gICAgICAgIHhqY1RvU3RyaW5nSXRlbS5zZXRUZXh0KDEsIENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1hKQ19UT1NUUklORyk7Ci0gICAgICAgIHhqY1RvU3RyaW5nSXRlbS5zZXRDaGVja2VkKG1vZGVsLmlzWGpjVG9TdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiB4amNUb1N0cmluZ0l0ZW07Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUYWJsZUl0ZW0gY3JlYXRlWEpDVG9TdHJpbmdNdWx0aUxpbmVUYWJsZUl0ZW0oVGFibGUgeGpjQXJnc1RhYmxlLAotICAgICAgICAgICAgZmluYWwgV1NETDJKYXZhQ29udGV4dCBtb2RlbCkgewotICAgICAgICBUYWJsZUl0ZW0geGpjVG9TdHJpbmdNdWx0aUxpbmVJdGVtID0gbmV3IFRhYmxlSXRlbSh4amNBcmdzVGFibGUsIFNXVC5OT05FKTsKLSAgICAgICAgeGpjVG9TdHJpbmdNdWx0aUxpbmVJdGVtLnNldFRleHQoMCwgWEpDX1RTX01VTFRJX0FSRyk7Ci0gICAgICAgIHhqY1RvU3RyaW5nTXVsdGlMaW5lSXRlbS5zZXRUZXh0KDEsIENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1hKQ19UT1NUUklOR19NVUxUSUxJTkUpOwotICAgICAgICB4amNUb1N0cmluZ011bHRpTGluZUl0ZW0uc2V0Q2hlY2tlZChtb2RlbC5pc1hqY1RvU3RyaW5nTXVsdGlMaW5lKCkpOwotICAgICAgICByZXR1cm4geGpjVG9TdHJpbmdNdWx0aUxpbmVJdGVtOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGFibGVJdGVtIGNyZWF0ZVhKQ1RvU3RyaW5nU2ltcGxlVGFibGVJdGVtKFRhYmxlIHhqY0FyZ3NUYWJsZSwgZmluYWwgV1NETDJKYXZhQ29udGV4dCBtb2RlbCkgewotICAgICAgICBUYWJsZUl0ZW0geGpjVG9TdHJpbmdTaW1wbGVJdGVtID0gbmV3IFRhYmxlSXRlbSh4amNBcmdzVGFibGUsIFNXVC5OT05FKTsKLSAgICAgICAgeGpjVG9TdHJpbmdTaW1wbGVJdGVtLnNldFRleHQoMCwgWEpDX1RTX1NJTVBMRSk7Ci0gICAgICAgIHhqY1RvU3RyaW5nU2ltcGxlSXRlbS5zZXRUZXh0KDEsIENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1hKQ19UT1NUUklOR19TSU1QTEUpOwotICAgICAgICB4amNUb1N0cmluZ1NpbXBsZUl0ZW0uc2V0Q2hlY2tlZChtb2RlbC5pc1hqY1RvU3RyaW5nU2ltcGxlKCkpOwotICAgICAgICByZXR1cm4geGpjVG9TdHJpbmdTaW1wbGVJdGVtOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGFibGVJdGVtIGNyZWF0ZVhKQ0xvY2F0b3JUYWJsZUl0ZW0oVGFibGUgeGpjQXJnc1RhYmxlLCBmaW5hbCBXU0RMMkphdmFDb250ZXh0IG1vZGVsKSB7Ci0gICAgICAgIFRhYmxlSXRlbSB4amNMb2NhdG9ySXRlbSA9IG5ldyBUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICAgIHhqY0xvY2F0b3JJdGVtLnNldFRleHQoMCwgWEpDX0xPQ0FUT1JfQVJHKTsKLSAgICAgICAgeGpjTG9jYXRvckl0ZW0uc2V0VGV4dCgxLCBDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9YSkNfTE9DQVRPUik7Ci0gICAgICAgIHhqY0xvY2F0b3JJdGVtLnNldENoZWNrZWQobW9kZWwuaXNYamNMb2NhdG9yKCkpOwotICAgICAgICByZXR1cm4geGpjTG9jYXRvckl0ZW07Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUYWJsZUl0ZW0gY3JlYXRlWEpDU3luY01ldGhvZHNUYWJsZUl0ZW0oVGFibGUgeGpjQXJnc1RhYmxlLCBmaW5hbCBXU0RMMkphdmFDb250ZXh0IG1vZGVsKSB7Ci0gICAgICAgIFRhYmxlSXRlbSB4amNTeW5jTWV0aG9kc0l0ZW0gPSBuZXcgVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgU1dULk5PTkUpOwotICAgICAgICB4amNTeW5jTWV0aG9kc0l0ZW0uc2V0VGV4dCgwLCBYSkNfU1lOQ19NRVRIT0RTX0FSRyk7Ci0gICAgICAgIHhqY1N5bmNNZXRob2RzSXRlbS5zZXRUZXh0KDEsIENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1hKQ19TWU5DX01FVEhPRFMpOwotICAgICAgICB4amNTeW5jTWV0aG9kc0l0ZW0uc2V0Q2hlY2tlZChtb2RlbC5pc1hqY1N5bmNNZXRob2RzKCkpOwotICAgICAgICByZXR1cm4geGpjU3luY01ldGhvZHNJdGVtOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGFibGVJdGVtIGNyZWF0ZVhKQ01hcmtHZW5lcmF0ZWRUYWJsZUl0ZW0oVGFibGUgeGpjQXJnc1RhYmxlLCBmaW5hbCBXU0RMMkphdmFDb250ZXh0IG1vZGVsKSB7Ci0gICAgICAgIFRhYmxlSXRlbSB4amNNYXJrR2VuZXJhdGVkSXRlbSA9IG5ldyBUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICAgIHhqY01hcmtHZW5lcmF0ZWRJdGVtLnNldFRleHQoMCwgWEpDX01BUktfR0VORVJBVEVEX0FSRyk7Ci0gICAgICAgIHhqY01hcmtHZW5lcmF0ZWRJdGVtLnNldFRleHQoMSwgQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfWEpDX01BUktfR0VORVJBVEVEKTsKLSAgICAgICAgeGpjTWFya0dlbmVyYXRlZEl0ZW0uc2V0Q2hlY2tlZChtb2RlbC5pc1hqY01hcmtHZW5lcmF0ZWQoKSk7Ci0gICAgICAgIHJldHVybiB4amNNYXJrR2VuZXJhdGVkSXRlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRhYmxlSXRlbSBjcmVhdGVYSkNFcGlzb2RlRmlsZVRhYmxlSXRlbShUYWJsZSB4amNBcmdzVGFibGUsIGZpbmFsIFdTREwySmF2YUNvbnRleHQgbW9kZWwpIHsKLSAgICAgICAgVGFibGVJdGVtIHhqY0VwaXNvZGVGaWxlSXRlbSA9IG5ldyBUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICAgIHhqY0VwaXNvZGVGaWxlSXRlbS5zZXRUZXh0KDAsIFhKQ19FUElTT0RFX0ZJTEVfQVJHKTsKLSAgICAgICAgeGpjRXBpc29kZUZpbGVJdGVtLnNldFRleHQoMSwgQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfWEpDX0VQSVNPREVfRklMRSk7Ci0gICAgICAgIHJldHVybiB4amNFcGlzb2RlRmlsZUl0ZW07Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUYWJsZSBjcmVhdGVYSkNBcmdUYWJsZShDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBXU0RMMkphdmFDb250ZXh0IG1vZGVsKSB7Ci0gICAgICAgIFRhYmxlIHhqY0FyZ3NUYWJsZSA9IG5ldyBUYWJsZShwYXJlbnQsIFNXVC5DSEVDSyB8IFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotICAgICAgICB4amNBcmdzVGFibGUuc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfWEpDX0FSR1NfVE9PTFRJUCk7Ci0gICAgICAgIHhqY0FyZ3NUYWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0gICAgICAgIHhqY0FyZ3NUYWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCi0gICAgICAgIFRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0gICAgICAgIHhqY0FyZ3NUYWJsZS5zZXRMYXlvdXQodGFibGVMYXlvdXQpOwotCi0gICAgICAgIFRhYmxlQ29sdW1uIHhqY0FyZ0NvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih4amNBcmdzVGFibGUsIFNXVC5OT05FKTsKLSAgICAgICAgeGpjQXJnQ29sdW1uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfWEpDX0FSR19DT0xVTU5fTkFNRSk7Ci0KLSAgICAgICAgQ29sdW1uV2VpZ2h0RGF0YSBjb2x1bW5XZWlnaHREYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEoMTAwLCAxMDAsIHRydWUpOwotICAgICAgICB0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKGNvbHVtbldlaWdodERhdGEpOwotCi0gICAgICAgIFRhYmxlQ29sdW1uIGRlc2NyaXB0aW9uQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHhqY0FyZ3NUYWJsZSwgU1dULk5PTkUpOwotICAgICAgICBkZXNjcmlwdGlvbkNvbHVtbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1hKQ19ERVNDUklQVElPTl9DT0xVTU5fTkFNRSk7Ci0gICAgICAgIGNvbHVtbldlaWdodERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSgyMDAsIDIwMCwgdHJ1ZSk7Ci0gICAgICAgIHRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoY29sdW1uV2VpZ2h0RGF0YSk7Ci0KLSAgICAgICAgeGpjQXJnc1RhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmRldGFpbCA9PSBTV1QuQ0hFQ0spIHsKLSAgICAgICAgICAgICAgICAgICAgVGFibGVJdGVtIHRhYmxlSXRlbSA9IChUYWJsZUl0ZW0pIGV2ZW50Lml0ZW07Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB4amNBcmcgPSB0YWJsZUl0ZW0uZ2V0VGV4dCgwKTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBjaGVja2VkID0gdGFibGVJdGVtLmdldENoZWNrZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHhqY0FyZy5lcXVhbHMoWEpDX0RWX0FSRykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnNldFhqY1VzZURlZmF1bHRWYWx1ZXMoY2hlY2tlZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoeGpjQXJnLmVxdWFscyhYSkNfVFNfQVJHKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuc2V0WGpjVG9TdHJpbmcoY2hlY2tlZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoeGpjQXJnLmVxdWFscyhYSkNfVFNfTVVMVElfQVJHKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuc2V0WGpjVG9TdHJpbmdNdWx0aUxpbmUoY2hlY2tlZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoeGpjQXJnLmVxdWFscyhYSkNfVFNfU0lNUExFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuc2V0WGpjVG9TdHJpbmdTaW1wbGUoY2hlY2tlZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoeGpjQXJnLmVxdWFscyhYSkNfTE9DQVRPUl9BUkcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5zZXRYamNMb2NhdG9yKGNoZWNrZWQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHhqY0FyZy5lcXVhbHMoWEpDX1NZTkNfTUVUSE9EU19BUkcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5zZXRYamNTeW5jTWV0aG9kcyhjaGVja2VkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmICh4amNBcmcuZXF1YWxzKFhKQ19NQVJLX0dFTkVSQVRFRF9BUkcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5zZXRYamNNYXJrR2VuZXJhdGVkKGNoZWNrZWQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0pOwotCi0gICAgICAgIHhqY0FyZ0NvbHVtbi5wYWNrKCk7Ci0gICAgICAgIGRlc2NyaXB0aW9uQ29sdW1uLnBhY2soKTsKLQotICAgICAgICByZXR1cm4geGpjQXJnc1RhYmxlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlRnJvbnRlbmRMYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIExhYmVsIGZyb250ZW5kTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIGZyb250ZW5kTGFiZWwuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkNYRl9ERUZBVUxUX0ZST05URU5EX0xBQkVMKTsKLSAgICAgICAgcmV0dXJuIGZyb250ZW5kTGFiZWw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDb21ibyBjcmVhdGVGcm9udGVuZENvbWJvKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFdTREwySmF2YUNvbnRleHQgbW9kZWwpIHsKLSAgICAgICAgZmluYWwgQ29tYm8gZnJvbnRlbmRDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotICAgICAgICBmcm9udGVuZENvbWJvLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX0ZST05URU5EX1RPT0xUSVApOwotICAgICAgICBmcm9udGVuZENvbWJvLmFkZChtb2RlbC5nZXRGcm9udGVuZCgpLmdldExpdGVyYWwoKSk7Ci0gICAgICAgIGZyb250ZW5kQ29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGZyb250ZW5kQ29tYm8uc2VsZWN0KDApOwotICAgICAgICByZXR1cm4gZnJvbnRlbmRDb21ibzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZURhdGFiaW5kaW5nTGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBMYWJlbCBkYXRhYmluZGluZ0xhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBkYXRhYmluZGluZ0xhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5DWEZfREVGQVVMVF9EQVRBQklORElOR19MQUJFTCk7Ci0gICAgICAgIHJldHVybiBkYXRhYmluZGluZ0xhYmVsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29tYm8gY3JlYXRlRGF0YWJpbmRpbmdDb21ibyhDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBXU0RMMkphdmFDb250ZXh0IG1vZGVsKSB7Ci0gICAgICAgIGZpbmFsIENvbWJvIGRhdGFiaW5kaW5nQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuUkVBRF9PTkxZKTsKLSAgICAgICAgZGF0YWJpbmRpbmdDb21iby5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9EQVRBQklORElOR19UT09MVElQKTsKLSAgICAgICAgZGF0YWJpbmRpbmdDb21iby5hZGQobW9kZWwuZ2V0RGF0YWJpbmRpbmcoKS5nZXRMaXRlcmFsKCkpOwotICAgICAgICBkYXRhYmluZGluZ0NvbWJvLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBkYXRhYmluZGluZ0NvbWJvLnNlbGVjdCgwKTsKLSAgICAgICAgcmV0dXJuIGRhdGFiaW5kaW5nQ29tYm87Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVXU0RMVmVyc2lvbkxhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgTGFiZWwgd3NkbFZlcnNpb25MYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgd3NkbFZlcnNpb25MYWJlbC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1dTRExfVkVSU0lPTl9MQUJFTCk7Ci0gICAgICAgIHJldHVybiB3c2RsVmVyc2lvbkxhYmVsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29tYm8gY3JlYXRlV1NETFZlcnNpb25Db21ibyhDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBXU0RMMkphdmFDb250ZXh0IG1vZGVsKSB7Ci0gICAgICAgIGZpbmFsIENvbWJvIHdzZGxWZXJzaW9uQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuUkVBRF9PTkxZKTsKLSAgICAgICAgd3NkbFZlcnNpb25Db21iby5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9XU0RMX1ZFUlNJT05fVE9PTFRJUCk7Ci0gICAgICAgIHdzZGxWZXJzaW9uQ29tYm8uYWRkKG1vZGVsLmdldFdzZGxWZXJzaW9uKCkpOwotICAgICAgICB3c2RsVmVyc2lvbkNvbWJvLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICB3c2RsVmVyc2lvbkNvbWJvLnNlbGVjdCgwKTsKLSAgICAgICAgcmV0dXJuIHdzZGxWZXJzaW9uQ29tYm87Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlRGVmYXVsdFZhbHVlc0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBXU0RMMkphdmFDb250ZXh0IG1vZGVsKSB7Ci0gICAgICAgIGZpbmFsIEJ1dHRvbiB1c2VEZWZhdWx0VmFsdWVzQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0gICAgICAgIHVzZURlZmF1bHRWYWx1ZXNCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9VU0VfREVGQVVMVF9WQUxVRVMpOwotICAgICAgICB1c2VEZWZhdWx0VmFsdWVzQnV0dG9uLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX0RFRkFVTFRfVkFMVUVTX1RPT0xUSVApOwotICAgICAgICB1c2VEZWZhdWx0VmFsdWVzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0VXNlRGVmYXVsdFZhbHVlcyh1c2VEZWZhdWx0VmFsdWVzQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHVzZURlZmF1bHRWYWx1ZXNCdXR0b24uc2V0U2VsZWN0aW9uKG1vZGVsLmlzVXNlRGVmYXVsdFZhbHVlcygpKTsKLSAgICAgICAgcmV0dXJuIHVzZURlZmF1bHRWYWx1ZXNCdXR0b247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVPdXRwdXREaXJlY3RvcnlMYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIExhYmVsIHNyY0RpckxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBzcmNEaXJMYWJlbC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX09VVFBVVF9ESVJFQ1RPUlkpOwotICAgICAgICBzcmNEaXJMYWJlbC5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9PVVRQVVRfRElSRUNUT1JZX1RPT0xUSVApOwotICAgICAgICByZXR1cm4gc3JjRGlyTGFiZWw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDb21ibyBjcmVhdGVPdXRwdXREaXJlY3RvcnlDb21ibyhDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgZmluYWwgQ29tYm8gb3V0cHV0RGlyQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuUkVBRF9PTkxZKTsKLSAgICAgICAgb3V0cHV0RGlyQ29tYm8uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfT1VUUFVUX0RJUkVDVE9SWV9UT09MVElQKTsKLSAgICAgICAgb3V0cHV0RGlyQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgamF2YVNvdXJjZUZvbGRlciA9IG91dHB1dERpckNvbWJvLmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRKYXZhU291cmNlRm9sZGVyKGphdmFTb3VyY2VGb2xkZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBwb3B1bGF0ZU91dHB1dERpcmVjdG9yeUNvbWJvKG91dHB1dERpckNvbWJvLCBtb2RlbC5nZXRQcm9qZWN0TmFtZSgpKTsKLQotICAgICAgICByZXR1cm4gb3V0cHV0RGlyQ29tYm87Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHBvcHVsYXRlT3V0cHV0RGlyZWN0b3J5Q29tYm8oQ29tYm8gb3V0cHV0RGlyQ29tYm8sIFN0cmluZyBwcm9qZWN0TmFtZSkgewotICAgICAgICBvdXRwdXREaXJDb21iby5yZW1vdmVBbGwoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElQYWNrYWdlRnJhZ21lbnRSb290W10gcGFja2FnZUZyYWdtZW50Um9vdHMgPSBKRFRVdGlscy5nZXRKYXZhUHJvamVjdChwcm9qZWN0TmFtZSkKLSAgICAgICAgICAgIC5nZXRBbGxQYWNrYWdlRnJhZ21lbnRSb290cygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWNrYWdlRnJhZ21lbnRSb290cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIElQYWNrYWdlRnJhZ21lbnRSb290IHBhY2thZ2VGcmFnbWVudFJvb3QgPSBwYWNrYWdlRnJhZ21lbnRSb290c1tpXTsKLSAgICAgICAgICAgICAgICBpZiAocGFja2FnZUZyYWdtZW50Um9vdC5nZXRLaW5kKCkgPT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UpIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGlyQ29tYm8uYWRkKHBhY2thZ2VGcmFnbWVudFJvb3QuZ2V0UmVzb3VyY2UoKS5nZXRGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0cHV0RGlyQ29tYm8uc2VsZWN0KDApOwotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBDWEZVSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlUGFja2FnZU5hbWVMYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIExhYmVsIHBhY2thZ2VOYW1lTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIHBhY2thZ2VOYW1lTGFiZWwuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9QQUNLQUdFX05BTUUpOwotICAgICAgICBwYWNrYWdlTmFtZUxhYmVsLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1BBQ0tBR0VfTkFNRV9UT09MVElQKTsKLSAgICAgICAgcmV0dXJuIHBhY2thZ2VOYW1lTGFiZWw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZVBhY2thZ2VOYW1lVGV4dChDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgZmluYWwgVGV4dCBwYWNrYWdlTmFtZVRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIpOwotICAgICAgICBwYWNrYWdlTmFtZVRleHQuc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfUEFDS0FHRV9OQU1FX1RPT0xUSVApOwotCi0gICAgICAgIHBhY2thZ2VOYW1lVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZVRleHQuZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgIG1vZGVsLmdldEluY2x1ZGVkTmFtZXNwYWNlcygpLnB1dChtb2RlbC5nZXRUYXJnZXROYW1lc3BhY2UoKSwgcGFja2FnZU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBwYWNrYWdlTmFtZVRleHQuc2V0VGV4dChtb2RlbC5nZXRJbmNsdWRlZE5hbWVzcGFjZXMoKS5nZXQobW9kZWwuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKTsKLQotICAgICAgICByZXR1cm4gcGFja2FnZU5hbWVUZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZU5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgZmluYWwgQnV0dG9uIG5hbWVzcGFjZU1hcHBpbmdCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICAgICAgbmFtZXNwYWNlTWFwcGluZ0J1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1BBQ0tBR0VfTkFNRV9PUFRJT05BTCk7Ci0gICAgICAgIG5hbWVzcGFjZU1hcHBpbmdCdXR0b24uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfUEFDS0FHRV9OQU1FX09QVElPTkFMX1RPT0xUSVApOwotICAgICAgICByZXR1cm4gbmFtZXNwYWNlTWFwcGluZ0J1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRhYmxlVmlld2VyQ29sdW1uIGNyZWF0ZVdTRExOYW1lc3BhY2VWaWV3ZXJDb2x1bW4oVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXIpIHsKLSAgICAgICAgVGFibGVWaWV3ZXJDb2x1bW4gd3NkbE5hbWVzcGFjZVZpZXdlckNvbHVtbiA9IG5ldyBUYWJsZVZpZXdlckNvbHVtbih0YWJsZVZpZXdlciwgU1dULkxFRlQpOwotICAgICAgICB3c2RsTmFtZXNwYWNlVmlld2VyQ29sdW1uLnNldExhYmVsUHJvdmlkZXIobmV3IENvbHVtbkxhYmVsUHJvdmlkZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIFRhYmxlQ29sdW1uIHdzZGxOYW1lc3BhY2VDb2x1bW4gPSB3c2RsTmFtZXNwYWNlVmlld2VyQ29sdW1uLmdldENvbHVtbigpOwotICAgICAgICB3c2RsTmFtZXNwYWNlQ29sdW1uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfV1NETF9OQU1FU1BBQ0VfQ09MVU1OX0hFQURFUik7Ci0gICAgICAgIHdzZGxOYW1lc3BhY2VDb2x1bW4ucGFjaygpOwotICAgICAgICByZXR1cm4gd3NkbE5hbWVzcGFjZVZpZXdlckNvbHVtbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRhYmxlVmlld2VyQ29sdW1uIGNyZWF0ZVBhY2thZ2VOYW1lQ29sdW1uKFRhYmxlVmlld2VyIHRhYmxlVmlld2VyLCBXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgVGFibGVWaWV3ZXJDb2x1bW4gcGFja2FnZU5hbWVWaWV3ZXJDb2x1bW4gPSBuZXcgVGFibGVWaWV3ZXJDb2x1bW4odGFibGVWaWV3ZXIsIFNXVC5MRUZUKTsKLSAgICAgICAgcGFja2FnZU5hbWVWaWV3ZXJDb2x1bW4uc2V0TGFiZWxQcm92aWRlcihuZXcgUGFja2FnZU5hbWVDb2x1bW5MYWJlbFByb3ZpZGVyKG1vZGVsKSk7Ci0KLSAgICAgICAgVGFibGVDb2x1bW4gcGFja2FnZU5hbWVDb2x1bW4gPSBwYWNrYWdlTmFtZVZpZXdlckNvbHVtbi5nZXRDb2x1bW4oKTsKLSAgICAgICAgcGFja2FnZU5hbWVDb2x1bW4uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9QQUNLQUdFX05BTUVfQ09MVU1OX0hFQURFUik7Ci0gICAgICAgIHBhY2thZ2VOYW1lQ29sdW1uLnBhY2soKTsKLSAgICAgICAgcmV0dXJuIHBhY2thZ2VOYW1lVmlld2VyQ29sdW1uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlU2VydmljZU5hbWVMYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIExhYmVsIHNlcnZpY2VOYW1lTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIHNlcnZpY2VOYW1lTGFiZWwuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9TRVJWSUNFX05BTUUpOwotICAgICAgICBzZXJ2aWNlTmFtZUxhYmVsLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1NFUlZJQ0VfTkFNRV9UT09MVElQKTsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VOYW1lTGFiZWw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDb21ibyBjcmVhdGVTZXJ2aWNlTmFtZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFdTREwySmF2YURhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICBmaW5hbCBDb21ibyBzZXJ2aWNlTmFtZUNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotICAgICAgICBzZXJ2aWNlTmFtZUNvbWJvLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1NFUlZJQ0VfTkFNRV9UT09MVElQKTsKLQotICAgICAgICBzZXJ2aWNlTmFtZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIG1vZGVsLnNldFNlcnZpY2VOYW1lKHNlcnZpY2VOYW1lQ29tYm8uZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgcG9wdWxhdGVTZXJ2aWNlTmFtZUNvbWJvKHNlcnZpY2VOYW1lQ29tYm8sIG1vZGVsKTsKLQotICAgICAgICByZXR1cm4gc2VydmljZU5hbWVDb21ibzsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcG9wdWxhdGVTZXJ2aWNlTmFtZUNvbWJvKENvbWJvIHNlcnZpY2VOYW1lQ29tYm8sIFdTREwySmF2YURhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICBzZXJ2aWNlTmFtZUNvbWJvLnJlbW92ZUFsbCgpOwotICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBtb2RlbC5nZXRXc2RsRGVmaW5pdGlvbigpOwotICAgICAgICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNYXAgc2VydmljZXNNYXAgPSBkZWZpbml0aW9uLmdldFNlcnZpY2VzKCk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZXNNYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFNldCBzZXJ2aWNlc0VudHJ5U2V0ID0gc2VydmljZXNNYXAuZW50cnlTZXQoKTsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBzZXJ2aWNlc0l0ZXJhdG9yID0gc2VydmljZXNFbnRyeVNldC5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChzZXJ2aWNlc0l0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBNYXAuRW50cnkgc2VydmljZUVudHJ5ID0gKE1hcC5FbnRyeSkgc2VydmljZXNJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IChTZXJ2aWNlKSBzZXJ2aWNlRW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgUU5hbWUgcU5hbWUgPSBzZXJ2aWNlLmdldFFOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VOYW1lQ29tYm8uYWRkKHFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2VydmljZU5hbWVDb21iby5kZXNlbGVjdEFsbCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVCaW5kaW5nRmlsZXNMYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIExhYmVsIGJpbmRpbmdGaWxlc0xhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBiaW5kaW5nRmlsZXNMYWJlbC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX0JJTkRJTkdfRklMRVMpOwotICAgICAgICBiaW5kaW5nRmlsZXNMYWJlbC5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9CSU5ESU5HX05BTUVfVE9PTFRJUCk7Ci0gICAgICAgIHJldHVybiBiaW5kaW5nRmlsZXNMYWJlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExpc3QgY3JlYXRlQmluZGluZ0ZpbGVzTGlzdChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIGZpbmFsIExpc3QgYmluZGluZ0ZpbGVzTGlzdCA9IG5ldyBMaXN0KHBhcmVudCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0gICAgICAgIGJpbmRpbmdGaWxlc0xpc3Quc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfQklORElOR19OQU1FX1RPT0xUSVApOwotICAgICAgICByZXR1cm4gYmluZGluZ0ZpbGVzTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVBZGRCaW5kaW5nRmlsZUJ1dHRvbihmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWwsCi0gICAgICAgICAgICBmaW5hbCBMaXN0IGJpbmRpbmdGaWxlc0xpc3QpIHsKLSAgICAgICAgQnV0dG9uIGFkZEJpbmRpbmdGaWxlQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLSAgICAgICAgYWRkQmluZGluZ0ZpbGVCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9CSU5ESU5HX0ZJTEVTX0FERCk7Ci0gICAgICAgIGFkZEJpbmRpbmdGaWxlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgUmVzb3VyY2VTZWxlY3Rpb25EaWFsb2cgc2VsZWN0aW9uRGlhbG9nID0gbmV3IFJlc291cmNlU2VsZWN0aW9uRGlhbG9nKAotICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LmdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAieG1sIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfQklORElOR19GSUxFX0RJQUxPR19GSUxURVJfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX0JJTkRJTkdfRklMRV9ESUFMT0dfVElUTEUpOwotICAgICAgICAgICAgICAgIHNlbGVjdGlvbkRpYWxvZy5zZXRNZXNzYWdlKENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX0JJTkRJTkdfRklMRV9ESUFMT0dfTUVTU0FHRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbkRpYWxvZy5vcGVuKCkgPT0gU2VsZWN0aW9uRGlhbG9nLk9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSBzZWxlY3Rpb25EaWFsb2cuZ2V0UmVzdWx0KClbMF0udG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5nZXRCaW5kaW5nRmlsZXMoKS5jb250YWlucyhyZXN1bHQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5nZXRCaW5kaW5nRmlsZXMoKS5hZGQocmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdGaWxlc0xpc3QuYWRkKHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICByZXR1cm4gYWRkQmluZGluZ0ZpbGVCdXR0b247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlUmVtb3ZlQmluZGluZ0ZpbGVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsLAotICAgICAgICAgICAgZmluYWwgTGlzdCBiaW5kaW5nRmlsZXNMaXN0KSB7Ci0gICAgICAgIGZpbmFsIEJ1dHRvbiByZW1vdmVCaW5kaW5nRmlsZUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0gICAgICAgIHJlbW92ZUJpbmRpbmdGaWxlQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfQklORElOR19GSUxFU19SRU1PVkUpOwotICAgICAgICByZW1vdmVCaW5kaW5nRmlsZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgcmVtb3ZlQmluZGluZ0ZpbGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBzZWxlY3RlZEJpbmRpbmdGaWxlcyA9IGJpbmRpbmdGaWxlc0xpc3QuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgYmluZGluZ0ZpbGUgOiBzZWxlY3RlZEJpbmRpbmdGaWxlcykgewotICAgICAgICAgICAgICAgICAgICBiaW5kaW5nRmlsZXNMaXN0LnJlbW92ZShiaW5kaW5nRmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1vZGVsLmdldEJpbmRpbmdGaWxlcygpLnJlbW92ZShiaW5kaW5nRmlsZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGJpbmRpbmdGaWxlc0xpc3QuZ2V0SXRlbUNvdW50KCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICByZW1vdmVCaW5kaW5nRmlsZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGJpbmRpbmdGaWxlc0xpc3QuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJpbmRpbmdGaWxlc0xpc3QuZ2V0SXRlbUNvdW50KCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICByZW1vdmVCaW5kaW5nRmlsZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZW1vdmVCaW5kaW5nRmlsZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgcmV0dXJuIHJlbW92ZUJpbmRpbmdGaWxlQnV0dG9uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlUGFkZGluZ0xhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZVhNTENhdGFsb2dMYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIExhYmVsIHhtbENhdGFsb2dMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgeG1sQ2F0YWxvZ0xhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfWE1MX0NBVExPRyk7Ci0gICAgICAgIHhtbENhdGFsb2dMYWJlbC5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9YTUxfQ0FUQUxPR19UT09MVElQKTsKLSAgICAgICAgcmV0dXJuIHhtbENhdGFsb2dMYWJlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRleHQgY3JlYXRlWE1MQ2F0YWxvZ1RleHQoQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIGZpbmFsIFRleHQgeG1sQ2F0YWxvZ1RleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIpOwotICAgICAgICB4bWxDYXRhbG9nVGV4dC5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9YTUxfQ0FUQUxPR19UT09MVElQKTsKLSAgICAgICAgeG1sQ2F0YWxvZ1RleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHhtbENhdGFsb2cgPSB4bWxDYXRhbG9nVGV4dC5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0Q2F0YWxvZ0ZpbGUoeG1sQ2F0YWxvZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHJldHVybiB4bWxDYXRhbG9nVGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVYTUxDYXRhbG9nQnJvd3NlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQnV0dG9uIHhtbENhdGFsb2dCcm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotICAgICAgICB4bWxDYXRhbG9nQnJvd3NlQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfWE1MX0NBVExPR19CUk9XU0UpOwotICAgICAgICByZXR1cm4geG1sQ2F0YWxvZ0Jyb3dzZUJ1dHRvbjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aXphcmRzL0NYRkNsYXNzcGF0aENvbnRhaW5lclBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aXphcmRzL0NYRkNsYXNzcGF0aENvbnRhaW5lclBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIyMjYyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2l6YXJkcy9DWEZDbGFzc3BhdGhDb250YWluZXJQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2hhbmUgQ2xhcmtlLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpemFyZHM7DQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFjY2Vzc1J1bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhBdHRyaWJ1dGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuSUNsYXNzcGF0aENvbnRhaW5lclBhZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLklDbGFzc3BhdGhDb250YWluZXJQYWdlRXh0ZW5zaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGSW5zdGFsbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5DWEZVSU1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLkNYRlVJUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlc1V0aWw7DQotDQotcHVibGljIGNsYXNzIENYRkNsYXNzcGF0aENvbnRhaW5lclBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIGltcGxlbWVudHMgSUNsYXNzcGF0aENvbnRhaW5lclBhZ2UsIElDbGFzc3BhdGhDb250YWluZXJQYWdlRXh0ZW5zaW9uIHsNCi0NCi0gICAgcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0Ow0KLSAgICBwcml2YXRlIENvbWJvVmlld2VyIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlcjsNCi0gICAgcHJpdmF0ZSBMaW5rIGxpbms7DQotICAgIHByaXZhdGUgQ1hGQ29udGV4dCBjb250ZXh0Ow0KLSAgICBwcml2YXRlIENYRkluc3RhbGwgZGVmYXVsdEluc3RhbGw7DQotICAgIHByaXZhdGUgU3RyaW5nIGludGFsbGVkVmVyc2lvbjsNCi0NCi0gICAgcHVibGljIENYRkNsYXNzcGF0aENvbnRhaW5lclBhZ2UoKSB7DQotICAgICAgICBzdXBlcigiY3hmLmNsYXNzcGF0aC5jb250YWluZXIucGFnZSIpOw0KLSAgICAgICAgc2V0VGl0bGUoQ1hGVUlNZXNzYWdlcy5DWEZfSU5TVEFMTF9XSVpBUkRfUEFHRV9USVRMRSk7DQotICAgICAgICBzZXREZXNjcmlwdGlvbihDWEZVSU1lc3NhZ2VzLkNYRl9JTlNUQUxMX1dJWkFSRF9QQUdFX0RFU0NSSVBUSU9OKTsNCi0gICAgICAgIHNldEltYWdlRGVzY3JpcHRvcihDWEZVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKENYRlVJUGx1Z2luLlBMVUdJTl9JRCwgImljb25zL3dpemJhbi9saWJyYXJ5X3dpei5wbmciKSk7DQotICAgICAgICBjb250ZXh0ID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBmaW5pc2goKSB7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgSUNsYXNzcGF0aEVudHJ5IGdldFNlbGVjdGlvbigpIHsNCi0gICAgICAgIENYRkluc3RhbGwgc2VsZWN0ZWRJbnN0YWxsID0gZ2V0U2VsZWN0ZWRJbnN0YWxsKCk7DQotICAgICAgICBpZiAoc2VsZWN0ZWRJbnN0YWxsICE9IG51bGwpIHsvLyAmJiAhc2VsZWN0ZWRJbnN0YWxsLmdldFZlcnNpb24oKS5lcXVhbHMoaW50YWxsZWRWZXJzaW9uKSkgew0KLSAgICAgICAgICAgIENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNldENYRlJ1bnRpbWVWZXJzaW9uKHByb2plY3QsIHNlbGVjdGVkSW5zdGFsbC5nZXRWZXJzaW9uKCkpOw0KLQ0KLSAgICAgICAgICAgIElDbGFzc3BhdGhBdHRyaWJ1dGUganN0Q29tcG9uZW50RGVwZW5kZW5jeSA9DQotICAgICAgICAgICAgICAgIEphdmFDb3JlLm5ld0NsYXNzcGF0aEF0dHJpYnV0ZSgib3JnLmVjbGlwc2UuanN0LmNvbXBvbmVudC5kZXBlbmRlbmN5IiwgIi9XRUItSU5GL2xpYiIpOyAvLyROT04tTkxTLTEkDQotICAgICAgICAgICAgSVBhdGggcGF0aCA9IG5ldyBQYXRoKENYRkNvcmVQbHVnaW4uQ1hGX0NMQVNTUEFUSF9DT05UQUlORVJfSUQpOw0KLSAgICAgICAgICAgIHBhdGggPSBwYXRoLmFwcGVuZChzZWxlY3RlZEluc3RhbGwuZ2V0VHlwZSgpKTsNCi0gICAgICAgICAgICBwYXRoID0gcGF0aC5hcHBlbmQoc2VsZWN0ZWRJbnN0YWxsLmdldFZlcnNpb24oKSk7DQotICAgICAgICAgICAgcmV0dXJuIEphdmFDb3JlLm5ld0NvbnRhaW5lckVudHJ5KHBhdGgsIG5ldyBJQWNjZXNzUnVsZVswXSwNCi0gICAgICAgICAgICAgICAgICAgIENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCkuaXNFeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIoKQ0KLSAgICAgICAgICAgICAgICAgICAgPyBuZXcgSUNsYXNzcGF0aEF0dHJpYnV0ZVtde2pzdENvbXBvbmVudERlcGVuZGVuY3l9IDogbmV3IElDbGFzc3BhdGhBdHRyaWJ1dGVbXXt9LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJQ2xhc3NwYXRoRW50cnkgY29udGFpbmVyRW50cnkpIHsNCi0gICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpbnRhbGxlZFZlcnNpb24gPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRDWEZSdW50aW1lVmVyc2lvbihwcm9qZWN0KTsNCi0gICAgICAgICAgICBkZWZhdWx0SW5zdGFsbCA9IGNvbnRleHQuZ2V0SW5zdGFsbGF0aW9ucygpLmdldChpbnRhbGxlZFZlcnNpb24pOw0KLSAgICAgICAgICAgIGlmIChkZWZhdWx0SW5zdGFsbCAhPSBudWxsICYmIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlciAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZGVmYXVsdEluc3RhbGwpLCB0cnVlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7DQotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsNCi0NCi0gICAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsNCi0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7DQotDQotICAgICAgICBsaW5rID0gbmV3IExpbmsoY29tcG9zaXRlLCBTV1QuTk9ORSk7DQotICAgICAgICBsaW5rLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5DWEZfQ09ORklHVVJFX0lOU1RBTExFRF9SVU5USU1FU19MQUJFTCk7DQotICAgICAgICBsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgew0KLSAgICAgICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsNCi0gICAgICAgICAgICAgICAgaW50IHNlbGVjdGVkSW5kZXggPSBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXIuZ2V0Q29tYm8oKS5nZXRTZWxlY3Rpb25JbmRleCgpOw0KLSAgICAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbihnZXRTaGVsbCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpLkNYRlJ1bnRpbWVQcmVmZXJlbmNlc1BhZ2UiLCAvLyROT04tTkxTLTEkDQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsib3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS5DWEZSdW50aW1lUHJlZmVyZW5jZXNQYWdlIn0sIG51bGwpLm9wZW4oKTsgLy8kTk9OLU5MUy0xJA0KLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IFdpbmRvdy5PSykgew0KLSAgICAgICAgICAgICAgICAgICAgaW5zdGFsbGF0aW9uc0NvbWJvVmlld2VyLnJlZnJlc2goKTsNCi0gICAgICAgICAgICAgICAgICAgIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlci5nZXRDb21ibygpLnNlbGVjdChzZWxlY3RlZEluZGV4KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLQ0KLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkVORCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsNCi0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsNCi0gICAgICAgIGxpbmsuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7DQotDQotICAgICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsNCi0gICAgICAgIGxhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5DWEZfUFJPUEVSVFlfUEFHRV9SVU5USU1FX0xBQkVMKTsNCi0NCi0gICAgICAgIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlciA9IG5ldyBDb21ib1ZpZXdlcihjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsNCi0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOw0KLSAgICAgICAgaW5zdGFsbGF0aW9uc0NvbWJvVmlld2VyLmdldENvbWJvKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7DQotDQotICAgICAgICBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpIHsNCi0NCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIENvbGxlY3Rpb248Pz4pIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKENvbGxlY3Rpb248Pz4pIGlucHV0RWxlbWVudCkudG9BcnJheSgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0W10ge307DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotDQotICAgICAgICBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpIHsNCi0NCi0gICAgICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDWEZJbnN0YWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBDWEZJbnN0YWxsIGN4Zkluc3RhbGwgPSAoQ1hGSW5zdGFsbCkgZWxlbWVudDsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjeGZJbnN0YWxsLmdldFR5cGUoKSArICIgIiArIGN4Zkluc3RhbGwuZ2V0VmVyc2lvbigpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLQ0KLSAgICAgICAgQ29sbGVjdGlvbjxDWEZJbnN0YWxsPiBpbnN0YWxsYXRpb25zID0gY29udGV4dC5nZXRJbnN0YWxsYXRpb25zKCkudmFsdWVzKCk7DQotDQotICAgICAgICBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXIuc2V0SW5wdXQoaW5zdGFsbGF0aW9ucyk7DQotDQotICAgICAgICBEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7DQotICAgICAgICBzZXRDb250cm9sKGNvbXBvc2l0ZSk7DQotICAgICAgICBzZXRTZWxlY3Rpb24obnVsbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJSmF2YVByb2plY3QgamF2YVByb2plY3QsIElDbGFzc3BhdGhFbnRyeVtdIGN1cnJlbnRFbnRyaWVzKSB7DQotICAgICAgICBpZiAoamF2YVByb2plY3QgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRoaXMucHJvamVjdCA9IGphdmFQcm9qZWN0LmdldFByb2plY3QoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIENYRkluc3RhbGwgZ2V0U2VsZWN0ZWRJbnN0YWxsKCkgew0KLSAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlci5nZXRTZWxlY3Rpb24oKTsNCi0gICAgICAgIGlmICghc3RydWN0dXJlZFNlbGVjdGlvbi5pc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICBDWEZJbnN0YWxsIHNlbGVjdGVkSW5zdGFsbCA9IChDWEZJbnN0YWxsKSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOw0KLSAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZEluc3RhbGw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2l6YXJkcy9DWEZGYWNldEluc3RhbGxXaXphcmRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2l6YXJkcy9DWEZGYWNldEluc3RhbGxXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNWYxZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpemFyZHMvQ1hGRmFjZXRJbnN0YWxsV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLkNYRlVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuQWJzdHJhY3RGYWNldFdpemFyZFBhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBDWEZGYWNldEluc3RhbGxXaXphcmRQYWdlIGV4dGVuZHMgQWJzdHJhY3RGYWNldFdpemFyZFBhZ2UgewotCi0gICAgcHJpdmF0ZSBDWEZEYXRhTW9kZWwgZGF0YU1vZGVsOwotICAgIHByaXZhdGUgQ1hGQ29udGV4dCBjeGZDb250ZXh0OwotCi0gICAgcHJpdmF0ZSBDb21ib1ZpZXdlciBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXI7Ci0KLSAgICBwdWJsaWMgQ1hGRmFjZXRJbnN0YWxsV2l6YXJkUGFnZSgpIHsKLSAgICAgICAgc3VwZXIoImN4Zi5jb3JlLmZhY2V0Lmluc3RhbGwucGFnZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHNldFRpdGxlKENYRlVJTWVzc2FnZXMuQ1hGX0ZBQ0VUX0lOU1RBTExfV0laQVJEX1BBR0VfVElUTEUpOwotICAgICAgICBzZXREZXNjcmlwdGlvbihDWEZVSU1lc3NhZ2VzLkNYRl9GQUNFVF9JTlNUQUxMX1dJWkFSRF9QQUdFX0RFU0NSSVBUSU9OKTsKLSAgICAgICAgY3hmQ29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29uZmlnKE9iamVjdCBjb25maWcpIHsKLSAgICAgICAgZGF0YU1vZGVsID0gKENYRkRhdGFNb2RlbCkgY29uZmlnOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRyYW5zZmVyU3RhdGVUb0NvbmZpZygpIHsKLSAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgQ1hGSW5zdGFsbCBzZWxlY3RlZEluc3RhbGwgPSAoQ1hGSW5zdGFsbCkgc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKHNlbGVjdGVkSW5zdGFsbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkYXRhTW9kZWwuc2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKHNlbGVjdGVkSW5zdGFsbC5nZXRWZXJzaW9uKCkpOwotICAgICAgICAgICAgZGF0YU1vZGVsLnNldERlZmF1bHRSdW50aW1lTG9jYXRpb24oc2VsZWN0ZWRJbnN0YWxsLmdldExvY2F0aW9uKCkpOwotICAgICAgICAgICAgZGF0YU1vZGVsLnNldERlZmF1bHRSdW50aW1lVHlwZShzZWxlY3RlZEluc3RhbGwuZ2V0VHlwZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotICAgICAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAgICAgTGluayBsaW5rID0gbmV3IExpbmsoY29tcG9zaXRlLCBTV1QuUklHSFQpOwotICAgICAgICBsaW5rLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5DWEZfQ09ORklHVVJFX0lOU1RBTExFRF9SVU5USU1FU19MQUJFTCk7Ci0gICAgICAgIGxpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpbnQgc2VsZWN0ZWRJbmRleCA9IGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlci5nZXRDb21ibygpLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IFByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcmVmZXJlbmNlRGlhbG9nT24oZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpLkNYRlJ1bnRpbWVQcmVmZXJlbmNlc1BhZ2UiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyAib3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS5DWEZSdW50aW1lUHJlZmVyZW5jZXNQYWdlIiB9LCBudWxsKS5vcGVuKCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IFdpbmRvdy5PSykgewotICAgICAgICAgICAgICAgICAgICBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXIucmVmcmVzaCgpOwotICAgICAgICAgICAgICAgICAgICBzZXREZWZhdWx0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRU5ELCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIGxpbmsuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGxhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5DWEZfUFJPUEVSVFlfUEFHRV9SVU5USU1FX0xBQkVMKTsKLQotICAgICAgICBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXIgPSBuZXcgQ29tYm9WaWV3ZXIoY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXIuZ2V0Q29tYm8oKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpIHsKLQotICAgICAgICAgICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIENvbGxlY3Rpb248Pz4pIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoQ29sbGVjdGlvbjw/PikgaW5wdXRFbGVtZW50KS50b0FycmF5KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0W10ge307Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQ1hGSW5zdGFsbCkgewotICAgICAgICAgICAgICAgICAgICBDWEZJbnN0YWxsIGN4Zkluc3RhbGwgPSAoQ1hGSW5zdGFsbCkgZWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN4Zkluc3RhbGwuZ2V0VHlwZSgpICsgIiAiICsgY3hmSW5zdGFsbC5nZXRWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9KTsKLQotICAgICAgICBDb2xsZWN0aW9uPENYRkluc3RhbGw+IGluc3RhbGxhdGlvbnMgPSBjeGZDb250ZXh0LmdldEluc3RhbGxhdGlvbnMoKS52YWx1ZXMoKTsKLSAgICAgICAgaW5zdGFsbGF0aW9uc0NvbWJvVmlld2VyLnNldElucHV0KGluc3RhbGxhdGlvbnMpOwotICAgICAgICBzZXREZWZhdWx0KCk7Ci0gICAgICAgIHNldENvbnRyb2woY29tcG9zaXRlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0RGVmYXVsdCgpIHsKLSAgICAgICAgU3RyaW5nIGludGFsbGVkVmVyc2lvbiA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCkuZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCk7Ci0gICAgICAgIENYRkluc3RhbGwgZGVmYXVsdEluc3RhbGwgPSBjeGZDb250ZXh0LmdldEluc3RhbGxhdGlvbnMoKS5nZXQoaW50YWxsZWRWZXJzaW9uKTsKLSAgICAgICAgaWYgKGRlZmF1bHRJbnN0YWxsICE9IG51bGwpIHsKLSAgICAgICAgICAgIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZGVmYXVsdEluc3RhbGwpLCB0cnVlKTsKLSAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2l6YXJkcy9DWEZJbnN0YWxsV2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2l6YXJkcy9DWEZJbnN0YWxsV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NDE0MTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpemFyZHMvQ1hGSW5zdGFsbFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5DWEZVSU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgQ1hGSW5zdGFsbFdpemFyZCBleHRlbmRzIFdpemFyZCB7Ci0KLSAgICBwcml2YXRlIENYRkluc3RhbGxXaXphcmRQYWdlIGN4Zkluc3RhbGxXaXphcmRQYWdlOwotICAgIHByaXZhdGUgQ1hGSW5zdGFsbCBjeGZJbnN0YWxsOwotCi0gICAgcHVibGljIENYRkluc3RhbGxXaXphcmQoKSB7Ci0gICAgICAgIHNldFdpbmRvd1RpdGxlKENYRlVJTWVzc2FnZXMuQ1hGX0lOU1RBTExfV0laQVJEX0FERF9XSU5ET1dfVElUTEUpOwotICAgIH0KLQotICAgIHB1YmxpYyBDWEZJbnN0YWxsV2l6YXJkKENYRkluc3RhbGwgY3hmSW5zdGFsbCkgewotICAgICAgICB0aGlzLmN4Zkluc3RhbGwgPSBjeGZJbnN0YWxsOwotICAgICAgICBzZXRXaW5kb3dUaXRsZShDWEZVSU1lc3NhZ2VzLkNYRl9JTlNUQUxMX1dJWkFSRF9FRElUX1dJTkRPV19USVRMRSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0gICAgICAgIGlmIChjeGZJbnN0YWxsV2l6YXJkUGFnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjeGZJbnN0YWxsV2l6YXJkUGFnZSA9IG5ldyBDWEZJbnN0YWxsV2l6YXJkUGFnZSgpOwotICAgICAgICAgICAgaWYgKGN4Zkluc3RhbGwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGN4Zkluc3RhbGxXaXphcmRQYWdlLnNldENYRkluc3RhbGwoY3hmSW5zdGFsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYWRkUGFnZShjeGZJbnN0YWxsV2l6YXJkUGFnZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLSAgICAgICAgcmV0dXJuIGN4Zkluc3RhbGxXaXphcmRQYWdlLmZpbmlzaCgpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2l6YXJkcy9DWEZJbnN0YWxsV2l6YXJkUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpemFyZHMvQ1hGSW5zdGFsbFdpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M3OGRkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2l6YXJkcy9DWEZJbnN0YWxsV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlbmFtZUZpbHRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5DbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNsYXNzcGF0aENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuY29udGV4dC5DWEZQZXJzaXN0ZW50Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuTGF1bmNoVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5DWEZVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuQ1hGVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBDWEZJbnN0YWxsV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotICAgIHByaXZhdGUgSVN0YXR1cyBDWEZfTE9DQVRJT05fU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBDWEZVSVBsdWdpbi5QTFVHSU5fSUQsIG51bGwpOwotICAgIHByaXZhdGUgSVN0YXR1cyBDWEZfVFlQRV9TVEFUVVMgPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIENYRlVJUGx1Z2luLlBMVUdJTl9JRCwgbnVsbCk7Ci0gICAgcHJpdmF0ZSBJU3RhdHVzIENYRl9WRVJTSU9OX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgQ1hGVUlQbHVnaW4uUExVR0lOX0lELCBudWxsKTsKLSAgICBwcml2YXRlIElTdGF0dXMgT0tfU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBDWEZVSVBsdWdpbi5QTFVHSU5fSUQsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBQYXR0ZXJuIGRpZ2l0UGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiXFxkIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgQnV0dG9uIGJyb3dzZUJ1dHRvbjsKLSAgICBwcml2YXRlIFRleHQgY3hmSG9tZURpclRleHQ7Ci0gICAgcHJpdmF0ZSBUZXh0IGN4ZlR5cGVUZXh0OwotICAgIHByaXZhdGUgVGV4dCBjeGZWZXJzaW9uVGV4dDsKLQotICAgIFN0cmluZyBjeGZSdW50aW1lVmVyc2lvbiA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIGN4ZlJ1bnRpbWVMb2NhdGlvbiA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIGN4ZlJ1bnRpbWVUeXBlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgQ1hGSW5zdGFsbCBjeGZJbnN0YWxsOwotCi0gICAgcHJvdGVjdGVkIENYRkluc3RhbGxXaXphcmRQYWdlKCkgewotICAgICAgICBzdXBlcigiY3hmLmludGFsbC53aXphcmQucGFnZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHNldFRpdGxlKENYRlVJTWVzc2FnZXMuQ1hGX0lOU1RBTExfV0laQVJEX1BBR0VfVElUTEUpOwotICAgICAgICBzZXREZXNjcmlwdGlvbihDWEZVSU1lc3NhZ2VzLkNYRl9JTlNUQUxMX1dJWkFSRF9QQUdFX0RFU0NSSVBUSU9OKTsKLSAgICAgICAgc2V0SW1hZ2VEZXNjcmlwdG9yKENYRlVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oQ1hGVUlQbHVnaW4uUExVR0lOX0lELCAiaWNvbnMvd2l6YmFuL2xpYnJhcnlfd2l6LnBuZyIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLSAgICAgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGxhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfQ1hGX0hPTUVfRElSX0xBQkVMKTsKLQotICAgICAgICBjeGZIb21lRGlyVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0KLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgY3hmSG9tZURpclRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgY3hmSG9tZURpclRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlTG9jYXRpb25TdGF0dXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgYnJvd3NlQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfQlJPV1NFX0JVVFRPTl9MQUJFTCk7Ci0KLSAgICAgICAgYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgRGlyZWN0b3J5RGlhbG9nIGZpbGVEaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKGNvbXBvc2l0ZS5nZXRTaGVsbCgpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBmaWxlRGlhbG9nLm9wZW4oKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlsZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjeGZIb21lRGlyVGV4dC5zZXRUZXh0KGZpbGVOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vQ1hGIFZlcnNpb24KLSAgICAgICAgTGFiZWwgY3hmVmVyc2lvbkxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBjeGZWZXJzaW9uTGFiZWwuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9DWEZfVkVSU0lPTl9MQUJFTCk7Ci0KLSAgICAgICAgY3hmVmVyc2lvblRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgY3hmVmVyc2lvblRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIGN4ZlZlcnNpb25UZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHVwZGF0ZVZlcnNpb25TdGF0dXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy9CbGFuayBsYWJlbAotICAgICAgICBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0KLSAgICAgICAgLy9DWEYgVHlwZQotICAgICAgICBMYWJlbCBjeGZUeXBlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGN4ZlR5cGVMYWJlbC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0NYRl9UWVBFX0xBQkVMKTsKLQotICAgICAgICBjeGZUeXBlVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGN4ZlR5cGVUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICBjeGZUeXBlVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVUeXBlU3RhdHVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGlmIChjeGZJbnN0YWxsICE9IG51bGwpIHsKLSAgICAgICAgICAgIGN4ZkhvbWVEaXJUZXh0LnNldFRleHQoY3hmSW5zdGFsbC5nZXRMb2NhdGlvbigpKTsKLSAgICAgICAgICAgIGN4ZlZlcnNpb25UZXh0LnNldFRleHQoY3hmSW5zdGFsbC5nZXRWZXJzaW9uKCkpOwotICAgICAgICAgICAgY3hmVHlwZVRleHQuc2V0VGV4dChjeGZJbnN0YWxsLmdldFR5cGUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0gICAgICAgIERpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDWEZJbnN0YWxsKENYRkluc3RhbGwgY3hmSW5zdGFsbCkgewotICAgICAgICB0aGlzLmN4Zkluc3RhbGwgPSBjeGZJbnN0YWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVMb2NhdGlvblN0YXR1cygpIHsKLSAgICAgICAgQ1hGX0xPQ0FUSU9OX1NUQVRVUyA9IGNoZWNrUnVudGltZUV4aXN0KGN4ZkhvbWVEaXJUZXh0LmdldFRleHQoKSk7Ci0gICAgICAgIGFwcGx5U3RhdHVzVG9QYWdlKGZpbmRNb3N0U2V2ZXJlKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVUeXBlU3RhdHVzKCkgewotICAgICAgICBDWEZfVFlQRV9TVEFUVVMgPSB2YWxpZGF0ZVR5cGVOYW1lKGN4ZlR5cGVUZXh0LmdldFRleHQoKSk7Ci0gICAgICAgIGFwcGx5U3RhdHVzVG9QYWdlKGZpbmRNb3N0U2V2ZXJlKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVWZXJzaW9uU3RhdHVzKCkgewotICAgICAgICBDWEZfVkVSU0lPTl9TVEFUVVMgPSB2YWxpZGF0ZVZlcnNpb24oY3hmVmVyc2lvblRleHQuZ2V0VGV4dCgpKTsKLSAgICAgICAgYXBwbHlTdGF0dXNUb1BhZ2UoZmluZE1vc3RTZXZlcmUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGx5U3RhdHVzVG9QYWdlKElTdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gc3RhdHVzLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID4gSVN0YXR1cy5PSykgewotICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKG1lc3NhZ2UpOwotICAgICAgICAgICAgc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2V0TWVzc2FnZShnZXREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgSVN0YXR1cyBmaW5kTW9zdFNldmVyZSgpIHsKLSAgICAgICAgaWYgKENYRl9UWVBFX1NUQVRVUy5nZXRTZXZlcml0eSgpID4gQ1hGX0xPQ0FUSU9OX1NUQVRVUy5nZXRTZXZlcml0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ1hGX1RZUEVfU1RBVFVTOwotICAgICAgICB9Ci0gICAgICAgIGlmIChDWEZfVkVSU0lPTl9TVEFUVVMuZ2V0U2V2ZXJpdHkoKSA+IENYRl9MT0NBVElPTl9TVEFUVVMuZ2V0U2V2ZXJpdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIENYRl9WRVJTSU9OX1NUQVRVUzsKLSAgICAgICAgfQotICAgICAgICBpZiAoQ1hGX1RZUEVfU1RBVFVTLmdldFNldmVyaXR5KCkgPT0gQ1hGX0xPQ0FUSU9OX1NUQVRVUy5nZXRTZXZlcml0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ1hGX0xPQ0FUSU9OX1NUQVRVUzsKLSAgICAgICAgfQotICAgICAgICBpZiAoQ1hGX1ZFUlNJT05fU1RBVFVTLmdldFNldmVyaXR5KCkgPT0gQ1hGX0xPQ0FUSU9OX1NUQVRVUy5nZXRTZXZlcml0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ1hGX0xPQ0FUSU9OX1NUQVRVUzsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBDWEZfTE9DQVRJT05fU1RBVFVTOwotICAgIH0KLQotICAgIHByaXZhdGUgSVN0YXR1cyBjaGVja1J1bnRpbWVFeGlzdChTdHJpbmcgcGF0aCkgewotICAgICAgICBGaWxlIGN4ZkhvbWVEaXIgPSBuZXcgRmlsZShwYXRoKTsKLSAgICAgICAgaWYgKGN4ZkhvbWVEaXJUZXh0LmdldFRleHQoKS50cmltKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBDWEZfTE9DQVRJT05fU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZVSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgIENYRlVJTWVzc2FnZXMuQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX1JVTlRJTUVfTk9UX1NFVCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIGN4ZkxpYlBhdGggPSBjeGZIb21lRGlyICsgU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIpICsgImxpYiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBpZiAoY3hmSG9tZURpci5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICBGaWxlIGN4ZkxpYkZvbGRlciA9IG5ldyBGaWxlKGN4ZkxpYlBhdGgpOwotICAgICAgICAgICAgaWYgKGN4ZkxpYkZvbGRlci5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gY3hmSmFyRmlsZXMgPSBnZXRDWEZKYXJGaWxlcyhjeGZMaWJGb2xkZXIpOwotICAgICAgICAgICAgICAgIGlmIChjeGZKYXJGaWxlcyAhPSBudWxsICYmIGN4ZkphckZpbGVzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgSVN0YXR1cyB0b29sVmVyc2lvblN0YXR1cyA9IGdldFRvb2xWZXJzaW9uKGN4ZkxpYlBhdGgpOwotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVG9vbFZlcnNpb24odG9vbFZlcnNpb25TdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ1hGX0xPQ0FUSU9OX1NUQVRVUyA9IE9LX1NUQVRVUzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY3hmVHlwZVRleHQuc2V0VGV4dCgiIik7Ci0gICAgICAgIGN4ZlZlcnNpb25UZXh0LnNldFRleHQoIiIpOwotICAgICAgICBDWEZfTE9DQVRJT05fU1RBVFVTID0gbmV3IFN0YXR1cyhTdGF0dXMuRVJST1IsIENYRlVJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICBDWEZVSU1lc3NhZ2VzLkNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9SVU5USU1FX05PVF9TRVQpOwotICAgICAgICByZXR1cm4gQ1hGX0xPQ0FUSU9OX1NUQVRVUzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIElTdGF0dXMgdmFsaWRhdGVUeXBlTmFtZShTdHJpbmcgdHlwZU5hbWUpIHsKLSAgICAgICAgaWYgKHR5cGVOYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBDWEZfVFlQRV9TVEFUVVMgPSBuZXcgU3RhdHVzKFN0YXR1cy5FUlJPUiwgQ1hGVUlQbHVnaW4uUExVR0lOX0lELCBDWEZVSU1lc3NhZ2VzLkNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9FTlRFUl9UWVBFX05BTUUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ1hGX1RZUEVfU1RBVFVTID0gT0tfU1RBVFVTOwotICAgICAgICB9Ci0gICAgICAgIGlmICghdHlwZU5hbWUubWF0Y2hlcygiW2EtekEtWjAtOV9cXC1cXHNdKyIpKSB7Ci0gICAgICAgICAgICBDWEZfVFlQRV9TVEFUVVMgPSBuZXcgU3RhdHVzKFN0YXR1cy5FUlJPUiwgQ1hGVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICBDWEZVSU1lc3NhZ2VzLmJpbmQoQ1hGVUlNZXNzYWdlcy5DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfSU5WQUxJRF9UWVBFX05BTUUsIHR5cGVOYW1lKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBDWEZfVFlQRV9TVEFUVVMgPSBPS19TVEFUVVM7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENYRl9UWVBFX1NUQVRVUzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIElTdGF0dXMgdmFsaWRhdGVWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7Ci0gICAgICAgIGlmIChDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKYXZhMldTQ29udGV4dCgpLmdldEluc3RhbGxhdGlvbnMoKS5jb250YWluc0tleSh2ZXJzaW9uKQotICAgICAgICAgICAgICAgICYmIGN4Zkluc3RhbGwgIT0gbnVsbCAmJiAhY3hmSW5zdGFsbC5nZXRWZXJzaW9uKCkuZXF1YWxzKHZlcnNpb24pKSB7Ci0gICAgICAgICAgICBDWEZfVkVSU0lPTl9TVEFUVVMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRlVJUGx1Z2luLlBMVUdJTl9JRCwgIlZlcnNpb24gYWxyZWFkeSBpbnN0YWxsZWQiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIENYRl9WRVJTSU9OX1NUQVRVUyA9IE9LX1NUQVRVUzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQ1hGX1ZFUlNJT05fU1RBVFVTOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nW10gZ2V0Q1hGSmFyRmlsZXMoRmlsZSBkaXJlY3RvcnkpIHsKLSAgICAgICAgU3RyaW5nW10gY3hmSmFyRmlsZXMgPSBkaXJlY3RvcnkubGlzdChuZXcgRmlsZW5hbWVGaWx0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBkaXIsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aCgiY3hmIikgJiYgbmFtZS5lbmRzV2l0aCgiLmphciIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgZGlnaXRQYXR0ZXJuLm1hdGNoZXIobmFtZSkuZmluZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICByZXR1cm4gY3hmSmFyRmlsZXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJU3RhdHVzIGdldFRvb2xWZXJzaW9uKFN0cmluZyBjeExpYkZvbGRlclBhdGgpIHsKLSAgICAgICAgRmlsZSBjeGZMaWJGb2xkZXIgPSBuZXcgRmlsZShjeExpYkZvbGRlclBhdGgpOwotICAgICAgICBMaXN0PFN0cmluZz4gY3hmTGliID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIFN0cmluZ1tdIGphckZpbGVzID0gY3hmTGliRm9sZGVyLmxpc3QobmV3IEZpbGVuYW1lRmlsdGVyKCkgewotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyLCBTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgICAgIGlmIChuYW1lLmVuZHNXaXRoKCIuamFyIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBmb3IgKFN0cmluZyBqYXJGaWxlIDogamFyRmlsZXMpIHsKLSAgICAgICAgICAgIGN4ZkxpYi5hZGQoY3hMaWJGb2xkZXJQYXRoICsgU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIpICsgamFyRmlsZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotCi0gICAgICAgIElTdGF0dXMgdG9vbFZlcnNpb25TdGF0dXMgPSBMYXVuY2hVdGlscy5sYXVuY2goY3hmTGliLnRvQXJyYXkobmV3IFN0cmluZ1tjeGZMaWIuc2l6ZSgpXSksCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY3hmLnRvb2xzLndzZGx0by5XU0RMVG9KYXZhIiwgbmV3IFN0cmluZ1tdIHsgIi12IiB9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIHJldHVybiB0b29sVmVyc2lvblN0YXR1czsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1Rvb2xWZXJzaW9uKElTdGF0dXMgdG9vbFZlcnNpb25TdGF0dXMpIHsKLSAgICAgICAgaWYgKHRvb2xWZXJzaW9uU3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5JTkZPKSB7Ci0gICAgICAgICAgICBTdHJpbmcgY3hmVG9vbFZlcnNpb24gPSB0b29sVmVyc2lvblN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0KLSAgICAgICAgICAgIGN4ZlRvb2xWZXJzaW9uID0gY3hmVG9vbFZlcnNpb24uc3Vic3RyaW5nKGN4ZlRvb2xWZXJzaW9uLmluZGV4T2YoIi0iKSArIDEsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgY3hmVG9vbFZlcnNpb24ubGVuZ3RoKCkpLnRyaW0oKTsKLQotICAgICAgICAgICAgTWF0Y2hlciBtYXRjaGVyID0gZGlnaXRQYXR0ZXJuLm1hdGNoZXIoY3hmVG9vbFZlcnNpb24pOwotICAgICAgICAgICAgaWYgKG1hdGNoZXIuZmluZCgpKSB7Ci0gICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gbWF0Y2hlci5zdGFydCgpOwotICAgICAgICAgICAgICAgIGludCBlbmQgPSBtYXRjaGVyLmVuZCgpOwotICAgICAgICAgICAgICAgIHdoaWxlIChtYXRjaGVyLmZpbmQoKSkgewotICAgICAgICAgICAgICAgICAgICBlbmQgPSBtYXRjaGVyLmVuZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjeGZSdW50aW1lVHlwZSA9IGN4ZlRvb2xWZXJzaW9uLnN1YnN0cmluZygwLCBzdGFydCkudHJpbSgpOwotICAgICAgICAgICAgICAgIGN4ZlJ1bnRpbWVWZXJzaW9uID0gY3hmVG9vbFZlcnNpb24uc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjeGZWZXJzaW9uVGV4dC5zZXRUZXh0KGN4ZlJ1bnRpbWVWZXJzaW9uKTsKLSAgICAgICAgICAgIGN4ZlR5cGVUZXh0LnNldFRleHQoY3hmUnVudGltZVR5cGUpOwotICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuc2V0Q3VycmVudFJ1bnRpbWVWZXJzaW9uKG5ldyBWZXJzaW9uKGN4ZlJ1bnRpbWVWZXJzaW9uKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBmaW5pc2goKSB7Ci0gICAgICAgIENYRlBlcnNpc3RlbnRDb250ZXh0IGNvbnRleHQgPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKYXZhMldTQ29udGV4dCgpOwotICAgICAgICBNYXA8U3RyaW5nLCBDWEZJbnN0YWxsPiBpbnN0YWxscyA9IGNvbnRleHQuZ2V0SW5zdGFsbGF0aW9ucygpOwotICAgICAgICBDWEZJbnN0YWxsIGluc3RhbGwgPSBDWEZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDWEZJbnN0YWxsKCk7Ci0gICAgICAgIGluc3RhbGwuc2V0VmVyc2lvbihjeGZWZXJzaW9uVGV4dC5nZXRUZXh0KCkudHJpbSgpKTsKLSAgICAgICAgaW5zdGFsbC5zZXRMb2NhdGlvbihjeGZIb21lRGlyVGV4dC5nZXRUZXh0KCkudHJpbSgpKTsKLSAgICAgICAgaW5zdGFsbC5zZXRUeXBlKGN4ZlR5cGVUZXh0LmdldFRleHQoKS50cmltKCkpOwotICAgICAgICBpbnN0YWxscy5wdXQoY3hmUnVudGltZVZlcnNpb24sIGluc3RhbGwpOwotICAgICAgICBjb250ZXh0LnNldEluc3RhbGxhdGlvbnMoaW5zdGFsbHMpOwotICAgICAgICBpZiAoaXNVcGRhdGVSZXF1aXJlZChpbnN0YWxsKSkgewotICAgICAgICAgICAgdXBkYXRlUHJvamVjdHMoaW5zdGFsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNVcGRhdGVSZXF1aXJlZChDWEZJbnN0YWxsIGluc3RhbGwpIHsKLSAgICAgICAgaWYgKGN4Zkluc3RhbGwgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghY3hmSW5zdGFsbC5nZXRMb2NhdGlvbigpLmVxdWFscyhpbnN0YWxsLmdldExvY2F0aW9uKCkpCi0gICAgICAgICAgICAgICAgfHwgIWN4Zkluc3RhbGwuZ2V0VHlwZSgpLmVxdWFscyhpbnN0YWxsLmdldFR5cGUoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVQcm9qZWN0cyhDWEZJbnN0YWxsIGluc3RhbGwpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNldDxJRmFjZXRlZFByb2plY3Q+IGN4ZlByb2plY3RzID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0RmFjZXRlZFByb2plY3RzKFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCgiY3hmLmNvcmUiKSk7Ci0gICAgICAgICAgICBJdGVyYXRvcjxJRmFjZXRlZFByb2plY3Q+IHByb2pJdGVyID0gY3hmUHJvamVjdHMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChwcm9qSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBJRmFjZXRlZFByb2plY3QgY3hmUHJvamVjdCA9IHByb2pJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaW5zdGFsbGVkVmVyc2lvbiA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldENYRlJ1bnRpbWVWZXJzaW9uKGN4ZlByb2plY3QuZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5zdGFsbGVkVmVyc2lvbi5lcXVhbHMoaW5zdGFsbC5nZXRWZXJzaW9uKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyIGNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyID0gSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUl9JRCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJUGF0aCBjb250YWluZXJQYXRoID0gbmV3IFBhdGgoQ1hGQ29yZVBsdWdpbi5DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUl9JRCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUoY3hmUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQ2xhc3NwYXRoQ29udGFpbmVyIGN4ZkNsYXNzcGF0aENvbnRhaW5lciA9IG5ldyBDWEZDbGFzc3BhdGhDb250YWluZXIoY29udGFpbmVyUGF0aCwgamF2YVByb2plY3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIucmVxdWVzdENsYXNzcGF0aENvbnRhaW5lclVwZGF0ZShjb250YWluZXJQYXRoLCBqYXZhUHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3hmQ2xhc3NwYXRoQ29udGFpbmVyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgQ1hGVUlQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTMwY2I3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc1ZDMzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2UwMDJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNNb24gRmViIDAyIDExOjUwOjQyIEdNVCAyMDA5Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA3ZDY1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLVJlZ2lzdGVyQnVkZHk6IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXhiLmNvcmUuSkFYQkNvcmVQbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheGIuY29yZQotSW1wb3J0LVBhY2thZ2U6IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb247dmVyc2lvbj0iWzIuMS4wLDIuMi4wKSIsCi0gamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVyczt2ZXJzaW9uPSJbMi4xLjAsMi4yLjApIgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNmEwMzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMTksIDIwMDk8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvYWJvdXQuaW5pIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNiOTNlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yIGZlYXR1cmUgZGV0YWlscyBpbiB0aGUgIkFib3V0IiAKLSMgZGlhbG9nICh0cmFuc2xhdGVkKS4gIE1heGltdW0gMTUgbGluZXMgYW5kIDc1IGNoYXJhY3RlcnMgcGVyIGxpbmUuCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvYWJvdXQubWFwcGluZ3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL2Fib3V0LnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNjZWIyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZSBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9SkFYQiBUb29sc1xuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA5LCAyMDEwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvXG5cCi1cbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI5ZDYxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgaWNvbnMvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjA5YzJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmUxN2U2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA5IFByb2dyZXNzIFNvZnR3YXJlCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSNwcm9wZXJ0aWVzIGZpbGUgZm9yIEpBWEIgQ29yZQotcGx1Z2luTmFtZT1KQVhCIFRvb2xzIENvcmUKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLUpBWEJfQ0FURUdPUllfTkFNRT1KQVhCCi0KLVhNTF9TQ0hFTUFfVFlQRV9SVUxFUz1WYWxpZGF0aW9uIHJ1bGVzIGdvdmVybmluZyB0aGUgdXNlIG9mIEBYbWxTY2hlbWFUeXBlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEyMDcwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25DYXRlZ29yeSI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIGlkPSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgbmFtZT0iJUpBWEJfQ0FURUdPUllfTkFNRSI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25EZWZpbml0aW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yT3JkZXIiCi0gICAgICAgICAgICBuYW1lPSJYbWxBY2Nlc3Nvck9yZGVyIi8+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGUiCi0gICAgICAgICAgICBuYW1lPSJYbWxBY2Nlc3NvclR5cGUiLz4KLSAgICAgIAotICAgICAgPCEtLSBUT0RPIFJlaW5zdGF0ZSB3aGVuIFhtbEFkYXB0ZXIgaXNzdWUgaXMgc29sdmVkCi0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxBZGFwdGVyIgotICAgICAgICAgICAgbmFtZT0iWG1sQWRhcHRlciI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAtLT4KLSAgICAgIAotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQW55QXR0cmlidXRlIgotICAgICAgICAgICAgbmFtZT0iWG1sQW55QXR0cmlidXRlIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFueUVsZW1lbnQiCi0gICAgICAgICAgICBuYW1lPSJYbWxBbnlFbGVtZW50Ij4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dGFjaG1lbnRSZWYiCi0gICAgICAgICAgICBuYW1lPSJYbWxBdHRhY2htZW50UmVmIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZSIKLSAgICAgICAgICAgIG5hbWU9IlhtbEF0dHJpYnV0ZSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50IgotICAgICAgICAgICAgbmFtZT0iWG1sRWxlbWVudCI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50RGVjbCIKLSAgICAgICAgICAgIG5hbWU9IlhtbEVsZW1lbnREZWNsIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnRSZWYiCi0gICAgICAgICAgICBuYW1lPSJYbWxFbGVtZW50UmVmIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnRSZWZzIgotICAgICAgICAgICAgbmFtZT0iWG1sRWxlbWVudFJlZnMiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudFdyYXBwZXIiCi0gICAgICAgICAgICBuYW1lPSJYbWxFbGVtZW50V3JhcHBlciI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50cyIKLSAgICAgICAgICAgIG5hbWU9IlhtbEVsZW1lbnRzIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVudW0iCi0gICAgICAgICAgICBuYW1lPSJYbWxFbnVtIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVudW1WYWx1ZSIKLSAgICAgICAgICAgIG5hbWU9IlhtbEVudW1WYWx1ZSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJRCIKLSAgICAgICAgICAgIG5hbWU9IlhtbElEIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbElEUkVGIgotICAgICAgICAgICAgbmFtZT0iWG1sSURSRUYiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSW5saW5lQmluYXJ5RGF0YSIKLSAgICAgICAgICAgIG5hbWU9IlhtbElubGluZUJpbmFyeURhdGEiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyIgotICAgICAgICAgICAgbmFtZT0iWG1sSmF2YVR5cGVBZGFwdGVyIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEphdmFUeXBlQWRhcHRlcnMiCi0gICAgICAgICAgICBuYW1lPSJYbWxKYXZhVHlwZUFkYXB0ZXJzIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbExpc3QiCi0gICAgICAgICAgICBuYW1lPSJYbWxMaXN0Ij4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbE1pbWVUeXBlIgotICAgICAgICAgICAgbmFtZT0iWG1sTWltZVR5cGUiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sTWl4ZWQiCi0gICAgICAgICAgICBuYW1lPSJYbWxNaXhlZCI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxOcyIKLSAgICAgICAgICAgIG5hbWU9IlhtbE5zIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJlZ2lzdHJ5IgotICAgICAgICAgICAgbmFtZT0iWG1sUmVnaXN0cnkiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQiCi0gICAgICAgICAgICBuYW1lPSJYbWxSb290RWxlbWVudCI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxTY2hlbWEiCi0gICAgICAgICAgICBuYW1lPSJYbWxTY2hlbWEiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2NoZW1hVHlwZSIKLSAgICAgICAgICAgIG5hbWU9IlhtbFNjaGVtYVR5cGUiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2NoZW1hVHlwZXMiCi0gICAgICAgICAgICBuYW1lPSJYbWxTY2hlbWFUeXBlcyI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxTZWVBbHNvIgotICAgICAgICAgICAgbmFtZT0iWG1sU2VlQWxzbyI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUcmFuc2llbnQiCi0gICAgICAgICAgICBuYW1lPSJYbWxUcmFuc2llbnQiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZSIKLSAgICAgICAgICAgIG5hbWU9IlhtbFR5cGUiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVmFsdWUiCi0gICAgICAgICAgICBuYW1lPSJYbWxWYWx1ZSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXhiL2NvcmUvSkFYQkNvcmVNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4Yi9jb3JlL0pBWEJDb3JlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRmODgxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXhiL2NvcmUvSkFYQkNvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBQcm9ncmVzcyBTb2Z0d2FyZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheGIuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBKQVhCQ29yZU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAKLSAgICAgICAgIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXhiLmNvcmUuSkFYQkNvcmVNZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFRZUEVfTkFNRV9ESUZGRVJFTlRfQ0FTRV9FWElTVFM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVFlQRV9XSVRIX05BTUVfQUxSRUFEWV9FWElTVFM7Ci0gCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MX1NDSEVNQV9UWVBFX01VU1RfSEFWRV9ERUZBVUxUX09OX0ZJRUxEX09SX01FVEhPRDsKLQkKLSAgICBzdGF0aWMgewotICAgICAgICAvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotICAgICAgICBOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBKQVhCQ29yZU1lc3NhZ2VzLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEpBWEJDb3JlTWVzc2FnZXMoKSB7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXhiL2NvcmUvSkFYQkNvcmVNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4Yi9jb3JlL0pBWEJDb3JlTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA4MWJhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXhiL2NvcmUvSkFYQkNvcmVNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDkgUHJvZ3Jlc3MgU29mdHdhcmUgSW5jCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSNKRFRVdGlscwotVFlQRV9OQU1FX0RJRkZFUkVOVF9DQVNFX0VYSVNUUz1BIFR5cGUgd2l0aCB0aGUgc2FtZSBuYW1lIGJ1dCBkaWZmZXJlbnQgY2FzZSBhbHJlYWR5IGV4aXN0cwotVFlQRV9XSVRIX05BTUVfQUxSRUFEWV9FWElTVFM9QSBjb21waWxhdGlvbiB1bml0IG5hbWVkICcnezB9JycgYWxyZWFkeSBleGlzdHMgaW4gcGFja2FnZSAnJ3sxfScnCi1YTUxfU0NIRU1BX1RZUEVfTVVTVF9IQVZFX0RFRkFVTFRfT05fRklFTERfT1JfTUVUSE9EPUlmIEBYbWxTY2hlbWFUeXBlIGlzIHVzZWQgb24gYSBmaWVsZCBvciBhIG1ldGhvZCwgdGhlbiB0aGUgdmFsdWUgb2YgdHlwZSgpIG11c3QgYmUgREVGQVVMVC5jbGFzcyAoSkFYQiAyLjEsIDguNi40LjIpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4Yi9jb3JlL0pBWEJDb3JlUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXhiL2NvcmUvSkFYQkNvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY0ZGI3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXhiL2NvcmUvSkFYQkNvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgUHJvZ3Jlc3MgU29mdHdhcmUKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheGIuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEpBWEJDb3JlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZSI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0gICAgcHJpdmF0ZSBzdGF0aWMgSkFYQkNvcmVQbHVnaW4gcGx1Z2luOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSkFYQkNvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLSAgICAgIHJldHVybiBwbHVnaW47Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnN0YXJ0KGNvbnRleHQpOwotICAgICAgICBwbHVnaW4gPSB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcGx1Z2luID0gbnVsbDsKLSAgICAgICAgc3VwZXIuc3RvcChjb250ZXh0KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZ01lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBKQVhCQ29yZVBsdWdpbi5sb2cobmV3IFN0YXR1cyhzZXZlcml0eSwgSkFYQkNvcmVQbHVnaW4uUExVR0lOX0lELCBtZXNzYWdlKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotICAgICAgICBKQVhCQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0gICAgICAgIEpBWEJDb3JlUGx1Z2luLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpBWEJDb3JlUGx1Z2luLlBMVUdJTl9JRCwgZXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZXhjZXB0aW9uKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTMwY2I3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc5NzcwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNlMDAyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI01vbiBGZWIgMDIgMTE6NTA6NDIgR01UIDIwMDkKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMTQwZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLVJlZ2lzdGVyQnVkZHk6IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZVBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuYXB0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjMuMTAwLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDEuMS4wKSIsCi0gamF2YXgud3NkbDtidW5kbGUtdmVyc2lvbj0iWzEuNi4yLDEuNy4wKSIsCi0gamF2YXgueG1sLnNvYXA7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiLAotIG9yZy5hcGFjaGUueGVyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMi45LjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMS41LjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjMuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmU7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMsb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpLG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cyIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscwotSW1wb3J0LVBhY2thZ2U6IGphdmF4LmFjdGl2YXRpb24sCi0gamF2YXguandzLAotIGphdmF4Lmp3cy5zb2FwLAotIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb247dmVyc2lvbj0iMi4xLjAiLAotIGphdmF4LnhtbC53czt2ZXJzaW9uPSIyLjEuMCIsCi0gamF2YXgueG1sLndzLmh0dHA7dmVyc2lvbj0iMi4xLjAiLAotIGphdmF4LnhtbC53cy5zb2FwO3ZlcnNpb249IjIuMS4wIiwKLSBqYXZheC54bWwud3Muc3BpO3ZlcnNpb249IjIuMS4wIiwKLSBvcmcuamRvbTt2ZXJzaW9uPSIxLjAuMCIsCi0gb3JnLmpkb20uaW5wdXQ7dmVyc2lvbj0iMS4wLjAiLAotIG9yZy5qZG9tLm91dHB1dDt2ZXJzaW9uPSIxLjAuMCIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNmEwMzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDE5LCAyMDA5PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9hYm91dC5pbmkgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNiOTNlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciBmZWF0dXJlIGRldGFpbHMgaW4gdGhlICJBYm91dCIgCi0jIGRpYWxvZyAodHJhbnNsYXRlZCkuICBNYXhpbXVtIDE1IGxpbmVzIGFuZCA3NSBjaGFyYWN0ZXJzIHBlciBsaW5lLgotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9aWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9hYm91dC5tYXBwaW5ncyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvYWJvdXQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ3ODhlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UgYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPUpBWC1XUyBUb29sc1xuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA4LCAyMDEwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvXG5cCi1cbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjlkNjEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgaWNvbnMvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL2ljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL2ljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMDljMmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3YjZlMzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZSBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jcHJvcGVydGllcyBmaWxlIGZvciBKQVhXUyBDb3JlCi1wbHVnaW5OYW1lPUpBWC1XUyBUb29scyBDb3JlCi1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi1XRUJTRVJWSUNFX0NMQVNTX0RFRkFVTFRfUFVCTElDX0NPTlNUUlVDVE9SX1JVTEU9Q2xhc3NlcyBhbm5vdGF0ZWQgd2l0aCBAV2ViU2VydmljZSBtdXN0IGhhdmUgYSBkZWZhdWx0IHB1YmxpYyBjb25zdHJ1Y3RvcgotV0VCU0VSVklDRV9DTEFTU19QVUJMSUNfQUJTVFJBQ1RfRklOQUxfUlVMRT1DbGFzc2VzIGFubm90YXRlZCB3aXRoIEBXZWJTZXJ2aWNlIG11c3QgYmUgYW4gb3V0ZXIgcHVibGljIGNsYXNzLCBtdXN0IG5vdCBiZSBmaW5hbCwgYW5kIG11c3Qgbm90IGJlIGFic3RyYWN0Ci1XRUJTRVJWSUNFX0NMQVNTX05PX0ZJTkFMSVpFX01FVEhPRF9SVUxFPUNsYXNzZXMgYW5ub3RhdGVkIHdpdGggQFdlYlNlcnZpY2UgbXVzdCBub3QgZGVmaW5lIGEgZmluYWxpemUoKSBtZXRob2QKLVdFQk1FVEhPRF9PTkxZX1NVUFBPUlRFRF9PTl9DTEFTU0VTX1dJVEhfV0VCU0VSVklDRV9BTk5OT1RBVElPTj1AV2ViTWV0aG9kIGFubm90YXRpb25zIG9ubHkgc3VwcG9ydGVkIGluIGNsYXNzZXMgd2l0aCB0aGUgQFdlYlNlcnZpY2UgYW5ub3RhdGlvbgotV0VCU0VSVklDRV9TRUlfTk9fV0VCTUVUSE9TX1JVTEU9Tm8gQFdlYk1ldGhvZCBhbm5vdGF0aW9ucyBhbGxvd2VkIGluIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgY29udGFpbnMgYW4gZW5kcG9pbnRJbnRlcmZhY2UgYXR0cmlidXRlIGluIGl0J3MgQFdlYlNlcnZpY2UgYW5ub3RhdGlvbgotV0VCU0VSVklDRV9PTl9TRUlfQVRUUklCVVRFU19SVUxFPUNlcnRhaW4gQFdlYlNlcnZpY2UgYW5ub3RhdGlvbiBhdHRyaWJ1dGVzIGFyZSByZXN0cmljdGVkIHdoZW4gdXNlZCBvbiBTRUkncwotV0VCU0VSVklDRV9XRUJTRVJWSUNFX1BST1ZJREVSX0NPRVhJU1RfUlVMRT1AV2ViU2VydmljZSBhbmQgQFdlYlNlcnZpY2VQcm92aWRlciBhbm5vdGF0aW9ucyBjYW5ub3QgY29leGlzdAotT05FV0FZX05PX1JFVFVSTl9WQUxVRT1AT25ld2F5IG1ldGhvZHMgbXVzdCBub3QgcmV0dXJuIGEgdmFsdWUKLVdFQk1FVEhPRF9PTkxZX1BVQkxJQ19NRVRIT0RTPU1ldGhvZHMgYW5ub3RhdGVkIHdpdGggQFdlYk1ldGhvZCBtdXN0IGJlIHB1YmxpYywgYW5kIG11c3Qgbm90IGJlIGRlY2xhcmVkIHN0YXRpYyBvciBmaW5hbAotU09BUEJJTkRJTkdfUlVMRVM9QFNPQVBCaW5kaW5nIFJ1bGVzLiBFbmNvZGVkIHVzZSBub3Qgc3VwcG9ydGVkLiBObyBSUEMgc3R5bGUgb24gbWV0aG9kcy4gTm8gbWl4aW5nIG9mIFNPQVBCaW5kaW5nIHN0eWxlcy4gUlBDIHN0eWxlIG9ubHkgd2l0aCB3cmFwcGVkIHBhcmFtZXRlciBzdHlsZQotV0VCTUVUSE9EX0VYQ0xVREVfU1BFQ0lGSUVEX1JVTEU9QFdlYk1ldGhvZCBleGNsdWRlIGF0dHJpYnV0ZSBpcyBub3QgYWxsb3dlZCBpbiBTRUkncy4gSWYgc3BlY2lmaWVkIGluIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzLCB0aGVuIG90aGVyIGF0dHJpYnV0ZXMgaW4gdGhlIEBXZWJNZXRob2QgYW5ub3RhdGlvbiBhcmUgbm90IGFsbG93ZWQKLVNPQVBCSU5ESU5HX0RPQ1VNRU5UX0JBUkVfUlVMRVM9RG9jdW1lbnQgQmFyZSBvcGVyYXRpb25zIGFyZSBzdWJqZWN0IHRvIGEgbnVtYmVyIG9mIHJlc3RyaWN0aW9ucy4gQ29tYmluYXRpb25zIG9mIEBPbmV3YXkuIE5vdCBAT25ld2F5LiBWb2lkIFJldHVybi4gTm9uLVZvaWQgUmV0dXJuLiBAV2ViUGFyYW0gTW9kZXMgSU4sIE9VVCwgSU5PVVQuIEhlYWRlciBwYXJhbWV0ZXJzCi1IT0xERVJfVFlQRVNfUEFSQU1FVEVSU19SVUxFPVBhcmFtZXRlcnMgdGhhdCBjb25mb3JtIHRvIHRoZSBkZWZpbml0aW9uIG9mIEhvbGRlciBUeXBlcyBtdXN0IGJlIGFubm90YXRlZCB3aXRoIEBXZWJQYXJhbS5Nb2RlLk9VVCBvciBAV2ViUGFyYW0uTW9kZS5JTk9VVAotVU5JUVVFX05BTUVTX1JVTEU9Q2hlY2tzIEBSZXNwb25zZVdyYXBwZXIsIEBSZXF1ZXN0V3JhcHBlciBhbmQgQFdlYkZhdWx0IEJlYW5zIGZvciB1bmlxdWUgY2xhc3NOYW1lIGFuZCBmYXVsdEJlYW4gYXR0cmlidXRlcwotSEFORExFUkNIQUlOX1JVTEVTPUBIYW5kbGVyQ2hhaW4gYW5kIEBTT0FQTWVzc2FnZUhhbmRsZXJzIGFubm90YXRpb25zIGNhbm5vdCBjb2V4aXN0LiBASGFuZGxlckNoYWluIGFsbG93ZWQgb24gVFlQRSBvbmx5Ci1XRUJTRVJWSUNFUkVGU19SVUxFUz1FYWNoIEBXZWJTZXJ2aWNlUmVmIGFubm90YXRpb24gaW5zaWRlIGEgQFdlYlNlcnZpY2VSZWZzIG11c3QgY29udGFpbiBuYW1lIGFuZCB0eXBlIGVsZW1lbnRzIHdpdGggbm9uLWRlZmF1bHQgdmFsdWVzCi1XRUJTRVJWSUNFX1RBUkdFVF9OQU1FU1BBQ0VfUlVMRT1DbGFzc2VzIG9yIEludGVyZmFjZXMgaW4gdGhlIGRlZmF1bHQgcGFja2FnZSB0aGF0IGFyZSBhbm5vdGF0ZWQgd2l0aCBAamF2YXguandzLldlYlNlcnZpY2UgbXVzdCBzcGVjaWZ5IGEgdGFyZ2V0IG5hbWVzcGFjZQotV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX1JVTEU9VGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gYmVhbiBtdXN0IHJlbWFpbiBjb25zaXN0ZW50IHdpdGggdGhlIHBvcnRUeXBlIGFuZCBiaW5kaW5ncyBkZWNsYXJlZCBpbiB0aGlzIFdTREwgcmVmZXJlbmNlZCBpbiB0aGUgQFdlYlNlcnZpY2Uud3NkbExvY2F0aW9uIGF0dHJpYnV0ZQotV0VCU0VSVklDRVBST1ZJREVSX1JVTEVTPUEgUHJvdmlkZXIgYmFzZWQgc2VydmljZSBlbmRwb2ludCBpbXBsZW1lbnRhdGlvbiBtdXN0IGltcGxlbWVudCBhIHR5cGVkIFByb3ZpZGVyIGludGVyZmFjZSBhbmQgcHJvdmlkZSBhIHB1YmxpYyBkZWZhdWx0IGNvbnN0cnVjdG9yCi1XRUJTRVJWSUNFX01FVEhPRF9QQVJBTUVURVJTX1JFVFVSTl9UWVBFX1JVTEU9VmFsaWRhdGVzIE1ldGhvZCBQYXJhbWV0ZXJzIGFuZCBSZXR1cm4gVHlwZXMKLVdFQlNFUlZJQ0VfRUpCX1NUQVRFTEVTU19TRVNTSU9OPUBXZWJTZXJ2aWNlIG1heSBvbmx5IGJlIGFkZGVkIHRvIHN0YXRlbGVzcyBzZXNzaW9uIGJlYW5zIGluIGFuIEVKQiBtb2R1bGUKLUpBWFdTX0NBVEVHT1JZX05BTUU9SkFYLVdTCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZmExMzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkNhdGVnb3J5Ij4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgaWQ9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgbmFtZT0iJUpBWFdTX0NBVEVHT1JZX05BTUUiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uRGVmaW5pdGlvbiI+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4Lmp3cy5XZWJTZXJ2aWNlIgotICAgICAgICAgICAgbmFtZT0iV2ViU2VydmljZSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4Lmp3cy5XZWJNZXRob2QiCi0gICAgICAgICAgICBuYW1lPSJXZWJNZXRob2QiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC5qd3MuV2ViUGFyYW0iCi0gICAgICAgICAgICBuYW1lPSJXZWJQYXJhbSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4Lmp3cy5XZWJSZXN1bHQiCi0gICAgICAgICAgICBuYW1lPSJXZWJSZXN1bHQiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC5qd3MuSGFuZGxlckNoYWluIgotICAgICAgICAgICAgbmFtZT0iSGFuZGxlckNoYWluIj4KLSAgICAgICAgIDx0YXJnZXRGaWx0ZXIgdGFyZ2V0PSJGSUVMRCIvPgotICAgICAgICAgPHRhcmdldEZpbHRlciB0YXJnZXQ9Ik1FVEhPRCIvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC5qd3MuT25ld2F5IgotICAgICAgICAgICAgbmFtZT0iT25ld2F5Ij4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4d3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXguandzLnNvYXAuU09BUEJpbmRpbmciCi0gICAgICAgICAgICBuYW1lPSJTT0FQQmluZGluZyI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXIiCi0gICAgICAgICAgICBuYW1lPSJXZWJTZXJ2aWNlUHJvdmlkZXIiCi0gICAgICAgICAgICByZXN0cmljdGVkVG89IkNMQVNTX09OTFkiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudCIKLSAgICAgICAgICAgIG5hbWU9IldlYlNlcnZpY2VDbGllbnQiCi0gICAgICAgICAgICByZXN0cmljdGVkVG89IkNMQVNTX09OTFkiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwud3MuV2ViU2VydmljZVJlZiIKLSAgICAgICAgICAgIG5hbWU9IldlYlNlcnZpY2VSZWYiCi0gICAgICAgICAgICByZXN0cmljdGVkVG89IkNMQVNTX09OTFkiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwud3MuV2ViU2VydmljZVJlZnMiCi0gICAgICAgICAgICBuYW1lPSJXZWJTZXJ2aWNlUmVmcyIKLSAgICAgICAgICAgIHJlc3RyaWN0ZWRUbz0iQ0xBU1NfT05MWSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC53cy5TZXJ2aWNlTW9kZSIKLSAgICAgICAgICAgIG5hbWU9IlNlcnZpY2VNb2RlIgotICAgICAgICAgICAgcmVzdHJpY3RlZFRvPSJDTEFTU19PTkxZIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4d3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLndzLldlYkZhdWx0IgotICAgICAgICAgICAgbmFtZT0iV2ViRmF1bHQiCi0gICAgICAgICAgICByZXN0cmljdGVkVG89IkNMQVNTX09OTFkiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwud3MuQmluZGluZ1R5cGUiCi0gICAgICAgICAgICBuYW1lPSJCaW5kaW5nVHlwZSIKLSAgICAgICAgICAgIHJlc3RyaWN0ZWRUbz0iQ0xBU1NfT05MWSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC53cy5SZXF1ZXN0V3JhcHBlciIKLSAgICAgICAgICAgIG5hbWU9IlJlcXVlc3RXcmFwcGVyIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4d3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLndzLlJlc3BvbnNlV3JhcHBlciIKLSAgICAgICAgICAgIG5hbWU9IlJlc3BvbnNlV3JhcHBlciI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC53cy5XZWJFbmRwb2ludCIKLSAgICAgICAgICAgIG5hbWU9IldlYkVuZHBvaW50IgotICAgICAgICAgICAgcmVzdHJpY3RlZFRvPSJDTEFTU19PTkxZIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4d3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLndzLlJlc3BlY3RCaW5kaW5nIgotICAgICAgICAgICAgbmFtZT0iUmVzcGVjdEJpbmRpbmciCi0gICAgICAgICAgICByZXN0cmljdGVkVG89IkNMQVNTX09OTFkiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwud3Muc29hcC5BZGRyZXNzaW5nIgotICAgICAgICAgICAgbmFtZT0iQWRkcmVzc2luZyIKLSAgICAgICAgICAgIHJlc3RyaWN0ZWRUbz0iQ0xBU1NfT05MWSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC53cy5zb2FwLk1UT00iCi0gICAgICAgICAgICBuYW1lPSJNVE9NIgotICAgICAgICAgICAgcmVzdHJpY3RlZFRvPSJDTEFTU19PTkxZIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4d3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLndzLkZhdWx0QWN0aW9uIgotICAgICAgICAgICAgbmFtZT0iRmF1bHRBY3Rpb24iPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwud3MuQWN0aW9uIgotICAgICAgICAgICAgbmFtZT0iQWN0aW9uIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4d3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLndzLnNwaS5XZWJTZXJ2aWNlRmVhdHVyZUFubm90YXRpb24iCi0gICAgICAgICAgICBuYW1lPSJXZWJTZXJ2aWNlRmVhdHVyZUFubm90YXRpb24iPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25Qcm9jZXNzb3IiPgotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLldlYlNlcnZpY2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5Ib2xkZXJUeXBlUGFyYW1ldGVyc1J1bGUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJUhPTERFUl9UWVBFU19QQVJBTUVURVJTX1JVTEUKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3Byb2Nlc3Nvcj4KLSAgICAgIDxwcm9jZXNzb3IKLSAgICAgICAgICAgIGFubm90YXRpb249ImphdmF4Lmp3cy5XZWJTZXJ2aWNlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb24uVW5pcXVlTmFtZXNSdWxlIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVVTklRVUVfTkFNRVNfUlVMRQotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvcHJvY2Vzc29yPgotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLldlYlNlcnZpY2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5XZWJTZXJ2aWNlRGVmYXVsdFB1YmxpY0NvbnN0cnVjdG9yUnVsZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlV0VCU0VSVklDRV9DTEFTU19ERUZBVUxUX1BVQkxJQ19DT05TVFJVQ1RPUl9SVUxFCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9wcm9jZXNzb3I+Ci0gICAgICA8cHJvY2Vzc29yCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC5qd3MuV2ViU2VydmljZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uLldlYlNlcnZpY2VQdWJsaWNBYnN0cmFjdEZpbmFsUnVsZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlV0VCU0VSVklDRV9DTEFTU19QVUJMSUNfQUJTVFJBQ1RfRklOQUxfUlVMRQotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvcHJvY2Vzc29yPgotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLldlYlNlcnZpY2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5XZWJTZXJ2aWNlTm9GaW5hbGl6ZU1ldGhvZFJ1bGUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJVdFQlNFUlZJQ0VfQ0xBU1NfTk9fRklOQUxJWkVfTUVUSE9EX1JVTEUKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3Byb2Nlc3Nvcj4KLSAgICAgIDxwcm9jZXNzb3IKLSAgICAgICAgICAgIGFubm90YXRpb249ImphdmF4Lmp3cy5XZWJTZXJ2aWNlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb24uV2ViU2VydmljZVNFSVJlc3RyaWN0aW9uc1J1bGUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJVdFQlNFUlZJQ0VfU0VJX05PX1dFQk1FVEhPU19SVUxFCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9wcm9jZXNzb3I+Ci0gICAgICA8cHJvY2Vzc29yCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC5qd3MuV2ViU2VydmljZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uLldlYlNlcnZpY2VTRUlBbGxvd2VkQXR0cmlidXRlc1J1bGUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJVdFQlNFUlZJQ0VfT05fU0VJX0FUVFJJQlVURVNfUlVMRQotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvcHJvY2Vzc29yPgotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLldlYlNlcnZpY2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5XZWJTZXJ2aWNlV2ViU2VydmljZVByb3ZpZGVyQ29FeGlzdFJ1bGUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgCSVXRUJTRVJWSUNFX1dFQlNFUlZJQ0VfUFJPVklERVJfQ09FWElTVF9SVUxFCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9wcm9jZXNzb3I+Ci0gICAgICA8cHJvY2Vzc29yCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC5qd3MuV2ViTWV0aG9kIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb24uV2ViTWV0aG9kQ2hlY2tGb3JXZWJTZXJ2aWNlUnVsZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlV0VCTUVUSE9EX09OTFlfU1VQUE9SVEVEX09OX0NMQVNTRVNfV0lUSF9XRUJTRVJWSUNFX0FOTk5PVEFUSU9OCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9wcm9jZXNzb3I+Ci0gICAgICA8cHJvY2Vzc29yCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC5qd3MuV2ViTWV0aG9kIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb24uV2ViTWV0aG9kUHVibGljU3RhdGljRmluYWxSdWxlIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVXRUJNRVRIT0RfT05MWV9QVUJMSUNfTUVUSE9EUwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvcHJvY2Vzc29yPgotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLldlYk1ldGhvZCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uLldlYk1ldGhvZEV4Y2x1ZGVSdWxlcyI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlV0VCTUVUSE9EX0VYQ0xVREVfU1BFQ0lGSUVEX1JVTEUKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3Byb2Nlc3Nvcj4KLSAgICAgIDxwcm9jZXNzb3IKLSAgICAgICAgICAgIGFubm90YXRpb249ImphdmF4Lmp3cy5PbmV3YXkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5PbmV3YXlSdWxlcyI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlT05FV0FZX05PX1JFVFVSTl9WQUxVRQotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvcHJvY2Vzc29yPgotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLnNvYXAuU09BUEJpbmRpbmciCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5TT0FQQmluZGluZ1J1bGVzIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVTT0FQQklORElOR19SVUxFUwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvcHJvY2Vzc29yPgotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLnNvYXAuU09BUEJpbmRpbmciCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5TT0FQQmluZGluZ0RvY3VtZW50QmFyZVJ1bGVzIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVTT0FQQklORElOR19ET0NVTUVOVF9CQVJFX1JVTEVTCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9wcm9jZXNzb3I+Ci0gICAgICA8cHJvY2Vzc29yCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC5qd3MuSGFuZGxlckNoYWluIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb24uSGFuZGxlckNoYWluUnVsZXMiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJUhBTkRMRVJDSEFJTl9SVUxFUwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvcHJvY2Vzc29yPiAgICAgCi0gICAgICA8cHJvY2Vzc29yCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC54bWwud3MuV2ViU2VydmljZVJlZnMiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5XZWJTZXJ2aWNlUmVmc1J1bGVzIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVXRUJTRVJWSUNFUkVGU19SVUxFUwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvcHJvY2Vzc29yPgotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLldlYlNlcnZpY2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5XZWJTZXJ2aWNlVGFyZ2V0TmFtZXNwYWNlUnVsZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlV0VCU0VSVklDRV9UQVJHRVRfTkFNRVNQQUNFX1JVTEUKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3Byb2Nlc3Nvcj4gICAgIAotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLldlYlNlcnZpY2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5XZWJTZXJ2aWNlV1NETExvY2F0aW9uUnVsZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX1JVTEUKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3Byb2Nlc3Nvcj4KLSAgICAgIDxwcm9jZXNzb3IKLSAgICAgICAgICAgIGFubm90YXRpb249ImphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXIiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5XZWJTZXJ2aWNlUHJvdmlkZXJSdWxlcyI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlV0VCU0VSVklDRVBST1ZJREVSX1JVTEVTCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9wcm9jZXNzb3I+Ci0gICAgICA8cHJvY2Vzc29yCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC5qd3MuV2ViU2VydmljZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uLldlYlNlcnZpY2VQYXJhbWV0ZXJzUmV0dXJuVHlwZXNSdWxlIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVXRUJTRVJWSUNFX01FVEhPRF9QQVJBTUVURVJTX1JFVFVSTl9UWVBFX1JVTEUKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3Byb2Nlc3Nvcj4gICAgIAotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLldlYlNlcnZpY2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5XZWJTZXJ2aWNlRUpCTW9kdWxlUnVsZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlV0VCU0VSVklDRV9FSkJfU1RBVEVMRVNTX1NFU1NJT04KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3Byb2Nlc3Nvcj4gICAgIAotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvSkFYV1NDb3JlTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL0pBWFdTQ29yZU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNDc3MmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvSkFYV1NDb3JlTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgSkFYV1NDb3JlTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9Ci0gICAgICAgICJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFRZUEVfTkFNRV9ESUZGRVJFTlRfQ0FTRV9FWElTVFM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVFlQRV9XSVRIX05BTUVfQUxSRUFEWV9FWElTVFM7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBPTkVXQVlfTk9fUkVUVVJOX1ZBTFVFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE9ORVdBWV9OT19DSEVDS0VEX0VYQ0VQVElPTlM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgT05FV0FZX05PX0hPTERFUl9QQVJBTUVURVJTOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlBBUkFNX01PREVfT1VUX0lOT1VUX0hPTERFUl9UWVBFOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSE9MREVSX1RZUEVfTVVTVF9CRV9PVVRfSU5PVVQ7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBET0NfQkFSRV9OT05fVk9JRF9SRVRVUk5fTk9fSU5PVVRfT1VUX1BBUkFNRVRFUjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBET0NfQkFSRV9PTkxZX09ORV9OT05fSEVBREVSX0lOX1BBUkFNRVRFUjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBET0NfQkFSRV9WT0lEX1JFVFVSTl9PTkVfSU5fUEFSQU1FVEVSOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERPQ19CQVJFX1ZPSURfUkVUVVJOX09ORV9PVVRfUEFSQU1FVEVSOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSEFORExFUl9DSEFJTl9TT0FQX01FU1NBR0VfSEFORExFUlM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSEFORExFUl9DSEFJTl9PTl9GSUVMRDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBIQU5ETEVSX0NIQUlOX09OX01FVEhPRDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VSRUZTX05BTUVfUkVRVUlSRUQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRVJFRlNfVFlQRV9SRVFVSVJFRDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlBBUkFNX05BTUVfUkVRVUlSRURfV0hFTl9ET0NfQkFSRV9PVVRfSU5PVVQ7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJNRVRIT0RfT05MWV9TVVBQT1JURURfT05fQ0xBU1NFU19XSVRIX1dFQlNFUlZJQ0U7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCTUVUSE9EX09OTFlfT05fUFVCTElDX01FVEhPRFM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCTUVUSE9EX05PX0ZJTkFMX01PRElGSUVSX0FMTE9XRUQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCTUVUSE9EX05PX1NUQVRJQ19NT0RJRklFUl9BTExPV0VEOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQk1FVEhPRF9FWENMVURFX1NQRUNJRklFRF9OT19PVEhFUl9BVFRSSUJVVEVTX0FMTE9XRUQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCTUVUSE9EX0VYQ0xVREVfTk9UX0FMTE9XRURfT05fU0VJOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9QVUJMSUNfQUJTVFJBQ1RfRklOQUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9ERUZBVUxUX1BVQkxJQ19DT05TVFJVQ1RPUjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX0NMQVNTX09SX0lOVEVSRkFDRV9PTkxZOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfT1ZFUlJJREVfRklOQUxJWkU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9FTkRQT0lOVElOVEVSRkFDRV9TRUk7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9QT1JUTkFNRV9TRUk7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9TRVJWSUNFTkFNRV9TRUk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTVVTVF9JTVBMRU1FTlQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX1JFRFVDRURfVklTSUJJTElUWTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfSU5DT01QQVRJQkxFX1JFVFVSTl9UWVBFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9JTkNPTVBBVElCTEVfRVhDRVBUSU9OUzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9UX0lOVEVSRkFDRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9UX0ZPVU5EOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfQU5OT1RBVEVEOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfUFVCTElDOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19XRUJNRVRIT0RTOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfT1VURVI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX05BTUVfQVRUUklCVVRFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19TT0FQQklORElORzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fV0VCUkVTVUxUOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19XRUJQQVJBTTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fT05FV0FZOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9XRUJTRVJWSUNFUFJPVklERVJfQ09NQklOQVRJT047Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX0RFRkFVTFRfUEFDS0FHRV9UQVJHRVRfTkFNRVNQQUNFOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX1VOQUJMRV9UT19MT0NBVEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX05PX1BPUlRfTkFNRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX1dTRExfTE9DQVRJT05fTk9fU0VSVklDRV9OQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfV1NETF9MT0NBVElPTl9OT19PUEVSVEFUSU9OX05BTUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX1dTRExfT1BFUkFUSU9OX09VVFBVVF9NRVRIT0RfT05FV0FZOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfV1NETF9MT0NBVElPTl9TT0FQX0JJTkRJTkdfU1RZTEU7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTT0FQQklORElOR19OT19SUENfU1RZTEVfT05fTUVUSE9EUzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTT0FQQklORElOR19SUENfRU5DT0RFRF9OT1RfU1VQUE9SVEVEOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNPQVBCSU5ESU5HX0RPQ1VNRU5UX0VOQ09ERURfTk9UX1NVUFBPUlRFRDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTT0FQQklORElOR19OT19NSVhFRF9CSU5ESU5HUzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTT0FQQklORElOR19SUENfTk9fQkFSRV9QQVJBTUVURVJfU1RZTEU7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFUFJPVklERVJfREVGQVVMVF9QVUJMSUNfQ09OU1RSVUNUT1I7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRVBST1ZJREVSX0lNUExFTUVOVF9UWVBFRF9QUk9WSURFUl9JTlRFUkZBQ0U7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRVBST1ZJREVSX1NPQVBNRVNTQUdFX1NPQVBCSU5ESU5HOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VQUk9WSURFUl9TT0FQTUVTU0FHRV9NRVNTQUdFX01PREU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRVBST1ZJREVSX0RBVEFTT1VSQ0VfSFRUUEJJTkRJTkc7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRVBST1ZJREVSX0RBVEFTT1VSQ0VfTUVTU0FHRV9NT0RFOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgT1BFUkFUSU9OX05BTUVTX01VU1RfQkVfVU5JUVVFX0VSUk9SOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdSQVBQRVJfRkFVTFRfQkVBTl9OQU1FU19NVVNUX0JFX1VOSVFVRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBET0NfQkFSRV9NRVRIT0RTX1VOSVFVRV9YTUxfRUxFTUVOVFM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTE9DQUxfTkFNRV9BVFRSSUJVVEVTX01VU1RfQkVfVU5JUVVFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElOVkFMSURfTkNOQU1FX0FUVFJJQlVURTsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFBBUkFNRVRFUl9OQU1FX0NMQVNIOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEdFTkVSQVRFRF9QQVJBTUVURVJfTkFNRV9DTEFTSDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElOVEVSRkFDRVNfTk9UX1NVUFBPUlRFRDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBIQVNfSU5BRE1JU1NJQkxFX0lOTkVSX1RZUEVTOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElTX1JFTU9URV9PQkpFQ1Q7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQUJTVFJBQ1RfQ0xBU1NfTk9UX0lNUExFTUVOVEVEOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElOSEVSSVRBTkNFX0FORF9JTVBMRU1FTlRBVElPTjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBJTVBMRU1FTlRTX01VTFRJUExFX0lOVEVSRkFDRVM7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJQQVJBTV9OQU1FX1JFRFVOREFOVDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX09OTFlfT05fU1RBVEVMRVNTX1NFU1NJT05fQkVBTlM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVEFSR0VUX05BTUVTUEFDRV9VUklfU1lOVEFYX0VSUk9SOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRU1QVFlfQVRUUklCVVRFX1ZBTFVFOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIC8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0gICAgICAgIE5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEpBWFdTQ29yZU1lc3NhZ2VzLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEpBWFdTQ29yZU1lc3NhZ2VzKCkgewotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9KQVhXU0NvcmVNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvSkFYV1NDb3JlTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QwZmYyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9KQVhXU0NvcmVNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSNKRFRVdGlscwotVFlQRV9OQU1FX0RJRkZFUkVOVF9DQVNFX0VYSVNUUz1BIFR5cGUgd2l0aCB0aGUgc2FtZSBuYW1lIGJ1dCBkaWZmZXJlbnQgY2FzZSBhbHJlYWR5IGV4aXN0cwotVFlQRV9XSVRIX05BTUVfQUxSRUFEWV9FWElTVFM9QSBjb21waWxhdGlvbiB1bml0IG5hbWVkICcnezB9JycgYWxyZWFkeSBleGlzdHMgaW4gcGFja2FnZSAnJ3sxfScnCi0KLVdFQlNFUlZJQ0VfREVGQVVMVF9QVUJMSUNfQ09OU1RSVUNUT1I9Q2xhc3NlcyBhbm5vdGF0ZWQgd2l0aCBAV2ViU2VydmljZSBtdXN0IGhhdmUgYSBkZWZhdWx0IHB1YmxpYyBjb25zdHJ1Y3RvcgotV0VCU0VSVklDRV9DTEFTU19PUl9JTlRFUkZBQ0VfT05MWT1AV2ViU2VydmljZSBtYXkgb25seSBiZSBhZGRlZCB0byBhIGNsYXNzIG9yIGludGVyZmFjZQotV0VCU0VSVklDRV9QVUJMSUNfQUJTVFJBQ1RfRklOQUw9Q2xhc3NlcyBhbm5vdGF0ZWQgd2l0aCBAV2ViU2VydmljZSBtdXN0IGJlIGFuIG91dGVyIHB1YmxpYyBjbGFzcywgbXVzdCBub3QgYmUgZmluYWwsIGFuZCBtdXN0IG5vdCBiZSBhYnN0cmFjdAotV0VCU0VSVklDRV9PVkVSUklERV9GSU5BTElaRT1DbGFzc2VzIGFubm90YXRlZCB3aXRoIEBXZWJTZXJ2aWNlIG11c3Qgbm90IGRlZmluZSBhIGZpbmFsaXplKCkgbWV0aG9kCi1XRUJNRVRIT0RfT05MWV9TVVBQT1JURURfT05fQ0xBU1NFU19XSVRIX1dFQlNFUlZJQ0U9QFdlYk1ldGhvZCBpcyBvbmx5IHN1cHBvcnRlZCBvbiBjbGFzc2VzIGFubm90YXRlZCB3aXRoIEBXZWJTZXJ2aWNlCi1XRUJNRVRIT0RfT05MWV9PTl9QVUJMSUNfTUVUSE9EUz1AV2ViTWV0aG9kIGFubm90YXRpb24gaXMgbm90IGFsbG93ZWQgb24gbm9uLXB1YmxpYyBtZXRob2RzCi1XRUJNRVRIT0RfTk9fRklOQUxfTU9ESUZJRVJfQUxMT1dFRD1AV2ViTWV0aG9kIGFubm90YXRpb24gaXMgbm90IGFsbG93ZWQgb24gZmluYWwgbWV0aG9kcwotV0VCTUVUSE9EX05PX1NUQVRJQ19NT0RJRklFUl9BTExPV0VEPUBXZWJNZXRob2QgYW5ub3RhdGlvbiBpcyBub3QgYWxsb3dlZCBvbiBzdGF0aWMgbWV0aG9kcwotV0VCTUVUSE9EX0VYQ0xVREVfU1BFQ0lGSUVEX05PX09USEVSX0FUVFJJQlVURVNfQUxMT1dFRD1AV2ViTWV0aG9kIGV4Y2x1ZGUgYXR0cmlidXRlIGlzIHNwZWNpZmllZC4gTm8gb3RoZXIgYXR0cmlidXRlcyBhbGxvd2VkCi1XRUJNRVRIT0RfRVhDTFVERV9OT1RfQUxMT1dFRF9PTl9TRUk9QFdlYk1ldGhvZCBhbm5vdGF0aW9ucyBpbiBTRUkncyBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSB0aGUgZXhjbHVkZSBhdHRyaWJ1dGUKLVdFQlNFUlZJQ0VfU0VSVklDRU5BTUVfU0VJPUBXZWJTZXJ2aWNlIHNlcnZpY2VOYW1lIGVsZW1lbnQgaXMgbm90IGFsbG93ZWQgb24gU0VJCi1XRUJTRVJWSUNFX0VORFBPSU5USU5URVJGQUNFX1NFST1AV2ViU2VydmljZSBlbmRwb2ludEludGVyZmFjZSBlbGVtZW50IGlzIG5vdCBhbGxvd2VkIG9uIFNFSQotV0VCU0VSVklDRV9QT1JUTkFNRV9TRUk9QFdlYlNlcnZpY2UgcG9ydE5hbWUgZWxlbWVudCBpcyBub3QgYWxsb3dlZCBvbiBTRUkKLVdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9NVVNUX0lNUExFTUVOVD1JbXBsZW1lbnRhdGlvbiBjbGFzcyBtdXN0IGltcGxlbWVudCB0aGUgU0VJIG1ldGhvZCAnJ3swfScnCi1XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfUkVEVUNFRF9WSVNJQklMSVRZPUNhbm5vdCByZWR1Y2UgdGhlIHZpc2liaWxpdHkgb2YgdGhlIFNFSSBtZXRob2QKLVdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9JTkNPTVBBVElCTEVfUkVUVVJOX1RZUEU9VGhlIHJldHVybiB0eXBlIGlzIGluY29tcGF0aWJsZSB3aXRoIHswfQotV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PVF9JTlRFUkZBQ0U9VGhlIGVuZHBvaW50SW50ZXJmYWNlICcnezB9JycgbXVzdCBiZSBhbiBJbnRlcmZhY2UKLVdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfRk9VTkQ9VGhlIGVuZHBvaW50SW50ZXJmYWNlICcnezB9JycgY2Fubm90IGJlIGZvdW5kCi1XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9UX0FOTk9UQVRFRD1UaGUgZW5kcG9pbnRJbnRlcmZhY2UgJyd7MH0nJyBtdXN0IGJlIGFubm90YXRlZCB3aXRoIEBqYXZheC5qd3MuV2ViU2VydmljZQotV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PVF9QVUJMSUM9VGhlIGVuZHBvaW50SW50ZXJmYWNlICcnezB9JycgbXVzdCBiZSBwdWJsaWMKLVdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfT1VURVI9VGhlIGVuZHBvaW50SW50ZXJmYWNlICcnezB9JycgbXVzdCBiZSBhbiBvdXRlciBpbnRlcmZhY2UKLVdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19OQU1FX0FUVFJJQlVURT1AV2ViU2VydmljZSBhbm5vdGF0aW9uIGNvbnRhaW5zIGFuIGVuZHBvaW50SW50ZXJmYWNlIGF0dHJpYnV0ZS4gTm8gbmFtZSBhdHRyaWJ1dGUgYWxsb3dlZAotV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX1dFQk1FVEhPRFM9QFdlYlNlcnZpY2UgYW5ub3RhdGlvbiBjb250YWlucyBhbiBlbmRwb2ludEludGVyZmFjZSBhdHRyaWJ1dGUuIE5vIG1ldGhvZHMgYW5ub3RhdGVkIHdpdGggQFdlYk1ldGhvZCBhbGxvd2VkIGluIGltcGxlbWVudGF0aW9uIGNsYXNzCi1XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fU09BUEJJTkRJTkc9QFdlYlNlcnZpY2UgYW5ub3RhdGlvbiBjb250YWlucyBhbiBlbmRwb2ludEludGVyZmFjZSBhdHRyaWJ1dGUuIEBTT0FQQmluZGluZyBub3QgYWxsb3dlZCBpbiBpbXBsZW1lbnRhdGlvbiBjbGFzcwotV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX1dFQlJFU1VMVD1AV2ViU2VydmljZSBhbm5vdGF0aW9uIGNvbnRhaW5zIGFuIGVuZHBvaW50SW50ZXJmYWNlIGF0dHJpYnV0ZS4gTm8gbWV0aG9kcyBhbm5vdGF0ZWQgd2l0aCBAV2ViUmVzdWx0IGFsbG93ZWQgaW4gaW1wbGVtZW50YXRpb24gY2xhc3MKLVdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19XRUJQQVJBTT1AV2ViU2VydmljZSBhbm5vdGF0aW9uIGNvbnRhaW5zIGFuIGVuZHBvaW50SW50ZXJmYWNlIGF0dHJpYnV0ZS4gTm8gcGFyYW1ldGVycyBhbm5vdGF0ZWQgd2l0aCBAV2ViUGFyYW0gYWxsb3dlZCBpbiBpbXBsZW1lbnRhdGlvbiBjbGFzcwotV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX09ORVdBWT1AV2ViU2VydmljZSBhbm5vdGF0aW9uIGNvbnRhaW5zIGFuIGVuZHBvaW50SW50ZXJmYWNlIGF0dHJpYnV0ZS4gTm8gbWV0aG9kcyBhbm5vdGF0ZWQgd2l0aCBAT25ld2F5IGFsbG93ZWQgaW4gaW1wbGVtZW50YXRpb24gY2xhc3MKLVdFQlNFUlZJQ0VfV0VCU0VSVklDRVBST1ZJREVSX0NPTUJJTkFUSU9OPUBXZWJTZXJ2aWNlIGFuZCBAV2ViU2VydmljZVByb3ZpZGVyIGFubm90YXRpb25zIGNhbm5vdCBiZSBjb21iaW5lZAotV0VCU0VSVklDRV9ERUZBVUxUX1BBQ0tBR0VfVEFSR0VUX05BTUVTUEFDRT1DbGFzc2VzIG9yIEludGVyZmFjZXMgaW4gdGhlIGRlZmF1bHQgcGFja2FnZSB0aGF0IGFyZSBhbm5vdGF0ZWQgd2l0aCBAV2ViU2VydmljZSBtdXN0IHNwZWNpZnkgYSB0YXJnZXROYW1lc3BhY2UgYXR0cmlidXRlCi1PTkVXQVlfTk9fUkVUVVJOX1ZBTFVFPUBPbmV3YXkgbWV0aG9kcyBtdXN0IG5vdCByZXR1cm4gYSB2YWx1ZQotT05FV0FZX05PX0NIRUNLRURfRVhDRVBUSU9OUz1AT25ld2F5IG1ldGhvZHMgbXVzdCBub3QgZGVjbGFyZSBhbnkgY2hlY2tlZCBleGNlcHRpb25zCi1PTkVXQVlfTk9fSE9MREVSX1BBUkFNRVRFUlM9QE9uZXdheSBtZXRob2RzIG11c3Qgbm90IGFjY2VwdCBhbnkgamF2YXgueG1sLndzLkhvbGRlcjxUPiBwYXJhbWV0ZXJzLiAKLVdFQlBBUkFNX01PREVfT1VUX0lOT1VUX0hPTERFUl9UWVBFPVRoZSBAV2ViUGFyYW0uTW9kZS5PVVQgYW5kIEBXZWJQYXJhbS5Nb2RlLklOT1VUIG1vZGVzIG1heSBvbmx5IGJlIHNwZWNpZmllZCBmb3IgamF2YXgueG1sLndzLkhvbGRlcjxUPiBwYXJhbWV0ZXJzCi1IT0xERVJfVFlQRV9NVVNUX0JFX09VVF9JTk9VVD1qYXZheC54bWwud3MuSG9sZGVyPFQ+IHBhcmFtZXRlcnMgbXVzdCBiZSBAV2ViUGFyYW0uTW9kZS5PVVQgb3IgQFdlYlBhcmFtLk1vZGUuSU5PVVQKLVNPQVBCSU5ESU5HX05PX1JQQ19TVFlMRV9PTl9NRVRIT0RTPVJQQyBzdHlsZSBAU09BUEJpbmRpbmcgYW5ub3RhdGlvbnMgbm90IHN1cHBvcnRlZCBvbiBtZXRob2RzCi1TT0FQQklORElOR19SUENfRU5DT0RFRF9OT1RfU1VQUE9SVEVEPVJQQyBFbmNvZGVkIFNPQVAgQmluZGluZ3Mgbm90IHN1cHBvcnRlZAotU09BUEJJTkRJTkdfRE9DVU1FTlRfRU5DT0RFRF9OT1RfU1VQUE9SVEVEPURvY3VtZW50IEVuY29kZWQgU09BUCBCaW5kaW5ncyBub3Qgc3VwcG9ydGVkCi1TT0FQQklORElOR19OT19NSVhFRF9CSU5ESU5HUz1NaXhlZCBSUEMgYW5kIERvY3VtZW50IHN0eWxlIG9wZXJhdGlvbnMgbm90IHBlcm1pdHRlZCBpbiB0aGUgc2FtZSBzZXJ2aWNlCi1TT0FQQklORElOR19SUENfTk9fQkFSRV9QQVJBTUVURVJfU1RZTEU9VXNlIG9mIFJQQyBzdHlsZSByZXF1aXJlcyB1c2Ugb2YgV1JBUFBFRCBwYXJhbWV0ZXIgc3R5bGUKLURPQ19CQVJFX09OTFlfT05FX05PTl9IRUFERVJfSU5fUEFSQU1FVEVSPURvY3VtZW50IGxpdGVyYWwgYmFyZSBtZXRob2RzIG1heSBoYXZlIG9ubHkgb25lIG5vbi1oZWFkZXIgSU4gcGFyYW1ldGVyCi1ET0NfQkFSRV9OT05fVk9JRF9SRVRVUk5fTk9fSU5PVVRfT1VUX1BBUkFNRVRFUj1Eb2N1bWVudCBsaXRlcmFsIGJhcmUgbWV0aG9kcyB0aGF0IGRlY2xhcmUgYSBub24tdm9pZCByZXR1cm4gdmFsdWUgbWF5IG5vdCBoYXZlIGFueSBPVVQgb3IgSU5PVVQgcGFyYW1ldGVycwotRE9DX0JBUkVfVk9JRF9SRVRVUk5fT05FX0lOX1BBUkFNRVRFUj1Eb2N1bWVudCBsaXRlcmFsIGJhcmUgbWV0aG9kcyB0aGF0IGRlY2xhcmUgYSB2b2lkIHJldHVybiB2YWx1ZSBtYXkgaGF2ZSBvbmx5IG9uZSBJTi9JTk9VVCBwYXJhbWV0ZXIKLURPQ19CQVJFX1ZPSURfUkVUVVJOX09ORV9PVVRfUEFSQU1FVEVSPURvY3VtZW50IGxpdGVyYWwgYmFyZSBtZXRob2RzIHRoYXQgZGVjbGFyZSBhIHZvaWQgcmV0dXJuIHZhbHVlIG1heSBoYXZlIG9ubHkgb25lIE9VVC9JTk9VVCBwYXJhbWV0ZXIKLVdFQlBBUkFNX05BTUVfUkVRVUlSRURfV0hFTl9ET0NfQkFSRV9PVVRfSU5PVVQ9VGhlIEBXZWJQYXJhbSBuYW1lIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCB3aGVuIHRoZSBvcGVyYXRpb24gaXMgRG9jdW1lbnQgQmFyZSBhbmQgdGhlIG1vZGUgaXMgT1VUIG9yIElOT1VUCi1PUEVSQVRJT05fTkFNRVNfTVVTVF9CRV9VTklRVUVfRVJST1I9T3BlcmF0aW9uIG5hbWVzIG11c3QgYmUgdW5pcXVlIDogJyd7MH0nJwotV1JBUFBFUl9GQVVMVF9CRUFOX05BTUVTX01VU1RfQkVfVU5JUVVFPUdlbmVyYXRlZCBSZXF1ZXN0L1Jlc3BvbnNlIGFuZCBGYXVsdCBiZWFuIGNsYXNzZXMgbXVzdCBoYXZlIHVuaXF1ZSBuYW1lcyB3aXRoaW4gYSBwYWNrYWdlIGFuZCBtdXN0IG5vdCBjbGFzaCB3aXRoIG90aGVyIGNsYXNzZXMgaW4gdGhhdCBwYWNrYWdlIDogJyd7MH0nJwotRE9DX0JBUkVfTUVUSE9EU19VTklRVUVfWE1MX0VMRU1FTlRTPURvY3VtZW50IExpdGVyYWwgQmFyZSBvcGVyYXRpb25zIG11c3QgaGF2ZSB1bmlxdWUgWE1MIGVsZW1lbnRzIGZvciB0aGUgaW5wdXQgYW5kIG91dHB1dCBtZXNzYWdlcyBhY3Jvc3MgYWxsIG9wZXJhdGlvbnMgb24gdGhlIFdlYiBTZXJ2aWNlIDogJyd7MH0nJwotTE9DQUxfTkFNRV9BVFRSSUJVVEVTX01VU1RfQkVfVU5JUVVFPVRoZSB3cmFwcGVyIGJlYW4gbG9jYWxOYW1lIGF0dHJpYnV0ZXMgbXVzdCBiZSB1bmlxdWUgOiAnJ3swfScnCi1JTlZBTElEX05DTkFNRV9BVFRSSUJVVEU9VGhlIEB7MH0gezF9IGF0dHJpYnV0ZSB2YWx1ZSAnJ3syfScnIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycwotV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX1VOQUJMRV9UT19MT0NBVEU9VW5hYmxlIHRvIGxvY2F0ZSB3c2RsIGF0IHdzZGxMb2NhdGlvbjogJyd7MH0nJwotV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX05PX1BPUlRfTkFNRT1ObyB3c2RsOnBvcnQgbWF0Y2hpbmcgdGhlIHBvcnROYW1lICcnezB9JycgY2FuIGJlIGZvdW5kIGluIHRoZSBXU0RMICcnezF9JycKLVdFQlNFUlZJQ0VfV1NETF9MT0NBVElPTl9OT19TRVJWSUNFX05BTUU9Tm8gd3NkbDpzZXJ2aWNlIG1hdGNoaW5nIHRoZSBzZXJ2aWNlTmFtZSAnJ3swfScnIGNhbiBiZSBmb3VuZCBpbiB0aGUgV1NETCAnJ3sxfScnCi1XRUJTRVJWSUNFX1dTRExfTE9DQVRJT05fTk9fT1BFUlRBVElPTl9OQU1FPU5vIEBXZWJNZXRob2QgbWF0Y2hpbmcgdGhlIHdzZGw6b3BlcmF0aW9uICcnezB9JycgY2FuIGJlIGZvdW5kCi1XRUJTRVJWSUNFX1dTRExfTE9DQVRJT05fV1NETF9PUEVSQVRJT05fT1VUUFVUX01FVEhPRF9PTkVXQVk9VGhlIE1ldGhvZCAnJ3swfScnIGlzIGFubm90YXRlZCBAT25ld2F5IGJ1dCB0aGUgd3NkbDpvcGVyYXRpb24gJyd7MH0nJyBzcGVjaWZpZXMgYSB3c2RsOm91dHB1dCBlbGVtZW50Ci1XRUJTRVJWSUNFX1dTRExfTE9DQVRJT05fU09BUF9CSU5ESU5HX1NUWUxFPVRoZSB3c2RsICcnezB9Jycgc3BlY2lmaWVzIGEgJyd7MX0nJyBTT0FQIGJpbmRpbmcgc3R5bGUgd2hpY2ggZG9lcyBub3QgbWF0Y2ggdGhlICcnezJ9JycgU09BUCBiaW5kaW5nIHN0eWxlIG9mIHRoZSB3ZWIgc2VydmljZSBpbXBsZW1lbnRhdGlvbi9TRUkKLVBBUkFNRVRFUl9OQU1FX0NMQVNIPVBhcmFtZXRlciBuYW1lcyBtdXN0IGJlIHVuaXF1ZTogJyd7MH0nJwotR0VORVJBVEVEX1BBUkFNRVRFUl9OQU1FX0NMQVNIPVBhcmFtZXRlciBOYW1lICcnezB9Jycgd2lsbCBjbGFzaCB3aXRoIGEgZ2VuZXJhdGVkIHBhcmFtZXRlciBuYW1lCi1IQU5ETEVSX0NIQUlOX1NPQVBfTUVTU0FHRV9IQU5ETEVSUz1ASGFuZGxlckNoYWluIGFuZCBAU09BUE1lc3NhZ2VIYW5kbGVycyBjYW5ub3QgYmUgY29tYmluZWQKLUhBTkRMRVJfQ0hBSU5fT05fRklFTEQ9VGhlIEBIYW5kbGVyQ2hhaW4gYW5ub3RhdGlvbiBtYXkgb25seSBiZSBzcGVjaWZpZWQgb24gYSBUWVBFLiBUaGUgYW5ub3RhdGlvbiB0YXJnZXQgaW5jbHVkZXMgRklFTEQgZm9yIHVzZSBieSBKQVgtV1MgMi4wCi1IQU5ETEVSX0NIQUlOX09OX01FVEhPRD1UaGUgQEhhbmRsZXJDaGFpbiBhbm5vdGF0aW9uIG1heSBvbmx5IGJlIHNwZWNpZmllZCBvbiBhIFRZUEUuIFRoZSBhbm5vdGF0aW9uIHRhcmdldCBpbmNsdWRlcyBNRVRIT0QgZm9yIHVzZSBieSBKQVgtV1MgMi4wCi1XRUJTRVJWSUNFUkVGU19OQU1FX1JFUVVJUkVEPUVhY2ggQFdlYlNlcnZpY2VSZWYgYW5ub3RhdGlvbiBpbnNpZGUgYSBAV2ViU2VydmljZVJlZnMgbXVzdCBjb250YWluIGEgbmFtZSBlbGVtZW50IHdpdGggYSBub24tZGVmYXVsdCAoIiIpIHZhbHVlCi1XRUJTRVJWSUNFUkVGU19UWVBFX1JFUVVJUkVEPUVhY2ggQFdlYlNlcnZpY2VSZWYgYW5ub3RhdGlvbiBpbnNpZGUgYSBAV2ViU2VydmljZVJlZnMgbXVzdCBjb250YWluIGEgdHlwZSBlbGVtZW50IHdpdGggYSBub24tZGVmYXVsdCAoT2JqZWN0LmNsYXNzKSB2YWx1ZQotV0VCU0VSVklDRVBST1ZJREVSX0RFRkFVTFRfUFVCTElDX0NPTlNUUlVDVE9SPUNsYXNzZXMgYW5ub3RhdGVkIHdpdGggQFdlYlNlcnZpY2VQcm92aWRlciBtdXN0IGhhdmUgYSBkZWZhdWx0IHB1YmxpYyBjb25zdHJ1Y3RvcgotV0VCU0VSVklDRVBST1ZJREVSX0lNUExFTUVOVF9UWVBFRF9QUk9WSURFUl9JTlRFUkZBQ0U9QSBQcm92aWRlciBiYXNlZCBlbmRwb2ludCBpbXBsZW1lbnRhdGlvbiBtdXN0IGltcGxlbWVudCBhIHR5cGVkIGphdmF4LnhtbC53cy5Qcm92aWRlciBpbnRlcmZhY2UuIFByb3ZpZGVyIGltcGxlbWVudGF0aW9ucyB3b3JrIHdpdGggdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBvYmplY3RzOiBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZSwgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2UgYW5kIGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZQotV0VCU0VSVklDRVBST1ZJREVSX1NPQVBNRVNTQUdFX1NPQVBCSU5ESU5HPWphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlIG9iamVjdHMgcmVxdWlyZSB0aGUgUHJvdmlkZXIgaW1wbGVtZW50YXRpb24gdG8gdXNlIHRoZSBTT0FQIEJpbmRpbmcKLVdFQlNFUlZJQ0VQUk9WSURFUl9TT0FQTUVTU0FHRV9NRVNTQUdFX01PREU9amF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2Ugb2JqZWN0cyByZXF1aXJlIHRoZSBQcm92aWRlciBpbXBsZW1lbnRhdGlvbiB0byBzcGVjaWZ5IGEgQGphdmF4LnhtbC53cy5TZXJ2aWNlTW9kZSBhbm5vdGF0aW9uIHdpdGggamF2YXgueG1sLndzLlNlcnZpY2UuTW9kZS5NRVNTQUdFIGFzIHRoZSB2YWx1ZSAKLVdFQlNFUlZJQ0VQUk9WSURFUl9EQVRBU09VUkNFX0hUVFBCSU5ESU5HPWphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZSBkZXJpdmVkIG9iamVjdHMgcmVxdWlyZSB0aGUgUHJvdmlkZXIgaW1wbGVtZW50YXRpb24gdG8gdXNlIHRoZSBIVFRQIEJpbmRpbmcKLVdFQlNFUlZJQ0VQUk9WSURFUl9EQVRBU09VUkNFX01FU1NBR0VfTU9ERT1qYXZheC5hY3RpdmF0aW9uLkRhdGFTb3VyY2UgZGVyaXZlZCBvYmplY3RzIHJlcXVpcmUgdGhlIFByb3ZpZGVyIGltcGxlbWVudGF0aW9uIHRvIHNwZWNpZnkgYSBAamF2YXgueG1sLndzLlNlcnZpY2VNb2RlIGFubm90YXRpb24gd2l0aCBqYXZheC54bWwud3MuU2VydmljZS5Nb2RlLk1FU1NBR0UgYXMgdGhlIHZhbHVlCi1FTVBUWV9BVFRSSUJVVEVfVkFMVUU9VGhlIEB7MH0gezF9IGF0dHJpYnV0ZSBzaG91bGQgbm90IGJlIGVtcHR5Ci1XRUJQQVJBTV9OQU1FX1JFRFVOREFOVD1OYW1lIGF0dHJpYnV0ZSBpcyBub3QgdXNlZCBpZiBTT0FQQmluZGluZy5TdHlsZSBpcyBSUEMgYW5kIHBhcnROYW1lIGlzIHByZXNlbnQKLVdFQlNFUlZJQ0VfT05MWV9PTl9TVEFURUxFU1NfU0VTU0lPTl9CRUFOUz1AV2ViU2VydmljZSBhbm5vdGF0aW9uIGluIEVKQiBtb2R1bGVzIGNhbiBiZSBvbmx5IHVzZWQgb24gc3RhdGVsZXNzIHNlc3Npb24gYmVhbnMKLVdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9JTkNPTVBBVElCTEVfRVhDRVBUSU9OUz1NZXRob2QgezB9IGRlY2xhcmVzIGV4Y2VwdGlvbnMgdGhhdCBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgezB9IG1ldGhvZCBpbiB0aGUgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UgezF9Ci1JTlRFUkZBQ0VTX05PVF9TVVBQT1JURUQ9ezB9IGlzIGFuIGludGVyZmFjZSBhbmQgbWF5IG5vdCBiZSB1c2VkIGFzIGEgcmV0dXJuIHR5cGUgb3IgbWV0aG9kIHBhcmFtZXRlciBhcyBKQVhCIGNhbm5vdCBoYW5kbGUgaW50ZXJmYWNlcwotSEFTX0lOQURNSVNTSUJMRV9JTk5FUl9UWVBFUz1DbGFzcyB7MH0gbWF5IG5vdCBiZSB1c2VkIGFzIGEgcmV0dXJuIHR5cGUgb3IgbWV0aG9kIHBhcmFtZXRlciBhcyBpdCBoYXMgaW5uZXIgdHlwZXMgdGhhdCBhcmUgbm90IHB1YmxpYyBhbmQgc3RhdGljCi1JU19SRU1PVEVfT0JKRUNUPUNsYXNzIHswfSBpcyBhIHJlbW90ZSBPYmplY3QgYW5kIG1heSBub3QgdXNlZCBhcyBhIG1ldGhvZCByZXR1cm4gdHlwZSBvciBwYXJhbWV0ZXIKLUFCU1RSQUNUX0NMQVNTX05PVF9JTVBMRU1FTlRFRD1BYnN0cmFjdCBjbGFzcyB7MH0gY2Fubm90IGJlIHVzZWQgYXMgYSBydW50aW1lIGNsYXNzIGJlY2F1c2UgaXQgaXMgbm90IGV4dGVuZGVkIGJ5IGEgbm9uIGFic3RyYWN0IGNsYXNzIHdoaWNoIGlzIHN1aXRhYmxlIGFzIGEgcnVudGltZSBjbGFzcwotSU5IRVJJVEFOQ0VfQU5EX0lNUExFTUVOVEFUSU9OPUNsYXNzIHswfSBleHRlbmRzIHsxfSBhbmQgaW1wbGVtZW50cyBpbnRlcmZhY2UgezJ9IChtdWx0aXBsZSBpbmhlcml0YW5jZSBpcyBub3QgYWxsb3dlZCkKLUlNUExFTUVOVFNfTVVMVElQTEVfSU5URVJGQUNFUz1DbGFzcyB7MH0gaW1wbGVtZW50cyBtdWx0aXBsZSBpbnRlcmZhY2VzIChtdWx0aXBsZSBpbmhlcml0YW5jZSBpcyBub3QgYWxsb3dlZCkKLVRBUkdFVF9OQU1FU1BBQ0VfVVJJX1NZTlRBWF9FUlJPUj1VUkkgc3ludGF4IGVycm9yIGF0IGluZGV4IHswfSBvZiBpbnB1dCBTdHJpbmcgJyd7MX0nJy4gUmVhc29uOiB7Mn0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL0pBWFdTQ29yZVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvSkFYV1NDb3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMTI3ZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvSkFYV1NDb3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBKQVhXU0NvcmVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZSI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0gICAgcHJpdmF0ZSBzdGF0aWMgSkFYV1NDb3JlUGx1Z2luIHBsdWdpbjsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIEpBWFdTQ29yZVBsdWdpbiBnZXREZWZhdWx0KCkgewotICAgICAgcmV0dXJuIHBsdWdpbjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0gICAgICAgIHBsdWdpbiA9IHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBwbHVnaW4gPSBudWxsOwotICAgICAgICBzdXBlci5zdG9wKGNvbnRleHQpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2cobmV3IFN0YXR1cyhzZXZlcml0eSwgSkFYV1NDb3JlUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSBleGNlcHRpb24pIHsKLSAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpBWFdTQ29yZVBsdWdpbi5QTFVHSU5fSUQsIGV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIC5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGV4Y2VwdGlvbikpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vSGFuZGxlckNoYWluUnVsZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vSGFuZGxlckNoYWluUnVsZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcxZmU4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL0hhbmRsZXJDaGFpblJ1bGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247DQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuSGFuZGxlckNoYWluOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOw0KLQ0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yOw0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOw0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5EZWNsYXJhdGlvbjsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uRmllbGREZWNsYXJhdGlvbjsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb247DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlR5cGVEZWNsYXJhdGlvbjsNCi0NCi1wdWJsaWMgY2xhc3MgSGFuZGxlckNoYWluUnVsZXMgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3Igew0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgcHJvY2VzcygpIHsNCi0gICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvbkRlY2xhcmF0aW9uID0gKEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pIGVudmlyb25tZW50DQotICAgICAgICAgICAgICAgIC5nZXRUeXBlRGVjbGFyYXRpb24oSGFuZGxlckNoYWluLmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBDb2xsZWN0aW9uPERlY2xhcmF0aW9uPiBhbm5vdGF0ZWRUeXBlcyA9IGVudmlyb25tZW50DQotICAgICAgICAgICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKGFubm90YXRpb25EZWNsYXJhdGlvbik7DQotDQotICAgICAgICBmb3IgKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uIDogYW5ub3RhdGVkVHlwZXMpIHsNCi0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsNCi0gICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikNCi0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciBhbm5vdGF0aW9uTWlycm9yID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgamF2YXguandzLnNvYXAuU09BUE1lc3NhZ2VIYW5kbGVycy5jbGFzcyk7DQotICAgICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uTWlycm9yICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKGFubm90YXRpb25NaXJyb3IuZ2V0UG9zaXRpb24oKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuSEFORExFUl9DSEFJTl9TT0FQX01FU1NBR0VfSEFORExFUlMpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24pIHsNCi0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciBhbm5vdGF0aW9uTWlycm9yID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgamF2YXguandzLkhhbmRsZXJDaGFpbi5jbGFzcyk7DQotICAgICAgICAgICAgICAgIHByaW50RXJyb3IoYW5ub3RhdGlvbk1pcnJvci5nZXRQb3NpdGlvbigpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLkhBTkRMRVJfQ0hBSU5fT05fRklFTEQpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikgew0KLSAgICAgICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBqYXZheC5qd3MuSGFuZGxlckNoYWluLmNsYXNzKTsNCi0NCi0gICAgICAgICAgICAgICAgcHJpbnRFcnJvcihhbm5vdGF0aW9uTWlycm9yLmdldFBvc2l0aW9uKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuSEFORExFUl9DSEFJTl9PTl9NRVRIT0QpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL0hvbGRlclR5cGVQYXJhbWV0ZXJzUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9Ib2xkZXJUeXBlUGFyYW1ldGVyc1J1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM4ZWQyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL0hvbGRlclR5cGVQYXJhbWV0ZXJzUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5NT0RFOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvbk1pcnJvcjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1ldGhvZERlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlBhcmFtZXRlckRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci50eXBlLlR5cGVNaXJyb3I7Ci0KLXB1YmxpYyBjbGFzcyBIb2xkZXJUeXBlUGFyYW1ldGVyc1J1bGUgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IgewotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoKSB7Ci0gICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvbkRlY2xhcmF0aW9uID0gKEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pIGVudmlyb25tZW50Ci0gICAgICAgICAgICAgICAgLmdldFR5cGVEZWNsYXJhdGlvbihXZWJTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKGFubm90YXRpb25EZWNsYXJhdGlvbik7Ci0KLSAgICAgICAgZm9yIChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA6IGFubm90YXRlZFR5cGVzKSB7Ci0gICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgIHZhbGlkYXRlUGFyYW1ldGVycygoVHlwZURlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVBhcmFtZXRlcnMoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbikgewotICAgICAgICBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2REZWNsYXJhdGlvbj4gbWV0aG9kcyA9IHR5cGVEZWNsYXJhdGlvbi5nZXRNZXRob2RzKCk7Ci0gICAgICAgIGZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gOiBtZXRob2RzKSB7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uPFBhcmFtZXRlckRlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzID0gbWV0aG9kRGVjbGFyYXRpb24uZ2V0UGFyYW1ldGVycygpOwotICAgICAgICAgICAgZm9yIChQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbWV0ZXIgOiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgVHlwZU1pcnJvciB0eXBlTWlycm9yID0gZW52aXJvbm1lbnQuZ2V0VHlwZVV0aWxzKCkuZ2V0RXJhc3VyZShwYXJhbWV0ZXIuZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzSG9sZGVyUGFyYW1ldGVyID0gdHlwZU1pcnJvci50b1N0cmluZygpLmVxdWFscyhIb2xkZXIuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAoaXNXZWJQYXJhbU91dElub3V0TW9kZShwYXJhbWV0ZXIpICYmICFpc0hvbGRlclBhcmFtZXRlcikgewotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKHBhcmFtZXRlci5nZXRQb3NpdGlvbigpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCUEFSQU1fTU9ERV9PVVRfSU5PVVRfSE9MREVSX1RZUEUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNIb2xkZXJQYXJhbWV0ZXIgJiYgaXNXZWJQYXJhbUluTW9kZShwYXJhbWV0ZXIpKXsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcihwYXJhbWV0ZXIuZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5IT0xERVJfVFlQRV9NVVNUX0JFX09VVF9JTk9VVCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc1dlYlBhcmFtSW5Nb2RlKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlcikgewotICAgICAgICBTdHJpbmcgbW9kZSA9IGdldE1vZGUocGFyYW1ldGVyKTsKLSAgICAgICAgaWYgKG1vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1vZGUuZXF1YWxzKFdlYlBhcmFtLk1vZGUuSU4udG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1dlYlBhcmFtT3V0SW5vdXRNb2RlKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlcikgewotICAgICAgICBTdHJpbmcgbW9kZSA9IGdldE1vZGUocGFyYW1ldGVyKTsKLSAgICAgICAgaWYgKG1vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1vZGUuZXF1YWxzKFdlYlBhcmFtLk1vZGUuT1VULm5hbWUoKSkgfHwgbW9kZS5lcXVhbHMoV2ViUGFyYW0uTW9kZS5JTk9VVC5uYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRNb2RlKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlcikgewotICAgICAgICBBbm5vdGF0aW9uTWlycm9yIHdlYlBhcmFtID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24ocGFyYW1ldGVyLCBXZWJQYXJhbS5jbGFzcyk7Ci0gICAgICAgIGlmICh3ZWJQYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKHdlYlBhcmFtLCBNT0RFKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vT25ld2F5UnVsZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vT25ld2F5UnVsZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QwNjQyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL09uZXdheVJ1bGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqYXZheC5qd3MuT25ld2F5OwotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25NaXJyb3I7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5EZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5QYXJhbWV0ZXJEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci50eXBlLlR5cGVNaXJyb3I7Ci0KLXB1YmxpYyBjbGFzcyBPbmV3YXlSdWxlcyBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvciB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKCkgewotICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAuZ2V0VHlwZURlY2xhcmF0aW9uKE9uZXdheS5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIENvbGxlY3Rpb248RGVjbGFyYXRpb24+IGFubm90YXRlZFR5cGVzID0gZW52aXJvbm1lbnQKLSAgICAgICAgLmdldERlY2xhcmF0aW9uc0Fubm90YXRlZFdpdGgoYW5ub3RhdGlvbkRlY2xhcmF0aW9uKTsKLQotICAgICAgICBmb3IgKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uIDogYW5ub3RhdGVkVHlwZXMpIHsKLSAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoTWV0aG9kRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uOwotICAgICAgICAgICAgICAgIGlmICghbWV0aG9kRGVjbGFyYXRpb24uZ2V0UmV0dXJuVHlwZSgpLmVxdWFscyhlbnZpcm9ubWVudC5nZXRUeXBlVXRpbHMoKS5nZXRWb2lkVHlwZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIG9uZXdheSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKG1ldGhvZERlY2xhcmF0aW9uLCBPbmV3YXkuY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKG9uZXdheS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5PTkVXQVlfTk9fUkVUVVJOX1ZBTFVFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1ldGhvZERlY2xhcmF0aW9uLmdldFRocm93blR5cGVzKCkuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIG9uZXdheSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKG1ldGhvZERlY2xhcmF0aW9uLCBPbmV3YXkuY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKG9uZXdheS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5PTkVXQVlfTk9fQ0hFQ0tFRF9FWENFUFRJT05TKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2hlY2tQYXJhbWV0ZXJzKG1ldGhvZERlY2xhcmF0aW9uLCBhbm5vdGF0aW9uRGVjbGFyYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrUGFyYW1ldGVycyhNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiwKLSAgICAgICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvbkRlY2xhcmF0aW9uKSB7Ci0gICAgICAgIENvbGxlY3Rpb248UGFyYW1ldGVyRGVjbGFyYXRpb24+IHBhcmFtZXRlcnMgPSBtZXRob2REZWNsYXJhdGlvbi5nZXRQYXJhbWV0ZXJzKCk7Ci0gICAgICAgIGZvciAoUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyIDogcGFyYW1ldGVycykgewotICAgICAgICAgICAgVHlwZU1pcnJvciB0eXBlTWlycm9yID0gZW52aXJvbm1lbnQuZ2V0VHlwZVV0aWxzKCkuZ2V0RXJhc3VyZShwYXJhbWV0ZXIuZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgIGlmICh0eXBlTWlycm9yLnRvU3RyaW5nKCkuZXF1YWxzKEhvbGRlci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciBvbmV3YXkgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihtZXRob2REZWNsYXJhdGlvbiwgT25ld2F5LmNsYXNzKTsKLSAgICAgICAgICAgICAgICBwcmludEVycm9yKG9uZXdheS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5PTkVXQVlfTk9fSE9MREVSX1BBUkFNRVRFUlMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9TT0FQQmluZGluZ0RvY3VtZW50QmFyZVJ1bGVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1NPQVBCaW5kaW5nRG9jdW1lbnRCYXJlUnVsZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVmY2NiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1NPQVBCaW5kaW5nRG9jdW1lbnRCYXJlUnVsZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLkhFQURFUjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5NT0RFOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqYXZheC5qd3MuT25ld2F5OwotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW0uTW9kZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlsczsKLQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25NaXJyb3I7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5EZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5QYXJhbWV0ZXJEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IudHlwZS5UeXBlTWlycm9yOwotCi1wdWJsaWMgY2xhc3MgU09BUEJpbmRpbmdEb2N1bWVudEJhcmVSdWxlcyBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvciB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKCkgewotICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAuZ2V0VHlwZURlY2xhcmF0aW9uKFNPQVBCaW5kaW5nLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKGFubm90YXRpb25EZWNsYXJhdGlvbik7Ci0KLSAgICAgICAgZm9yIChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA6IGFubm90YXRlZFR5cGVzKSB7Ci0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gKFR5cGVEZWNsYXJhdGlvbikgZGVjbGFyYXRpb247Ci0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxBbm5vdGF0aW9uTWlycm9yPiBhbm5vdGF0aW9uTWlycm9ycyA9IHR5cGVEZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTWlycm9ycygpOwotICAgICAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbk1pcnJvciBtaXJyb3IgOiBhbm5vdGF0aW9uTWlycm9ycykgewotICAgICAgICAgICAgICAgICAgICBpZiAobWlycm9yLmdldEFubm90YXRpb25UeXBlKCkuZ2V0RGVjbGFyYXRpb24oKS5lcXVhbHMoYW5ub3RhdGlvbkRlY2xhcmF0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEpBWFdTVXRpbHMuaXNEb2N1bWVudEJhcmUobWlycm9yKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2REZWNsYXJhdGlvbnMgPSB0eXBlRGVjbGFyYXRpb24uZ2V0TWV0aG9kcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gOiBtZXRob2REZWNsYXJhdGlvbnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc01ldGhvZChtZXRob2REZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gKE1ldGhvZERlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbjsKLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPEFubm90YXRpb25NaXJyb3I+IGFubm90YXRpb25NaXJyb3JzID0gbWV0aG9kRGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk1pcnJvcnMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKEFubm90YXRpb25NaXJyb3IgbWlycm9yIDogYW5ub3RhdGlvbk1pcnJvcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1pcnJvci5nZXRBbm5vdGF0aW9uVHlwZSgpLmdldERlY2xhcmF0aW9uKCkuZXF1YWxzKGFubm90YXRpb25EZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChKQVhXU1V0aWxzLmlzRG9jdW1lbnRCYXJlKG1pcnJvcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTWV0aG9kKG1ldGhvZERlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NNZXRob2QoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgQ29sbGVjdGlvbjxQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gcGFyYW1ldGVycyA9IG1ldGhvZERlY2xhcmF0aW9uLmdldFBhcmFtZXRlcnMoKTsKLQotICAgICAgICAvL0BPbmV3YXkgb3BlcmF0aW9ucwotICAgICAgICBpZiAoaXNPbmV3YXkobWV0aG9kRGVjbGFyYXRpb24pICYmICFpc1NpbmdsZU5vbkhlYWRlcklOUGFyYW1ldGVyKHBhcmFtZXRlcnMpKSB7Ci0gICAgICAgICAgICBwcmludEVycm9yKG1ldGhvZERlY2xhcmF0aW9uLmdldFBvc2l0aW9uKCksCi0gICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuRE9DX0JBUkVfT05MWV9PTkVfTk9OX0hFQURFUl9JTl9QQVJBTUVURVIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGlzVm9pZFJldHVyblR5cGUobWV0aG9kRGVjbGFyYXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvdW50SU5QYXJhbWV0ZXJzKHBhcmFtZXRlcnMpID4gMSkgewotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKG1ldGhvZERlY2xhcmF0aW9uLmdldFBvc2l0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuRE9DX0JBUkVfVk9JRF9SRVRVUk5fT05FX0lOX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChjb3VudE9VVFBhcmFtZXRlcnMocGFyYW1ldGVycykgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3IobWV0aG9kRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5ET0NfQkFSRV9WT0lEX1JFVFVSTl9PTkVfT1VUX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoY291bnRJTlBhcmFtZXRlcnMocGFyYW1ldGVycykgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3IobWV0aG9kRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLkRPQ19CQVJFX09OTFlfT05FX05PTl9IRUFERVJfSU5fUEFSQU1FVEVSKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNvdW50T1VUUGFyYW1ldGVycyhwYXJhbWV0ZXJzKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcihtZXRob2REZWNsYXJhdGlvbi5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuRE9DX0JBUkVfTk9OX1ZPSURfUkVUVVJOX05PX0lOT1VUX09VVF9QQVJBTUVURVIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vY2hlY2sgZm9yIEBXZWJQYXJhbS5uYW1lIGF0dHJpYnV0ZSB3aGVuIEBXZWJQYXJhbS5Nb2RlID0gT1VUIG9yIElOT1VUCi0vLyAgICAgICAgZm9yKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlckRlY2xhcmF0aW9uIDogcGFyYW1ldGVycykgewotLy8gICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihwYXJhbWV0ZXJEZWNsYXJhdGlvbiwgV2ViUGFyYW0uY2xhc3MpOwotLy8gICAgICAgICAgICBpZiAoYW5ub3RhdGlvbk1pcnJvciAhPSBudWxsKSB7Ci0vLyAgICAgICAgICAgICAgICBTdHJpbmcgbW9kZSA9IGdldFdlYlBhcmFtTW9kZShhbm5vdGF0aW9uTWlycm9yLCBwYXJhbWV0ZXJEZWNsYXJhdGlvbik7Ci0vLyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShhbm5vdGF0aW9uTWlycm9yLCBOQU1FKTsKLS8vCi0vLyAgICAgICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsICYmIChtb2RlLmVxdWFscyhNb2RlLk9VVC5uYW1lKCkpIHx8IG1vZGUuZXF1YWxzKE1vZGUuSU5PVVQubmFtZSgpKSkpIHsKLS8vICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKGFubm90YXRpb25NaXJyb3IuZ2V0UG9zaXRpb24oKSwKLS8vICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJQQVJBTV9OQU1FX1JFUVVJUkVEX1dIRU5fRE9DX0JBUkVfT1VUX0lOT1VUKTsKLS8vICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgfQotLy8gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNPbmV3YXkoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgQW5ub3RhdGlvbk1pcnJvciBvbmV3YXkgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihtZXRob2REZWNsYXJhdGlvbiwgT25ld2F5LmNsYXNzKTsKLSAgICAgICAgaWYgKG9uZXdheSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVm9pZFJldHVyblR5cGUoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgcmV0dXJuIG1ldGhvZERlY2xhcmF0aW9uLmdldFJldHVyblR5cGUoKS5lcXVhbHMoZW52aXJvbm1lbnQuZ2V0VHlwZVV0aWxzKCkuZ2V0Vm9pZFR5cGUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU2luZ2xlTm9uSGVhZGVySU5QYXJhbWV0ZXIoQ29sbGVjdGlvbjxQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gcGFyYW1ldGVycykgewotICAgICAgICByZXR1cm4gY291bnROb25IZWFkZXJJTlBhcmFtZXRlcnMocGFyYW1ldGVycykgPD0gMTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBjb3VudE5vbkhlYWRlcklOUGFyYW1ldGVycyhDb2xsZWN0aW9uPFBhcmFtZXRlckRlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgIGludCBpbk5vbkhlYWRlclBhcmFtZXRlcnMgPSAwOwotICAgICAgICBmb3IgKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlckRlY2xhcmF0aW9uIDogcGFyYW1ldGVycykgewotICAgICAgICAgICAgaWYgKGlzTm9uSGVhZGVySU5QYXJhbWV0ZXIocGFyYW1ldGVyRGVjbGFyYXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgaW5Ob25IZWFkZXJQYXJhbWV0ZXJzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGluTm9uSGVhZGVyUGFyYW1ldGVyczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNOb25IZWFkZXJJTlBhcmFtZXRlcihQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbWV0ZXJEZWNsYXJhdGlvbikgewotICAgICAgICBBbm5vdGF0aW9uTWlycm9yIHdlYlBhcmFtID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24ocGFyYW1ldGVyRGVjbGFyYXRpb24sIFdlYlBhcmFtLmNsYXNzKTsKLSAgICAgICAgaWYgKHdlYlBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRXZWJQYXJhbU1vZGUod2ViUGFyYW0sIHBhcmFtZXRlckRlY2xhcmF0aW9uKS5lcXVhbHMoTW9kZS5JTi5uYW1lKCkpCi0gICAgICAgICAgICAgICYmICFpc0hlYWRlcih3ZWJQYXJhbSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ2V0RGVmYXVsdFdlYlBhcmFtTW9kZShwYXJhbWV0ZXJEZWNsYXJhdGlvbikuZXF1YWxzKE1vZGUuSU4ubmFtZSgpKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgY291bnRJTlBhcmFtZXRlcnMoQ29sbGVjdGlvbjxQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gcGFyYW1ldGVycykgewotICAgICAgICBpbnQgaW5Ob25IZWFkZXJQYXJhbWV0ZXJzID0gMDsKLSAgICAgICAgZm9yIChQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbWV0ZXJEZWNsYXJhdGlvbiA6IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgIGlmIChpc0lOUGFyYW1ldGVyKHBhcmFtZXRlckRlY2xhcmF0aW9uKSkgewotICAgICAgICAgICAgICAgIGluTm9uSGVhZGVyUGFyYW1ldGVycysrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbk5vbkhlYWRlclBhcmFtZXRlcnM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSU5QYXJhbWV0ZXIoUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyRGVjbGFyYXRpb24pIHsKLSAgICAgICAgQW5ub3RhdGlvbk1pcnJvciB3ZWJQYXJhbSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHBhcmFtZXRlckRlY2xhcmF0aW9uLCBXZWJQYXJhbS5jbGFzcyk7Ci0gICAgICAgIGlmICh3ZWJQYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbW9kZSA9IGdldFdlYlBhcmFtTW9kZSh3ZWJQYXJhbSwgcGFyYW1ldGVyRGVjbGFyYXRpb24pOwotICAgICAgICAgICAgcmV0dXJuIChtb2RlLmVxdWFscyhNb2RlLklOLm5hbWUoKSkgfHwgbW9kZS5lcXVhbHMoTW9kZS5JTk9VVC5uYW1lKCkpKQotICAgICAgICAgICAgICAgICAgICAmJiAhaXNIZWFkZXIod2ViUGFyYW0pOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGRlZmF1bHRNb2RlID0gZ2V0RGVmYXVsdFdlYlBhcmFtTW9kZShwYXJhbWV0ZXJEZWNsYXJhdGlvbik7Ci0gICAgICAgIGlmIChkZWZhdWx0TW9kZS5lcXVhbHMoTW9kZS5JTi5uYW1lKCkpIHx8IGRlZmF1bHRNb2RlLmVxdWFscyhNb2RlLklOT1VULm5hbWUoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGNvdW50T1VUUGFyYW1ldGVycyhDb2xsZWN0aW9uPFBhcmFtZXRlckRlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgIGludCBvdXROb25IZWFkZXJQYXJhbWV0ZXJzID0gMDsKLSAgICAgICAgZm9yIChQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbWV0ZXJEZWNsYXJhdGlvbiA6IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgIGlmIChpc09VVFBhcmFtZXRlcihwYXJhbWV0ZXJEZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgICAgICBvdXROb25IZWFkZXJQYXJhbWV0ZXJzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG91dE5vbkhlYWRlclBhcmFtZXRlcnM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzT1VUUGFyYW1ldGVyKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlckRlY2xhcmF0aW9uKSB7Ci0gICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViUGFyYW0gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihwYXJhbWV0ZXJEZWNsYXJhdGlvbiwgV2ViUGFyYW0uY2xhc3MpOwotICAgICAgICBpZiAod2ViUGFyYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIG1vZGUgPSBnZXRXZWJQYXJhbU1vZGUod2ViUGFyYW0sIHBhcmFtZXRlckRlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgIHJldHVybiAobW9kZS5lcXVhbHMoTW9kZS5PVVQubmFtZSgpKSB8fCBtb2RlLmVxdWFscyhNb2RlLklOT1VULm5hbWUoKSkpCi0gICAgICAgICAgICAgICAgICAgICYmICFpc0hlYWRlcih3ZWJQYXJhbSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ2V0RGVmYXVsdFdlYlBhcmFtTW9kZShwYXJhbWV0ZXJEZWNsYXJhdGlvbikuZXF1YWxzKE1vZGUuSU5PVVQubmFtZSgpKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSGVhZGVyKEFubm90YXRpb25NaXJyb3IgYW5ub3RhdGlvbk1pcnJvcikgewotICAgICAgICBCb29sZWFuIGhlYWRlciA9IEFubm90YXRpb25VdGlscy5nZXRCb29sZWFuVmFsdWUoYW5ub3RhdGlvbk1pcnJvciwgSEVBREVSKTsKLSAgICAgICAgaWYgKGhlYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgIHJldHVybiBoZWFkZXIuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFdlYlBhcmFtTW9kZShBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IsIFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlckRlY2xhcmF0aW9uKSB7Ci0gICAgICAgIFN0cmluZyBtb2RlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKGFubm90YXRpb25NaXJyb3IsIE1PREUpOwotICAgICAgICBpZiAobW9kZSA9PSBudWxsIHx8IG1vZGUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgbW9kZSA9IGdldERlZmF1bHRXZWJQYXJhbU1vZGUocGFyYW1ldGVyRGVjbGFyYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtb2RlOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRXZWJQYXJhbU1vZGUoUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyRGVjbGFyYXRpb24pIHsKLSAgICAgICAgVHlwZU1pcnJvciB0eXBlTWlycm9yID0gZW52aXJvbm1lbnQuZ2V0VHlwZVV0aWxzKCkuZ2V0RXJhc3VyZShwYXJhbWV0ZXJEZWNsYXJhdGlvbi5nZXRUeXBlKCkpOwotICAgICAgICBpZiAodHlwZU1pcnJvci50b1N0cmluZygpLmVxdWFscyhIb2xkZXIuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSkgewotICAgICAgICAgICAgcmV0dXJuIE1vZGUuSU5PVVQubmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNb2RlLklOLm5hbWUoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vU09BUEJpbmRpbmdSdWxlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9TT0FQQmluZGluZ1J1bGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZTRlNDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9TT0FQQmluZGluZ1J1bGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5IRUFERVI7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5QQVJBTUVURVJfU1RZTEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuUEFSVF9OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlNUWUxFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlVTRTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlVzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvbk1pcnJvcjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25WYWx1ZTsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5EZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5QYXJhbWV0ZXJEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5UeXBlRGVjbGFyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBTT0FQQmluZGluZ1J1bGVzIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoKSB7Ci0gICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gc29hcEJpbmRpbmdEZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAuZ2V0VHlwZURlY2xhcmF0aW9uKFNPQVBCaW5kaW5nLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudAotICAgICAgICAuZ2V0RGVjbGFyYXRpb25zQW5ub3RhdGVkV2l0aChzb2FwQmluZGluZ0RlY2xhcmF0aW9uKTsKLQotICAgICAgICBmb3IgKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uIDogYW5ub3RhdGVkVHlwZXMpIHsKLSAgICAgICAgICAgIGNoZWNrRm9yRW5jb2RlZFVzZShkZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gKFR5cGVEZWNsYXJhdGlvbikgZGVjbGFyYXRpb247Ci0gICAgICAgICAgICAgICAgY2hlY2tGb3JSUENCYXJlT25UeXBlRGVjbGFyYXRpb24odHlwZURlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgICAgICBjaGVja1JlZHVuZGFudFdlYlBhcmFtTmFtZUF0dHJpYnV0ZSh0eXBlRGVjbGFyYXRpb24pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIGNoZWNrRm9yUlBDU3R5bGVPbk1ldGhvZERlY2xhcmF0aW9uKChNZXRob2REZWNsYXJhdGlvbikgZGVjbGFyYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrRm9yUlBDQmFyZU9uVHlwZURlY2xhcmF0aW9uKFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgQW5ub3RhdGlvbk1pcnJvciBzb2FwQmluZGluZyA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHR5cGVEZWNsYXJhdGlvbiwgU09BUEJpbmRpbmcuY2xhc3MpOwotICAgICAgICBTdHJpbmcgc3R5bGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoc29hcEJpbmRpbmcsIFNUWUxFKTsKLSAgICAgICAgaWYgKHN0eWxlICE9IG51bGwgJiYgc3R5bGUuZXF1YWxzKFN0eWxlLlJQQy50b1N0cmluZygpKSkgewotICAgICAgICAgICAgU3RyaW5nIHBhcmFtZXRlclN0eWxlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKHNvYXBCaW5kaW5nLCBQQVJBTUVURVJfU1RZTEUpOwotICAgICAgICAgICAgaWYgKHBhcmFtZXRlclN0eWxlICE9IG51bGwgJiYgcGFyYW1ldGVyU3R5bGUuZXF1YWxzKFBhcmFtZXRlclN0eWxlLkJBUkUudG9TdHJpbmcoKSkpIHsKLSAgICAgICAgICAgICAgICBwcmludEVycm9yKHNvYXBCaW5kaW5nLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLlNPQVBCSU5ESU5HX1JQQ19OT19CQVJFX1BBUkFNRVRFUl9TVFlMRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBjaGVjayBmb3IgRG9jdW1lbnQgc3R5bGUgQFNPQVBCaW5kaW5nIG9uIG1ldGhvZHMKLSAgICAgICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2REZWNsYXJhdGlvbnMgPSB0eXBlRGVjbGFyYXRpb24uZ2V0TWV0aG9kcygpOwotICAgICAgICAgICAgZm9yIChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA6IG1ldGhvZERlY2xhcmF0aW9ucykgewotICAgICAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igc29hcEJpbmRpbmcyID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obWV0aG9kRGVjbGFyYXRpb24sIFNPQVBCaW5kaW5nLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBpZiAoc29hcEJpbmRpbmcyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN0eWxlMiA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShzb2FwQmluZGluZzIsIFNUWUxFKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlMiA9PSBudWxsIHx8IHN0eWxlMi5lcXVhbHMoU3R5bGUuRE9DVU1FTlQudG9TdHJpbmcoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3Ioc29hcEJpbmRpbmcyLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLlNPQVBCSU5ESU5HX05PX01JWEVEX0JJTkRJTkdTKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja0ZvckVuY29kZWRVc2UoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLSAgICAgICAgQW5ub3RhdGlvbk1pcnJvciBzb2FwQmluZGluZyA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBTT0FQQmluZGluZy5jbGFzcyk7Ci0gICAgICAgIFN0cmluZyB1c2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoc29hcEJpbmRpbmcsIFVTRSk7Ci0gICAgICAgIGlmICh1c2UgIT0gbnVsbCAmJiB1c2UuZXF1YWxzKFVzZS5FTkNPREVELnRvU3RyaW5nKCkpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgc3R5bGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoc29hcEJpbmRpbmcsIFNUWUxFKTsKLSAgICAgICAgICAgIGlmIChzdHlsZSA9PSBudWxsIHx8IHN0eWxlLmVxdWFscyhTdHlsZS5ET0NVTUVOVC50b1N0cmluZygpKSkgewotICAgICAgICAgICAgICAgIHByaW50RXJyb3Ioc29hcEJpbmRpbmcuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuU09BUEJJTkRJTkdfRE9DVU1FTlRfRU5DT0RFRF9OT1RfU1VQUE9SVEVEKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRFcnJvcihzb2FwQmluZGluZy5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5TT0FQQklORElOR19SUENfRU5DT0RFRF9OT1RfU1VQUE9SVEVEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja0ZvclJQQ1N0eWxlT25NZXRob2REZWNsYXJhdGlvbihNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICBBbm5vdGF0aW9uTWlycm9yIHNvYXBCaW5kaW5nID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obWV0aG9kRGVjbGFyYXRpb24sIFNPQVBCaW5kaW5nLmNsYXNzKTsKLSAgICAgICAgU3RyaW5nIHN0eWxlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKHNvYXBCaW5kaW5nLCBTVFlMRSk7Ci0gICAgICAgIGlmIChzdHlsZSAhPSBudWxsICYmIHN0eWxlLmVxdWFscyhTdHlsZS5SUEMudG9TdHJpbmcoKSkpIHsKLSAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKHNvYXBCaW5kaW5nLmdldFBvc2l0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLlNPQVBCSU5ESU5HX05PX1JQQ19TVFlMRV9PTl9NRVRIT0RTKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja1JlZHVuZGFudFdlYlBhcmFtTmFtZUF0dHJpYnV0ZShUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgIEFubm90YXRpb25NaXJyb3Igc29hcEJpbmRpbmcgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbih0eXBlRGVjbGFyYXRpb24sIFNPQVBCaW5kaW5nLmNsYXNzKTsKLSAgICAgICAgU3RyaW5nIHN0eWxlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKHNvYXBCaW5kaW5nLCBTVFlMRSk7Ci0gICAgICAgIGlmIChzdHlsZSAhPSBudWxsICYmIHN0eWxlLmVxdWFscyhTdHlsZS5SUEMudG9TdHJpbmcoKSkpIHsKLSAgICAgICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2RzID0gdHlwZURlY2xhcmF0aW9uLmdldE1ldGhvZHMoKTsKLSAgICAgICAgICAgIGZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gOiBtZXRob2RzKSB7Ci0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gcGFyYW1ldGVycyA9IG1ldGhvZERlY2xhcmF0aW9uLmdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlckRlY2xhcmF0aW9uIDogcGFyYW1ldGVycykgewotICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIHdlYlBhcmFtID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24ocGFyYW1ldGVyRGVjbGFyYXRpb24sIFdlYlBhcmFtLmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHdlYlBhcmFtICE9IG51bGwgJiYgIWlzSGVhZGVyKHdlYlBhcmFtKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIHBhcnROYW1lID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25WYWx1ZSh3ZWJQYXJhbSwgUEFSVF9OQU1FKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0TmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIG5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKHdlYlBhcmFtLCBOQU1FKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50V2FybmluZyhuYW1lLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlBBUkFNX05BTUVfUkVEVU5EQU5UKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNIZWFkZXIoQW5ub3RhdGlvbk1pcnJvciBhbm5vdGF0aW9uTWlycm9yKSB7Ci0gICAgICAgIEJvb2xlYW4gaGVhZGVyID0gQW5ub3RhdGlvblV0aWxzLmdldEJvb2xlYW5WYWx1ZShhbm5vdGF0aW9uTWlycm9yLCBIRUFERVIpOwotICAgICAgICBpZiAoaGVhZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBoZWFkZXIuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9VbmlxdWVOYW1lc1J1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vVW5pcXVlTmFtZXNSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYjNlNjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9VbmlxdWVOYW1lc1J1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLkNMQVNTX05BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuRkFVTFRfQkVBTjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5IRUFERVI7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuTE9DQUxfTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5NT0RFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLk5BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuT1BFUkFUSU9OX05BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuUEFSVF9OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlBPUlRfTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5SRVNQT05TRV9TVUZGSVg7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuU0VSVklDRV9OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlRBUkdFVF9OQU1FU1BBQ0U7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsKLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW0uTW9kZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYkZhdWx0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMudXRpbC5YTUxDaGFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblZhbHVlOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkNsYXNzRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uUGFyYW1ldGVyRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLnR5cGUuUmVmZXJlbmNlVHlwZTsKLWltcG9ydCBjb20uc3VuLm1pcnJvci50eXBlLlR5cGVNaXJyb3I7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IudXRpbC5Tb3VyY2VQb3NpdGlvbjsKLQotcHVibGljIGNsYXNzIFVuaXF1ZU5hbWVzUnVsZSBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgUGF0dGVybiBwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCJhcmdcXGQrKyIpOyAvLyROT04tTkxTLTEkCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKCkgewotICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIHdlYlNlcnZpY2VEZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAuZ2V0VHlwZURlY2xhcmF0aW9uKFdlYlNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICBDb2xsZWN0aW9uPERlY2xhcmF0aW9uPiBhbm5vdGF0ZWRUeXBlcyA9IGVudmlyb25tZW50Ci0gICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKHdlYlNlcnZpY2VEZWNsYXJhdGlvbik7Ci0KLQotICAgICAgICBmb3IgKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uIDogYW5ub3RhdGVkVHlwZXMpIHsKLSAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSAoVHlwZURlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbjsKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZU5hbWVBdHRyaWJ1dGVzKHR5cGVEZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgY2hlY2tPcGVyYXRpb25OYW1lcyh0eXBlRGVjbGFyYXRpb24uZ2V0TWV0aG9kcygpKTsKLSAgICAgICAgICAgICAgICBjaGVja1dyYXBwZXJBbmRGYXVsdEJlYW5OYW1lcyh0eXBlRGVjbGFyYXRpb24uZ2V0TWV0aG9kcygpKTsKLSAgICAgICAgICAgICAgICBjaGVja0RvY3VtZW50QmFyZU1ldGhvZHModHlwZURlY2xhcmF0aW9uLmdldE1ldGhvZHMoKSk7Ci0gICAgICAgICAgICAgICAgY2hlY2tNZXRob2RQYXJhbWV0ZXJzKHR5cGVEZWNsYXJhdGlvbi5nZXRNZXRob2RzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlTmFtZUF0dHJpYnV0ZXMoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbikgewotICAgICAgICBBbm5vdGF0aW9uTWlycm9yIHdlYlNlcnZpY2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbih0eXBlRGVjbGFyYXRpb24sIFdlYlNlcnZpY2UuY2xhc3MpOwotICAgICAgICBjaGVja0F0dHJpYnV0ZVZhbHVlKHdlYlNlcnZpY2UsIFdlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBOQU1FKTsKLSAgICAgICAgY2hlY2tBdHRyaWJ1dGVWYWx1ZSh3ZWJTZXJ2aWNlLCBXZWJTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgUE9SVF9OQU1FKTsKLSAgICAgICAgY2hlY2tBdHRyaWJ1dGVWYWx1ZSh3ZWJTZXJ2aWNlLCBXZWJTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgU0VSVklDRV9OQU1FKTsKLQotICAgICAgICBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2REZWNsYXJhdGlvbj4gbWV0aG9kcyA9IHR5cGVEZWNsYXJhdGlvbi5nZXRNZXRob2RzKCk7Ci0gICAgICAgIGZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gOiBtZXRob2RzKSB7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIHdlYk1ldGhvZCA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKG1ldGhvZERlY2xhcmF0aW9uLCBXZWJNZXRob2QuY2xhc3MpOwotICAgICAgICAgICAgY2hlY2tBdHRyaWJ1dGVWYWx1ZSh3ZWJNZXRob2QsIFdlYk1ldGhvZC5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIE9QRVJBVElPTl9OQU1FKTsKLQotICAgICAgICAgICAgQ29sbGVjdGlvbjxQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gcGFyYW1ldGVycyA9IG1ldGhvZERlY2xhcmF0aW9uLmdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgIGZvciAoUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyRGVjbGFyYXRpb24gOiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciB3ZWJQYXJhbSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHBhcmFtZXRlckRlY2xhcmF0aW9uLCBXZWJQYXJhbS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgY2hlY2tBdHRyaWJ1dGVWYWx1ZSh3ZWJQYXJhbSwgV2ViUGFyYW0uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBOQU1FKTsKLSAgICAgICAgICAgICAgICBjaGVja0F0dHJpYnV0ZVZhbHVlKHdlYlBhcmFtLCBXZWJQYXJhbS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIFBBUlRfTkFNRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tBdHRyaWJ1dGVWYWx1ZShBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLSAgICAgICAgaWYgKGFubm90YXRpb25NaXJyb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIGFubm90YXRpb25WYWx1ZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uVmFsdWUoYW5ub3RhdGlvbk1pcnJvciwgYXR0cmlidXRlTmFtZSk7Ci0gICAgICAgICAgICBpZiAoYW5ub3RhdGlvblZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoYW5ub3RhdGlvblZhbHVlLnRvU3RyaW5nKCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcihhbm5vdGF0aW9uVmFsdWUuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5FTVBUWV9BVFRSSUJVVEVfVkFMVUUsIG5ldyBPYmplY3RbXSB7IGFubm90YXRpb25OYW1lLCBhdHRyaWJ1dGVOYW1lIH0pKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFYTUxDaGFyLmlzVmFsaWROYW1lKGFubm90YXRpb25WYWx1ZS50b1N0cmluZygpKSkgewotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKGFubm90YXRpb25WYWx1ZS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLklOVkFMSURfTkNOQU1FX0FUVFJJQlVURSwgbmV3IE9iamVjdFtdIHsgYW5ub3RhdGlvbk5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lLCAgYW5ub3RhdGlvblZhbHVlLnRvU3RyaW5nKCkgfSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja09wZXJhdGlvbk5hbWVzKENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2RzKSB7Ci0gICAgICAgIE1hcDxEZWNsYXJhdGlvbiwgUU5hbWU+IG5hbWVNYXAgPSBuZXcgSGFzaE1hcDxEZWNsYXJhdGlvbiwgUU5hbWU+KCk7Ci0gICAgICAgIGZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gOiBtZXRob2RzKSB7Ci0gICAgICAgICAgICBuYW1lTWFwLnB1dChtZXRob2REZWNsYXJhdGlvbiwgbmV3IFFOYW1lKGdldFRhcmdldE5hbWVzcGFjZShtZXRob2REZWNsYXJhdGlvbi5nZXREZWNsYXJpbmdUeXBlKCkpLAotICAgICAgICAgICAgICAgICAgICBnZXRPcGVyYXRpb25OYW1lKG1ldGhvZERlY2xhcmF0aW9uKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgRGVjbGFyYXRpb25bXSBrZXlzID0gbmFtZU1hcC5rZXlTZXQoKS50b0FycmF5KG5ldyBEZWNsYXJhdGlvbltuYW1lTWFwLnNpemUoKV0pOwotICAgICAgICBRTmFtZVtdIHZhbHVlcyA9IG5hbWVNYXAudmFsdWVzKCkudG9BcnJheShuZXcgUU5hbWVbbmFtZU1hcC5zaXplKCldKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgUU5hbWUgcU5hbWUgPSB2YWx1ZXNbaV07Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gaSArIDE7IGogPCB2YWx1ZXMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICBRTmFtZSBvdGhlclFOYW1lID0gdmFsdWVzW2pdOwotICAgICAgICAgICAgICAgIGlmIChxTmFtZS5lcXVhbHMob3RoZXJRTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcihrZXlzW2ldLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuT1BFUkFUSU9OX05BTUVTX01VU1RfQkVfVU5JUVVFX0VSUk9SLCBxTmFtZSkpOwotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKGtleXNbal0uZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5PUEVSQVRJT05fTkFNRVNfTVVTVF9CRV9VTklRVUVfRVJST1IsIG90aGVyUU5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFubm90YXRpb24sIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0gICAgICAgIEFubm90YXRpb25NaXJyb3IgYW5ub3RhdGlvbk1pcnJvciA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBhbm5vdGF0aW9uKTsKLSAgICAgICAgaWYgKGFubm90YXRpb25NaXJyb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShhbm5vdGF0aW9uTWlycm9yLCBhdHRyaWJ1dGVOYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tXcmFwcGVyQW5kRmF1bHRCZWFuTmFtZXMoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWV0aG9kRGVjbGFyYXRpb24+IG1ldGhvZERlY2xhcmF0aW9ucykgewotICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIHJlcXVlc3RXcmFwcGVyRGVjbGFyYXRpb24gPSAoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgZW52aXJvbm1lbnQKLSAgICAgICAgLmdldFR5cGVEZWNsYXJhdGlvbihSZXF1ZXN0V3JhcHBlci5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gcmVzcG9zZVdyYXBwZXJEZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAuZ2V0VHlwZURlY2xhcmF0aW9uKFJlc3BvbnNlV3JhcHBlci5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIFNldDxEZWNsYXJhdGlvbj4gbWV0aG9kcyA9IG5ldyBIYXNoU2V0PERlY2xhcmF0aW9uPigpOwotICAgICAgICBtZXRob2RzLmFkZEFsbChlbnZpcm9ubWVudC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKHJlcXVlc3RXcmFwcGVyRGVjbGFyYXRpb24pKTsKLSAgICAgICAgbWV0aG9kcy5hZGRBbGwoZW52aXJvbm1lbnQuZ2V0RGVjbGFyYXRpb25zQW5ub3RhdGVkV2l0aChyZXNwb3NlV3JhcHBlckRlY2xhcmF0aW9uKSk7Ci0KLSAgICAgICAgTGlzdDxBbm5vdGF0aW9uVmFsdWU+IGNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PEFubm90YXRpb25WYWx1ZT4oKTsKLSAgICAgICAgTWFwPE9iamVjdCwgUU5hbWU+IHFOYW1lcyA9IG5ldyBIYXNoTWFwPE9iamVjdCwgUU5hbWU+KCk7Ci0KLSAgICAgICAgZm9yIChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA6IG1ldGhvZHMpIHsKLSAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciByZXF1ZXN0V3JhcHBlciA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBSZXF1ZXN0V3JhcHBlci5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RXcmFwcGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkQ2xhc3NOYW1lKHJlcXVlc3RXcmFwcGVyLCBDTEFTU19OQU1FLCBjbGFzc05hbWVzKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkTG9jYWxOYW1lKHJlcXVlc3RXcmFwcGVyLCBMT0NBTF9OQU1FLCAoTWV0aG9kRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uLCBxTmFtZXMpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3IgcmVzcG9uc2VXcmFwcGVyID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24sIFJlc3BvbnNlV3JhcHBlci5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlV3JhcHBlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZENsYXNzTmFtZShyZXNwb25zZVdyYXBwZXIsIENMQVNTX05BTUUsIGNsYXNzTmFtZXMpOwotICAgICAgICAgICAgICAgICAgICBhZGRMb2NhbE5hbWUocmVzcG9uc2VXcmFwcGVyLCBMT0NBTF9OQU1FLCAoTWV0aG9kRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uLCBxTmFtZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFNldDxSZWZlcmVuY2VUeXBlPiB0aHJvd25UeXBlcyA9IG5ldyBIYXNoU2V0PFJlZmVyZW5jZVR5cGU+KCk7Ci0KLSAgICAgICAgZm9yIChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA6IG1ldGhvZERlY2xhcmF0aW9ucykgewotICAgICAgICAgICAgdGhyb3duVHlwZXMuYWRkQWxsKG1ldGhvZERlY2xhcmF0aW9uLmdldFRocm93blR5cGVzKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChSZWZlcmVuY2VUeXBlIHJlZmVyZW5jZVR5cGUgOiB0aHJvd25UeXBlcykgewotICAgICAgICAgICAgaWYgKHJlZmVyZW5jZVR5cGUgaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uID0gKENsYXNzRGVjbGFyYXRpb24pIHJlZmVyZW5jZVR5cGU7Ci0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciB3ZWJGYXVsdCA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKGNsYXNzRGVjbGFyYXRpb24sIFdlYkZhdWx0LmNsYXNzKTsKLSAgICAgICAgICAgICAgICBpZiAod2ViRmF1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhZGRDbGFzc05hbWUod2ViRmF1bHQsIEZBVUxUX0JFQU4sIGNsYXNzTmFtZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NOYW1lcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIGNsYXNzTmFtZSA9IGNsYXNzTmFtZXMuZ2V0KGkpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgY2xhc3NOYW1lcy5zaXplKCk7IGorKykgewotICAgICAgICAgICAgICAgIEFubm90YXRpb25WYWx1ZSBvdGhlckNsYXNzTmFtZSA9IGNsYXNzTmFtZXMuZ2V0KGopOwotICAgICAgICAgICAgICAgIGlmIChjbGFzc05hbWUuZ2V0VmFsdWUoKS50b1N0cmluZygpLmVxdWFsc0lnbm9yZUNhc2Uob3RoZXJDbGFzc05hbWUuZ2V0VmFsdWUoKS50b1N0cmluZygpKSkgewotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKGNsYXNzTmFtZS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldSQVBQRVJfRkFVTFRfQkVBTl9OQU1FU19NVVNUX0JFX1VOSVFVRSwgY2xhc3NOYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3Iob3RoZXJDbGFzc05hbWUuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XUkFQUEVSX0ZBVUxUX0JFQU5fTkFNRVNfTVVTVF9CRV9VTklRVUUsIG90aGVyQ2xhc3NOYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdmFsaWRhdGVRTmFtZXMocU5hbWVzLCBKQVhXU0NvcmVNZXNzYWdlcy5MT0NBTF9OQU1FX0FUVFJJQlVURVNfTVVTVF9CRV9VTklRVUUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVFOYW1lcyhNYXA8T2JqZWN0LCBRTmFtZT4gcU5hbWVzLCBTdHJpbmcgZXJyb3JNZXNzYWdlKSB7Ci0gICAgICAgIE9iamVjdFtdIGtleXMgPSAgcU5hbWVzLmtleVNldCgpLnRvQXJyYXkobmV3IE9iamVjdFtxTmFtZXMuc2l6ZSgpXSk7Ci0gICAgICAgIFFOYW1lW10gdmFsdWVzID0gcU5hbWVzLnZhbHVlcygpLnRvQXJyYXkobmV3IFFOYW1lW3FOYW1lcy5zaXplKCldKTsKLQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBRTmFtZSBxTmFtZSA9IHZhbHVlc1tpXTsKLSAgICAgICAgICAgIGZvcihpbnQgaiA9IGkgKyAxOyBqIDwgdmFsdWVzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgUU5hbWUgb3RoZXJRTmFtZSA9IHZhbHVlc1tqXTsKLSAgICAgICAgICAgICAgICBpZiAocU5hbWUuZXF1YWxzKG90aGVyUU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3IoZ2V0UG9zaXRpb24oa2V5c1tpXSksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoZXJyb3JNZXNzYWdlLCBxTmFtZSkpOwotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKGdldFBvc2l0aW9uKGtleXNbal0pLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKGVycm9yTWVzc2FnZSwgb3RoZXJRTmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRDbGFzc05hbWUoQW5ub3RhdGlvbk1pcnJvciBhbm5vdGF0aW9uTWlycm9yLCBTdHJpbmcgYXR0cmlidXRlS2V5LAotICAgICAgICAgICAgTGlzdDxBbm5vdGF0aW9uVmFsdWU+IGNsYXNzTmFtZXMpIHsKLSAgICAgICAgQW5ub3RhdGlvblZhbHVlIGNsYXNzTmFtZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uVmFsdWUoYW5ub3RhdGlvbk1pcnJvciwgYXR0cmlidXRlS2V5KTsKLSAgICAgICAgaWYgKGNsYXNzTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjbGFzc05hbWVzLmFkZChjbGFzc05hbWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZExvY2FsTmFtZShBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IsIFN0cmluZyBhdHRyaWJ1dGVLZXksCi0gICAgICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiwgTWFwPE9iamVjdCwgUU5hbWU+IHFOYW1lcykgewotICAgICAgICBBbm5vdGF0aW9uVmFsdWUgbG9jYWxOYW1lVmFsdWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKGFubm90YXRpb25NaXJyb3IsIGF0dHJpYnV0ZUtleSk7Ci0gICAgICAgIGlmIChsb2NhbE5hbWVWYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBxTmFtZXMucHV0KGxvY2FsTmFtZVZhbHVlLCBuZXcgUU5hbWUoZ2V0VGFyZ2V0TmFtZXNwYWNlKGFubm90YXRpb25NaXJyb3IsIG1ldGhvZERlY2xhcmF0aW9uKSwKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxOYW1lVmFsdWUuZ2V0VmFsdWUoKS50b1N0cmluZygpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tEb2N1bWVudEJhcmVNZXRob2RzKENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2RzKSB7Ci0gICAgICAgIExpc3Q8TWV0aG9kRGVjbGFyYXRpb24+IGRvY0JhcmVNZXRob2RzID0gbmV3IEFycmF5TGlzdDxNZXRob2REZWNsYXJhdGlvbj4oKTsKLSAgICAgICAgZm9yIChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA6IG1ldGhvZHMpIHsKLSAgICAgICAgICAgIGlmIChoYXNEb2N1bWVudEJhcmVTT0FQQmluZGluZyhtZXRob2REZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgICAgICBkb2NCYXJlTWV0aG9kcy5hZGQobWV0aG9kRGVjbGFyYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTWFwPE9iamVjdCwgUU5hbWU+IHFOYW1lcyA9IG5ldyBIYXNoTWFwPE9iamVjdCwgUU5hbWU+KCk7Ci0gICAgICAgIGZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gOiBkb2NCYXJlTWV0aG9kcykgewotICAgICAgICAgICAgZ2V0RG9jdW1lbnRCYXJlT3BlcmF0aW9uUmVxdWVzdChtZXRob2REZWNsYXJhdGlvbiwgcU5hbWVzKTsKLSAgICAgICAgICAgIGdldERvY3VtZW50QmFyZU9wZXJhdGlvblJlc3BvbnNlKG1ldGhvZERlY2xhcmF0aW9uLCBxTmFtZXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgdmFsaWRhdGVRTmFtZXMocU5hbWVzLCBKQVhXU0NvcmVNZXNzYWdlcy5ET0NfQkFSRV9NRVRIT0RTX1VOSVFVRV9YTUxfRUxFTUVOVFMpOwotICAgIH0KLQotICAgIHByaXZhdGUgU291cmNlUG9zaXRpb24gZ2V0UG9zaXRpb24oT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFubm90YXRpb25WYWx1ZSkgewotICAgICAgICAgICAgcmV0dXJuICgoQW5ub3RhdGlvblZhbHVlKSB2YWx1ZSkuZ2V0UG9zaXRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICAgICAgcmV0dXJuICgoTWV0aG9kRGVjbGFyYXRpb24pIHZhbHVlKS5nZXRQb3NpdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFBhcmFtZXRlckRlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChQYXJhbWV0ZXJEZWNsYXJhdGlvbikgdmFsdWUpLmdldFBvc2l0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGdldERvY3VtZW50QmFyZU9wZXJhdGlvblJlcXVlc3QoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24sIE1hcDxPYmplY3QsIFFOYW1lPiBxTmFtZXMpIHsKLSAgICAgICAgQ29sbGVjdGlvbjxQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gcGFyYW1ldGVycyA9IG1ldGhvZERlY2xhcmF0aW9uLmdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgZm9yIChQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbWV0ZXJEZWNsYXJhdGlvbiA6IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViUGFyYW0gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihwYXJhbWV0ZXJEZWNsYXJhdGlvbiwgV2ViUGFyYW0uY2xhc3MpOwotICAgICAgICAgICAgaWYgKHdlYlBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbW9kZSA9IGdldFdlYlBhcmFtTW9kZSh3ZWJQYXJhbSwgcGFyYW1ldGVyRGVjbGFyYXRpb24pOwotICAgICAgICAgICAgICAgIGlmIChtb2RlLmVxdWFscyhNb2RlLklOLm5hbWUoKSkgfHwgbW9kZS5lcXVhbHMoTW9kZS5JTk9VVC5uYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdldE9wZXJhdGlvblJlcXVlc3Qod2ViUGFyYW0sIG1ldGhvZERlY2xhcmF0aW9uLCBwYXJhbWV0ZXJEZWNsYXJhdGlvbiwgcU5hbWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHFOYW1lcy5wdXQocGFyYW1ldGVyRGVjbGFyYXRpb24sIGdldE9wZXJhdGlvblJlcXVlc3REZWZhdWx0KG1ldGhvZERlY2xhcmF0aW9uKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZ2V0T3BlcmF0aW9uUmVxdWVzdChBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IsIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uLAotICAgICAgICAgICAgUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyRGVjbGFyYXRpb24sIE1hcDxPYmplY3QsIFFOYW1lPiBxTmFtZXMpIHsKLSAgICAgICAgQW5ub3RhdGlvblZhbHVlIG5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKGFubm90YXRpb25NaXJyb3IsIE5BTUUpOwotICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBRTmFtZSBxTmFtZSA9IG5ldyBRTmFtZShnZXRUYXJnZXROYW1lc3BhY2UoYW5ub3RhdGlvbk1pcnJvciwgbWV0aG9kRGVjbGFyYXRpb24pLCBuYW1lLmdldFZhbHVlKCkKLSAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgcU5hbWVzLnB1dChuYW1lLCBxTmFtZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBxTmFtZXMucHV0KHBhcmFtZXRlckRlY2xhcmF0aW9uLCBnZXRPcGVyYXRpb25SZXF1ZXN0RGVmYXVsdChtZXRob2REZWNsYXJhdGlvbikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBRTmFtZSBnZXRPcGVyYXRpb25SZXF1ZXN0RGVmYXVsdChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICByZXR1cm4gbmV3IFFOYW1lKGdldFRhcmdldE5hbWVzcGFjZShtZXRob2REZWNsYXJhdGlvbi5nZXREZWNsYXJpbmdUeXBlKCkpLCBtZXRob2REZWNsYXJhdGlvbgotICAgICAgICAgICAgICAgIC5nZXRTaW1wbGVOYW1lKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBnZXREb2N1bWVudEJhcmVPcGVyYXRpb25SZXNwb25zZShNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiwgTWFwPE9iamVjdCwgUU5hbWU+IHFOYW1lcykgewotICAgICAgICBpZiAoIXJldHVybnNWb2lkKG1ldGhvZERlY2xhcmF0aW9uKSkgewotICAgICAgICAgICAgZ2V0T3BlcmF0aW9uUmVzcG9uc2UoQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obWV0aG9kRGVjbGFyYXRpb24sIFdlYlJlc3VsdC5jbGFzcyksCi0gICAgICAgICAgICAgICAgICAgIG1ldGhvZERlY2xhcmF0aW9uLCBxTmFtZXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ29sbGVjdGlvbjxQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gcGFyYW1ldGVycyA9IG1ldGhvZERlY2xhcmF0aW9uLmdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgIGZvciAoUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyRGVjbGFyYXRpb24gOiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciB3ZWJQYXJhbSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHBhcmFtZXRlckRlY2xhcmF0aW9uLCBXZWJQYXJhbS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHdlYlBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1vZGUgPSBnZXRXZWJQYXJhbU1vZGUod2ViUGFyYW0sIHBhcmFtZXRlckRlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGUuZXF1YWxzKE1vZGUuT1VULm5hbWUoKSkgfHwgbW9kZS5lcXVhbHMoTW9kZS5JTk9VVC5uYW1lKCkpICYmICFpc0hlYWRlcih3ZWJQYXJhbSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldE9wZXJhdGlvblJlc3BvbnNlKHdlYlBhcmFtLCBtZXRob2REZWNsYXJhdGlvbiwgcU5hbWVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChnZXREZWZhdWx0V2ViUGFyYW1Nb2RlKHBhcmFtZXRlckRlY2xhcmF0aW9uKS5lcXVhbHMoTW9kZS5JTk9VVC5uYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHFOYW1lcy5wdXQocGFyYW1ldGVyRGVjbGFyYXRpb24sIGdldE9wZXJhdGlvblJlc3BvbnNlRGVmYXVsdChtZXRob2REZWNsYXJhdGlvbikpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZ2V0T3BlcmF0aW9uUmVzcG9uc2UoQW5ub3RhdGlvbk1pcnJvciBhbm5vdGF0aW9uTWlycm9yLCBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiwKLSAgICAgICAgICAgIE1hcDxPYmplY3QsIFFOYW1lPiBxTmFtZXMpIHsKLSAgICAgICAgaWYgKGFubm90YXRpb25NaXJyb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIG5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKGFubm90YXRpb25NaXJyb3IsIE5BTUUpOwotICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHFOYW1lcy5wdXQobmFtZSwgbmV3IFFOYW1lKGdldFRhcmdldE5hbWVzcGFjZShhbm5vdGF0aW9uTWlycm9yLCBtZXRob2REZWNsYXJhdGlvbiksIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcU5hbWVzLnB1dChtZXRob2REZWNsYXJhdGlvbiwgZ2V0T3BlcmF0aW9uUmVzcG9uc2VEZWZhdWx0KG1ldGhvZERlY2xhcmF0aW9uKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBxTmFtZXMucHV0KG1ldGhvZERlY2xhcmF0aW9uLCBnZXRPcGVyYXRpb25SZXNwb25zZURlZmF1bHQobWV0aG9kRGVjbGFyYXRpb24pKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgUU5hbWUgZ2V0T3BlcmF0aW9uUmVzcG9uc2VEZWZhdWx0KE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUU5hbWUoZ2V0VGFyZ2V0TmFtZXNwYWNlKG1ldGhvZERlY2xhcmF0aW9uLmdldERlY2xhcmluZ1R5cGUoKSksIG1ldGhvZERlY2xhcmF0aW9uCi0gICAgICAgICAgICAgICAgLmdldFNpbXBsZU5hbWUoKQotICAgICAgICAgICAgICAgICsgUkVTUE9OU0VfU1VGRklYKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNIZWFkZXIoQW5ub3RhdGlvbk1pcnJvciBhbm5vdGF0aW9uTWlycm9yKSB7Ci0gICAgICAgIEJvb2xlYW4gaGVhZGVyID0gQW5ub3RhdGlvblV0aWxzLmdldEJvb2xlYW5WYWx1ZShhbm5vdGF0aW9uTWlycm9yLCBIRUFERVIpOwotICAgICAgICBpZiAoaGVhZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBoZWFkZXIuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFdlYlBhcmFtTW9kZShBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IsIFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlckRlY2xhcmF0aW9uKSB7Ci0gICAgICAgIFN0cmluZyBtb2RlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKGFubm90YXRpb25NaXJyb3IsIE1PREUpOwotICAgICAgICBpZiAobW9kZSA9PSBudWxsIHx8IG1vZGUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgbW9kZSA9IGdldERlZmF1bHRXZWJQYXJhbU1vZGUocGFyYW1ldGVyRGVjbGFyYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtb2RlOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRXZWJQYXJhbU1vZGUoUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyRGVjbGFyYXRpb24pIHsKLSAgICAgICAgVHlwZU1pcnJvciB0eXBlTWlycm9yID0gZW52aXJvbm1lbnQuZ2V0VHlwZVV0aWxzKCkuZ2V0RXJhc3VyZShwYXJhbWV0ZXJEZWNsYXJhdGlvbi5nZXRUeXBlKCkpOwotICAgICAgICBpZiAodHlwZU1pcnJvci50b1N0cmluZygpLmVxdWFscyhIb2xkZXIuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSkgewotICAgICAgICAgICAgcmV0dXJuIE1vZGUuSU5PVVQubmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNb2RlLklOLm5hbWUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gcmV0dXJuc1ZvaWQoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgcmV0dXJuIG1ldGhvZERlY2xhcmF0aW9uLmdldFJldHVyblR5cGUoKS5lcXVhbHMoZW52aXJvbm1lbnQuZ2V0VHlwZVV0aWxzKCkuZ2V0Vm9pZFR5cGUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrTWV0aG9kUGFyYW1ldGVycyhDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2REZWNsYXJhdGlvbj4gbWV0aG9kRGVjbGFyYXRpb25zKSB7Ci0gICAgICAgIExpc3Q8TWV0aG9kRGVjbGFyYXRpb24+IG1ldGhvZHMgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZERlY2xhcmF0aW9uPigpOwotICAgICAgICBmb3IgKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uIDogbWV0aG9kRGVjbGFyYXRpb25zKSB7Ci0gICAgICAgICAgICAvL05vdCBEb2MgQmFyZQotICAgICAgICAgICAgaWYgKCFoYXNEb2N1bWVudEJhcmVTT0FQQmluZGluZyhtZXRob2REZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgICAgICBtZXRob2RzLmFkZChtZXRob2REZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uIDogbWV0aG9kcykgewotICAgICAgICAgICAgTGlzdDxBbm5vdGF0aW9uVmFsdWU+IG5hbWVzID0gbmV3IEFycmF5TGlzdDxBbm5vdGF0aW9uVmFsdWU+KCk7Ci0gICAgICAgICAgICBMaXN0PFBhcmFtZXRlckRlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzID0gKExpc3Q8UGFyYW1ldGVyRGVjbGFyYXRpb24+KSBtZXRob2REZWNsYXJhdGlvbi5nZXRQYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgICBmb3IgKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlckRlY2xhcmF0aW9uIDogcGFyYW1ldGVycykgewotICAgICAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViUGFyYW0gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihwYXJhbWV0ZXJEZWNsYXJhdGlvbiwgV2ViUGFyYW0uY2xhc3MpOwotICAgICAgICAgICAgICAgIGlmICh3ZWJQYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25WYWx1ZSBuYW1lID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25WYWx1ZSh3ZWJQYXJhbSwgTkFNRSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzLmFkZChuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RGb3JHZW5lcmF0ZWROYW1lQ2xhc2gobmFtZSwgcGFyYW1ldGVyRGVjbGFyYXRpb24sIHBhcmFtZXRlcnMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIG5hbWUgPSBuYW1lcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgbmFtZXMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIG90aGVyTmFtZSA9IG5hbWVzLmdldChqKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUudG9TdHJpbmcoKS5lcXVhbHMob3RoZXJOYW1lLnRvU3RyaW5nKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKG5hbWUuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuUEFSQU1FVEVSX05BTUVfQ0xBU0gsIG5hbWUuZ2V0VmFsdWUoKS50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKG90aGVyTmFtZS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5QQVJBTUVURVJfTkFNRV9DTEFTSCwgb3RoZXJOYW1lLmdldFZhbHVlKCkudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RGb3JHZW5lcmF0ZWROYW1lQ2xhc2goQW5ub3RhdGlvblZhbHVlIHdlYlBhcmFtTmFtZSwgUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyLAotICAgICAgICAgICAgTGlzdDxQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gcGFyYW1ldGVycykgewotICAgICAgICBTdHJpbmcgbmFtZSA9IHdlYlBhcmFtTmFtZS50b1N0cmluZygpOwotICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBwYXR0ZXJuLm1hdGNoZXIobmFtZSk7Ci0gICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgaW50IGFyZ04gPSBJbnRlZ2VyLnBhcnNlSW50KG5hbWUuc3Vic3RyaW5nKDMpKTsKLSAgICAgICAgICAgIGlmIChhcmdOICE9IHBhcmFtZXRlcnMuaW5kZXhPZihwYXJhbWV0ZXIpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFyZ04gPCBwYXJhbWV0ZXJzLnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbWV0ZXJOID0gcGFyYW1ldGVycy5nZXQoYXJnTik7Ci0gICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViUGFyYW1OID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24ocGFyYW1ldGVyTiwgV2ViUGFyYW0uY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICBpZiAod2ViUGFyYW1OICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25WYWx1ZSB3ZWJQYXJhbU5hbWVOID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25WYWx1ZSh3ZWJQYXJhbU4sIE5BTUUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdlYlBhcmFtTmFtZU4gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3IocGFyYW1ldGVyTi5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuR0VORVJBVEVEX1BBUkFNRVRFUl9OQU1FX0NMQVNILCBuYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcih3ZWJQYXJhbU5hbWUuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLkdFTkVSQVRFRF9QQVJBTUVURVJfTkFNRV9DTEFTSCwgbmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3ZWJQYXJhbU5hbWVOLnRvU3RyaW5nKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3Iod2ViUGFyYW1OYW1lTi5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuR0VORVJBVEVEX1BBUkFNRVRFUl9OQU1FX0NMQVNILCBuYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcih3ZWJQYXJhbU5hbWUuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLkdFTkVSQVRFRF9QQVJBTUVURVJfTkFNRV9DTEFTSCwgbmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcihwYXJhbWV0ZXJOLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLkdFTkVSQVRFRF9QQVJBTUVURVJfTkFNRV9DTEFTSCwgbmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcih3ZWJQYXJhbU5hbWUuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuR0VORVJBVEVEX1BBUkFNRVRFUl9OQU1FX0NMQVNILCBuYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbikgewotICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gZ2V0QXR0cmlidXRlVmFsdWUodHlwZURlY2xhcmF0aW9uLCBXZWJTZXJ2aWNlLmNsYXNzLCBUQVJHRVRfTkFNRVNQQUNFKTsKLSAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGFyZ2V0TmFtZXNwYWNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIEpEVFV0aWxzLmdldFRhcmdldE5hbWVzcGFjZUZyb21QYWNrYWdlTmFtZSh0eXBlRGVjbGFyYXRpb24uZ2V0UGFja2FnZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKEFubm90YXRpb25NaXJyb3IgYW5ub3RhdGlvbk1pcnJvciwgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShhbm5vdGF0aW9uTWlycm9yLCBUQVJHRVRfTkFNRVNQQUNFKTsKLSAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSBnZXRUYXJnZXROYW1lc3BhY2UobWV0aG9kRGVjbGFyYXRpb24uZ2V0RGVjbGFyaW5nVHlwZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGFyZ2V0TmFtZXNwYWNlOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldE9wZXJhdGlvbk5hbWUoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShtZXRob2REZWNsYXJhdGlvbiwgV2ViTWV0aG9kLmNsYXNzLCBPUEVSQVRJT05fTkFNRSk7Ci0gICAgICAgIGlmIChvcGVyYXRpb25OYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBvcGVyYXRpb25OYW1lOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtZXRob2REZWNsYXJhdGlvbi5nZXRTaW1wbGVOYW1lKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhc0RvY3VtZW50QmFyZVNPQVBCaW5kaW5nKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0gICAgICAgIEFubm90YXRpb25NaXJyb3Igc29hcEJpbmRpbmcgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgU09BUEJpbmRpbmcuY2xhc3MpOwotICAgICAgICBpZiAoc29hcEJpbmRpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIEpBWFdTVXRpbHMuaXNEb2N1bWVudEJhcmUoc29hcEJpbmRpbmcpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IChNZXRob2REZWNsYXJhdGlvbikgZGVjbGFyYXRpb247Ci0gICAgICAgICAgICByZXR1cm4gaGFzRG9jdW1lbnRCYXJlU09BUEJpbmRpbmcobWV0aG9kRGVjbGFyYXRpb24uZ2V0RGVjbGFyaW5nVHlwZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYk1ldGhvZENoZWNrRm9yV2ViU2VydmljZVJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViTWV0aG9kQ2hlY2tGb3JXZWJTZXJ2aWNlUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGQ1ZjJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViTWV0aG9kQ2hlY2tGb3JXZWJTZXJ2aWNlUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25NaXJyb3I7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5EZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5UeXBlRGVjbGFyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBXZWJNZXRob2RDaGVja0ZvcldlYlNlcnZpY2VSdWxlIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoKSB7Ci0gICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXRUeXBlRGVjbGFyYXRpb24oV2ViTWV0aG9kLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKGFubm90YXRpb25EZWNsYXJhdGlvbik7Ci0KLSAgICAgICAgZm9yIChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA6IGFubm90YXRlZFR5cGVzKSB7Ci0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIENvbGxlY3Rpb248QW5ub3RhdGlvbk1pcnJvcj4gYW5ub3RhdGlvbk1pcnJvcnMgPSBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTWlycm9ycygpOwotICAgICAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbk1pcnJvciBtaXJyb3IgOiBhbm5vdGF0aW9uTWlycm9ycykgewotICAgICAgICAgICAgICAgICAgICBpZiAobWlycm9yLmdldEFubm90YXRpb25UeXBlKCkuZ2V0RGVjbGFyYXRpb24oKS5lcXVhbHMoYW5ub3RhdGlvbkRlY2xhcmF0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFjaGVja0ZvcldlYlNlcnZpY2VBbm5vdGF0aW9uKCgoTWV0aG9kRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uKS5nZXREZWNsYXJpbmdUeXBlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludEZpeGFibGVFcnJvcihtaXJyb3IuZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCTUVUSE9EX09OTFlfU1VQUE9SVEVEX09OX0NMQVNTRVNfV0lUSF9XRUJTRVJWSUNFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja0ZvcldlYlNlcnZpY2VBbm5vdGF0aW9uKFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHR5cGVEZWNsYXJhdGlvbiwgV2ViU2VydmljZS5jbGFzcykgIT0gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYk1ldGhvZEV4Y2x1ZGVSdWxlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJNZXRob2RFeGNsdWRlUnVsZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q2ZDM0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYk1ldGhvZEV4Y2x1ZGVSdWxlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5FWENMVURFOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblZhbHVlOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkNsYXNzRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uSW50ZXJmYWNlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uVHlwZURlY2xhcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgV2ViTWV0aG9kRXhjbHVkZVJ1bGVzIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoKSB7Ci0gICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvbkRlY2xhcmF0aW9uID0gKEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pIGVudmlyb25tZW50Ci0gICAgICAgICAgICAgICAgLmdldFR5cGVEZWNsYXJhdGlvbihXZWJNZXRob2QuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICBDb2xsZWN0aW9uPERlY2xhcmF0aW9uPiBhbm5vdGF0ZWRUeXBlcyA9IGVudmlyb25tZW50LmdldERlY2xhcmF0aW9uc0Fubm90YXRlZFdpdGgoCi0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbkRlY2xhcmF0aW9uKTsKLQotICAgICAgICBmb3IgKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uIDogYW5ub3RhdGVkVHlwZXMpIHsKLSAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxBbm5vdGF0aW9uTWlycm9yPiBhbm5vdGF0aW9uTWlycm9ycyA9IGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25NaXJyb3JzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IgOiBhbm5vdGF0aW9uTWlycm9ycykgewotICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVmFsdWUgZXhjbHVkZUF0dHJpYnV0ZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uVmFsdWUoYW5ub3RhdGlvbk1pcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWENMVURFKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGV4Y2x1ZGVBdHRyaWJ1dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoTWV0aG9kRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IG1ldGhvZERlY2xhcmF0aW9uLmdldERlY2xhcmluZ1R5cGUoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVEZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEludGVyZmFjZURlY2xhcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICgoQm9vbGVhbikgZXhjbHVkZUF0dHJpYnV0ZS5nZXRWYWx1ZSgpKS5ib29sZWFuVmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKGV4Y2x1ZGVBdHRyaWJ1dGUuZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQk1FVEhPRF9FWENMVURFX05PVF9BTExPV0VEX09OX1NFSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlRGVjbGFyYXRpb24gaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGFubm90YXRpb25NaXJyb3IuZ2V0RWxlbWVudFZhbHVlcygpLnNpemUoKSA+IDEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgQm9vbGVhbi52YWx1ZU9mKGV4Y2x1ZGVBdHRyaWJ1dGUuZ2V0VmFsdWUoKS50b1N0cmluZygpKS5ib29sZWFuVmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKGV4Y2x1ZGVBdHRyaWJ1dGUuZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQk1FVEhPRF9FWENMVURFX1NQRUNJRklFRF9OT19PVEhFUl9BVFRSSUJVVEVTX0FMTE9XRUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJNZXRob2RQdWJsaWNTdGF0aWNGaW5hbFJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViTWV0aG9kUHVibGljU3RhdGljRmluYWxSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MjAxMzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJNZXRob2RQdWJsaWNTdGF0aWNGaW5hbFJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5DbGFzc0RlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1ldGhvZERlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1vZGlmaWVyOwotCi1wdWJsaWMgY2xhc3MgV2ViTWV0aG9kUHVibGljU3RhdGljRmluYWxSdWxlIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLQkKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKCkgewotICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXRUeXBlRGVjbGFyYXRpb24oV2ViTWV0aG9kLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKAotICAgICAgICAgICAgICAgIGFubm90YXRpb25EZWNsYXJhdGlvbik7Ci0KLSAgICAgICAgZm9yIChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA6IGFubm90YXRlZFR5cGVzKSB7Ci0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gKE1ldGhvZERlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbjsKLSAgICAgICAgICAgICAgICBpZiAobWV0aG9kRGVjbGFyYXRpb24uZ2V0RGVjbGFyaW5nVHlwZSgpIGluc3RhbmNlb2YgQ2xhc3NEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPE1vZGlmaWVyPiBtb2RpZmllcnMgPSBtZXRob2REZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtb2RpZmllcnMuY29udGFpbnMoTW9kaWZpZXIuUFVCTElDKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3IobWV0aG9kRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQk1FVEhPRF9PTkxZX09OX1BVQkxJQ19NRVRIT0RTKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtb2RpZmllcnMuY29udGFpbnMoTW9kaWZpZXIuRklOQUwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludEZpeGFibGVFcnJvcihtZXRob2REZWNsYXJhdGlvbi5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJNRVRIT0RfTk9fRklOQUxfTU9ESUZJRVJfQUxMT1dFRCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChtb2RpZmllcnMuY29udGFpbnMoTW9kaWZpZXIuU1RBVElDKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3IobWV0aG9kRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCTUVUSE9EX05PX1NUQVRJQ19NT0RJRklFUl9BTExPV0VEKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlRGVmYXVsdFB1YmxpY0NvbnN0cnVjdG9yUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlRGVmYXVsdFB1YmxpY0NvbnN0cnVjdG9yUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjY2YTgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZURlZmF1bHRQdWJsaWNDb25zdHJ1Y3RvclJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQ2xhc3NEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkVudW1EZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Nb2RpZmllcjsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VEZWZhdWx0UHVibGljQ29uc3RydWN0b3JSdWxlIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoKSB7Ci0gICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvbkRlY2xhcmF0aW9uID0gKEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pIGVudmlyb25tZW50Ci0gICAgICAgIC5nZXRUeXBlRGVjbGFyYXRpb24oV2ViU2VydmljZS5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIENvbGxlY3Rpb248RGVjbGFyYXRpb24+IGFubm90YXRlZFR5cGVzID0gZW52aXJvbm1lbnQKLSAgICAgICAgLmdldERlY2xhcmF0aW9uc0Fubm90YXRlZFdpdGgoYW5ub3RhdGlvbkRlY2xhcmF0aW9uKTsKLQotICAgICAgICBmb3IgKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uIDogYW5ub3RhdGVkVHlwZXMpIHsKLSAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIENsYXNzRGVjbGFyYXRpb24gJiYgIShkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEVudW1EZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGhhc0RlZmF1bHRDb25zdHJ1Y3RvciA9IGZhbHNlOwotICAgICAgICAgICAgICAgIENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbiA9IChDbGFzc0RlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbjsKLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPENvbnN0cnVjdG9yRGVjbGFyYXRpb24+IGNvbnN0cnVjdG9ycyA9IGNsYXNzRGVjbGFyYXRpb24uZ2V0Q29uc3RydWN0b3JzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnN0cnVjdG9ycy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBoYXNEZWZhdWx0Q29uc3RydWN0b3IgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uIDogY29uc3RydWN0b3JzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKS5jb250YWlucyhNb2RpZmllci5QVUJMSUMpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0UGFyYW1ldGVycygpLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzRGVmYXVsdENvbnN0cnVjdG9yID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWhhc0RlZmF1bHRDb25zdHJ1Y3RvcikgewotICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPEFubm90YXRpb25NaXJyb3I+IGFubm90YXRpb25NaXJyb3JzID0gZGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk1pcnJvcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChBbm5vdGF0aW9uTWlycm9yIG1pcnJvciA6IGFubm90YXRpb25NaXJyb3JzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIG1pcnJvci5nZXRBbm5vdGF0aW9uVHlwZSgpLnRvU3RyaW5nKCkuZXF1YWxzKGFubm90YXRpb25EZWNsYXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UXVhbGlmaWVkTmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKGRlY2xhcmF0aW9uLmdldFBvc2l0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0RFRkFVTFRfUFVCTElDX0NPTlNUUlVDVE9SKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlRUpCTW9kdWxlUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlRUpCTW9kdWxlUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTUwN2Q0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZUVKQk1vZHVsZVJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmFwdC5jb3JlLmVudi5FY2xpcHNlQW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uRGVjbGFyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlRUpCTW9kdWxlUnVsZSBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVEVMRVNTID0gImphdmF4LmVqYi5TdGF0ZWxlc3MiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9GQUNFVCA9ICJqc3QuZWpiIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfRkFDRVRfVkVSU0lPTiA9ICIzLjAiOyAvLyROT04tTkxTLTEkCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKCkgewotICAgICAgICBpZiAoZW52aXJvbm1lbnQgaW5zdGFuY2VvZiBFY2xpcHNlQW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50KSB7Ci0gICAgICAgICAgICBFY2xpcHNlQW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50IGVjbGlwc2VFbnZpcm9ubWVudCA9IChFY2xpcHNlQW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50KSBlbnZpcm9ubWVudDsKLQotICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IGVjbGlwc2VFbnZpcm9ubWVudC5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzRmFjZXRlZFByb2plY3QocHJvamVjdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmFjZXRlZFByb2plY3QuaGFzUHJvamVjdEZhY2V0KFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChFSkJfRkFDRVQpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgSVByb2plY3RGYWNldFZlcnNpb24gZmFjZXRWZXJzaW9uID0gZmFjZXRlZFByb2plY3QuZ2V0UHJvamVjdEZhY2V0VmVyc2lvbihQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoRUpCX0ZBQ0VUKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFjZXRWZXJzaW9uLmdldFZlcnNpb25TdHJpbmcoKS5lcXVhbHMoRUpCX0ZBQ0VUX1ZFUlNJT04pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiB3ZWJTZXJ2aWNlRGVjbGFyYXRpb24gPSAoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgZWNsaXBzZUVudmlyb25tZW50LmdldFR5cGVEZWNsYXJhdGlvbihXZWJTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlY2xpcHNlRW52aXJvbm1lbnQuZ2V0RGVjbGFyYXRpb25zQW5ub3RhdGVkV2l0aCh3ZWJTZXJ2aWNlRGVjbGFyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gOiBhbm5vdGF0ZWRUeXBlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0U3RhdGVsZXNzQW5ub3RhdGlvbihkZWNsYXJhdGlvbikgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciB3ZWJTZXJ2aWNlID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24sIFdlYlNlcnZpY2UuY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcih3ZWJTZXJ2aWNlLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfT05MWV9PTl9TVEFURUxFU1NfU0VTU0lPTl9CRUFOUyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEFubm90YXRpb25NaXJyb3IgZ2V0U3RhdGVsZXNzQW5ub3RhdGlvbihEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotICAgICAgICBDb2xsZWN0aW9uPEFubm90YXRpb25NaXJyb3I+IGFhbm5vdGF0aW9uTWlycm9ycyA9IGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25NaXJyb3JzKCk7Ci0KLSAgICAgICAgZm9yIChBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IgOiBhYW5ub3RhdGlvbk1pcnJvcnMpIHsKLSAgICAgICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiA9IGFubm90YXRpb25NaXJyb3IuZ2V0QW5ub3RhdGlvblR5cGUoKS5nZXREZWNsYXJhdGlvbigpOwotICAgICAgICAgICAgaWYgKGFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiBhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoU1RBVEVMRVNTKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uTWlycm9yOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0ZhY2V0ZWRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgU2V0PElGYWNldGVkUHJvamVjdD4gZmFjZXRlZFByb2plY3RzID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0RmFjZXRlZFByb2plY3RzKCk7Ci0gICAgICAgIGZvciAoSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0IDogZmFjZXRlZFByb2plY3RzKSB7Ci0gICAgICAgICAgICBpZiAoZmFjZXRlZFByb2plY3QuZ2V0UHJvamVjdCgpLmVxdWFscyhwcm9qZWN0KSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZU5vRmluYWxpemVNZXRob2RSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VOb0ZpbmFsaXplTWV0aG9kUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzRiZDM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZU5vRmluYWxpemVNZXRob2RSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLkZJTkFMSVpFOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1ldGhvZERlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlR5cGVEZWNsYXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VOb0ZpbmFsaXplTWV0aG9kUnVsZSBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvciB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKCkgewotICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXRUeXBlRGVjbGFyYXRpb24oV2ViU2VydmljZS5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIENvbGxlY3Rpb248RGVjbGFyYXRpb24+IGFubm90YXRlZFR5cGVzID0gZW52aXJvbm1lbnQKLSAgICAgICAgICAgICAgICAuZ2V0RGVjbGFyYXRpb25zQW5ub3RhdGVkV2l0aChhbm5vdGF0aW9uRGVjbGFyYXRpb24pOwotCi0gICAgICAgIGZvciAoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gOiBhbm5vdGF0ZWRUeXBlcykgewotICAgICAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gZmluYWxpemVNZXRob2QgPSBnZXRGaW5hbGl6ZU1ldGhvZChkZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICBpZiAoZmluYWxpemVNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKGZpbmFsaXplTWV0aG9kLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfT1ZFUlJJREVfRklOQUxJWkUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZXRob2REZWNsYXJhdGlvbiBnZXRGaW5hbGl6ZU1ldGhvZChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgIFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSAoVHlwZURlY2xhcmF0aW9uKWRlY2xhcmF0aW9uOwotICAgICAgICAgICAgQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWV0aG9kRGVjbGFyYXRpb24+IG1ldGhvZERlY2xhcmF0aW9ucyA9IHR5cGVEZWNsYXJhdGlvbi5nZXRNZXRob2RzKCk7Ci0gICAgICAgICAgICBmb3IgKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uIDogbWV0aG9kRGVjbGFyYXRpb25zKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1ldGhvZERlY2xhcmF0aW9uLmdldFNpbXBsZU5hbWUoKS5lcXVhbHMoRklOQUxJWkUpIAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgbWV0aG9kRGVjbGFyYXRpb24uZ2V0UGFyYW1ldGVycygpLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2REZWNsYXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlUGFyYW1ldGVyc1JldHVyblR5cGVzUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlUGFyYW1ldGVyc1JldHVyblR5cGVzUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmJlYTNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZVBhcmFtZXRlcnNSZXR1cm5UeXBlc1J1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZS5lbnYuRWNsaXBzZUFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5GbGFnczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVIaWVyYXJjaHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZVBsdWdpbjsKLQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQ2xhc3NEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5EZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5JbnRlcmZhY2VEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Nb2RpZmllcjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5QYXJhbWV0ZXJEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IudHlwZS5BcnJheVR5cGU7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IudHlwZS5DbGFzc1R5cGU7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IudHlwZS5JbnRlcmZhY2VUeXBlOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLnR5cGUuVHlwZU1pcnJvcjsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VQYXJhbWV0ZXJzUmV0dXJuVHlwZXNSdWxlIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IEpBVkFfVFlQRVMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBBTExPV0VEX0lOX01VTFRJUExFX0lOSEVSSVRBTkNFID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmEudXRpbC5DYWxlbmRhciIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEpBVkFfVFlQRVMuYWRkKCJqYXZhLnV0aWwuRGF0ZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEpBVkFfVFlQRVMuYWRkKCJqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YXgueG1sLmRhdGF0eXBlLlhNTEdyZWdvcmlhbkNhbGVuZGFyIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YS51dGlsLkFycmF5TGlzdCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEpBVkFfVFlQRVMuYWRkKCJqYXZhLnV0aWwuSGFzaFNldCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEpBVkFfVFlQRVMuYWRkKCJqYXZhLnV0aWwuTGlua2VkTGlzdCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEpBVkFfVFlQRVMuYWRkKCJqYXZhLnV0aWwuTGlzdCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEpBVkFfVFlQRVMuYWRkKCJqYXZhLnV0aWwuU3RhY2siKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YS51dGlsLlZlY3RvciIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmEubWF0aC5CaWdEZWNpbWFsIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmEubWF0aC5CaWdJbnRlZ2VyIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmEubGFuZy5PYmplY3QiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEpBVkFfVFlQRVMuYWRkKCJqYXZhLnV0aWwuVVVJRCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEpBVkFfVFlQRVMuYWRkKCJqYXZhLm5ldC5VUkkiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YS5hd3QuSW1hZ2UiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YXgueG1sLmRhdGF0eXBlLkR1cmF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIEpBVkFfVFlQRVMuYWRkKCJqYXZhLmxhbmcuU3RyaW5nIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmEubGFuZy5Cb29sZWFuIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmEubGFuZy5JbnRlZ2VyIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmEubGFuZy5DaGFyYWN0ZXIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YS5sYW5nLkZsb2F0Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmEubGFuZy5CeXRlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmEubGFuZy5Eb3VibGUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YS5sYW5nLkxvbmciKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YS5sYW5nLlNob3J0Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmEubGFuZy5Wb2lkIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YS5pby5TZXJpYWxpemFibGUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YS5sYW5nLkNsb25lYWJsZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEpBVkFfVFlQRVMuYWRkKCJqYXZhLmxhbmcuQ29tcGFyYWJsZSIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmEudXRpbC5NYXAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YS51dGlsLkhhc2hNYXAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YS51dGlsLkhhc2h0YWJsZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEpBVkFfVFlQRVMuYWRkKCJqYXZhLnV0aWwuQ29sbGVjdGlvbiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmEubGFuZy5FeGNlcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YS5sYW5nLlRocm93YWJsZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEpBVkFfVFlQRVMuYWRkKCJqYXZhLmxhbmcuU3RhY2tUcmFjZUVsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIEFMTE9XRURfSU5fTVVMVElQTEVfSU5IRVJJVEFOQ0UuYWRkKCJqYXZhLmxhbmcuQ2xvbmVhYmxlIik7IC8vICROT04tTkxTJAotICAgICAgICBBTExPV0VEX0lOX01VTFRJUExFX0lOSEVSSVRBTkNFLmFkZCgiamF2YS5sYW5nLkNvbXBhcmFibGUiKTsgLy8gJE5PTi1OTFMkCi0gICAgICAgIEFMTE9XRURfSU5fTVVMVElQTEVfSU5IRVJJVEFOQ0UuYWRkKCJqYXZhLmlvLlNlcmlhbGl6YWJsZSIpOyAvLyAkTk9OLU5MUyQKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1RFX09CSkVDVCA9ICJqYXZhLnJtaS5SZW1vdGUiOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJvY2VzcygpIHsKLSAgICAgICAgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiB3ZWJTZXJ2aWNlRGVjbGFyYXRpb24gPSAoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgZW52aXJvbm1lbnQKLSAgICAgICAgLmdldFR5cGVEZWNsYXJhdGlvbihXZWJTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKHdlYlNlcnZpY2VEZWNsYXJhdGlvbik7Ci0KLSAgICAgICAgZm9yIChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA6IGFubm90YXRlZFR5cGVzKSB7Ci0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBJbnRlcmZhY2VEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIHZhbGlkYXRlTWV0aG9kUGFyYW1ldGVyc0FuZFJldHVyblR5cGVzKChJbnRlcmZhY2VEZWNsYXJhdGlvbikgZGVjbGFyYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlTWV0aG9kUGFyYW1ldGVyc0FuZFJldHVyblR5cGVzKEludGVyZmFjZURlY2xhcmF0aW9uIGludGVyZmFjZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2RzID0gaW50ZXJmYWNlRGVjbGFyYXRpb24uZ2V0TWV0aG9kcygpOwotICAgICAgICBmb3IgKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uIDogbWV0aG9kcykgewotICAgICAgICAgICAgVHlwZU1pcnJvciByZXR1cm5UeXBlID0gbWV0aG9kRGVjbGFyYXRpb24uZ2V0UmV0dXJuVHlwZSgpOwotICAgICAgICAgICAgdmFsaWRhdGVUeXBlTWlycm9yKHJldHVyblR5cGUsIG1ldGhvZERlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgIENvbGxlY3Rpb248UGFyYW1ldGVyRGVjbGFyYXRpb24+IHBhcmFtZXRlcnMgPSAgbWV0aG9kRGVjbGFyYXRpb24uZ2V0UGFyYW1ldGVycygpOwotICAgICAgICAgICAgZm9yIChQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbWV0ZXJEZWNsYXJhdGlvbiA6IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZVR5cGVNaXJyb3IocGFyYW1ldGVyRGVjbGFyYXRpb24uZ2V0VHlwZSgpLCBtZXRob2REZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVUeXBlTWlycm9yKFR5cGVNaXJyb3IgcmV0dXJuVHlwZSwgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgaWYgKHJldHVyblR5cGUgaW5zdGFuY2VvZiBBcnJheVR5cGUpIHsKLSAgICAgICAgICAgIEFycmF5VHlwZSBhcnJheVR5cGUgPSAoQXJyYXlUeXBlKSByZXR1cm5UeXBlOwotCi0gICAgICAgICAgICBUeXBlTWlycm9yIGNvbXBvbmVudFR5cGUgPSBhcnJheVR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpOwotICAgICAgICAgICAgaWYgKGNvbXBvbmVudFR5cGUgaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uID0gKENsYXNzRGVjbGFyYXRpb24pIGNvbXBvbmVudFR5cGU7Ci0gICAgICAgICAgICAgICAgY2hlY2tDbGFzc1Jlc3RyaWN0aW9uKGNsYXNzRGVjbGFyYXRpb24sIG1ldGhvZERlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXR1cm5UeXBlIGluc3RhbmNlb2YgSW50ZXJmYWNlVHlwZSkgewotICAgICAgICAgICAgSW50ZXJmYWNlVHlwZSBpbnRlcmZhY2VUeXBlID0gKEludGVyZmFjZVR5cGUpIHJldHVyblR5cGU7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uPFR5cGVNaXJyb3I+IHR5cGVBcmd1bWVudHMgPSBpbnRlcmZhY2VUeXBlLmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKTsKLSAgICAgICAgICAgIGlmICh0eXBlQXJndW1lbnRzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBmb3IgKFR5cGVNaXJyb3IgdHlwZU1pcnJvciA6IHR5cGVBcmd1bWVudHMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVNaXJyb3IgaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24gPSAoQ2xhc3NEZWNsYXJhdGlvbikgdHlwZU1pcnJvcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrQ2xhc3NSZXN0cmljdGlvbihjbGFzc0RlY2xhcmF0aW9uLCBtZXRob2REZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVNaXJyb3IgaW5zdGFuY2VvZiBJbnRlcmZhY2VEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tJbnRlcmZhY2UoKEludGVyZmFjZURlY2xhcmF0aW9uKSB0eXBlTWlycm9yLCBtZXRob2REZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGVja0ludGVyZmFjZShpbnRlcmZhY2VUeXBlLmdldERlY2xhcmF0aW9uKCksIG1ldGhvZERlY2xhcmF0aW9uKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJldHVyblR5cGUgaW5zdGFuY2VvZiBDbGFzc1R5cGUpIHsKLSAgICAgICAgICAgIENsYXNzVHlwZSBjbGFzc1R5cGUgPSAoQ2xhc3NUeXBlKSByZXR1cm5UeXBlOwotICAgICAgICAgICAgQ29sbGVjdGlvbjxUeXBlTWlycm9yPiB0eXBlQXJndW1lbnRzID0gY2xhc3NUeXBlLmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKTsKLSAgICAgICAgICAgIGlmICh0eXBlQXJndW1lbnRzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBmb3IgKFR5cGVNaXJyb3IgdHlwZU1pcnJvciA6IHR5cGVBcmd1bWVudHMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVNaXJyb3IgaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24gPSAoQ2xhc3NEZWNsYXJhdGlvbikgdHlwZU1pcnJvcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrQ2xhc3NSZXN0cmljdGlvbihjbGFzc0RlY2xhcmF0aW9uLCBtZXRob2REZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChjbGFzc1R5cGUuZ2V0RGVjbGFyYXRpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrQ2xhc3NSZXN0cmljdGlvbihjbGFzc1R5cGUuZ2V0RGVjbGFyYXRpb24oKSwgbWV0aG9kRGVjbGFyYXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrQ2xhc3NSZXN0cmljdGlvbihDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24sIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgIGNoZWNrSW5uZXJQdWJsaWNTdGF0aWNUeXBlcyhjbGFzc0RlY2xhcmF0aW9uLCBtZXRob2REZWNsYXJhdGlvbik7Ci0gICAgICAgIGNoZWNrSWZSZW1vdGVPYmplY3QoY2xhc3NEZWNsYXJhdGlvbiwgbWV0aG9kRGVjbGFyYXRpb24pOwotICAgICAgICBjaGVja0Fic3RhY3RUeXBlKGNsYXNzRGVjbGFyYXRpb24sIG1ldGhvZERlY2xhcmF0aW9uKTsKLSAgICAgICAgY2hlY2tNdWx0aXBsZUluaGVyaXRhbmNlKGNsYXNzRGVjbGFyYXRpb24sIG1ldGhvZERlY2xhcmF0aW9uKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tJbm5lclB1YmxpY1N0YXRpY1R5cGVzKENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbiwgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgaWYgKGhhc0lubmVyTm9uUHVibGljU3RhdGljVHlwZXMoY2xhc3NEZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgIHByaW50RXJyb3IobWV0aG9kRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuSEFTX0lOQURNSVNTSUJMRV9JTk5FUl9UWVBFUywgY2xhc3NEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNJbm5lck5vblB1YmxpY1N0YXRpY1R5cGVzKENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbikgewotICAgICAgICBpZiAoaXNKYXZhVHlwZShjbGFzc0RlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKSkgJiYgSkFWQV9UWVBFUy5jb250YWlucyhjbGFzc0RlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBDb2xsZWN0aW9uPFR5cGVEZWNsYXJhdGlvbj4gbmVzdGVkVHlwZXMgPSBjbGFzc0RlY2xhcmF0aW9uLmdldE5lc3RlZFR5cGVzKCk7Ci0gICAgICAgIGZvciAoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA6IG5lc3RlZFR5cGVzKSB7Ci0gICAgICAgICAgICBpZiAoIXR5cGVEZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKS5jb250YWlucyhNb2RpZmllci5QVUJMSUMpCi0gICAgICAgICAgICAgICAgICAgIHx8ICF0eXBlRGVjbGFyYXRpb24uZ2V0TW9kaWZpZXJzKCkuY29udGFpbnMoTW9kaWZpZXIuU1RBVElDKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tJbnRlcmZhY2UoSW50ZXJmYWNlRGVjbGFyYXRpb24gaW50ZXJmYWNlRGVjbGFyYXRpb24sIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgIGlmICghaXNTdWl0YWJsZUludGVyZmFjZShpbnRlcmZhY2VEZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgIHByaW50RXJyb3IobWV0aG9kRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuSU5URVJGQUNFU19OT1RfU1VQUE9SVEVELCBpbnRlcmZhY2VEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1N1aXRhYmxlSW50ZXJmYWNlKEludGVyZmFjZURlY2xhcmF0aW9uIGludGVyZmFjZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgIHJldHVybiBpc0phdmFUeXBlKGludGVyZmFjZURlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKSkgJiYgSkFWQV9UWVBFUy5jb250YWlucyhpbnRlcmZhY2VEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkpCi0gICAgICAgIHx8IGlzWE1MVHlwZShpbnRlcmZhY2VEZWNsYXJhdGlvbik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzWE1MVHlwZShJbnRlcmZhY2VEZWNsYXJhdGlvbiBpbnRlcmZhY2VEZWNsYXJhdGlvbikgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oaW50ZXJmYWNlRGVjbGFyYXRpb24sIFhtbFR5cGUuY2xhc3MpICE9IG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrSWZSZW1vdGVPYmplY3QoQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uLCBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICBpZiAoaXNSZW1vdGVPYmplY3QoY2xhc3NEZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgIHByaW50RXJyb3IobWV0aG9kRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuSVNfUkVNT1RFX09CSkVDVCwgY2xhc3NEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1JlbW90ZU9iamVjdChDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24pIHsKLSAgICAgICAgQ29sbGVjdGlvbjxJbnRlcmZhY2VUeXBlPiBzdXBlckludGVyZmFjZXMgPSBjbGFzc0RlY2xhcmF0aW9uLmdldFN1cGVyaW50ZXJmYWNlcygpOwotICAgICAgICBmb3IgKEludGVyZmFjZVR5cGUgaW50ZXJmYWNlVHlwZSA6IHN1cGVySW50ZXJmYWNlcykgewotCi0gICAgICAgICAgICBpZiAoaW50ZXJmYWNlVHlwZS5nZXREZWNsYXJhdGlvbigpICE9IG51bGwgJiYgaW50ZXJmYWNlVHlwZS5nZXREZWNsYXJhdGlvbigpLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoUkVNT1RFX09CSkVDVCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrQWJzdGFjdFR5cGUoQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uLCBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICBpZiAoY2xhc3NEZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKS5jb250YWlucyhNb2RpZmllci5BQlNUUkFDVCkpIHsKLSAgICAgICAgICAgIGlmIChlbnZpcm9ubWVudCBpbnN0YW5jZW9mIEVjbGlwc2VBbm5vdGF0aW9uUHJvY2Vzc29yRW52aXJvbm1lbnQpIHsKLSAgICAgICAgICAgICAgICBFY2xpcHNlQW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50IGVjbGlwc2VFbnZpcm9ubWVudCA9IChFY2xpcHNlQW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50KSBlbnZpcm9ubWVudDsKLSAgICAgICAgICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBlY2xpcHNlRW52aXJvbm1lbnQuZ2V0SmF2YVByb2plY3QoKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBJVHlwZSB0eXBlID0gamF2YVByb2plY3QuZmluZFR5cGUoY2xhc3NEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBJVHlwZUhpZXJhcmNoeSBoaWVyYXJjaHkgPSB0eXBlLm5ld1R5cGVIaWVyYXJjaHkobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIElUeXBlW10gc3ViVHlwZXMgPSBoaWVyYXJjaHkuZ2V0QWxsU3VidHlwZXModHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdWJUeXBlcy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKElUeXBlIHN1YlR5cGUgOiBzdWJUeXBlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghRmxhZ3MuaXNBYnN0cmFjdChzdWJUeXBlLmdldEZsYWdzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSAgZW52aXJvbm1lbnQuZ2V0VHlwZURlY2xhcmF0aW9uKHN1YlR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZURlY2xhcmF0aW9uIGluc3RhbmNlb2YgQ2xhc3NEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NEZWNsYXJhdGlvbiBzdWJUeXBlRGVjbGFyYXRpb24gPSAoQ2xhc3NEZWNsYXJhdGlvbikgdHlwZURlY2xhcmF0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUmVtb3RlT2JqZWN0KHN1YlR5cGVEZWNsYXJhdGlvbikgfHwgaGFzSW5uZXJOb25QdWJsaWNTdGF0aWNUeXBlcyhzdWJUeXBlRGVjbGFyYXRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGltcGxlbWVudHNNdWx0aXBsZUludGVyZmFjZXMoc3ViVHlwZURlY2xhcmF0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBpbXBsZW1lbnRzQ2xhc3NBbmRJbnRlcmZhY2Uoc3ViVHlwZURlY2xhcmF0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3IobWV0aG9kRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLkFCU1RSQUNUX0NMQVNTX05PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzRGVjbGFyYXRpb24uZ2V0UXVhbGlmaWVkTmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKG1ldGhvZERlY2xhcmF0aW9uLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLkFCU1RSQUNUX0NMQVNTX05PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpbXBsZW1lbnRzTXVsdGlwbGVJbnRlcmZhY2VzKENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbikgewotICAgICAgICBpZiAoaGFzU3VwZXJDbGFzcyhjbGFzc0RlY2xhcmF0aW9uKSkgewotICAgICAgICAgICAgcmV0dXJuIGNvdW50QWxsb3dlZEludGVyZmFjZXMoY2xhc3NEZWNsYXJhdGlvbi5nZXRTdXBlcmludGVyZmFjZXMoKSkgPiAxOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaW1wbGVtZW50c0NsYXNzQW5kSW50ZXJmYWNlKENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbikgewotICAgICAgICBpZiAoIWhhc1N1cGVyQ2xhc3MoY2xhc3NEZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgIHJldHVybiBjb3VudEFsbG93ZWRJbnRlcmZhY2VzKGNsYXNzRGVjbGFyYXRpb24uZ2V0U3VwZXJpbnRlcmZhY2VzKCkpID4gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhc1N1cGVyQ2xhc3MoQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uKSB7Ci0gICAgICAgIENsYXNzVHlwZSBzdXBlckNsYXNzID0gY2xhc3NEZWNsYXJhdGlvbi5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgIGlmIChzdXBlckNsYXNzLmdldERlY2xhcmF0aW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHF1YWxpZmllZE5hbWUgPSBzdXBlckNsYXNzLmdldERlY2xhcmF0aW9uKCkuZ2V0UXVhbGlmaWVkTmFtZSgpOwotICAgICAgICAgICAgcmV0dXJuIHF1YWxpZmllZE5hbWUuZXF1YWxzKE9iamVjdC5jbGFzcy5nZXROYW1lKCkpIHx8IHF1YWxpZmllZE5hbWUuZXF1YWxzKEV4Y2VwdGlvbi5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tNdWx0aXBsZUluaGVyaXRhbmNlKENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbiwgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgaWYgKGltcGxlbWVudHNNdWx0aXBsZUludGVyZmFjZXMoY2xhc3NEZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBpbnRlcmZhY2VOYW1lcyA9IGdldEFsbG93ZWRJbnRlcmZhY2VOYW1lcyhjbGFzc0RlY2xhcmF0aW9uLmdldFN1cGVyaW50ZXJmYWNlcygpKTsKLSAgICAgICAgICAgIHByaW50RXJyb3IobWV0aG9kRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuSU1QTEVNRU5UU19NVUxUSVBMRV9JTlRFUkZBQ0VTLAotICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0IFtdIHsgY2xhc3NEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCksIGludGVyZmFjZU5hbWVzLmdldCgwKSwgaW50ZXJmYWNlTmFtZXMuZ2V0KDEpIH0pKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW1wbGVtZW50c0NsYXNzQW5kSW50ZXJmYWNlKGNsYXNzRGVjbGFyYXRpb24pKSB7Ci0gICAgICAgICAgICBMaXN0PFN0cmluZz4gaW50ZXJmYWNlTmFtZXMgPSBnZXRBbGxvd2VkSW50ZXJmYWNlTmFtZXMoY2xhc3NEZWNsYXJhdGlvbi5nZXRTdXBlcmludGVyZmFjZXMoKSk7Ci0gICAgICAgICAgICBwcmludEVycm9yKG1ldGhvZERlY2xhcmF0aW9uLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLklOSEVSSVRBTkNFX0FORF9JTVBMRU1FTlRBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtjbGFzc0RlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc0RlY2xhcmF0aW9uLmdldFN1cGVyY2xhc3MoKS5nZXREZWNsYXJhdGlvbigpLmdldFF1YWxpZmllZE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VOYW1lcy5nZXQoMCl9ICkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZ2V0QWxsb3dlZEludGVyZmFjZU5hbWVzKENvbGxlY3Rpb248SW50ZXJmYWNlVHlwZT4gc3VwZXJJbnRlcmZhY2VzKSB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBpbnRlcmZhY2VOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBmb3IgKEludGVyZmFjZVR5cGUgaW50ZXJmYWNlVHlwZSA6IHN1cGVySW50ZXJmYWNlcykgewotICAgICAgICAgICAgaWYgKGludGVyZmFjZVR5cGUuZ2V0RGVjbGFyYXRpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSW50ZXJmYWNlRGVjbGFyYXRpb24gc3VwZXJJbnRlcmZhY2UgPSBpbnRlcmZhY2VUeXBlLmdldERlY2xhcmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFBTExPV0VEX0lOX01VTFRJUExFX0lOSEVSSVRBTkNFLmNvbnRhaW5zKHN1cGVySW50ZXJmYWNlLmdldFF1YWxpZmllZE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlTmFtZXMuYWRkKHN1cGVySW50ZXJmYWNlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbnRlcmZhY2VOYW1lczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBjb3VudEFsbG93ZWRJbnRlcmZhY2VzKENvbGxlY3Rpb248SW50ZXJmYWNlVHlwZT4gc3VwZXJJbnRlcmZhY2VzKSB7Ci0gICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgIGZvciAoSW50ZXJmYWNlVHlwZSBpbnRlcmZhY2VUeXBlIDogc3VwZXJJbnRlcmZhY2VzKSB7Ci0gICAgICAgICAgICBpZiAoaW50ZXJmYWNlVHlwZS5nZXREZWNsYXJhdGlvbigpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJbnRlcmZhY2VEZWNsYXJhdGlvbiBzdXBlckludGVyZmFjZSA9IGludGVyZmFjZVR5cGUuZ2V0RGVjbGFyYXRpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAoIUFMTE9XRURfSU5fTVVMVElQTEVfSU5IRVJJVEFOQ0UuY29udGFpbnMoc3VwZXJJbnRlcmZhY2UuZ2V0UXVhbGlmaWVkTmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY291bnQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSmF2YVR5cGUoU3RyaW5nIHR5cGVOYW1lKSB7Ci0gICAgICAgIHJldHVybiB0eXBlTmFtZS5zdGFydHNXaXRoKCJqYXZhLiIpICB8fCB0eXBlTmFtZS5zdGFydHNXaXRoKCJqYXZheC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlUHJvdmlkZXJSdWxlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlUHJvdmlkZXJSdWxlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTc1YTI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZVByb3ZpZGVyUnVsZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlZBTFVFOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2VNb2RlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVByb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZS5Nb2RlOw0KLWltcG9ydCBqYXZheC54bWwud3MuaHR0cC5IVFRQQmluZGluZzsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7DQotDQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25NaXJyb3I7DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25UeXBlRGVjbGFyYXRpb247DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkNsYXNzRGVjbGFyYXRpb247DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkNvbnN0cnVjdG9yRGVjbGFyYXRpb247DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOw0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5JbnRlcmZhY2VEZWNsYXJhdGlvbjsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTW9kaWZpZXI7DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLnR5cGUuSW50ZXJmYWNlVHlwZTsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IudHlwZS5UeXBlTWlycm9yOw0KLQ0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlUHJvdmlkZXJSdWxlcyBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvciB7DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBwcm9jZXNzKCkgew0KLSAgICAgICAgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0aW9uRGVjbGFyYXRpb24gPSAoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgZW52aXJvbm1lbnQNCi0gICAgICAgICAgICAgICAgLmdldFR5cGVEZWNsYXJhdGlvbihXZWJTZXJ2aWNlUHJvdmlkZXIuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIENvbGxlY3Rpb248RGVjbGFyYXRpb24+IGFubm90YXRlZFR5cGVzID0gZW52aXJvbm1lbnQuZ2V0RGVjbGFyYXRpb25zQW5ub3RhdGVkV2l0aChhbm5vdGF0aW9uRGVjbGFyYXRpb24pOw0KLQ0KLSAgICAgICAgZm9yIChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA6IGFubm90YXRlZFR5cGVzKSB7DQotICAgICAgICAJaWYgKGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgQ2xhc3NEZWNsYXJhdGlvbikgew0KLSAgICAgICAgCQljaGVja0ZvckRlZmF1bHRDb25zdHJ1Y3RvcigoQ2xhc3NEZWNsYXJhdGlvbilkZWNsYXJhdGlvbik7DQotICAgICAgICAJCWNoZWNrRm9yUHJvdmlkZXJJbnRlcmZhY2UoKENsYXNzRGVjbGFyYXRpb24pZGVjbGFyYXRpb24pOw0KLSAgICAgICAgCX0NCi0gICAgICAgIH0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIGNoZWNrRm9yUHJvdmlkZXJJbnRlcmZhY2UoQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uKSB7DQotICAgICAgICBDb2xsZWN0aW9uPEludGVyZmFjZVR5cGU+IGludGVyZmFjZXMgPSBjbGFzc0RlY2xhcmF0aW9uLmdldFN1cGVyaW50ZXJmYWNlcygpOw0KLSAgICAgICAgYm9vbGVhbiBpbXBsZW1lbnRzVHlwZWRQcm92aWRlciA9IGZhbHNlOw0KLSAgICAgICAgaWYgKGludGVyZmFjZXMuc2l6ZSgpID4gMCkgew0KLSAgICAgICAgICAgIGZvciAoSW50ZXJmYWNlVHlwZSBpbnRlcmZhY2VUeXBlIDogaW50ZXJmYWNlcykgew0KLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPFR5cGVNaXJyb3I+IHR5cGVQYXJhbWV0ZXJzID0gaW50ZXJmYWNlVHlwZS5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKCk7DQotICAgICAgICAgICAgICAgIGlmICh0eXBlUGFyYW1ldGVycy5zaXplKCkgPiAwKSB7DQotICAgICAgICAgICAgICAgICAgICBmb3IgKFR5cGVNaXJyb3IgdHlwZU1pcnJvciA6IHR5cGVQYXJhbWV0ZXJzKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVNaXJyb3IgaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsID0gKENsYXNzRGVjbGFyYXRpb24pIHR5cGVNaXJyb3I7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGFzc0RlY2wuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhTT0FQTWVzc2FnZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja1NPQVBNZXNzYWdlUmVxdWlyZW1lbnRzKGNsYXNzRGVjbGFyYXRpb24pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50c1R5cGVkUHJvdmlkZXIgPSB0cnVlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxJbnRlcmZhY2VUeXBlPiBpbXBsZW1lbnRlZEludGVyZmFjZXMgPSBjbGFzc0RlY2wuZ2V0U3VwZXJpbnRlcmZhY2VzKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSW50ZXJmYWNlVHlwZSBpbXBsZW1lbnRlZEludGVyZmFjZSA6IGltcGxlbWVudGVkSW50ZXJmYWNlcykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJmYWNlRGVjbGFyYXRpb24gaW50ZXJmYWNlRGVjbCA9IGltcGxlbWVudGVkSW50ZXJmYWNlLmdldERlY2xhcmF0aW9uKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJmYWNlRGVjbCAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVyZmFjZURlY2wuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhTb3VyY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzVHlwZWRQcm92aWRlciA9IHRydWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJmYWNlRGVjbC5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKERhdGFTb3VyY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja0RhdGFTb3VyY2VSZXF1aXJlbWVudHMoY2xhc3NEZWNsYXJhdGlvbik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHNUeXBlZFByb3ZpZGVyID0gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlTWlycm9yIGluc3RhbmNlb2YgSW50ZXJmYWNlRGVjbGFyYXRpb24pIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJmYWNlRGVjbGFyYXRpb24gaW50ZXJmYWNlRGVjbCA9IChJbnRlcmZhY2VEZWNsYXJhdGlvbikgdHlwZU1pcnJvcjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVyZmFjZURlY2wuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhTb3VyY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50c1R5cGVkUHJvdmlkZXIgPSB0cnVlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVyZmFjZURlY2wuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhEYXRhU291cmNlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrRGF0YVNvdXJjZVJlcXVpcmVtZW50cyhjbGFzc0RlY2xhcmF0aW9uKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHNUeXBlZFByb3ZpZGVyID0gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCFpbXBsZW1lbnRzVHlwZWRQcm92aWRlcikgew0KLSAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViU2VydmljZVByb3ZpZGVyID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oY2xhc3NEZWNsYXJhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIFdlYlNlcnZpY2VQcm92aWRlci5jbGFzcyk7DQotICAgICAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKHdlYlNlcnZpY2VQcm92aWRlci5nZXRQb3NpdGlvbigpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VQUk9WSURFUl9JTVBMRU1FTlRfVFlQRURfUFJPVklERVJfSU5URVJGQUNFKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIGNoZWNrU09BUE1lc3NhZ2VSZXF1aXJlbWVudHMoQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uKSB7DQotICAgICAgICBpZiAoIWlzU09BUEJpbmRpbmcoY2xhc3NEZWNsYXJhdGlvbikpIHsNCi0gICAgICAgICAgICBwcmludEVycm9yKGNsYXNzRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRVBST1ZJREVSX1NPQVBNRVNTQUdFX1NPQVBCSU5ESU5HKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghaXNNZXNzYWdlTW9kZShjbGFzc0RlY2xhcmF0aW9uKSkgew0KLSAgICAgICAgICAgIHByaW50RXJyb3IoY2xhc3NEZWNsYXJhdGlvbi5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFUFJPVklERVJfU09BUE1FU1NBR0VfTUVTU0FHRV9NT0RFKTsNCi0gICAgICAgIH0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIGNoZWNrRGF0YVNvdXJjZVJlcXVpcmVtZW50cyhDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24pIHsNCi0gICAgICAgIGlmICghaXNIVFRQQmluZGluZyhjbGFzc0RlY2xhcmF0aW9uKSkgew0KLSAgICAgICAgICAgIHByaW50RXJyb3IoY2xhc3NEZWNsYXJhdGlvbi5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFUFJPVklERVJfREFUQVNPVVJDRV9IVFRQQklORElORyk7DQotICAgICAgICB9DQotDQotCSAgICBpZiAoIWlzTWVzc2FnZU1vZGUoY2xhc3NEZWNsYXJhdGlvbikpIHsNCi0gICAgICAgICAgICBwcmludEVycm9yKGNsYXNzRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRVBST1ZJREVSX0RBVEFTT1VSQ0VfTUVTU0FHRV9NT0RFKTsNCi0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQkNCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU09BUEJpbmRpbmcoQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uKSB7DQotICAgICAgICBTdHJpbmcgYmluZGluZ1R5cGUgPSBnZXRCaW5kaW5nVHlwZVZhbHVlKGNsYXNzRGVjbGFyYXRpb24pOw0KLSAgICAgICAgaWYgKGJpbmRpbmdUeXBlLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcpIA0KLSAgICAgICAgICAgICAgICB8fCBiaW5kaW5nVHlwZS5lcXVhbHMoU09BUEJpbmRpbmcuU09BUDEySFRUUF9CSU5ESU5HKQ0KLSAgICAgICAgICAgICAgICB8fCBiaW5kaW5nVHlwZS5lcXVhbHMoU09BUEJpbmRpbmcuU09BUDExSFRUUF9NVE9NX0JJTkRJTkcpDQotICAgICAgICAgICAgICAgIHx8IGJpbmRpbmdUeXBlLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTJIVFRQX01UT01fQklORElORykpIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNIVFRQQmluZGluZyhDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24pIHsNCi0gICAgICAgIFN0cmluZyBiaW5kaW5nVHlwZSA9IGdldEJpbmRpbmdUeXBlVmFsdWUoY2xhc3NEZWNsYXJhdGlvbik7DQotICAgICAgICBpZiAoYmluZGluZ1R5cGUuZXF1YWxzKEhUVFBCaW5kaW5nLkhUVFBfQklORElORykpIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRCaW5kaW5nVHlwZVZhbHVlKENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbikgew0KLSAgICAgICAgQW5ub3RhdGlvbk1pcnJvciBiaW5kaW5nVHlwZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKGNsYXNzRGVjbGFyYXRpb24sIEJpbmRpbmdUeXBlLmNsYXNzKTsNCi0gICAgICAgIGlmIChiaW5kaW5nVHlwZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKGJpbmRpbmdUeXBlLCBWQUxVRSk7DQotICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkc7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTWVzc2FnZU1vZGUoQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uKSB7DQotICAgICAgICByZXR1cm4gZ2V0U2VydmljZU1vZGUoY2xhc3NEZWNsYXJhdGlvbikuZXF1YWxzKE1vZGUuTUVTU0FHRS5uYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1BheWxvYWRNb2RlKENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbikgew0KLSAgICAgICAgcmV0dXJuIGdldFNlcnZpY2VNb2RlKGNsYXNzRGVjbGFyYXRpb24pLmVxdWFscyhNb2RlLlBBWUxPQUQubmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRTZXJ2aWNlTW9kZShDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24pIHsNCi0gICAgICAgIEFubm90YXRpb25NaXJyb3Igc2VydmljZU1vZGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihjbGFzc0RlY2xhcmF0aW9uLCBTZXJ2aWNlTW9kZS5jbGFzcyk7DQotICAgICAgICBpZiAoc2VydmljZU1vZGUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShzZXJ2aWNlTW9kZSwgVkFMVUUpOw0KLSAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gTW9kZS5QQVlMT0FELnRvU3RyaW5nKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrRm9yRGVmYXVsdENvbnN0cnVjdG9yKENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbikgew0KLQkJYm9vbGVhbiBoYXNEZWZhdWx0Q29uc3RydWN0b3IgPSBmYWxzZTsNCi0JCUNvbGxlY3Rpb248Q29uc3RydWN0b3JEZWNsYXJhdGlvbj4gY29uc3RydWN0b3JzID0gY2xhc3NEZWNsYXJhdGlvbi5nZXRDb25zdHJ1Y3RvcnMoKTsNCi0JCWlmIChjb25zdHJ1Y3RvcnMuc2l6ZSgpID09IDApIHsNCi0JCQloYXNEZWZhdWx0Q29uc3RydWN0b3IgPSB0cnVlOw0KLQkJfSBlbHNlIHsNCi0JCQlmb3IgKENvbnN0cnVjdG9yRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiA6IGNvbnN0cnVjdG9ycykgew0KLQkJCQlpZiAoY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKS5jb250YWlucyhNb2RpZmllci5QVUJMSUMpICYmIA0KLQkJCQkJCWNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0UGFyYW1ldGVycygpLnNpemUoKSA9PSAwKSB7DQotCQkJCQloYXNEZWZhdWx0Q29uc3RydWN0b3IgPSB0cnVlOw0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQlpZiAoIWhhc0RlZmF1bHRDb25zdHJ1Y3Rvcikgew0KLQkJCUFubm90YXRpb25NaXJyb3Igd2ViU2VydmljZVByb3ZpZGVyID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oY2xhc3NEZWNsYXJhdGlvbiwgV2ViU2VydmljZVByb3ZpZGVyLmNsYXNzKTsNCi0JCQlwcmludEZpeGFibGVFcnJvcih3ZWJTZXJ2aWNlUHJvdmlkZXIuZ2V0UG9zaXRpb24oKSwNCi0JCQkgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VQUk9WSURFUl9ERUZBVUxUX1BVQkxJQ19DT05TVFJVQ1RPUik7IA0KLQkJfSAgICAgICAgICAgICAgICANCi0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VQdWJsaWNBYnN0cmFjdEZpbmFsUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlUHVibGljQWJzdHJhY3RGaW5hbFJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk1ZTM4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VQdWJsaWNBYnN0cmFjdEZpbmFsUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25NaXJyb3I7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5DbGFzc0RlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkVudW1EZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5JbnRlcmZhY2VEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Nb2RpZmllcjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5UeXBlRGVjbGFyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlUHVibGljQWJzdHJhY3RGaW5hbFJ1bGUgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJvY2VzcygpIHsKLSAgICAgICAgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0aW9uRGVjbGFyYXRpb24gPSAoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgZW52aXJvbm1lbnQKLSAgICAgICAgLmdldFR5cGVEZWNsYXJhdGlvbihXZWJTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudAotICAgICAgICAuZ2V0RGVjbGFyYXRpb25zQW5ub3RhdGVkV2l0aChhbm5vdGF0aW9uRGVjbGFyYXRpb24pOwotCi0gICAgICAgIGZvciAoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gOiBhbm5vdGF0ZWRUeXBlcykgewotICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgQ2xhc3NEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEVudW1EZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKGRlY2xhcmF0aW9uLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfQ0xBU1NfT1JfSU5URVJGQUNFX09OTFkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlc3REZWNsYXJhdGlvbihkZWNsYXJhdGlvbiwgYW5ub3RhdGlvbkRlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEludGVyZmFjZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKGRlY2xhcmF0aW9uLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfQ0xBU1NfT1JfSU5URVJGQUNFX09OTFkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlc3REZWNsYXJhdGlvbihkZWNsYXJhdGlvbiwgYW5ub3RhdGlvbkRlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdERlY2xhcmF0aW9uKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbikgewotICAgICAgICBDb2xsZWN0aW9uPE1vZGlmaWVyPiBtb2RpZmllcnMgPSBkZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKTsKLSAgICAgICAgaWYgKG1vZGlmaWVycy5jb250YWlucyhNb2RpZmllci5GSU5BTCkgfHwgbW9kaWZpZXJzLmNvbnRhaW5zKE1vZGlmaWVyLkFCU1RSQUNUKQotICAgICAgICAgICAgICAgIHx8ICFtb2RpZmllcnMuY29udGFpbnMoTW9kaWZpZXIuUFVCTElDKSkgewotICAgICAgICAgICAgQ29sbGVjdGlvbjxBbm5vdGF0aW9uTWlycm9yPiBhbm5vdGF0aW9uTWlycm9ycyA9IGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25NaXJyb3JzKCk7Ci0gICAgICAgICAgICBmb3IgKEFubm90YXRpb25NaXJyb3IgbWlycm9yIDogYW5ub3RhdGlvbk1pcnJvcnMpIHsKLSAgICAgICAgICAgICAgICBpZiAobWlycm9yLmdldEFubm90YXRpb25UeXBlKCkudG9TdHJpbmcoKS5lcXVhbHMoYW5ub3RhdGlvbkRlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3IoZGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX1BVQkxJQ19BQlNUUkFDVF9GSU5BTCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSAoVHlwZURlY2xhcmF0aW9uKWRlY2xhcmF0aW9uOwotICAgICAgICBpZiAodHlwZURlY2xhcmF0aW9uLmdldE5lc3RlZFR5cGVzKCkuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgdGVzdE5lc3RlZFR5cGVzKHR5cGVEZWNsYXJhdGlvbi5nZXROZXN0ZWRUeXBlcygpLCBhbm5vdGF0aW9uRGVjbGFyYXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3ROZXN0ZWRUeXBlcyhDb2xsZWN0aW9uPFR5cGVEZWNsYXJhdGlvbj4gbmVzdGVkVHlwZXMsQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0aW9uRGVjbGFyYXRpb24pIHsKLSAgICAgICAgZm9yIChUeXBlRGVjbGFyYXRpb24gbmVzdGVkRGVjbGFyYXRpb24gOiBuZXN0ZWRUeXBlcykgewotICAgICAgICAgICAgQ29sbGVjdGlvbjxBbm5vdGF0aW9uTWlycm9yPiBhbm5vdGF0aW9uTWlycm9ycyA9IG5lc3RlZERlY2xhcmF0aW9uLmdldEFubm90YXRpb25NaXJyb3JzKCk7Ci0gICAgICAgICAgICBmb3IgKEFubm90YXRpb25NaXJyb3IgbWlycm9yIDogYW5ub3RhdGlvbk1pcnJvcnMpIHsKLSAgICAgICAgICAgICAgICBpZiAobWlycm9yLmdldEFubm90YXRpb25UeXBlKCkudG9TdHJpbmcoKS5lcXVhbHMoYW5ub3RhdGlvbkRlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcihtaXJyb3IuZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX1BVQkxJQ19BQlNUUkFDVF9GSU5BTCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlUmVmc1J1bGVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VSZWZzUnVsZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg3ZjVlNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VSZWZzUnVsZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuTkFNRTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuVFlQRTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuVkFMVUU7DQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VSZWZzOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOw0KLQ0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yOw0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOw0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVmFsdWU7DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkNsYXNzRGVjbGFyYXRpb247DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOw0KLQ0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlUmVmc1J1bGVzIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsNCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoKSB7DQotICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gPSAoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgZW52aXJvbm1lbnQNCi0gICAgICAgICAgICAgICAgLmdldFR5cGVEZWNsYXJhdGlvbihXZWJTZXJ2aWNlUmVmcy5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudA0KLSAgICAgICAgICAgICAgICAuZ2V0RGVjbGFyYXRpb25zQW5ub3RhdGVkV2l0aChhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKTsNCi0NCi0gICAgICAgIGZvciAoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gOiBhbm5vdGF0ZWRUeXBlcykgew0KLSAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViU2VydmljZVJlZnMgPSBBbm5vdGF0aW9uVXRpbHMNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBXZWJTZXJ2aWNlUmVmcy5jbGFzcyk7DQotDQotICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIHdlYlNlcnZpY2VSZWZzVmFsdWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKHdlYlNlcnZpY2VSZWZzLCBWQUxVRSk7DQotDQotICAgICAgICAgICAgaWYgKHdlYlNlcnZpY2VSZWZzVmFsdWUgIT0gbnVsbCAmJiB3ZWJTZXJ2aWNlUmVmc1ZhbHVlLmdldFZhbHVlKCkgaW5zdGFuY2VvZiBMaXN0PD8+KSB7DQotICAgICAgICAgICAgICAgIExpc3Q8QW5ub3RhdGlvblZhbHVlPiB2YWx1ZSA9IChMaXN0PEFubm90YXRpb25WYWx1ZT4pIHdlYlNlcnZpY2VSZWZzVmFsdWUuZ2V0VmFsdWUoKTsNCi0NCi0gICAgICAgICAgICAgICAgZm9yIChBbm5vdGF0aW9uVmFsdWUgYW5ub3RhdGlvblZhbHVlIDogdmFsdWUpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uVmFsdWUuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEFubm90YXRpb25NaXJyb3IpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIHdlYlNlcnZpY2VSZWYgPSAoQW5ub3RhdGlvbk1pcnJvcikgYW5ub3RhdGlvblZhbHVlLmdldFZhbHVlKCk7DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHdlYlNlcnZpY2VSZWZOYW1lID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKHdlYlNlcnZpY2VSZWYsIE5BTUUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3ZWJTZXJ2aWNlUmVmTmFtZSA9PSBudWxsIHx8IHdlYlNlcnZpY2VSZWZOYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3Iod2ViU2VydmljZVJlZi5nZXRQb3NpdGlvbigpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VSRUZTX05BTUVfUkVRVUlSRUQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVmFsdWUgd2ViU2VydmljZVJlZk5hbWVUeXBlID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25WYWx1ZSgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlYlNlcnZpY2VSZWYsIFRZUEUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3ZWJTZXJ2aWNlUmVmTmFtZVR5cGUgIT0gbnVsbCAmJiB3ZWJTZXJ2aWNlUmVmTmFtZVR5cGUgaW5zdGFuY2VvZiBBbm5vdGF0aW9uVmFsdWUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIHR5cGUgPSAoQW5ub3RhdGlvblZhbHVlKSB3ZWJTZXJ2aWNlUmVmTmFtZVR5cGU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlLmdldFZhbHVlKCkgaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24gPSAoQ2xhc3NEZWNsYXJhdGlvbikgdHlwZS5nZXRWYWx1ZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzRGVjbGFyYXRpb24uZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscygNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcih3ZWJTZXJ2aWNlUmVmLmdldFBvc2l0aW9uKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFUkVGU19UWVBFX1JFUVVJUkVEKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3Iod2ViU2VydmljZVJlZi5nZXRQb3NpdGlvbigpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VSRUZTX1RZUEVfUkVRVUlSRUQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VTRUlBbGxvd2VkQXR0cmlidXRlc1J1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZVNFSUFsbG93ZWRBdHRyaWJ1dGVzUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzI1MGRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZVNFSUFsbG93ZWRBdHRyaWJ1dGVzUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5FTkRQT0lOVF9JTlRFUkZBQ0U7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuUE9SVF9OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlNFUlZJQ0VfTkFNRTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25NaXJyb3I7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVmFsdWU7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uSW50ZXJmYWNlRGVjbGFyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlU0VJQWxsb3dlZEF0dHJpYnV0ZXNSdWxlIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoKSB7Ci0gICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvbkRlY2xhcmF0aW9uID0gKEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pIGVudmlyb25tZW50Ci0gICAgICAgICAgICAgICAgLmdldFR5cGVEZWNsYXJhdGlvbihXZWJTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKGFubm90YXRpb25EZWNsYXJhdGlvbik7Ci0gICAgICAgIAotICAgICAgICBmb3IgKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uIDogYW5ub3RhdGVkVHlwZXMpIHsKLSAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEludGVyZmFjZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxBbm5vdGF0aW9uTWlycm9yPiBhbm5vdGF0aW9uTWlycm9ycyA9IGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25NaXJyb3JzKCk7Ci0gICAgICAgIAotICAgICAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbk1pcnJvciBtaXJyb3IgOiBhbm5vdGF0aW9uTWlycm9ycykgewotICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVmFsdWUgc2VydmljZU5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKG1pcnJvciwgU0VSVklDRV9OQU1FKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKHNlcnZpY2VOYW1lLmdldFBvc2l0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfU0VSVklDRU5BTUVfU0VJKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVmFsdWUgZW5kcG9pbnRJbnRlcmZhY2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKG1pcnJvciwgRU5EUE9JTlRfSU5URVJGQUNFKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVuZHBvaW50SW50ZXJmYWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKGVuZHBvaW50SW50ZXJmYWNlLmdldFBvc2l0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5EUE9JTlRJTlRFUkZBQ0VfU0VJKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIHBvcnROYW1lID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25WYWx1ZShtaXJyb3IsIFBPUlRfTkFNRSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwb3J0TmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludEZpeGFibGVFcnJvcihwb3J0TmFtZS5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX1BPUlROQU1FX1NFSSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZVNFSVJlc3RyaWN0aW9uc1J1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZVNFSVJlc3RyaWN0aW9uc1J1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdiYTRhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VTRUlSZXN0cmljdGlvbnNSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5FTkRQT0lOVF9JTlRFUkZBQ0U7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuTkFNRTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGphdmF4Lmp3cy5PbmV3YXk7Ci1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsKLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvbk1pcnJvcjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25WYWx1ZTsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5DbGFzc0RlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkludGVyZmFjZURlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1ldGhvZERlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1vZGlmaWVyOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlBhcmFtZXRlckRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlR5cGVEZWNsYXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VTRUlSZXN0cmljdGlvbnNSdWxlIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoKSB7Ci0gICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvbkRlY2xhcmF0aW9uID0gKEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pIGVudmlyb25tZW50Ci0gICAgICAgIC5nZXRUeXBlRGVjbGFyYXRpb24oV2ViU2VydmljZS5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBDb2xsZWN0aW9uPERlY2xhcmF0aW9uPiBhbm5vdGF0ZWRUeXBlcyA9IGVudmlyb25tZW50Ci0gICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKGFubm90YXRpb25EZWNsYXJhdGlvbik7Ci0gICAgICAgIGZvciAoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gOiBhbm5vdGF0ZWRUeXBlcykgewotICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgQ2xhc3NEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIENvbGxlY3Rpb248QW5ub3RhdGlvbk1pcnJvcj4gYW5ub3RhdGlvbk1pcnJvcnMgPSBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTWlycm9ycygpOwotICAgICAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbk1pcnJvciBtaXJyb3IgOiBhbm5vdGF0aW9uTWlycm9ycykgewotICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVmFsdWUgZW5kcG9pbnRJbnRlcmZhY2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKG1pcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkRQT0lOVF9JTlRFUkZBQ0UpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZW5kcG9pbnRJbnRlcmZhY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIG5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKG1pcnJvciwgTkFNRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3IobmFtZS5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX05BTUVfQVRUUklCVVRFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrUmVzdHJpY3Rpb25zKChDbGFzc0RlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbiwgZW5kcG9pbnRJbnRlcmZhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tKU1IxODFBbm5vdGF0aW9ucygoQ2xhc3NEZWNsYXJhdGlvbikgZGVjbGFyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrUmVzdHJpY3Rpb25zKENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbiwgQW5ub3RhdGlvblZhbHVlIGVuZHBvaW50SW50ZXJmYWNlKSB7Ci0gICAgICAgIFN0cmluZyBzZWkgPSBlbmRwb2ludEludGVyZmFjZS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCk7Ci0gICAgICAgIGlmIChKRFRVdGlscy52YWxpZGF0ZUphdmFUeXBlTmFtZShzZWkpLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSBlbnZpcm9ubWVudC5nZXRUeXBlRGVjbGFyYXRpb24oc2VpKTsKLSAgICAgICAgaWYgKHR5cGVEZWNsYXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoISh0eXBlRGVjbGFyYXRpb24gaW5zdGFuY2VvZiBJbnRlcmZhY2VEZWNsYXJhdGlvbikgfHwgdHlwZURlY2xhcmF0aW9uIGluc3RhbmNlb2YgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIHByaW50RXJyb3IoZW5kcG9pbnRJbnRlcmZhY2UuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfSU5URVJGQUNFLCBzZWkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodHlwZURlY2xhcmF0aW9uLmdldERlY2xhcmluZ1R5cGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRFcnJvcihlbmRwb2ludEludGVyZmFjZS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PVF9PVVRFUiwgc2VpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbih0eXBlRGVjbGFyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIFdlYlNlcnZpY2UuY2xhc3MpOwotICAgICAgICAgICAgaWYgKGFubm90YXRpb25NaXJyb3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByaW50RXJyb3IoZW5kcG9pbnRJbnRlcmZhY2UuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfQU5OT1RBVEVELCBzZWkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCF0eXBlRGVjbGFyYXRpb24uZ2V0TW9kaWZpZXJzKCkuY29udGFpbnMoTW9kaWZpZXIuUFVCTElDKSkgewotICAgICAgICAgICAgICAgIHByaW50RXJyb3IoZW5kcG9pbnRJbnRlcmZhY2UuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfUFVCTElDLCBzZWkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFjbGFzc0RlY2xhcmF0aW9uLmdldFN1cGVyaW50ZXJmYWNlcygpLmNvbnRhaW5zKHR5cGVEZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2REZWNsYXJhdGlvbj4gc2VpTWV0aG9kcyA9IHR5cGVEZWNsYXJhdGlvbi5nZXRNZXRob2RzKCk7Ci0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWV0aG9kRGVjbGFyYXRpb24+IGltcGxNZXRob2RzID0gY2xhc3NEZWNsYXJhdGlvbi5nZXRNZXRob2RzKCk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKE1ldGhvZERlY2xhcmF0aW9uIHNlaU1ldGhvZCA6IHNlaU1ldGhvZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbXBsZW1lbnRlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBmb3IgKE1ldGhvZERlY2xhcmF0aW9uIGltcGxNZXRob2QgOiBpbXBsTWV0aG9kcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFubm90YXRpb25VdGlscy5jb21wYXJlTWV0aG9kcyhzZWlNZXRob2QsIGltcGxNZXRob2QpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbXBsTWV0aG9kLmdldE1vZGlmaWVycygpLmNvbnRhaW5zKE1vZGlmaWVyLlBVQkxJQykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3IoaW1wbE1ldGhvZC5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9SRURVQ0VEX1ZJU0lCSUxJVFkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWltcGxNZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmVxdWFscyhzZWlNZXRob2QuZ2V0UmV0dXJuVHlwZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludEZpeGFibGVFcnJvcihpbXBsTWV0aG9kLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX0lOQ09NUEFUSUJMRV9SRVRVUk5fVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbXBsZW1lbnRzTWVzc2FnZSh0eXBlRGVjbGFyYXRpb24sIHNlaU1ldGhvZCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfSU5DT01QQVRJQkxFX1JFVFVSTl9UWVBFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltcGxNZXRob2QuZ2V0VGhyb3duVHlwZXMoKS5zaXplKCkgIT0gc2VpTWV0aG9kLmdldFRocm93blR5cGVzKCkuc2l6ZSgpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaW1wbE1ldGhvZC5nZXRUaHJvd25UeXBlcygpLmNvbnRhaW5zQWxsKHNlaU1ldGhvZC5nZXRUaHJvd25UeXBlcygpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKGltcGxNZXRob2QuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfSU5DT01QQVRJQkxFX0VYQ0VQVElPTlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbE1ldGhvZC5nZXRTaW1wbGVOYW1lKCksIHNlaSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpbXBsZW1lbnRlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3IoZW5kcG9pbnRJbnRlcmZhY2UuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX01VU1RfSU1QTEVNRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbXBsZW1lbnRzTWVzc2FnZSh0eXBlRGVjbGFyYXRpb24sIHNlaU1ldGhvZCkpLCAiIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTVVTVF9JTVBMRU1FTlQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJpbnRFcnJvcihlbmRwb2ludEludGVyZmFjZS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9UX0ZPVU5ELCBzZWkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldEltcGxlbWVudHNNZXNzYWdlKFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sIE1ldGhvZERlY2xhcmF0aW9uIHNlaU1ldGhvZCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIG1lc3NhZ2UgPSBuZXcgU3RyaW5nQnVpbGRlcih0eXBlRGVjbGFyYXRpb24uZ2V0U2ltcGxlTmFtZSgpKTsKLSAgICAgICAgbWVzc2FnZS5hcHBlbmQoIi4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBtZXNzYWdlLmFwcGVuZChzZWlNZXRob2QuZ2V0U2ltcGxlTmFtZSgpKTsKLSAgICAgICAgbWVzc2FnZS5hcHBlbmQoIigiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBDb2xsZWN0aW9uPFBhcmFtZXRlckRlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzID0gc2VpTWV0aG9kLmdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgSXRlcmF0b3I8UGFyYW1ldGVyRGVjbGFyYXRpb24+IGl0ZXIgPSBwYXJhbWV0ZXJzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyRGVjbGFyYXRpb24gPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyB0eXBlTWlycm9yID0gZW52aXJvbm1lbnQuZ2V0VHlwZVV0aWxzKCkuZ2V0RXJhc3VyZShwYXJhbWV0ZXJEZWNsYXJhdGlvbi5nZXRUeXBlKCkpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCh0eXBlTWlycm9yLnN1YnN0cmluZyh0eXBlTWlycm9yLmxhc3RJbmRleE9mKCIuIikgKyAxKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGlmIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICBtZXNzYWdlLmFwcGVuZCgiKSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBtZXNzYWdlLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrSlNSMTgxQW5ub3RhdGlvbnMoQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uKSB7Ci0gICAgICAgIEFubm90YXRpb25NaXJyb3Igc29hcEJpbmRpbmcgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihjbGFzc0RlY2xhcmF0aW9uLCBTT0FQQmluZGluZy5jbGFzcyk7Ci0gICAgICAgIGlmIChzb2FwQmluZGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcmludEZpeGFibGVFcnJvcihzb2FwQmluZGluZy5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fU09BUEJJTkRJTkcpOwotICAgICAgICB9Ci0KLSAgICAgICAgQ29sbGVjdGlvbjw/IGV4dGVuZHMgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb24+IGltcGxNZXRob2RzID0gY2xhc3NEZWNsYXJhdGlvbgotICAgICAgICAuZ2V0TWV0aG9kcygpOwotICAgICAgICBmb3IgKGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uIDogaW1wbE1ldGhvZHMpIHsKLSAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3IgbXNvYXBCaW5kaW5nID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obWV0aG9kRGVjbGFyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzKTsKLSAgICAgICAgICAgIGlmIChtc29hcEJpbmRpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKG1zb2FwQmluZGluZy5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX1NPQVBCSU5ESU5HKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciBvbmV3YXkgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihtZXRob2REZWNsYXJhdGlvbiwgT25ld2F5LmNsYXNzKTsKLSAgICAgICAgICAgIGlmIChvbmV3YXkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKG9uZXdheS5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX09ORVdBWSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViTWV0aG9kID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obWV0aG9kRGVjbGFyYXRpb24sIFdlYk1ldGhvZC5jbGFzcyk7Ci0gICAgICAgICAgICBpZiAod2ViTWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcmludEZpeGFibGVFcnJvcih3ZWJNZXRob2QuZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19XRUJNRVRIT0RTKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViUmVzdWx0ID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obWV0aG9kRGVjbGFyYXRpb24sIFdlYlJlc3VsdC5jbGFzcyk7Ci0gICAgICAgICAgICBpZiAod2ViUmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcmludEZpeGFibGVFcnJvcih3ZWJSZXN1bHQuZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19XRUJSRVNVTFQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDb2xsZWN0aW9uPFBhcmFtZXRlckRlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzID0gbWV0aG9kRGVjbGFyYXRpb24uZ2V0UGFyYW1ldGVycygpOwotICAgICAgICAgICAgZm9yIChQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbWV0ZXJEZWNsYXJhdGlvbiA6IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIHdlYlBhcmFtID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24ocGFyYW1ldGVyRGVjbGFyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICBXZWJQYXJhbS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHdlYlBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3Iod2ViUGFyYW0uZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fV0VCUEFSQU0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZVRhcmdldE5hbWVzcGFjZVJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZVRhcmdldE5hbWVzcGFjZVJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUxNTRlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VUYXJnZXROYW1lc3BhY2VSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlRBUkdFVF9OQU1FU1BBQ0U7DQotDQotaW1wb3J0IGphdmEubmV0LlVSSTsNCi1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsNCi0NCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvbk1pcnJvcjsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblZhbHVlOw0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5EZWNsYXJhdGlvbjsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb247DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlBhY2thZ2VEZWNsYXJhdGlvbjsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uUGFyYW1ldGVyRGVjbGFyYXRpb247DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlR5cGVEZWNsYXJhdGlvbjsNCi0NCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVRhcmdldE5hbWVzcGFjZVJ1bGUgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3Igew0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgcHJvY2VzcygpIHsNCi0gICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvbkRlY2xhcmF0aW9uID0gKEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pIGVudmlyb25tZW50DQotICAgICAgICAuZ2V0VHlwZURlY2xhcmF0aW9uKFdlYlNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIENvbGxlY3Rpb248RGVjbGFyYXRpb24+IGFubm90YXRlZFR5cGVzID0gZW52aXJvbm1lbnQNCi0gICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKGFubm90YXRpb25EZWNsYXJhdGlvbik7DQotDQotICAgICAgICBmb3IgKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uIDogYW5ub3RhdGVkVHlwZXMpIHsNCi0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsNCi0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciB3ZWJTZXJ2aWNlID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24sIFdlYlNlcnZpY2UuY2xhc3MpOw0KLSAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVmFsdWUgdGFyZ2V0TmFtZXNwYWNlID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25WYWx1ZSh3ZWJTZXJ2aWNlLCBUQVJHRVRfTkFNRVNQQUNFKTsNCi0NCi0gICAgICAgICAgICAgICAgVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IChUeXBlRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uOw0KLSAgICAgICAgICAgICAgICAvLw0KLSAgICAgICAgICAgICAgICBQYWNrYWdlRGVjbGFyYXRpb24gcGFja2FnZURlY2xhcmF0aW9uID0gdHlwZURlY2xhcmF0aW9uLmdldFBhY2thZ2UoKTsNCi0gICAgICAgICAgICAgICAgaWYgKHBhY2thZ2VEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkubGVuZ3RoKCkgPT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZSA9PSBudWxsIHx8IHRhcmdldE5hbWVzcGFjZS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKHdlYlNlcnZpY2UuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9ERUZBVUxUX1BBQ0tBR0VfVEFSR0VUX05BTUVTUEFDRSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgdmFsaWRhdGVVUklTeW50YXgodGFyZ2V0TmFtZXNwYWNlKTsNCi0NCi0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWV0aG9kRGVjbGFyYXRpb24+IG1ldGhvZHMgPSAoKFR5cGVEZWNsYXJhdGlvbikgZGVjbGFyYXRpb24pLmdldE1ldGhvZHMoKTsNCi0gICAgICAgICAgICAgICAgZm9yIChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA6IG1ldGhvZHMpIHsNCi0gICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248UGFyYW1ldGVyRGVjbGFyYXRpb24+IHBhcmFtZXRlcnMgPSBtZXRob2REZWNsYXJhdGlvbi5nZXRQYXJhbWV0ZXJzKCk7DQotICAgICAgICAgICAgICAgICAgICBmb3IgKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlckRlY2xhcmF0aW9uIDogcGFyYW1ldGVycykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViUGFyYW0gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihwYXJhbWV0ZXJEZWNsYXJhdGlvbiwgV2ViUGFyYW0uY2xhc3MpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3ZWJQYXJhbSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlVVJJU3ludGF4KEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uVmFsdWUod2ViUGFyYW0sIFRBUkdFVF9OQU1FU1BBQ0UpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlVVJJU3ludGF4KEFubm90YXRpb25WYWx1ZSB0YXJnZXROYW1lc3BhY2UpIHsNCi0gICAgICAgIGlmICh0YXJnZXROYW1lc3BhY2UgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIG5ldyBVUkkodGFyZ2V0TmFtZXNwYWNlLmdldFZhbHVlKCkudG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIHVyaXNlKSB7DQotICAgICAgICAgICAgICAgIHByaW50RXJyb3IodGFyZ2V0TmFtZXNwYWNlLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoDQotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuVEFSR0VUX05BTUVTUEFDRV9VUklfU1lOVEFYX0VSUk9SLCBuZXcgT2JqZWN0W10gew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJpc2UuZ2V0SW5kZXgoKSwgdXJpc2UuZ2V0SW5wdXQoKSwgdXJpc2UuZ2V0UmVhc29uKCkgfSkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VXU0RMTG9jYXRpb25SdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VXU0RMTG9jYXRpb25SdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YTMzYTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlV1NETExvY2F0aW9uUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuRU5EUE9JTlRfSU5URVJGQUNFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLkVYQ0xVREU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuT1BFUkFUSU9OX05BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuUE9SVF9OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlBPUlRfU1VGRklYOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlNFUlZJQ0VfTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5TRVJWSUNFX1NVRkZJWDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5TVFlMRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5UQVJHRVRfTkFNRVNQQUNFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLldTRExfTE9DQVRJT047Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXguandzLk9uZXdheTsKLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcDEyLlNPQVAxMkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZS5lbnYuRWNsaXBzZUFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLldTRExVdGlsczsKLQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25NaXJyb3I7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVmFsdWU7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQ2xhc3NEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5EZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5UeXBlRGVjbGFyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlV1NETExvY2F0aW9uUnVsZSBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvciB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKCkgewotICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAuZ2V0VHlwZURlY2xhcmF0aW9uKFdlYlNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICBDb2xsZWN0aW9uPERlY2xhcmF0aW9uPiBhbm5vdGF0ZWRUeXBlcyA9IGVudmlyb25tZW50Ci0gICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKGFubm90YXRpb25EZWNsYXJhdGlvbik7Ci0KLSAgICAgICAgZm9yIChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA6IGFubm90YXRlZFR5cGVzKSB7Ci0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uID0gKENsYXNzRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uOwotICAgICAgICAgICAgICAgIGNoZWNrV1NETG9jYXRpb24oY2xhc3NEZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tXU0RMb2NhdGlvbihDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24pIHsKLSAgICAgICAgQW5ub3RhdGlvbk1pcnJvciB3ZWJTZXJ2aWNlID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oY2xhc3NEZWNsYXJhdGlvbiwgV2ViU2VydmljZS5jbGFzcyk7Ci0gICAgICAgIEFubm90YXRpb25WYWx1ZSB3c2RsTG9jYXRpb25WYWx1ZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uVmFsdWUod2ViU2VydmljZSwgV1NETF9MT0NBVElPTik7Ci0gICAgICAgIGlmICh3c2RsTG9jYXRpb25WYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uID0gd3NkbExvY2F0aW9uVmFsdWUuZ2V0VmFsdWUoKS50b1N0cmluZygpLnRyaW0oKTsKLSAgICAgICAgICAgIGlmICh3c2RsTG9jYXRpb24ubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHdzZGxMb2NhdGlvbi5lbmRzV2l0aCgiLndzZGwiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIFVSTCByZWxhdGl2ZVVSTCA9IGdldFJlbGF0aXZlVVJMKGNsYXNzRGVjbGFyYXRpb24sIHdzZGxMb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWxhdGl2ZVVSTCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZVdTREwocmVsYXRpdmVVUkwudG9TdHJpbmcoKSwgd2ViU2VydmljZSwgY2xhc3NEZWNsYXJhdGlvbiwgd3NkbExvY2F0aW9uVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRXYXJuaW5nKHdzZGxMb2NhdGlvblZhbHVlLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfV1NETF9MT0NBVElPTl9VTkFCTEVfVE9fTE9DQVRFLCB3c2RsTG9jYXRpb24pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlV1NETCh3c2RsTG9jYXRpb24sIHdlYlNlcnZpY2UsIGNsYXNzRGVjbGFyYXRpb24sIHdzZGxMb2NhdGlvblZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRFcnJvcih3c2RsTG9jYXRpb25WYWx1ZS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuRU1QVFlfQVRUUklCVVRFX1ZBTFVFLCBuZXcgT2JqZWN0W10ge1dlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMX0xPQ0FUSU9OfSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBVUkwgZ2V0UmVsYXRpdmVVUkwoQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uLCBTdHJpbmcgd3NkbExvY2F0aW9uKSB7Ci0gICAgICAgIGlmIChlbnZpcm9ubWVudCBpbnN0YW5jZW9mIEVjbGlwc2VBbm5vdGF0aW9uUHJvY2Vzc29yRW52aXJvbm1lbnQpIHsKLSAgICAgICAgICAgIEVjbGlwc2VBbm5vdGF0aW9uUHJvY2Vzc29yRW52aXJvbm1lbnQgZWNsaXBzZUVudmlyb25tZW50ID0gKEVjbGlwc2VBbm5vdGF0aW9uUHJvY2Vzc29yRW52aXJvbm1lbnQpIGVudmlyb25tZW50OwotICAgICAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gZWNsaXBzZUVudmlyb25tZW50LmdldEphdmFQcm9qZWN0KCk7Ci0gICAgICAgICAgICBJRm9sZGVyIHdlYkNvbnRlbnRGb2xkZXIgPSBXU0RMVXRpbHMuZ2V0V2ViQ29udGVudEZvbGRlcihqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotICAgICAgICAgICAgaWYgKHdlYkNvbnRlbnRGb2xkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIElSZXNvdXJjZSB3c2RsUmVzb3VyY2UgPSB3ZWJDb250ZW50Rm9sZGVyLmZpbmRNZW1iZXIod3NkbExvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICBpZiAod3NkbFJlc291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3c2RsUmVzb3VyY2UuZ2V0TG9jYXRpb25VUkkoKS50b1VSTCgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVybGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2cobXVybGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVdTREwoU3RyaW5nIHdzZGxMb2NhdGlvbiwgQW5ub3RhdGlvbk1pcnJvciB3ZWJTZXJ2aWNlLCBDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24sIEFubm90YXRpb25WYWx1ZSB3c2RsTG9jYXRpb25WYWx1ZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgVVJMIHdzZGxVUkwgPSBuZXcgVVJMKHdzZGxMb2NhdGlvbik7Ci0gICAgICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBXU0RMVXRpbHMucmVhZFdTREwod3NkbFVSTCk7Ci0gICAgICAgICAgICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lID0gIGdldFNlcnZpY2VRTmFtZSh3ZWJTZXJ2aWNlLCBjbGFzc0RlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKGRlZmluaXRpb24sIHNlcnZpY2VRTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcG9ydE5hbWUgPSAgZ2V0UG9ydE5hbWUod2ViU2VydmljZSwgY2xhc3NEZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIFBvcnQgcG9ydCA9IGdldFBvcnQoc2VydmljZSwgcG9ydE5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAocG9ydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSBwb3J0LmdldEJpbmRpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlQmluZGluZyhiaW5kaW5nLCBjbGFzc0RlY2xhcmF0aW9uLCB3ZWJTZXJ2aWNlLCB3c2RsTG9jYXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgTWV0aG9kRGVjbGFyYXRpb24+IG1ldGhvZE1hcCA9IGdldFdlYk1ldGhvZHMoY2xhc3NEZWNsYXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2ViU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8T3BlcmF0aW9uPiBvcGVyYXRpb25zID0gYmluZGluZy5nZXRQb3J0VHlwZSgpLmdldE9wZXJhdGlvbnMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoT3BlcmF0aW9uIG9wZXJhdGlvbiA6IG9wZXJhdGlvbnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IG1ldGhvZE1hcC5nZXQob3BlcmF0aW9uLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZERlY2xhcmF0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcih3ZWJTZXJ2aWNlLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX05PX09QRVJUQVRJT05fTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciBvbmV3YXkgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2REZWNsYXJhdGlvbiwgT25ld2F5LmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9uZXdheSAhPSBudWxsICYmIG9wZXJhdGlvbi5nZXRPdXRwdXQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKG1ldGhvZERlY2xhcmF0aW9uLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfV1NETF9MT0NBVElPTl9XU0RMX09QRVJBVElPTl9PVVRQVVRfTUVUSE9EX09ORVdBWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHttZXRob2REZWNsYXJhdGlvbi5nZXRTaW1wbGVOYW1lKCksIG9wZXJhdGlvbi5nZXROYW1lKCl9KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKHdlYlNlcnZpY2UuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX05PX1BPUlRfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtwb3J0TmFtZSwgd3NkbExvY2F0aW9ufSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcih3ZWJTZXJ2aWNlLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX05PX1NFUlZJQ0VfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge3NlcnZpY2VRTmFtZS5nZXRMb2NhbFBhcnQoKSwgd3NkbExvY2F0aW9ufSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11cmxlKSB7Ci0gICAgICAgICAgICBwcmludEVycm9yKHdzZGxMb2NhdGlvblZhbHVlLmdldFBvc2l0aW9uKCksIG11cmxlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgcHJpbnRXYXJuaW5nKHdzZGxMb2NhdGlvblZhbHVlLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfV1NETF9MT0NBVElPTl9VTkFCTEVfVE9fTE9DQVRFLCB3c2RsTG9jYXRpb24pKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUJpbmRpbmcoQmluZGluZyBiaW5kaW5nLCBDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24sCi0gICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIHdlYlNlcnZpY2UsIFN0cmluZyB3c2RsTG9jYXRpb24pIHsKLSAgICAgICAgU3RyaW5nIHN0eWxlID0gamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGUuRE9DVU1FTlQubmFtZSgpOwotCi0gICAgICAgIEFubm90YXRpb25NaXJyb3Igc29hcEJpbmRpbmdBbm5vdGF0aW9uID0gZ2V0U09BUEJpbmRpbmcoY2xhc3NEZWNsYXJhdGlvbiwgd2ViU2VydmljZSk7Ci0gICAgICAgIGlmIChzb2FwQmluZGluZ0Fubm90YXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHN0eWxlVmFsdWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoc29hcEJpbmRpbmdBbm5vdGF0aW9uLCBTVFlMRSk7Ci0gICAgICAgICAgICBpZiAoc3R5bGVWYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc3R5bGUgPSBzdHlsZVZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdCBleHRlbnNpYmlsaXR5RWxlbWVudHMgPSAgYmluZGluZy5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgICAgZm9yIChPYmplY3QgZWxlbWVudEV4dGVuc2libGUgOiBleHRlbnNpYmlsaXR5RWxlbWVudHMpIHsKLSAgICAgICAgICAgIGlmIChlbGVtZW50RXh0ZW5zaWJsZSBpbnN0YW5jZW9mIFNPQVBCaW5kaW5nKSB7Ci0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcgc29hcEJpbmRpbmcgPSAoU09BUEJpbmRpbmcpIGVsZW1lbnRFeHRlbnNpYmxlOwotICAgICAgICAgICAgICAgIGlmIChzdHlsZS5jb21wYXJlVG9JZ25vcmVDYXNlKHNvYXBCaW5kaW5nLmdldFN0eWxlKCkpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcihzb2FwQmluZGluZ0Fubm90YXRpb24gPT0gbnVsbCA/IHdlYlNlcnZpY2UuZ2V0UG9zaXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc29hcEJpbmRpbmdBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuYmluZChKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX1dTRExfTE9DQVRJT05fU09BUF9CSU5ESU5HX1NUWUxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHt3c2RsTG9jYXRpb24sIHNvYXBCaW5kaW5nLmdldFN0eWxlKCksIHN0eWxlfSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlbGVtZW50RXh0ZW5zaWJsZSBpbnN0YW5jZW9mIFNPQVAxMkJpbmRpbmcpIHsKLSAgICAgICAgICAgICAgICBTT0FQMTJCaW5kaW5nIHNvYXAxMkJpbmRpbmcgPSAoU09BUDEyQmluZGluZykgZWxlbWVudEV4dGVuc2libGU7Ci0gICAgICAgICAgICAgICAgaWYgKHN0eWxlLmNvbXBhcmVUb0lnbm9yZUNhc2Uoc29hcDEyQmluZGluZy5nZXRTdHlsZSgpKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3Ioc29hcEJpbmRpbmdBbm5vdGF0aW9uID09IG51bGwgPyB3ZWJTZXJ2aWNlLmdldFBvc2l0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHNvYXBCaW5kaW5nQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX1NPQVBfQklORElOR19TVFlMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7d3NkbExvY2F0aW9uLCBzb2FwMTJCaW5kaW5nLmdldFN0eWxlKCksIHN0eWxlfSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgQW5ub3RhdGlvbk1pcnJvciBnZXRTT0FQQmluZGluZyhUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBBbm5vdGF0aW9uTWlycm9yIHdlYlNlcnZpY2UpIHsKLSAgICAgICAgU3RyaW5nIGVuZHBvaW50SW50ZXJmYWNlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKHdlYlNlcnZpY2UsIEVORFBPSU5UX0lOVEVSRkFDRSk7Ci0gICAgICAgIGlmIChlbmRwb2ludEludGVyZmFjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBUeXBlRGVjbGFyYXRpb24gc2VpRGVjbGFyYXRpb24gPSBlbnZpcm9ubWVudC5nZXRUeXBlRGVjbGFyYXRpb24oZW5kcG9pbnRJbnRlcmZhY2UpOwotICAgICAgICAgICAgaWYgKHNlaURlY2xhcmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0eXBlRGVjbGFyYXRpb24gPSBzZWlEZWNsYXJhdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24odHlwZURlY2xhcmF0aW9uLCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBNZXRob2REZWNsYXJhdGlvbj4gZ2V0V2ViTWV0aG9kcyhUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBBbm5vdGF0aW9uTWlycm9yIHdlYlNlcnZpY2UpIHsKLSAgICAgICAgTWFwPFN0cmluZywgTWV0aG9kRGVjbGFyYXRpb24+IG1ldGhvZE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWV0aG9kRGVjbGFyYXRpb24+KCk7Ci0KLSAgICAgICAgU3RyaW5nIGVuZHBvaW50SW50ZXJmYWNlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKHdlYlNlcnZpY2UsIEVORFBPSU5UX0lOVEVSRkFDRSk7Ci0gICAgICAgIGlmIChlbmRwb2ludEludGVyZmFjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBUeXBlRGVjbGFyYXRpb24gc2VpRGVjbGFyYXRpb24gPSBlbnZpcm9ubWVudC5nZXRUeXBlRGVjbGFyYXRpb24oZW5kcG9pbnRJbnRlcmZhY2UpOwotICAgICAgICAgICAgaWYgKHNlaURlY2xhcmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0eXBlRGVjbGFyYXRpb24gPSBzZWlEZWNsYXJhdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2RzID0gdHlwZURlY2xhcmF0aW9uLmdldE1ldGhvZHMoKTsKLSAgICAgICAgZm9yIChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA6IG1ldGhvZHMpIHsKLSAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViTWV0aG9kID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obWV0aG9kRGVjbGFyYXRpb24sIFdlYk1ldGhvZC5jbGFzcyk7Ci0gICAgICAgICAgICBpZiAod2ViTWV0aG9kICE9IG51bGwgJiYgIWlzRXhsdWRlZCh3ZWJNZXRob2QpKSB7Ci0gICAgICAgICAgICAgICAgbWV0aG9kTWFwLnB1dChnZXRPcGVyYXRpb25OYW1lKHdlYk1ldGhvZCwgbWV0aG9kRGVjbGFyYXRpb24pLCBtZXRob2REZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1ldGhvZE1hcC5wdXQobWV0aG9kRGVjbGFyYXRpb24uZ2V0U2ltcGxlTmFtZSgpLCBtZXRob2REZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1ldGhvZE1hcDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNFeGx1ZGVkKEFubm90YXRpb25NaXJyb3Igd2ViTWV0aG9kKSB7Ci0gICAgICAgIEJvb2xlYW4gZXhjbHVkZSA9IEFubm90YXRpb25VdGlscy5nZXRCb29sZWFuVmFsdWUod2ViTWV0aG9kLCBFWENMVURFKTsKLSAgICAgICAgaWYgKGV4Y2x1ZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGV4Y2x1ZGUuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldE9wZXJhdGlvbk5hbWUoQW5ub3RhdGlvbk1pcnJvciB3ZWJNZXRob2QsIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgIFN0cmluZyBvcGVyYXRpb25OYW1lID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKHdlYk1ldGhvZCwgT1BFUkFUSU9OX05BTUUpOwotICAgICAgICBpZiAob3BlcmF0aW9uTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gb3BlcmF0aW9uTmFtZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWV0aG9kRGVjbGFyYXRpb24uZ2V0U2ltcGxlTmFtZSgpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHByaXZhdGUgU2VydmljZSBnZXRTZXJ2aWNlKERlZmluaXRpb24gZGVmaW5pdGlvbiwgUU5hbWUgc2VydmljZVFOYW1lKSB7Ci0gICAgICAgIE1hcCBzZXJ2aWNlc01hcCA9IGRlZmluaXRpb24uZ2V0U2VydmljZXMoKTsKLSAgICAgICAgU2V0PE1hcC5FbnRyeT4gc2VydmljZXNTZXQgPSBzZXJ2aWNlc01hcC5lbnRyeVNldCgpOwotICAgICAgICBmb3IgKE1hcC5FbnRyeTxRTmFtZSwgU2VydmljZT4gc2VydmljZUVudHJ5IDogc2VydmljZXNTZXQpIHsKLSAgICAgICAgICAgIFFOYW1lIHNlcnZpY2VFbnRyeUtleSA9IHNlcnZpY2VFbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlRW50cnlLZXkuZXF1YWxzKHNlcnZpY2VRTmFtZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZUVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSBQb3J0IGdldFBvcnQoU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgcG9ydE5hbWUpIHsKLSAgICAgICAgTWFwIHBvcnRzTWFwID0gc2VydmljZS5nZXRQb3J0cygpOwotICAgICAgICBTZXQ8TWFwLkVudHJ5PiBwb3J0c1NldCA9IHBvcnRzTWFwLmVudHJ5U2V0KCk7Ci0gICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgUG9ydD4gcG9ydEVudHJ5IDogcG9ydHNTZXQpIHsKLSAgICAgICAgICAgIFN0cmluZyBwb3J0RW50cnlLZXkgPSBwb3J0RW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICBpZiAocG9ydEVudHJ5S2V5LmVxdWFscyhwb3J0TmFtZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcG9ydEVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBRTmFtZSBnZXRTZXJ2aWNlUU5hbWUoQW5ub3RhdGlvbk1pcnJvciB3ZWJTZXJ2aWNlLCBDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24pIHsKLSAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKHdlYlNlcnZpY2UsIFNFUlZJQ0VfTkFNRSk7Ci0gICAgICAgIGlmIChzZXJ2aWNlTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzZXJ2aWNlTmFtZSA9IGNsYXNzRGVjbGFyYXRpb24uZ2V0U2ltcGxlTmFtZSgpICsgU0VSVklDRV9TVUZGSVg7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBRTmFtZShnZXRUYXJnZXROYW1lc3BhY2Uod2ViU2VydmljZSwgY2xhc3NEZWNsYXJhdGlvbiksIHNlcnZpY2VOYW1lKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRQb3J0TmFtZShBbm5vdGF0aW9uTWlycm9yIHdlYlNlcnZpY2UsIENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbikgewotICAgICAgICBTdHJpbmcgcG9ydE5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUod2ViU2VydmljZSwgUE9SVF9OQU1FKTsKLSAgICAgICAgaWYgKHBvcnROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHBvcnROYW1lID0gY2xhc3NEZWNsYXJhdGlvbi5nZXRTaW1wbGVOYW1lKCkgKyBQT1JUX1NVRkZJWDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcG9ydE5hbWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKEFubm90YXRpb25NaXJyb3Igd2ViU2VydmljZSwgQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uKSB7Ci0gICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUod2ViU2VydmljZSwgVEFSR0VUX05BTUVTUEFDRSk7Ci0gICAgICAgIGlmICh0YXJnZXROYW1lc3BhY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gSkRUVXRpbHMuZ2V0VGFyZ2V0TmFtZXNwYWNlRnJvbVBhY2thZ2VOYW1lKAotICAgICAgICAgICAgICAgICAgICBjbGFzc0RlY2xhcmF0aW9uLmdldFBhY2thZ2UoKS5nZXRRdWFsaWZpZWROYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0YXJnZXROYW1lc3BhY2U7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VXZWJTZXJ2aWNlUHJvdmlkZXJDb0V4aXN0UnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlV2ViU2VydmljZVByb3ZpZGVyQ29FeGlzdFJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFhYTc1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VXZWJTZXJ2aWNlUHJvdmlkZXJDb0V4aXN0UnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvbk1pcnJvcjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVdlYlNlcnZpY2VQcm92aWRlckNvRXhpc3RSdWxlIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKCkgewotICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXRUeXBlRGVjbGFyYXRpb24oV2ViU2VydmljZS5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIENvbGxlY3Rpb248RGVjbGFyYXRpb24+IGFubm90YXRlZFR5cGVzID0gZW52aXJvbm1lbnQKLSAgICAgICAgICAgICAgICAuZ2V0RGVjbGFyYXRpb25zQW5ub3RhdGVkV2l0aChhbm5vdGF0aW9uRGVjbGFyYXRpb24pOwotCi0gICAgICAgIGZvciAoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gOiBhbm5vdGF0ZWRUeXBlcykgewotICAgICAgICAgICAgQ29sbGVjdGlvbjxBbm5vdGF0aW9uTWlycm9yPiBhbm5vdGF0aW9uTWlycm9ycyA9IGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25NaXJyb3JzKCk7Ci0KLSAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbk1pcnJvciBtaXJyb3IgOiBhbm5vdGF0aW9uTWlycm9ycykgewotICAgICAgICAgICAgICAgIGNoZWNrV2ViU2VydmljZVByb3ZpZGVyKG1pcnJvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tXZWJTZXJ2aWNlUHJvdmlkZXIoQW5ub3RhdGlvbk1pcnJvciBtaXJyb3IpIHsKLSAgICAgICAgaWYgKG1pcnJvci5nZXRBbm5vdGF0aW9uVHlwZSgpLnRvU3RyaW5nKCkuZXF1YWxzKFdlYlNlcnZpY2VQcm92aWRlci5jbGFzcy5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICBwcmludEZpeGFibGVFcnJvcihtaXJyb3IuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMKLSAgICAgICAgICAgICAgICAgICAgLldFQlNFUlZJQ0VfV0VCU0VSVklDRVBST1ZJREVSX0NPTUJJTkFUSU9OKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL3V0aWxzL0pBWFdTSGFuZGxlclV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS91dGlscy9KQVhXU0hhbmRsZXJVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWE1NzZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL3V0aWxzL0pBWFdTSGFuZGxlclV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Gb3JtYXRQcm9jZXNzb3JzRXh0ZW5zaW9uUmVhZGVyOwotaW1wb3J0IG9yZy5qZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy5qZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmpkb20uSkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuamRvbS5OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmpkb20uaW5wdXQuU0FYQnVpbGRlcjsKLWltcG9ydCBvcmcuamRvbS5vdXRwdXQuWE1MT3V0cHV0dGVyOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSkFYV1NIYW5kbGVyVXRpbHMgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhBTkRMRVJfQ0hBSU5TID0gImhhbmRsZXItY2hhaW5zIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhBTkRMRVJfQ0hBSU4gPSAiaGFuZGxlci1jaGFpbiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIQU5ETEVSID0gImhhbmRsZXIiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEFORExFUl9OQU1FID0gImhhbmRsZXItbmFtZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIQU5ETEVSX0NMQVNTID0gImhhbmRsZXItY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE5hbWVzcGFjZSBKQVZBRUVfTlMgPSBOYW1lc3BhY2UuZ2V0TmFtZXNwYWNlKCJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBKQVhXU0hhbmRsZXJVdGlscygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlSGFuZGxlckNoYWluRmlsZShJUGF0aCBwYXRoLCBTdHJpbmcgaGFuZGxlck5hbWUsIFN0cmluZyBoYW5kbGVyQ2xhc3MpIHsKLSAgICAgICAgSUZpbGUgaGFuZGxlckNoYWluRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLSAgICAgICAgaWYgKCFoYW5kbGVyQ2hhaW5GaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVyQ2hhaW5GaWxlLmNyZWF0ZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbXSB7fSksIHRydWUsIHByb2dyZXNzTW9uaXRvcik7Ci0KLSAgICAgICAgICAgICAgICBFbGVtZW50IGhhbmRsZXJDaGFpbnNFbGVtZW50ID0gbmV3IEVsZW1lbnQoSEFORExFUl9DSEFJTlMpOwotICAgICAgICAgICAgICAgIGhhbmRsZXJDaGFpbnNFbGVtZW50LnNldE5hbWVzcGFjZShKQVZBRUVfTlMpOwotCi0gICAgICAgICAgICAgICAgRWxlbWVudCBoYW5kbGVyQ2hhaW5FbGVtZW50ID0gbmV3IEVsZW1lbnQoSEFORExFUl9DSEFJTiwgSkFWQUVFX05TKTsKLSAgICAgICAgICAgICAgICBFbGVtZW50IGhhbmRsZXJFbGVtZW50ID0gbmV3IEVsZW1lbnQoSEFORExFUiwgSkFWQUVFX05TKTsKLQotICAgICAgICAgICAgICAgIEVsZW1lbnQgaGFuZGxlck5hbWVFbGVtZW50ID0gbmV3IEVsZW1lbnQoSEFORExFUl9OQU1FLCBKQVZBRUVfTlMpOwotICAgICAgICAgICAgICAgIGhhbmRsZXJOYW1lRWxlbWVudC5zZXRUZXh0KGhhbmRsZXJOYW1lKTsKLQotICAgICAgICAgICAgICAgIEVsZW1lbnQgaGFuZGxlckNsYXNzRWxlbWVudCA9IG5ldyBFbGVtZW50KEhBTkRMRVJfQ0xBU1MsIEpBVkFFRV9OUyk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlckNsYXNzRWxlbWVudC5zZXRUZXh0KGhhbmRsZXJDbGFzcyk7Ci0KLSAgICAgICAgICAgICAgICBoYW5kbGVyRWxlbWVudC5hZGRDb250ZW50KGhhbmRsZXJOYW1lRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlckVsZW1lbnQuYWRkQ29udGVudChoYW5kbGVyQ2xhc3NFbGVtZW50KTsKLQotICAgICAgICAgICAgICAgIGhhbmRsZXJDaGFpbkVsZW1lbnQuYWRkQ29udGVudChoYW5kbGVyRWxlbWVudCk7Ci0KLSAgICAgICAgICAgICAgICBoYW5kbGVyQ2hhaW5zRWxlbWVudC5hZGRDb250ZW50KGhhbmRsZXJDaGFpbkVsZW1lbnQpOwotCi0gICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBuZXcgRG9jdW1lbnQoaGFuZGxlckNoYWluc0VsZW1lbnQpOwotICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShoYW5kbGVyQ2hhaW5GaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCkpOwotICAgICAgICAgICAgICAgIFhNTE91dHB1dHRlciBvdXRwdXR0ZXIgPSBuZXcgWE1MT3V0cHV0dGVyKCk7Ci0gICAgICAgICAgICAgICAgb3V0cHV0dGVyLm91dHB1dChkb2N1bWVudCwgb3V0cHV0U3RyZWFtKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVyQ2hhaW5GaWxlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgICAgICAgICBmb3JtYXRYTUxGaWxlKGhhbmRsZXJDaGFpbkZpbGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2coY2UpOwotICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpIHsKLSAgICAgICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKGZuZmUpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhpb2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZUhhbmRsZXJDaGFpbkZpbGUoSVBhdGggcGF0aCkgewotICAgICAgICBJRmlsZSBoYW5kbGVyQ2hhaW5GaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotICAgICAgICBpZiAoIWhhbmRsZXJDaGFpbkZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotICAgICAgICAgICAgICAgIGhhbmRsZXJDaGFpbkZpbGUuY3JlYXRlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVtdIHt9KSwgdHJ1ZSwgcHJvZ3Jlc3NNb25pdG9yKTsKLQotICAgICAgICAgICAgICAgIEVsZW1lbnQgaGFuZGxlckNoYWluc0VsZW1lbnQgPSBuZXcgRWxlbWVudChIQU5ETEVSX0NIQUlOUyk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlckNoYWluc0VsZW1lbnQuc2V0TmFtZXNwYWNlKEpBVkFFRV9OUyk7Ci0KLSAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG5ldyBEb2N1bWVudChoYW5kbGVyQ2hhaW5zRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGhhbmRsZXJDaGFpbkZpbGUuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKSk7Ci0gICAgICAgICAgICAgICAgWE1MT3V0cHV0dGVyIG91dHB1dHRlciA9IG5ldyBYTUxPdXRwdXR0ZXIoKTsKLSAgICAgICAgICAgICAgICBvdXRwdXR0ZXIub3V0cHV0KGRvY3VtZW50LCBvdXRwdXRTdHJlYW0pOwotICAgICAgICAgICAgICAgIGhhbmRsZXJDaGFpbkZpbGUucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9PTkUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICAgICAgICAgIGZvcm1hdFhNTEZpbGUoaGFuZGxlckNoYWluRmlsZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhjZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5mZSkgewotICAgICAgICAgICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2coZm5mZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKGlvZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkSGFuZGxlclRvSGFuZGxlckNoYWluKElQYXRoIHBhdGgsIFN0cmluZyBoYW5kbGVyTmFtZSwgU3RyaW5nIGhhbmRsZXJDbGFzcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJRmlsZSBoYW5kbGVyQ2hhaW5GaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotICAgICAgICBpZiAoaGFuZGxlckNoYWluRmlsZS5leGlzdHMoKSAmJiBoYW5kbGVyQ2hhaW5GaWxlLmlzQWNjZXNzaWJsZSgpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGhhbmRsZXJJbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oaGFuZGxlckNoYWluRmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpKTsKLSAgICAgICAgICAgICAgICBTQVhCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU0FYQnVpbGRlcigpOwotICAgICAgICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gYnVpbGRlci5idWlsZChoYW5kbGVySW5wdXRTdHJlYW0pOwotICAgICAgICAgICAgICAgIEVsZW1lbnQgcm9vdCA9IGRvY3VtZW50LmdldFJvb3RFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgICAgICBFbGVtZW50IGhhbmRsZXJDaGFpbkVsZW1lbnQgPSByb290LmdldENoaWxkKEhBTkRMRVJfQ0hBSU4sIEpBVkFFRV9OUyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaGFuZGxlckNoYWluRWxlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZXJDaGFpbkVsZW1lbnQgPSBuZXcgRWxlbWVudChIQU5ETEVSX0NIQUlOLCBKQVZBRUVfTlMpOwotICAgICAgICAgICAgICAgICAgICByb290LmFkZENvbnRlbnQoaGFuZGxlckNoYWluRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgRWxlbWVudCBoYW5kbGVyRWxlbWVudCA9IG5ldyBFbGVtZW50KEhBTkRMRVIsIEpBVkFFRV9OUyk7Ci0KLSAgICAgICAgICAgICAgICBFbGVtZW50IGhhbmRsZXJOYW1lRWxlbWVudCA9IG5ldyBFbGVtZW50KEhBTkRMRVJfTkFNRSwgSkFWQUVFX05TKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVyTmFtZUVsZW1lbnQuc2V0VGV4dChoYW5kbGVyTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICBFbGVtZW50IGhhbmRsZXJDbGFzc0VsZW1lbnQgPSBuZXcgRWxlbWVudChIQU5ETEVSX0NMQVNTLCBKQVZBRUVfTlMpOwotICAgICAgICAgICAgICAgIGhhbmRsZXJDbGFzc0VsZW1lbnQuc2V0VGV4dChoYW5kbGVyQ2xhc3MpOwotCi0gICAgICAgICAgICAgICAgaGFuZGxlckVsZW1lbnQuYWRkQ29udGVudChoYW5kbGVyTmFtZUVsZW1lbnQpOwotICAgICAgICAgICAgICAgIGhhbmRsZXJFbGVtZW50LmFkZENvbnRlbnQoaGFuZGxlckNsYXNzRWxlbWVudCk7Ci0KLSAgICAgICAgICAgICAgICBoYW5kbGVyQ2hhaW5FbGVtZW50LmFkZENvbnRlbnQoaGFuZGxlckVsZW1lbnQpOwotCi0gICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGhhbmRsZXJDaGFpbkZpbGUuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKSk7Ci0gICAgICAgICAgICAgICAgWE1MT3V0cHV0dGVyIG91dHB1dHRlciA9IG5ldyBYTUxPdXRwdXR0ZXIoKTsKLSAgICAgICAgICAgICAgICBvdXRwdXR0ZXIub3V0cHV0KGRvY3VtZW50LCBvdXRwdXRTdHJlYW0pOwotICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpIHsKLSAgICAgICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKGZuZmUpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhpb2UpOwotICAgICAgICAgICAgfSBjYXRjaCAoSkRPTUV4Y2VwdGlvbiBqZG9tZSkgewotICAgICAgICAgICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2coamRvbWUpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAvL1RPRE8gQ2xvc2Ugc3RyZWFtcwotICAgICAgICAgICAgICAgIGhhbmRsZXJDaGFpbkZpbGUucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9PTkUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICAgICAgICAgIGZvcm1hdFhNTEZpbGUoaGFuZGxlckNoYWluRmlsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVEb2N1bWVudFRvRmlsZShJUGF0aCBmaWxlUGF0aCwgRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSUZpbGUgaGFuZGxlckNoYWluRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShmaWxlUGF0aCk7Ci0gICAgICAgIGlmIChoYW5kbGVyQ2hhaW5GaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChpc0hhbmRsZXJDaGFpbkZpbGUoaGFuZGxlckNoYWluRmlsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShoYW5kbGVyQ2hhaW5GaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgWE1MT3V0cHV0dGVyIG91dHB1dHRlciA9IG5ldyBYTUxPdXRwdXR0ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dHRlci5vdXRwdXQoZG9jdW1lbnQsIG91dHB1dFN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyQ2hhaW5GaWxlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdFhNTEZpbGUoaGFuZGxlckNoYWluRmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2coaW9lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0hhbmRsZXJEZWZpbmVkKElGaWxlIGhhbmRsZXJDaGFpbkZpbGUsIFN0cmluZyBoYW5kbGVyTmFtZSwgU3RyaW5nIGhhbmRsZXJDbGFzcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGlzSGFuZGxlckNoYWluRmlsZShoYW5kbGVyQ2hhaW5GaWxlKSkgewotICAgICAgICAgICAgU0FYQnVpbGRlciBidWlsZGVyID0gbmV3IFNBWEJ1aWxkZXIoKTsKLSAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBoYW5kbGVyQ2hhaW5JbnB1dFN0ZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShoYW5kbGVyQ2hhaW5GaWxlLmdldExvY2F0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgLnRvRmlsZSgpKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gYnVpbGRlci5idWlsZChoYW5kbGVyQ2hhaW5JbnB1dFN0ZWFtKTsKLSAgICAgICAgICAgICAgICBFbGVtZW50IHJvb3QgPSBkb2MuZ2V0Um9vdEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBMaXN0PEVsZW1lbnQ+IGhhbmRsZXJDaGFpbnMgPSByb290LmdldENoaWxkcmVuKEhBTkRMRVJfQ0hBSU4sIEpBVkFFRV9OUyk7Ci0gICAgICAgICAgICAgICAgZm9yIChFbGVtZW50IGhhbmRsZXJDaGFpbiA6IGhhbmRsZXJDaGFpbnMpIHsKLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBoYW5kbGVyID0gaGFuZGxlckNoYWluLmdldENoaWxkKEhBTkRMRVIsIEpBVkFFRV9OUyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgaGFuZGxlck5hbWVFbGVtZW50ID0gaGFuZGxlci5nZXRDaGlsZChIQU5ETEVSX05BTUUsIEpBVkFFRV9OUyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGhhbmRsZXJDbGFzc0VsZW1lbnQgPSBoYW5kbGVyLmdldENoaWxkKEhBTkRMRVJfQ0xBU1MsIEpBVkFFRV9OUyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyTmFtZUVsZW1lbnQgIT0gbnVsbCAmJiBoYW5kbGVyTmFtZUVsZW1lbnQuZ2V0VGV4dCgpLmVxdWFscyhoYW5kbGVyTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaGFuZGxlckNsYXNzRWxlbWVudCAhPSBudWxsICYmIGhhbmRsZXJDbGFzc0VsZW1lbnQuZ2V0VGV4dCgpLmVxdWFscyhoYW5kbGVyQ2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChKRE9NRXhjZXB0aW9uIGpkb21lKSB7Ci0gICAgICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhqZG9tZSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGhhbmRsZXJDaGFpbklucHV0U3RlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSGFuZGxlckNoYWluRmlsZShJRmlsZSBoYW5kbGVyQ2hhaW5GaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoaGFuZGxlckNoYWluRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGhhbmRsZXJDaGFpbklucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShoYW5kbGVyQ2hhaW5GaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCkpOwotICAgICAgICAgICAgaWYgKGhhbmRsZXJDaGFpbklucHV0U3RyZWFtLmF2YWlsYWJsZSgpID4gMCkgewotICAgICAgICAgICAgICAgIFNBWEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTQVhCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gYnVpbGRlci5idWlsZChoYW5kbGVyQ2hhaW5JbnB1dFN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgcm9vdCA9IGRvYy5nZXRSb290RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocm9vdC5nZXROYW1lKCkuZXF1YWxzKEhBTkRMRVJfQ0hBSU5TKSAmJiByb290LmdldE5hbWVzcGFjZSgpLmVxdWFscyhKQVZBRUVfTlMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEpET01FeGNlcHRpb24gamRvbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhqZG9tZSk7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlckNoYWluSW5wdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmb3JtYXRYTUxGaWxlKElGaWxlIGZpbGUpIHsKLSAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IGZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnREZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gY29udGVudERlc2NyaXB0aW9uLmdldENvbnRlbnRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgZm9ybWF0UHJvY2Vzc29yID0gRm9ybWF0UHJvY2Vzc29yc0V4dGVuc2lvblJlYWRlci5nZXRJbnN0YW5jZSgpCi0gICAgICAgICAgICAgICAgLmdldEZvcm1hdFByb2Nlc3Nvcihjb250ZW50VHlwZS5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICBpZiAoZm9ybWF0UHJvY2Vzc29yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0UHJvY2Vzc29yLmZvcm1hdEZpbGUoZmlsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2coY2UuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhpb2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS91dGlscy9KQVhXU1V0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS91dGlscy9KQVhXU1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxZTBkZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvdXRpbHMvSkFYV1NVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlVzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVQbHVnaW47Ci0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSkFYV1NVdGlscyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT04gPSAiYWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSRyA9ICJhcmciOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfTkFNRSA9ICJjbGFzc05hbWUiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9UX0NIQVJBQ1RFUiA9ICIuIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVORFBPSU5UX0lOVEVSRkFDRSA9ICJlbmRwb2ludEludGVyZmFjZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENMVURFID0gImV4Y2x1ZGUiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFVTFRfQkVBTiA9ICJmYXVsdEJlYW4iOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklOQUxJWkUgPSAiZmluYWxpemUiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSID0gImhlYWRlciI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhXU19TVUJQQUNLQUdFID0gImpheHdzIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMX05BTUUgPSAibG9jYWxOYW1lIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PREUgPSAibW9kZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRVJBVElPTl9OQU1FID0gIm9wZXJhdGlvbk5hbWUiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX1NUWUxFID0gInBhcmFtZXRlclN0eWxlIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlRfTkFNRSA9ICJwYXJ0TmFtZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUX05BTUUgPSAicG9ydE5hbWUiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9SVF9TVUZGSVggPSAiUG9ydCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNQT05TRSA9ICJSZXNwb25zZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNQT05TRV9TVUZGSVggPSAiUmVzcG9uc2UiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVUVVJOID0gInJldHVybiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX05BTUUgPSAic2VydmljZU5hbWUiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9TVUZGSVggPSAiU2VydmljZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFlMRSA9ICJzdHlsZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfTkFNRVNQQUNFID0gInRhcmdldE5hbWVzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUlVFID0gInRydWUiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRSA9ICJ1c2UiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9MT0NBVElPTiA9ICJ3c2RsTG9jYXRpb24iOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUUgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIEpBWFdTVXRpbHMoKSB7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RvY3VtZW50QmFyZShBbm5vdGF0aW9uTWlycm9yIG1pcnJvcikgewotICAgICAgICBTdHJpbmcgc3R5bGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUobWlycm9yLCBTVFlMRSk7Ci0gICAgICAgIFN0cmluZyB1c2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUobWlycm9yLCBVU0UpOwotICAgICAgICBTdHJpbmcgcGFyYW1ldGVyU3R5bGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUobWlycm9yLCBQQVJBTUVURVJfU1RZTEUpOwotCi0gICAgICAgIHJldHVybiBKQVhXU1V0aWxzLmlzRG9jdW1lbnRCYXJlKHN0eWxlLCB1c2UsIHBhcmFtZXRlclN0eWxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEb2N1bWVudEJhcmUoSUFubm90YXRpb24gYW5ub3RhdGlvbikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIHN0eWxlID0gQW5ub3RhdGlvblV0aWxzLmdldEVudW1WYWx1ZShhbm5vdGF0aW9uLCBTVFlMRSk7Ci0gICAgICAgICAgICBTdHJpbmcgdXNlID0gQW5ub3RhdGlvblV0aWxzLmdldEVudW1WYWx1ZShhbm5vdGF0aW9uLCBVU0UpOwotICAgICAgICAgICAgU3RyaW5nIHBhcmFtZXRlclN0eWxlID0gQW5ub3RhdGlvblV0aWxzLmdldEVudW1WYWx1ZShhbm5vdGF0aW9uLCBQQVJBTUVURVJfU1RZTEUpOwotICAgICAgICAgICAgcmV0dXJuIEpBWFdTVXRpbHMuaXNEb2N1bWVudEJhcmUoc3R5bGUsIHVzZSwgcGFyYW1ldGVyU3R5bGUpOwotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEb2N1bWVudEJhcmUob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gYW5ub3RhdGlvbikgewotICAgICAgICBTdHJpbmcgc3R5bGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0RW51bVZhbHVlKGFubm90YXRpb24sIFNUWUxFKTsKLSAgICAgICAgU3RyaW5nIHVzZSA9IEFubm90YXRpb25VdGlscy5nZXRFbnVtVmFsdWUoYW5ub3RhdGlvbiwgVVNFKTsKLSAgICAgICAgU3RyaW5nIHBhcmFtZXRlclN0eWxlID0gQW5ub3RhdGlvblV0aWxzLmdldEVudW1WYWx1ZShhbm5vdGF0aW9uLCBQQVJBTUVURVJfU1RZTEUpOwotCi0gICAgICAgIHJldHVybiBKQVhXU1V0aWxzLmlzRG9jdW1lbnRCYXJlKHN0eWxlLCB1c2UsIHBhcmFtZXRlclN0eWxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEb2N1bWVudEJhcmUoU3RyaW5nIHN0eWxlLCBTdHJpbmcgdXNlLCBTdHJpbmcgcGFyYW1ldGVyU3R5bGUpIHsKLSAgICAgICAgcmV0dXJuIChzdHlsZSA9PSBudWxsIHx8IHN0eWxlLmVxdWFscyhTdHlsZS5ET0NVTUVOVC5uYW1lKCkpKQotICAgICAgICAgICAgICAgICYmICh1c2UgPT0gbnVsbCB8fCB1c2UuZXF1YWxzKFVzZS5MSVRFUkFMLm5hbWUoKSkpCi0gICAgICAgICAgICAgICAgJiYgKHBhcmFtZXRlclN0eWxlICE9IG51bGwgJiYgcGFyYW1ldGVyU3R5bGUuZXF1YWxzKFBhcmFtZXRlclN0eWxlLkJBUkUubmFtZSgpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRG9jdW1lbnRXcmFwcGVkKEFubm90YXRpb25NaXJyb3IgbWlycm9yKSB7Ci0gICAgICAgIFN0cmluZyBzdHlsZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShtaXJyb3IsIFNUWUxFKTsKLSAgICAgICAgU3RyaW5nIHVzZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShtaXJyb3IsIFVTRSk7Ci0gICAgICAgIFN0cmluZyBwYXJhbWV0ZXJTdHlsZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShtaXJyb3IsIFBBUkFNRVRFUl9TVFlMRSk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gSkFYV1NVdGlscy5pc0RvY3VtZW50V3JhcHBlZChzdHlsZSwgdXNlLCBwYXJhbWV0ZXJTdHlsZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RvY3VtZW50V3JhcHBlZChJQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgc3R5bGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0RW51bVZhbHVlKGFubm90YXRpb24sIFNUWUxFKTsKLSAgICAgICAgICAgIFN0cmluZyB1c2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0RW51bVZhbHVlKGFubm90YXRpb24sIFVTRSk7Ci0gICAgICAgICAgICBTdHJpbmcgcGFyYW1ldGVyU3R5bGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0RW51bVZhbHVlKGFubm90YXRpb24sIFBBUkFNRVRFUl9TVFlMRSk7Ci0gICAgICAgICAgICByZXR1cm4gSkFYV1NVdGlscy5pc0RvY3VtZW50V3JhcHBlZChzdHlsZSwgdXNlLCBwYXJhbWV0ZXJTdHlsZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRG9jdW1lbnRXcmFwcGVkKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLSAgICAgICAgU3RyaW5nIHN0eWxlID0gQW5ub3RhdGlvblV0aWxzLmdldEVudW1WYWx1ZShhbm5vdGF0aW9uLCBTVFlMRSk7Ci0gICAgICAgIFN0cmluZyB1c2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0RW51bVZhbHVlKGFubm90YXRpb24sIFVTRSk7Ci0gICAgICAgIFN0cmluZyBwYXJhbWV0ZXJTdHlsZSA9IEFubm90YXRpb25VdGlscy5nZXRFbnVtVmFsdWUoYW5ub3RhdGlvbiwgUEFSQU1FVEVSX1NUWUxFKTsKLQotICAgICAgICByZXR1cm4gSkFYV1NVdGlscy5pc0RvY3VtZW50V3JhcHBlZChzdHlsZSwgdXNlLCBwYXJhbWV0ZXJTdHlsZSk7Ci0gICAgfQotCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRG9jdW1lbnRXcmFwcGVkKFN0cmluZyBzdHlsZSwgU3RyaW5nIHVzZSwgU3RyaW5nIHBhcmFtZXRlclN0eWxlKSB7Ci0gICAgICAgIHJldHVybiAoc3R5bGUgPT0gbnVsbCB8fCBzdHlsZS5lcXVhbHMoU3R5bGUuRE9DVU1FTlQubmFtZSgpKSkKLSAgICAgICAgICAgICAgICAmJiAodXNlID09IG51bGwgfHwgdXNlLmVxdWFscyhVc2UuTElURVJBTC5uYW1lKCkpKQotICAgICAgICAgICAgICAgICYmIChwYXJhbWV0ZXJTdHlsZSA9PSBudWxsIHx8IHBhcmFtZXRlclN0eWxlLmVxdWFscyhQYXJhbWV0ZXJTdHlsZS5XUkFQUEVELm5hbWUoKSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBnaXZlbiB7QGxpbmsgSU1ldGhvZH0gdG8gc2VlIGlmIGl0IGlzIGFuIG92ZXJsb2FkZWQgbWV0aG9kLiBJZiBpdCBpcyBpdCB3aWxsIHJldHVybgotICAgICAqIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcG9zaXRpb24gb2YgdGhpcyBtZXRob2QgaW4gaXQncyBwYXJlbnRzIHtAbGluayBJVHlwZX0uCi0gICAgICogPHA+Ci0gICAgICogRS5nLiBHaXZlbiB0aHJlZSBtZXRob2RzOgotICAgICAqIDxwcmU+Ci0gICAgICogcHVibGljIHZvaWQgbXlNZXRob2QoLi4uKTsKLSAgICAgKiBwdWJsaWMgdm9pZCBteU1ldGhvZCguLi4pOwotICAgICAqIHB1YmxpYyB2b2lkIG15TWV0aG9kKC4uLik7Ci0gICAgICogPC9wcmU+Ci0gICAgICogVGhlIGZpcnN0IG1ldGhvZCB3b3VsZCByZXR1cm4gYSBibGFuayBzdHJpbmcsIHRoZSBzZWNvbmQgd291bGQgcmV0dXJuIHRoZSBzdHJpbmcgIjEiIGFuZCB0aGUgdGhpcmQKLSAgICAgKiB3b3VsZCByZXR1cm4gdGhlIHN0cmluZyAiMiIuCi0gICAgICogPC9wPgotICAgICAqIEBwYXJhbSBtZXRob2QgdGhlIG1ldGhvZCB0byB0ZXN0Ci0gICAgICogQHJldHVybiBhIHN0cmluZyB2YWx1ZQotICAgICAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIHRocm93biBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyB0aGUgdW5kZXJseWluZyByZXNvdXJjZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjY291bnRGb3JPdmVybG9hZGVkTWV0aG9kcyhJTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgCUlUeXBlIHR5cGUgPSBtZXRob2QuZ2V0RGVjbGFyaW5nVHlwZSgpOwotICAgIAlpZiAodHlwZSA9PSBudWxsKSB7Ci0gICAgCQlyZXR1cm4gIiI7Ci0gICAgCX0KLSAgICAgICAgTGlzdDxJTWV0aG9kPiBtZXRob2RzID0gIEFycmF5cy5hc0xpc3QodHlwZS5nZXRNZXRob2RzKCkpOwotICAgICAgICBMaXN0PElNZXRob2Q+IHNpbWlsYXJNZXRob2RzID0gbmV3IEFycmF5TGlzdDxJTWV0aG9kPigpOwotICAgICAgICBmb3IgKElNZXRob2QgbWV0aG9kVG9UZXN0IDogbWV0aG9kcykgewotICAgICAgICAgICAgaWYgKCFtZXRob2QuZXF1YWxzKG1ldGhvZFRvVGVzdCkgJiYgbWV0aG9kLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgKLSAgICAgICAgICAgICAgICAgICAgbWV0aG9kVG9UZXN0LmdldEVsZW1lbnROYW1lKCkpICYmIG1ldGhvZFRvVGVzdC5nZXRTb3VyY2VSYW5nZSgpLmdldE9mZnNldCgpIDwKLSAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmdldFNvdXJjZVJhbmdlKCkuZ2V0T2Zmc2V0KCkpIHsKLSAgICAgICAgICAgICAgICBzaW1pbGFyTWV0aG9kcy5hZGQobWV0aG9kVG9UZXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2ltaWxhck1ldGhvZHMuc2l6ZSgpID4gMCA/IEludGVnZXIudG9TdHJpbmcoc2ltaWxhck1ldGhvZHMuc2l6ZSgpKSA6ICIiOyAvLyROT04tTkxTLTEkCi0gICAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9KRFRVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvSkRUVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRkMjlkOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9KRFRVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5GbGFnczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29udmVudGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZVBsdWdpbjsKLQotLyoqCi0gKiBKRFQgVXRpbGl0eSBjbGFzcy4KLSAqIDxwPgotICogPHN0cm9uZz5Qcm92aXNpb25hbCBBUEk6PC9zdHJvbmc+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlcgotICogZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0Ci0gKiB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzCi0gKiB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBKRFRVdGlscyB7Ci0KLSAgICBwcml2YXRlIEpEVFV0aWxzKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhIDxjb2RlPklDbGFzc3BhdGhFbnRyeTwvY29kZT4gdG8gYSA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+Ci0gICAgICogQHBhcmFtIGphdmFQcm9qZWN0IHRoZSA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+IHRvIGFkZCB0aGUgY2xhc3NwYXRoIGVudHJ5IHRvCi0gICAgICogQHBhcmFtIGNsYXNzcGF0aEVudHJ5IHRoZSA8Y29kZT5JQ2xhc3NwYXRoRW50cnk8L2NvZGU+IHRvIGFkZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRUb0NsYXNzcGF0aChJSmF2YVByb2plY3QgamF2YVByb2plY3QsIElDbGFzc3BhdGhFbnRyeSBjbGFzc3BhdGhFbnRyeSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTGlzdDxJQ2xhc3NwYXRoRW50cnk+IGN1cnJlbnRFbnRyaWVzID0gQXJyYXlzLmFzTGlzdChqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKSk7Ci0gICAgICAgICAgICBMaXN0PElDbGFzc3BhdGhFbnRyeT4gbmV3RW50cmllcyA9IG5ldyBBcnJheUxpc3Q8SUNsYXNzcGF0aEVudHJ5PigpOwotICAgICAgICAgICAgbmV3RW50cmllcy5hZGRBbGwoY3VycmVudEVudHJpZXMpOwotICAgICAgICAgICAgaWYgKGNsYXNzcGF0aEVudHJ5ICE9IG51bGwgJiYgIW5ld0VudHJpZXMuY29udGFpbnMoY2xhc3NwYXRoRW50cnkpKSB7Ci0gICAgICAgICAgICAgICAgbmV3RW50cmllcy5hZGQoY2xhc3NwYXRoRW50cnkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld0VudHJpZXMudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5W25ld0VudHJpZXMuc2l6ZSgpXSksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgYSA8Y29kZT5JQ2xhc3NwYXRoRW50cnk8L2NvZGU+IGZyb20gYSA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+Ci0gICAgICogQHBhcmFtIGphdmFQcm9qZWN0IHRoZSA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+IHRvIHJlbW92ZSB0aGUgY2xhc3NwYXRoIGVudHJ5IGZyb20KLSAgICAgKiBAcGFyYW0gY2xhc3NwYXRoRW50cnkgdGhlIDxjb2RlPklDbGFzc3BhdGhFbnRyeTwvY29kZT4gdG8gcmVtb3ZlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUZyb21DbGFzc3BhdGgoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBJQ2xhc3NwYXRoRW50cnkgY2xhc3NwYXRoRW50cnkpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIExpc3Q8SUNsYXNzcGF0aEVudHJ5PiBjdXJyZW50RW50cmllcyA9IEFycmF5cy5hc0xpc3QoamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCkpOwotICAgICAgICAgICAgTGlzdDxJQ2xhc3NwYXRoRW50cnk+IG5ld0VudHJpZXMgPSBuZXcgQXJyYXlMaXN0PElDbGFzc3BhdGhFbnRyeT4oKTsKLSAgICAgICAgICAgIG5ld0VudHJpZXMuYWRkQWxsKGN1cnJlbnRFbnRyaWVzKTsKLSAgICAgICAgICAgIGlmIChjbGFzc3BhdGhFbnRyeSAhPSBudWxsICYmIG5ld0VudHJpZXMuY29udGFpbnMoY2xhc3NwYXRoRW50cnkpKSB7Ci0gICAgICAgICAgICAgICAgbmV3RW50cmllcy5yZW1vdmUoY2xhc3NwYXRoRW50cnkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld0VudHJpZXMudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5W25ld0VudHJpZXMuc2l6ZSgpXSksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBKYXZhIHByb2plY3QgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gcHJvamVjdCBuYW1lLgotICAgICAqIEBwYXJhbSBwcm9qZWN0TmFtZSB0aGUgcHJvamVjdCBuYW1lCi0gICAgICogQHJldHVybiB0aGUgSmF2YSBwcm9qZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHByb2plY3QgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgewotICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgcmV0dXJuIEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIGluIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSBvZiB0aGUgZGVmYXVsdCBvdXRwdXQgbG9jYXRpb24gZm9yIHRoZSBnaXZlbiBqYXZhIHByb2plY3QuCi0gICAgICogQHBhcmFtIGphdmFQcm9qZWN0IHRoZSBqYXZhIHByb2plY3QKLSAgICAgKiBAcmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBkZWZhdWx0IG91dHB1dCBmb2xkZXIgZm9yIHRoZSBnaXZlbiBqYXZhIHByb2plY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElQYXRoIGdldEphdmFQcm9qZWN0T3V0cHV0RGlyZWN0b3J5UGF0aChJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIoamF2YVByb2plY3QuZ2V0T3V0cHV0TG9jYXRpb24oKSkuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIoamF2YVByb2plY3QuZ2V0UGF0aCgpKS5nZXRMb2NhdGlvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFic29sdXRlIHBhdGggaW4gdGhlIGxvY2FsIGZpbGUgc3lzdGVtIG9mIHRoZSBkZWZhdWx0IG91dHB1dCBsb2NhdGlvbiBmb3IgdGhlIGdpdmVuIGphdmEgcHJvamVjdCBuYW1lLgotICAgICAqIEBwYXJhbSBwcm9qZWN0TmFtZSB0aGUgbmFtZSBvZiB0aGUgamF2YSBwcm9qZWN0Ci0gICAgICogQHJldHVybiAgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGRlZmF1bHQgb3V0cHV0IGZvbGRlciBmb3IgdGhlIGdpdmVuIGphdmEgcHJvamVjdCBuYW1lCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJUGF0aCBnZXRKYXZhUHJvamVjdE91dHB1dERpcmVjdG9yeVBhdGgoU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0gICAgICAgIHJldHVybiBKRFRVdGlscy5nZXRKYXZhUHJvamVjdE91dHB1dERpcmVjdG9yeVBhdGgoSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QocHJvamVjdE5hbWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmdWxsLCBhYnNvbHV0ZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSB3b3Jrc3BhY2Ugb2YgdGhlIHNvdXJjZSBmb2xkZXIgdGhhdCBjb250YWlucyB0aGUgZ2l2ZW4gdHlwZS4KLSAgICAgKiBAcGFyYW0gdHlwZSB0aGUgPGNvZGU+SVR5cGU8L2NvZGU+Ci0gICAgICogQHJldHVybiB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZ2l2ZW4gPGNvZGU+SVR5cGU8L2NvZGU+IHNvdXJjZSBmb2xkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElQYXRoIGdldEphdmFQcm9qZWN0U291cmNlRGlyZWN0b3J5UGF0aChJVHlwZSB0eXBlKSB7Ci0gICAgICAgIElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50ID0gdHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKTsKLSAgICAgICAgSVBhY2thZ2VGcmFnbWVudFJvb3QgcGFja2FnZUZyYWdtZW50Um9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgcGFja2FnZUZyYWdtZW50LmdldFBhcmVudCgpOwotICAgICAgICBJUmVzb3VyY2Ugc3JjRGlyZWN0b3J5UmVzb3VyY2UgPSBwYWNrYWdlRnJhZ21lbnRSb290LmdldFJlc291cmNlKCk7Ci0gICAgICAgIHJldHVybiBzcmNEaXJlY3RvcnlSZXNvdXJjZS5nZXRGdWxsUGF0aCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZ1bGwsIGFic29sdXRlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHdvcmtzcGFjZSBvZiB0aGUgZmlyc3Qgc291cmNlIGZvbGRlciBmb3VuZCBpbiB0aGUgamF2YSBwcm9qZWN0IHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAgICogQHBhcmFtIHByb2plY3ROYW1lIHRoZSBuYW1lIG9mIHRoZSBqYXZhIHByb2plY3QKLSAgICAgKiBAcmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBmaXJzdCBzb3VyY2UgZm9sZGVyIGZvdW5kIGluIHRoZSBqYXZhIHByb2plY3Qgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElQYXRoIGdldEphdmFQcm9qZWN0U291cmNlRGlyZWN0b3J5UGF0aChTdHJpbmcgcHJvamVjdE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIEpEVFV0aWxzLmdldEphdmFQcm9qZWN0U291cmNlRGlyZWN0b3J5UGF0aChKRFRVdGlscy5nZXRKYXZhUHJvamVjdChwcm9qZWN0TmFtZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZ1bGwsIGFic29sdXRlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHdvcmtzcGFjZSBvZiB0aGUgZmlyc3Qgc291cmNlIGZvbGRlciBmb3VuZCBpbiB0aGUgZ2l2ZW4gamF2YSBwcm9qZWN0LgotICAgICAqIEBwYXJhbSBqYXZhUHJvamVjdCB0aGUgPGNvZGU+SUphdmFQcm9qZWN0PC9jb2RlPgotICAgICAqIEByZXR1cm4gdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGZpcnN0IHNvdXJjZSBmb2xkZXIgZm91bmQgaW4gdGhlIGdpdmVuIGphdmEgcHJvamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElQYXRoIGdldEphdmFQcm9qZWN0U291cmNlRGlyZWN0b3J5UGF0aChJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElQYWNrYWdlRnJhZ21lbnRSb290W10gcGFja2FnZUZyYWdtZW50Um9vdHMgPSBqYXZhUHJvamVjdC5nZXRBbGxQYWNrYWdlRnJhZ21lbnRSb290cygpOwotICAgICAgICAgICAgSVBhY2thZ2VGcmFnbWVudFJvb3QgcGFja2FnZUZyYWdtZW50Um9vdCA9IHBhY2thZ2VGcmFnbWVudFJvb3RzWzBdOwotICAgICAgICAgICAgSVJlc291cmNlIHNyY0RpcmVjdG9yeVJlc291cmNlID0gcGFja2FnZUZyYWdtZW50Um9vdC5nZXRSZXNvdXJjZSgpOwotICAgICAgICAgICAgcmV0dXJuIHNyY0RpcmVjdG9yeVJlc291cmNlLmdldEZ1bGxQYXRoKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFBhdGgoIiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoZSBnaXZlbiA8Y29kZT5JVHlwZTwvY29kZT4gaXMgYW4gaW50ZXJmYWNlIGFsbCBtZXRob2RzIGRlY2xhcmVkIGluIHRoYXQgaW50ZXJmYWNlIGFyZSByZXR1cm5lZC4KLSAgICAgKiA8cD4KLSAgICAgKiBBbHRlcm5hdGl2ZWx5IGlmIHRoZSBnaXZlbiBnaXZlbiA8Y29kZT5JVHlwZTwvY29kZT4gaXMgYSBjbGFzcywgb25seSBtZXRob2RzIHRoYXQgYXJlIGV4cGxpY2l0bHkgbWFya2VkCi0gICAgICogcHVibGljIGFyZSByZXR1cm5lZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0eXBlIHRoZSA8Y29kZT5JVHlwZTwvY29kZT4KLSAgICAgKiBAcmV0dXJuIHRoZSBwdWJsaWMgbWV0aG9kcyBkZWNsYXJlZCBpbiB0aGlzIHR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElNZXRob2RbXSBnZXRQdWJsaWNNZXRob2RzKElUeXBlIHR5cGUpIHsKLSAgICAgICAgTGlzdDxJTWV0aG9kPiBwdWJsaWNNZXRob2RzID0gbmV3IEFycmF5TGlzdDxJTWV0aG9kPigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSU1ldGhvZFtdIGFsbE1ldGhvZHMgPSB0eXBlLmdldE1ldGhvZHMoKTsKLSAgICAgICAgICAgIGlmICh0eXBlLmlzSW50ZXJmYWNlKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYWxsTWV0aG9kczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsTWV0aG9kcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gYWxsTWV0aG9kc1tpXTsKLSAgICAgICAgICAgICAgICBpZiAoRmxhZ3MuaXNQdWJsaWMobWV0aG9kLmdldEZsYWdzKCkpICYmICFtZXRob2QuaXNDb25zdHJ1Y3RvcigpICYmICFtZXRob2QuaXNNYWluTWV0aG9kKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljTWV0aG9kcy5hZGQobWV0aG9kKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHVibGljTWV0aG9kcy50b0FycmF5KG5ldyBJTWV0aG9kW3B1YmxpY01ldGhvZHMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIHRhcmdldCBuYW1lc3BhY2Ugc3RyaW5nIGZyb20gdGhlIGdpdmVuIHBhY2thZ2UgbmFtZSBieSBzcGxpdHRpbmcgdGhlIGRvdCAnLicgc2VwYXJhdGVkCi0gICAgICogcGFja2FnZSBuYW1lLCByZXZlcnNpbmcgdGhlIG9yZGVyIG9mIHRoZSBwYWNrYWdlIG5hbWUgc2VnbWVudHMgZm9sbG93ZWQgYnkgcHJlZml4aW5nIHRoZSBzdHJpbmcgd2l0aAotICAgICAqICdodHRwOi8vJyBhbmQgYXBwZW5kaW5nIGEgZm9yd2FyZCBzbGFzaCAnLycgdG8gdGhlIGVuZC4KLSAgICAgKiA8cD5FLmcuLCB0aGUgSmF2YSBwYWNrYWdlINJjb20uZXhhbXBsZS53c9Mgd291bGQgcmV0dXJuIHRoZSB0YXJnZXQgbmFtZXNwYWNlINJodHRwOi8vd3MuZXhhbXBsZS5jb20v0y48L3A+Ci0gICAgICogPHA+SWYgdGhlIHBhY2thZ2UgbmFtZSBpcyBudWxsIG9yIGlzIG9mIHplcm8gbGVuZ3RoICAiaHR0cDovL2RlZmF1bHRfcGFja2FnZS8iIGlzIHJldHVybmVkLjwvcD4KLSAgICAgKiBAcGFyYW0gcGFja2FnZU5hbWUgdGhlIHBhY2thZ2UgbmFtZQotICAgICAqIEByZXR1cm4gdGhlIGRlcml2ZWQgdGFyZ2V0IG5hbWVzcGFjZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZUZyb21QYWNrYWdlTmFtZShTdHJpbmcgcGFja2FnZU5hbWUpIHsKLSAgICAgICAgaWYgKHBhY2thZ2VOYW1lID09IG51bGwgfHwgcGFja2FnZU5hbWUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuICJodHRwOi8vZGVmYXVsdF9wYWNrYWdlLyI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBMaXN0PFN0cmluZz4gbmFtZXNwYWNlRWxlbWVudHMgPSBBcnJheXMuYXNMaXN0KHBhY2thZ2VOYW1lLnNwbGl0KCJcXC4iKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgQ29sbGVjdGlvbnMucmV2ZXJzZShuYW1lc3BhY2VFbGVtZW50cyk7Ci0gICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovLyI7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBJdGVyYXRvcjxTdHJpbmc+IG5hbWVzcGFjZUl0ZXJhdG9yID0gbmFtZXNwYWNlRWxlbWVudHMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKG5hbWVzcGFjZUl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgU3RyaW5nIGVsZW1lbnQgPSBuYW1lc3BhY2VJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlICs9IGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZUl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgKz0gIi4iOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRhcmdldE5hbWVzcGFjZSArPSAiLyI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCB0eXBlIGZvdW5kIGZvbGxvd2luZyB0aGUgZ2l2ZW4gamF2YSBwcm9qZWN0J3MgY2xhc3NwYXRoIHdpdGggdGhlIGdpdmVuIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9yIG51bGwgaWYgbm9uZSBpcyBmb3VuZC4KLSAgICAgKiBAcGFyYW0gamF2YVByb2plY3QgdGhlIGdpdmVuIDxjb2RlPklKYXZhUHJvamVjdDwvY29kZT4KLSAgICAgKiBAcGFyYW0gZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUgdGhlIGdpdmVuIGZ1bGx5IHF1YWxpZmllZCBuYW1lCi0gICAgICogQHJldHVybiB0aGUgZmlyc3QgdHlwZSBmb3VuZCBmb2xsb3dpbmcgdGhlIGphdmEgcHJvamVjdCdzIGNsYXNzcGF0aCB3aXRoIHRoZSBnaXZlbiBmdWxseSBxdWFsaWZpZWQgbmFtZSBvciBudWxsIGlmIG5vbmUgaXMgZm91bmQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElUeXBlIGZpbmRUeXBlKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gamF2YVByb2plY3QuZmluZFR5cGUoZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUpOwotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmlyc3QgdHlwZSBmb3VuZCB3aXRoIHRoZSBnaXZlbiBmdWxseSBxdWFsaWZpZWQgbmFtZSBmb2xsb3dpbmcgdGhlIGNsYXNzcGF0aCBvZiB0aGUgamF2YSBwcm9qZWN0IHdpdGgKLSAgICAgKiB0aGUgZ2l2ZSBwcm9qZWN0IG5hbWUgb3IgbnVsbCBpZiBub25lIGlzIGZvdW5kLgotICAgICAqIEBwYXJhbSBwcm9qZWN0TmFtZSB0aGUgbmFtZSBvZiB0aGUgamF2YSBwcm9qZWN0Ci0gICAgICogQHBhcmFtIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lIHRoZSBnaXZlbiBmdWxseSBxdWFsaWZpZWQgbmFtZQotICAgICAqIEByZXR1cm4gdGhlIGZpcnN0IHR5cGUgZm91bmQgZm9sbG93aW5nIHRoZSBqYXZhIHByb2plY3QncyBjbGFzc3BhdGggd2l0aCB0aGUgZ2l2ZW4gZnVsbHkgcXVhbGlmaWVkIG5hbWUgb3IgbnVsbCBpZiBub25lIGlzIGZvdW5kCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJVHlwZSBmaW5kVHlwZShTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBmdWxseVF1YWxpZmllZENsYXNzTmFtZSkgewotICAgICAgICByZXR1cm4gSkRUVXRpbHMuZmluZFR5cGUoSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QocHJvamVjdE5hbWUpLCBmdWxseVF1YWxpZmllZENsYXNzTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBwcm9qZWN0IGhhcyB0aGUgamF2YSBuYXR1cmUuCi0gICAgICogQHBhcmFtIHByb2plY3QgdGhlIGdpdmVuIHByb2plY3QKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcm9qZWN0IGhhcyB0aGUgamF2YSBuYXR1cmUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKYXZhUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJvamVjdC5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gbWV0aG9kIGlzbid0IGEgbWFpbiBtZXRob2Qgb3IgY29uc3RydWN0b3IgYW5kIGlmIGl0IGhhcyB0aGUgcHVibGljIG1vZGlmaWVyLgotICAgICAqIEBwYXJhbSBtZXRob2QgdGhlIGdpdmVuIG1ldGhvZAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIG1ldGhvZCBpcyBwdWJsaWMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQdWJsaWNNZXRob2QoSU1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBGbGFncy5pc1B1YmxpYyhtZXRob2QuZ2V0RmxhZ3MoKSkgJiYgIW1ldGhvZC5pc0NvbnN0cnVjdG9yKCkgJiYgIW1ldGhvZC5pc01haW5NZXRob2QoKTsKLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZXMgdGhlIGdpdmVuIEphdmEgdHlwZSBuYW1lLCBlaXRoZXIgc2ltcGxlIG9yIHF1YWxpZmllZCwgdXNpbmcgdGhlIHdvcmtzcGFjZSBzb3VyY2UgYW5kIGNvbXBsaWFuY2UgbGV2ZWxzLgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIGEgdHlwZQotICAgICAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSBJU3RhdHVzLk9LIGlmIHRoZSBnaXZlbiBuYW1lIGlzIHZhbGlkIGFzIGEgSmF2YSB0eXBlIG5hbWUsIGEgc3RhdHVzIHdpdGgKLSAgICAgKiBjb2RlIElTdGF0dXMuV0FSTklORyBpbmRpY2F0aW5nIHdoeSB0aGUgZ2l2ZW4gbmFtZSBpcyBkaXNjb3VyYWdlZCwgb3RoZXJ3aXNlIGEgc3RhdHVzIG9iamVjdCBpbmRpY2F0aW5nIHdoYXQgaXMgd3Jvbmcgd2l0aCB0aGUgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZUphdmFUeXBlTmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBTdHJpbmcgc291cmNlTGV2ZWwgPSBKYXZhQ29yZS5nZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfU09VUkNFKTsKLSAgICAgICAgU3RyaW5nIGNvbXBsaWFuY2VMZXZlbCA9IEphdmFDb3JlLmdldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9DT01QTElBTkNFKTsKLSAgICAgICAgcmV0dXJuIEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUphdmFUeXBlTmFtZShuYW1lLCBzb3VyY2VMZXZlbCwgY29tcGxpYW5jZUxldmVsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZXMgdGhlIGdpdmVuIEphdmEgdHlwZSBuYW1lLCBlaXRoZXIgc2ltcGxlIG9yIHF1YWxpZmllZCwgdXNpbmcgdGhlIGdpdmVuIHByb2plY3RzIHNvdXJjZSBhbmQgY29tcGxpYW5jZSBsZXZlbHMuCi0gICAgICogQHBhcmFtIHByb2plY3ROYW1lIHRoZSBuYW1lIG9mIHRoZSBqYXZhIHByb2plY3QKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiBhIHR5cGUKLSAgICAgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgSVN0YXR1cy5PSyBpZiB0aGUgZ2l2ZW4gbmFtZSBpcyB2YWxpZCBhcyBhIEphdmEgdHlwZSBuYW1lLCBhIHN0YXR1cyB3aXRoCi0gICAgICogY29kZSBJU3RhdHVzLldBUk5JTkcgaW5kaWNhdGluZyB3aHkgdGhlIGdpdmVuIG5hbWUgaXMgZGlzY291cmFnZWQsIG90aGVyd2lzZSBhIHN0YXR1cyBvYmplY3QgaW5kaWNhdGluZyB3aGF0IGlzIHdyb25nIHdpdGggdGhlIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGVKYXZhVHlwZU5hbWUoU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgbmFtZSkgewotICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKRFRVdGlscy5nZXRKYXZhUHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgICAgIFN0cmluZyBzb3VyY2VMZXZlbCA9IGphdmFQcm9qZWN0LmdldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9TT1VSQ0UsIHRydWUpOwotICAgICAgICBTdHJpbmcgY29tcGxpYW5jZUxldmVsID0gamF2YVByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX0NPTVBMSUFOQ0UsIHRydWUpOwotICAgICAgICByZXR1cm4gSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlSmF2YVR5cGVOYW1lKG5hbWUsIHNvdXJjZUxldmVsLCBjb21wbGlhbmNlTGV2ZWwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlIHRoZSBnaXZlbiBwYWNrYWdlIG5hbWUgdXNpbmcgdGhlIGdpdmVuIHByb2plY3RzIHNvdXJjZSBhbmQgY29tcGxpYW5jZSBsZXZlbHMuCi0gICAgICogQHBhcmFtIHByb2plY3ROYW1lIHRoZSBuYW1lIG9mIHRoZSBqYXZhIHByb2plY3QKLSAgICAgKiBAcGFyYW0gcGFja2FnZU5hbWUgdGhlIG5hbWUgb2YgYSBwYWNrYWdlCi0gICAgICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIElTdGF0dXMuT0sgaWYgdGhlIGdpdmVuIG5hbWUgaXMgdmFsaWQgYXMgYSBwYWNrYWdlIG5hbWUsIG90aGVyd2lzZSBhIHN0YXR1cwotICAgICAqIG9iamVjdCBpbmRpY2F0aW5nIHdoYXQgaXMgd3Jvbmcgd2l0aCB0aGUgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZVBhY2thZ2VOYW1lKFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0gICAgICAgIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEpEVFV0aWxzLmdldEphdmFQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgU3RyaW5nIHNvdXJjZUxldmVsID0gamF2YVByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX1NPVVJDRSwgdHJ1ZSk7Ci0gICAgICAgIFN0cmluZyBjb21wbGlhbmNlTGV2ZWwgPSBqYXZhUHJvamVjdC5nZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfQ09NUExJQU5DRSwgdHJ1ZSk7Ci0gICAgICAgIHJldHVybiBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSwgc291cmNlTGV2ZWwsIGNvbXBsaWFuY2VMZXZlbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGVzIHRoZSBnaXZlbiBKYXZhIGlkZW50aWZpZXIgd2l0aCB0aGUgd29ya3NwYWNlIHNvdXJjZSBhbmQgY29tcGxpYW5jZSBsZXZlbHMuCi0gICAgICogQHBhcmFtIGlkIHRoZSBKYXZhIGlkZW50aWZpZXIKLSAgICAgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgSVN0YXR1cy5PSyBpZiB0aGUgZ2l2ZW4gaWRlbnRpZmllciBpcyBhIHZhbGlkIEphdmEgaWRlbnRpZmllciwgb3RoZXJ3aXNlCi0gICAgICogYSBzdGF0dXMgb2JqZWN0IGluZGljYXRpbmcgd2hhdCBpcyB3cm9uZyB3aXRoIHRoZSBpZGVudGlmaWVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlSWRlbnRpZmllcihTdHJpbmcgaWQpIHsKLSAgICAgICAgU3RyaW5nIHNvdXJjZUxldmVsID0gSmF2YUNvcmUuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX1NPVVJDRSk7Ci0gICAgICAgIFN0cmluZyBjb21wbGlhbmNlTGV2ZWwgPSBKYXZhQ29yZS5nZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfQ09NUExJQU5DRSk7Ci0gICAgICAgIHJldHVybiBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVJZGVudGlmaWVyKGlkLCBzb3VyY2VMZXZlbCwgY29tcGxpYW5jZUxldmVsKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9XU0RMVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL1dTRExVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTQ5YTFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL1dTRExVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogQnVnICMyNzQyOTMgLSBzdWRoYW5AcHJvZ3Jlc3MuY29tCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBBZGRyZXNzOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwMTIuU09BUDEyQWRkcmVzczsKLWltcG9ydCBqYXZheC53c2RsLmZhY3RvcnkuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETFJlYWRlcjsKLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMV3JpdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLlVSSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotLyoqCi0gKiBXU0RMIFV0aWxpdHkgY2xhc3MuCi0gKiA8cD4KLSAqIDxzdHJvbmc+UHJvdmlzaW9uYWwgQVBJOjwvc3Ryb25nPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIKLSAqIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdAotICogdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcwotICogdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgV1NETFV0aWxzIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9GSUxFX05BTUVfUEFUVEVSTiA9ICJbYS16QS1aMC05X1xcLV0rLndzZGwiOy8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9RVUVSWSA9ICI/d3NkbCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIElQYXRoIFdTRExfRk9MREVSX1BBVEggPSBuZXcgUGF0aCgid3NkbC8iKTsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSU1FT1VUID0gMzAwMDA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX0ZJTEVfRVhURU5TSU9OID0gIi53c2RsIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBXU0RMVXRpbHMoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIDxjb2RlPmphdmF4LndzZGwuRGVmaW5pdGlvbjwvY29kZT4gYnkgcmVhZGluZyB0aGUgV1NETCBkb2N1bWVudCBhdCB0aGUgZ2l2ZW4gVVJMIG9yIG51bGwgaWYgbm9uZSBjYW4gYmUgZm91bmQKLSAgICAgKiBvciBpZiB0aGUgY29ubmVjdGlvbiB0aW1lcyBvdXQuCi0gICAgICogQHBhcmFtIHdzZGxVUkwgdGhlIHVybCBvZiB0aGUgd3NkbCBkb2N1bWVudCB0byByZWFkLgotICAgICAqIEByZXR1cm4gdGhlIGRlZmluaXRpb24gZGVzY3JpYmVkIGluIHRoZSB3c2RsIGRvY3VtZW50IHBvaW50ZWQgdG8gYnkgdGhlIGdpdmVuIFVSTC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIEkvTyBleGNlcHRpb24gb2NjdXJzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRGVmaW5pdGlvbiByZWFkV1NETChVUkwgd3NkbFVSTCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgVVJMQ29ubmVjdGlvbiB1cmxDb25uZWN0aW9uID0gd3NkbFVSTC5vcGVuQ29ubmVjdGlvbigpOwotICAgICAgICB1cmxDb25uZWN0aW9uLnNldENvbm5lY3RUaW1lb3V0KFRJTUVPVVQpOwotICAgICAgICB1cmxDb25uZWN0aW9uLnNldFJlYWRUaW1lb3V0KFRJTUVPVVQpOwotICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbnB1dFN0cmVhbSA9IHVybENvbm5lY3Rpb24uZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIElucHV0U291cmNlIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKGlucHV0U3RyZWFtKTsKLSAgICAgICAgICAgIFdTRExGYWN0b3J5IHdzZGxGYWN0b3J5ID0gV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFdTRExSZWFkZXIgd3NkbFJlYWRlciA9IHdzZGxGYWN0b3J5Lm5ld1dTRExSZWFkZXIoKTsKLSAgICAgICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IHdzZGxSZWFkZXIucmVhZFdTREwod3NkbFVSTC5nZXRQYXRoKCksIGlucHV0U291cmNlKTsKLSAgICAgICAgICAgIHJldHVybiBkZWZpbml0aW9uOwotICAgICAgICB9IGNhdGNoIChXU0RMRXhjZXB0aW9uIHdzZGxlKSB7Ci0gICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKHdzZGxlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChpbnB1dFN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIGdpdmVuIDxjb2RlPmphdmF4LndzZGwuRGVmaW5pdGlvbjwvY29kZT4gdG8gdGhlIHdzZGwgZG9jdW1lbnQgYXQgdGhlIGdpdmVuIFVSTC4KLSAgICAgKiBAcGFyYW0gd3NkbFVSTCB0aGUgdXJsIG9mIHRoZSB3c2RsIGRvY3VtZW50IHRvIHdyaXRlIHRvLgotICAgICAqIEBwYXJhbSBkZWZpbml0aW9uIHRoZSBXU0RMIGRlZmluaXRpb24gdG8gYmUgd3JpdHRlbi4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uICBpZiBhbiBJL08gZXhjZXB0aW9uIG9jY3Vycy4KLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIG9jY3VycyByZWZyZXNoaW5nIHRoZSBmaWxlIGluIHRoZSB3b3Jrc3BhY2UgaWYgaXQgZXhpc3RzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVdTREwoVVJMIHdzZGxVUkwsIERlZmluaXRpb24gZGVmaW5pdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgVVJJIHdzZGxVUkkgPSBudWxsOwotICAgICAgICBPdXRwdXRTdHJlYW0gd3NkbE91dHB1dFN0cmVhbSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3c2RsVVJJID0gd3NkbFVSTC50b1VSSSgpOwotICAgICAgICAgICAgRmlsZSB3c2RsRmlsZSA9IG5ldyBGaWxlKHdzZGxVUkkpOwotICAgICAgICAgICAgd3NkbE91dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHdzZGxGaWxlKTsKLSAgICAgICAgICAgIFdTRExGYWN0b3J5IHdzZGxGYWN0b3J5ID0gV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFdTRExXcml0ZXIgd3NkbFdyaXRlciA9IHdzZGxGYWN0b3J5Lm5ld1dTRExXcml0ZXIoKTsKLSAgICAgICAgICAgIHdzZGxXcml0ZXIud3JpdGVXU0RMKGRlZmluaXRpb24sIHdzZGxPdXRwdXRTdHJlYW0pOwotICAgICAgICB9IGNhdGNoIChXU0RMRXhjZXB0aW9uIHdzZGxlKSB7Ci0gICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKHdzZGxlKTsKLSAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIHVyaXNlKSB7Ci0gICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKHVyaXNlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmICh3c2RsT3V0cHV0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB3c2RsT3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkKLSAgICAgICAgICAgICAgICAuZ2V0RmlsZUZvckxvY2F0aW9uKFVSSVV0aWwudG9QYXRoKHdzZGxVUkkpKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmlsZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX09ORSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gZmlsZSBuYW1lIGNvbnRhaW5zIEFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLCB1bmRlcnNjb3JlICdfJywKLSAgICAgKiBkYXNoZXMgJy0nIGFuZCBlbmRzIHdpdGggdGhlICcud3NkbCcgZXh0ZW5zaW9uLiBPdGhlcndpc2UgcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4uCi0gICAgICogQHBhcmFtIHdzZGxGaWxlTmFtZSB0aGUgd3NkbCBmaWxlIG5hbWUKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHZhbGlkLCBjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRXU0RMRmlsZU5hbWUoU3RyaW5nIHdzZGxGaWxlTmFtZSkgewotICAgICAgICByZXR1cm4gd3NkbEZpbGVOYW1lICE9IG51bGwgJiYgd3NkbEZpbGVOYW1lLm1hdGNoZXMoV1NETF9GSUxFX05BTUVfUEFUVEVSTik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3QgZ2V0UHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgV2ViIENvbnRlbnQgZm9sZGVyIG9mIHRoZSBnaXZlbiBwcm9qZWN0LiBUaGUgcmV0dXJuZWQgcmVzb3VyY2UgbWF5IG5vdCBleGlzdC4KLSAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgbmFtZSBvZiB0aGUgd2ViIHByb2plY3QKLSAgICAgKiBAcmV0dXJuIHRoZSB3ZWIgY29udGVudCBmb2xkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElGb2xkZXIgZ2V0V2ViQ29udGVudEZvbGRlcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIHJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcigKLSAgICAgICAgICAgICAgICBXU0RMVXRpbHMuZ2V0V2ViQ29udGVudFBhdGgocHJvamVjdCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFdTREwgZm9sZGVyIG9mIHRoZSBwcm9qZWN0IHdpdGggdGhlIGdpdmVuIG5hbWUuIFRoZSBXU0RMIGZvbGRlciBwYXRoIGlzIHRoZSBwcm9qZWN0cyB3ZWIgY29udGVudCBmb2xkZXIKLSAgICAgKiBwYXRoIGFwcGVuZGVkIHdpdGggdGhlICdXU0RMJyBkaXJlY3RvcnkuIFRoZSByZXR1cm5lZCByZXNvdXJjZSBtYXkgbm90IGV4aXN0LgotICAgICAqIEBwYXJhbSBwcm9qZWN0TmFtZSB0aGUgbmFtZSBvZiB0aGUgd2ViIHByb2plY3QKLSAgICAgKiBAcmV0dXJuIHRoZSB3c2RsIGZvbGRlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSUZvbGRlciBnZXRXU0RMRm9sZGVyKFN0cmluZyBwcm9qZWN0TmFtZSkgewotICAgICAgICByZXR1cm4gV1NETFV0aWxzLmdldFdTRExGb2xkZXIoV1NETFV0aWxzLmdldFByb2plY3QocHJvamVjdE5hbWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBXU0RMIGZvbGRlciBvZiB0aGUgZ2l2ZW4gcHJvamVjdC4gVGhlIFdTREwgZm9sZGVyIHBhdGggaXMgdGhlIHByb2plY3RzIHdlYiBjb250ZW50IGZvbGRlcgotICAgICAqIHBhdGggYXBwZW5kZWQgd2l0aCB0aGUgJ1dTREwnIGRpcmVjdG9yeS4gVGhlIHJldHVybmVkIHJlc291cmNlIG1heSBub3QgZXhpc3QuCi0gICAgICogQHBhcmFtIHByb2plY3ROYW1lIHRoZSBuYW1lIG9mIHRoZSB3ZWIgcHJvamVjdAotICAgICAqIEByZXR1cm4gdGhlIHdzZGwgZm9sZGVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJRm9sZGVyIGdldFdTRExGb2xkZXIoSVByb2plY3QgcHJvamVjdCkgewotICAgICAgICBJUGF0aCB3c2RsRm9sZGVyUGF0aCA9IFdTRExVdGlscy5nZXRXZWJDb250ZW50UGF0aChwcm9qZWN0KS5hcHBlbmQoV1NETFV0aWxzLldTRExfRk9MREVSX1BBVEgpOwotICAgICAgICBJRm9sZGVyIHdzZGxGb2xkZXIgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcih3c2RsRm9sZGVyUGF0aCk7Ci0gICAgICAgIGlmICghd3NkbEZvbGRlci5leGlzdHMoKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB3c2RsRm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd3NkbEZvbGRlcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBJUGF0aCBnZXRXZWJDb250ZW50UGF0aChJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIElWaXJ0dWFsQ29tcG9uZW50IHZpcnR1YWxDb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLSAgICAgICAgcmV0dXJuIHZpcnR1YWxDb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldFdvcmtzcGFjZVJlbGF0aXZlUGF0aCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZpcnN0IDxjb2RlPlNPQVBBZGRyZXNzPC9jb2RlPiBvciA8Y29kZT5TT0FQMTJBZGRyZXNzPC9jb2RlPiBmb3VuZCBpbiB0aGUgZ2l2ZW4KLSAgICAgKiA8Y29kZT5EZWZpbml0aW9uPC9jb2RlPiBvciBudWxsIGlmIG5vbmUgaXMgZm91bmQuCi0gICAgICogQHBhcmFtIGRlZmluaXRpb24gdGhlIGdpdmVuIGRlZmluaXRpb24uCi0gICAgICogQHJldHVybiByZXR1cm4gb25lIG9mOgotICAgICAqIDxsaT5TT0FQQWRkcmVzczxsaT5TT0FQMTJBZGRyZXNzPGxpPm51bGwgaWYgaXQgY2FuIG5vdCBmaW5kIGEgc29hcCBhZGRyZXNzCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHN0YXRpYyBFeHRlbnNpYmlsaXR5RWxlbWVudCBnZXRFbmRwb2ludEFkZHJlc3MoRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB7Ci0gICAgICAgIGlmIChkZWZpbml0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIE1hcCBzZXJ2aWNlc01hcCA9IGRlZmluaXRpb24uZ2V0U2VydmljZXMoKTsKLSAgICAgICAgICAgIFNldDxNYXAuRW50cnk+IHNlcnZpY2VzU2V0ID0gc2VydmljZXNNYXAuZW50cnlTZXQoKTsKLSAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5IHNlcnZpY2VFbnRyeSA6IHNlcnZpY2VzU2V0KSB7Ci0gICAgICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpIHNlcnZpY2VFbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIE1hcCBwb3J0c01hcCA9IHNlcnZpY2UuZ2V0UG9ydHMoKTsKLSAgICAgICAgICAgICAgICBTZXQ8TWFwLkVudHJ5PiBwb3J0c1NldCA9IHBvcnRzTWFwLmVudHJ5U2V0KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnkgcG9ydEVudHJ5IDogcG9ydHNTZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpIHBvcnRFbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBMaXN0IGV4dGVuc2liaWxpdHlFbGVtZW50cyA9IHBvcnQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IG9iamVjdCA6IGV4dGVuc2liaWxpdHlFbGVtZW50cykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFNPQVBBZGRyZXNzIHx8IG9iamVjdCBpbnN0YW5jZW9mIFNPQVAxMkFkZHJlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBvYmplY3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbG9jYXRpb24gVVJJIGZyb20gdGhlIGZpcnN0IDxjb2RlPlNPQVBBZGRyZXNzPC9jb2RlPiBvciA8Y29kZT5TT0FQMTJBZGRyZXNzPC9jb2RlPiBmb3VuZAotICAgICAqIGluIHRoZSBnaXZlbiA8Y29kZT5EZWZpbml0aW9uPC9jb2RlPiBvciBudWxsIGlmIG5vbmUgaXMgZm91bmQuIFRoZSByZXR1cm5lZCBsb2NhdGlvbiBVUkkgaXMgYXBwZW5kZWQgd2l0aAotICAgICAqIHRoZSAnP3dzZGwnIHF1ZXJ5IGlmIHRoZSBxdWVyeSB3YXMgbm90IHByZXNlbnQgaW4gdGhlIDxjb2RlPlNPQVBBZGRyZXNzPC9jb2RlPiBvciA8Y29kZT5TT0FQMTJBZGRyZXNzPC9jb2RlPiBsb2NhdGlvbiBVUkkuCi0gICAgICogQHBhcmFtIGRlZmluaXRpb24gdGhlIGdpdmVuIGRlZmludGlvbi4KLSAgICAgKiBAcmV0dXJuIHRoZSBsb2NhdGlvbiBVUkkgb3IgdGhlIGZpcnN0IDxjb2RlPlNPQVBBZGRyZXNzPC9jb2RlPiBvciA8Y29kZT5TT0FQMTJBZGRyZXNzPC9jb2RlPiBmb3VuZCBpbiB0aGUgZ2l2ZW4gZGVmaW5pdGlvbi4KLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgdGVzdGluZyB0aGUgbG9jYXRpb24gVVJJIGZvciBhIHF1ZXJ5IHBhcnQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V1NETExvY2F0aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbikgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0gICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50ID0gV1NETFV0aWxzLmdldEVuZHBvaW50QWRkcmVzcyhkZWZpbml0aW9uKTsKLSAgICAgICAgaWYgKGV4dGVuc2liaWxpdHlFbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBsb2NhdGlvblVSSSA9IGdldExvY2F0aW9uVVJJKGV4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgICAgICAgICAgIGlmIChsb2NhdGlvblVSSS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBVUkwgZW5kcG9pbnRVUkwgPSBuZXcgVVJMKGxvY2F0aW9uVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAoZW5kcG9pbnRVUkwuZ2V0UXVlcnkoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uVVJJICs9IFdTRExfUVVFUlk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBsb2NhdGlvblVSSTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TG9jYXRpb25VUkkoRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJpbGl0eUVsZW1lbnQpIHsKLSAgICAgICAgaWYgKGV4dGVuc2liaWxpdHlFbGVtZW50IGluc3RhbmNlb2YgU09BUEFkZHJlc3MpIHsKLSAgICAgICAgICAgIHJldHVybiAoKFNPQVBBZGRyZXNzKSBleHRlbnNpYmlsaXR5RWxlbWVudCkuZ2V0TG9jYXRpb25VUkkoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZXh0ZW5zaWJpbGl0eUVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQMTJBZGRyZXNzKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChTT0FQMTJBZGRyZXNzKSBleHRlbnNpYmlsaXR5RWxlbWVudCkuZ2V0TG9jYXRpb25VUkkoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgZG90IHNlcGFyYXRlZCBwYWNrYWdlIG5hbWUgZnJvbSBhIGdpdmVuIG5hbWVzcGFjZS4KLSAgICAgKiA8cD5FLmcuLCB0aGUgbmFtZXNwYWNlINJodHRwOi8vd3MuZXhhbXBsZS5jb20v0yB3b3VsZCByZXR1cm4gdGhlIEphdmEgcGFja2FnZSBuYW1lINJjb20uZXhhbXBsZS53c9MuPC9wPgotICAgICAqIDxwPk4uQi4gVGhpcyBtZXRob2QgZG9lcyBub3QgcHJlc2VydmUgJ3d3dycgaW4gdGhlIHJldHVybmVkIHBhY2thZ2UgbmFtZSBpZiBpdCBleGlzdHMgaW4gdGhlIGdpdmVuIG5hbWVzcGFjZS48L3A+Ci0gICAgICogQHBhcmFtIG5hbWVzcGFjZSB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKiBAcmV0dXJuIGEgcGFja2FnZSBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lRnJvbU5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcGFja2FnZU5hbWVFbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgICAgICBVUkwgbmFtZXNwYWNlVVJMID0gbmV3IFVSTChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAvLyBSZW1vdmUgd3d3IGlmIHRoZXJlCi0gICAgICAgICAgICBTdHJpbmcgYXV0aG9yaXR5ID0gbmFtZXNwYWNlVVJMLmdldEF1dGhvcml0eSgpOwotICAgICAgICAgICAgaWYgKGF1dGhvcml0eS5pbmRleE9mKCJ3d3ciKSAhPSAtMSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgYXV0aG9yaXR5ID0gYXV0aG9yaXR5LnN1YnN0cmluZyhhdXRob3JpdHkuaW5kZXhPZigiLiIpICsgMSwgYXV0aG9yaXR5Lmxlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gYXV0aG9yaXR5RWxlbWVudHMgPSBBcnJheXMuYXNMaXN0KGF1dGhvcml0eS5zcGxpdCgiXFwuIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBDb2xsZWN0aW9ucy5yZXZlcnNlKGF1dGhvcml0eUVsZW1lbnRzKTsKLSAgICAgICAgICAgIHBhY2thZ2VOYW1lRWxlbWVudHMuYWRkQWxsKGF1dGhvcml0eUVsZW1lbnRzKTsKLQotICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBuYW1lc3BhY2VVUkwuZ2V0UGF0aCgpOwotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHBhdGhFbGVtZW50cyA9IEFycmF5cy5hc0xpc3QocGF0aC5zcGxpdCgiWy9cXFxcXSIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcGFja2FnZU5hbWVFbGVtZW50cy5hZGRBbGwocGF0aEVsZW1lbnRzKTsKLQotICAgICAgICAgICAgSXRlcmF0b3I8U3RyaW5nPiBwYWNrYWdlSXRlcmF0b3IgPSBwYWNrYWdlTmFtZUVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAocGFja2FnZUl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBlbGVtZW50ID0gcGFja2FnZUl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lICs9IGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYWNrYWdlSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSArPSAiLiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11cmxlKSB7Ci0gICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKG11cmxlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGFja2FnZU5hbWUudG9Mb3dlckNhc2UoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZDFhNDMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBiMTlhZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWUwNDg0ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jTW9uIEp1bCAyMCAxNToyNTozMSBFRVNUIDIwMDkNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWQwZjUyMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyDQotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wDQotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMA0KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb247c2luZ2xldG9uOj10cnVlDQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcg0KLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24uaW50ZXJuYWwucGx1Z2luLkRvbUludGVncmF0aW9uUGx1Z2luDQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luDQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwNCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsDQotIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLA0KLSBvcmcuZWNsaXBzZS5qZHQuY29yZSwNCi0gb3JnLmVjbGlwc2UudWkuaWRlLA0KLSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IsDQotIG9yZy5lY2xpcHNlLmpkdC51aSwNCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZSwNCi0gb3JnLmVjbGlwc2UuanN0LmplZS51aSwNCi0gb3JnLmVjbGlwc2UuamVtLnV0aWwsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWksDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscywNCi0gb3JnLmVjbGlwc2UuamR0LmFwdC5jb3JlDQotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkNCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUNCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3I7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cyIsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLmFjdGlvbnM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cyINCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDEwYWZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkF1Z3VzdCAxNSwgMjAwOTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAxMWQ5OGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcDQotICAgICAgICAgICAgICAgaWNvbnMvDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL2ljb25zL2pheHdzX25hdmNvbnRlbnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL2ljb25zL2pheHdzX25hdmNvbnRlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmI4NDRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9pY29ucy9qYXh3c19uYXZjb250ZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDE2NTNlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgTGFuZ3VhZ2UgRmlsZSBmb3IgdGhpcyBQbHVnaW4NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBHZW5lcmljIExhYmVsIGFuZCBEZXNjcmlwdGlvbg0KLUJ1bmRsZS1OYW1lLjA9SkFYLVdTIERPTSBJbnRlZ3JhdGlvbg0KLUJ1bmRsZS1WZW5kb3IuMD1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQ0KLQ0KLURvbVZhbGlkYXRvcl9OYW1lID0gV2ViIFNlcnZpY2VzIFZhbGlkYXRpb24NCi1Eb21WYWxpZGF0aW9uX01hcmtlck5hbWUgPSBXZWIgU2VydmljZXMgUHJvYmxlbSBNYXJrZXINCi1uYXZpZ2F0b3JDb250ZW50Lm5hbWUuMCA9IEpBWC1XUyBXZWIgU2VydmljZXMgRWxlbWVudHMNCi1kZWNvcmF0b3IubGFiZWwuMCA9IFdlYiBTZXJ2aWNlIERlY29yYXRvcg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU4YTBhNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTwhLS0KLSAgICBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgIAotICAgIENvbnRyaWJ1dG9yczoKLSAgICAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gLS0+Ci0KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWRpdC5pdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yaWVzIj4KLQkJPGZhY3RvcnkgCi0JCQl1cmkgPSAiaHR0cDovLy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvZG9tLmVjb3JlIiAKLQkJCWNsYXNzID0gIm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLkN1c3RvbURvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IiAKLQkJCXN1cHBvcnRlZFR5cGVzID0gCi0JCQkJIm9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyCi0JCQkJb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyCi0JCQkJb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyCi0JCQkJb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyCi0JCQkJb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZSIgLz4KLQk8L2V4dGVuc2lvbj4KLQkKLSAgPCEtLSB7e3sgRGVmaW5lcyBpbnRlZ3JhdGlvbiBmb3IgRE9NIG9iamVjdHMgdG8gbmF2aWdhdGlvbiB0cmVlIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5uYXZpZ2F0b3JDb250ZW50Ij4gCi0JCTxuYXZpZ2F0b3JDb250ZW50Ci0gICAgICAgIGFjdGl2ZUJ5RGVmYXVsdD0idHJ1ZSIKLSAgICAgICAgY29udGVudFByb3ZpZGVyPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5ET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciIKLSAgICAgICAgaWNvbj0iaWNvbnMvamF4d3NfbmF2Y29udGVudC5naWYiCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QubmF2aWdhdG9yLmoyZWUudWkuamF4d3MiCi0gICAgICAgIGxhYmVsUHJvdmlkZXI9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLkRPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciIKLSAgICAgICAgbmFtZT0iJW5hdmlnYXRvckNvbnRlbnQubmFtZS4wIgotICAgICAgICBwcmlvcml0eT0iaGlnaGVzdCI+Ci0JCQk8dHJpZ2dlclBvaW50cz4KLQkJCQk8b3I+Ci0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIgLz4KLQkJCQk8L29yPgotCQkJPC90cmlnZ2VyUG9pbnRzPgotCQkJPHBvc3NpYmxlQ2hpbGRyZW4+Ci0JCQkJPG9yPgotCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSIvPgotCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIi8+Ci0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2QiLz4KLQkJCQk8L29yPgotCQkJPC9wb3NzaWJsZUNoaWxkcmVuPgotCQkJPGFjdGlvblByb3ZpZGVyCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLmFjdGlvbnMuV1NBY3Rpb25Qcm92aWRlciIKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuYWN0aW9ucy5XU0FjdGlvblByb3ZpZGVyIj4KLQkJCQk8ZW5hYmxlbWVudD4KLQkJCQkJPG9yPgotCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuIi8+Ci0JCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSIvPgotCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSIvPgotCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCIvPgotCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtIi8+Ci0JCQkJCTwvb3I+Ci0JCQkJPC9lbmFibGVtZW50PgotCQkJPC9hY3Rpb25Qcm92aWRlcj4KLQkJPC9uYXZpZ2F0b3JDb250ZW50PgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmRlY29yYXRvcnMiPgotCQk8ZGVjb3JhdG9yCi0JCQlhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBsb2NhdGlvbj0iQk9UVE9NX1JJR0hUIgotICAgICAgICAgICAgbGlnaHR3ZWlnaHQ9ImZhbHNlIgotICAgICAgICAgICAgbGFiZWw9IiVkZWNvcmF0b3IubGFiZWwuMCIKLSAgICAgICAgICAgIHN0YXRlPSJ0cnVlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLldlYlNlcnZpY2VQcm9ibGVtc0RlY29yYXRvciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5XZWJTZXJ2aWNlRGVjb3JhdG9yIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4KLQkJCQkJPG9iamVjdENsYXNzIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLklTRUlDaGlsZExpc3QiLz4KLQkJCQkJPG9iamVjdENsYXNzIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLklXZWJTZXJ2aWNlQ2hpbGRMaXN0Ii8+Ci0JCQkJCTxvYmplY3RDbGFzcyBuYW1lPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdCIvPgotCQkJCQk8b2JqZWN0Q2xhc3MgbmFtZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kIi8+Ci0JCQkJCTxvYmplY3RDbGFzcyBuYW1lPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSIvPgotCQkJCQk8b2JqZWN0Q2xhc3MgbmFtZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSIvPgotCQkJCQk8b2JqZWN0Q2xhc3MgbmFtZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIi8+Ci0JCQkJPC9vcj4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9kZWNvcmF0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLSAgPCEtLSB9fX0gLS0+Ci0gIDwhLS0ge3t7IERlZmluZXMgaW50ZWdyYXRpb24gZm9yIERPTSBvYmplY3RzIHRvIHByb3BlcnRpZXMgdmlldyAtLT4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdGVycyI+Ci0JCTxmYWN0b3J5Ci0JCQlhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLkRPTVByb3BlcnR5Vmlld0FkYXB0ZXJGYWN0b3J5Ij4KLQkJCTxhZGFwdGVyCi0JCQkJdHlwZT0ib3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2VQcm92aWRlciI+Ci0JCQk8L2FkYXB0ZXI+Ci0JCTwvZmFjdG9yeT4KLQkJPGZhY3RvcnkKLQkJCWFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5ET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeSI+Ci0JCQk8YWRhcHRlcgotCQkJCXR5cGU9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlUHJvdmlkZXIiPgotCQkJPC9hZGFwdGVyPgotCQk8L2ZhY3Rvcnk+Ci0JCTxmYWN0b3J5Ci0JCQlhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5ET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeSI+Ci0JCQk8YWRhcHRlcgotCQkJCXR5cGU9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlUHJvdmlkZXIiPgotCQkJPC9hZGFwdGVyPgotCQk8L2ZhY3Rvcnk+Ci0JCTxmYWN0b3J5Ci0JCQlhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2QiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnkiPgotCQkJPGFkYXB0ZXIKLQkJCQl0eXBlPSJvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIj4KLQkJCTwvYWRhcHRlcj4KLQkJPC9mYWN0b3J5PgotCQk8ZmFjdG9yeQotCQkJYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0iCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnkiPgotCQkJPGFkYXB0ZXIKLQkJCQl0eXBlPSJvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIj4KLQkJCTwvYWRhcHRlcj4KLQkJPC9mYWN0b3J5PgkJCi0JCTxmYWN0b3J5Ci0JCQlhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLklET01Qcm9wZXJ0eVZhbHVlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLkRPTUl0ZW1WYWx1ZVByb3BlcnR5U291cmNlRmFjdG9yeSI+Ci0JCQk8YWRhcHRlcgotCQkJCXR5cGU9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlIj4KLQkJCTwvYWRhcHRlcj4KLQkJPC9mYWN0b3J5PgkJCi0gICA8L2V4dGVuc2lvbj4KLTwhLS0gfX19IC0tPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vaW50ZXJuYWwvcGx1Z2luL0RvbUludGVncmF0aW9uTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9pbnRlcm5hbC9wbHVnaW4vRG9tSW50ZWdyYXRpb25NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYjFhNmQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9pbnRlcm5hbC9wbHVnaW4vRG9tSW50ZWdyYXRpb25NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLmludGVybmFsLnBsdWdpbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsNCi0NCi1wdWJsaWMgY2xhc3MgRG9tSW50ZWdyYXRpb25NZXNzYWdlcyBleHRlbmRzIE5MUw0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24uaW50ZXJuYWwucGx1Z2luLkRvbUludGVncmF0aW9uTWVzc2FnZXMiOyAvLyROT04tTkxTLTEkDQotDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcl9KYXhXc1dlYlNlcnZpY2VzTGFiZWw7DQotDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcl9Mb2FkaW5nQ2FuY2VsZWRMYWJlbDsNCi0NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyX0xvYWRpbmdEdW1teUxhYmVsOw0KLQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXJfU2VpTGFiZWw7DQotDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcl9XZWJTZXJ2aWNlc0xhYmVsOw0KLQ0KLQkvKiogbWVzc2FnZSBjb25zdGFudCAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuV1NSZXNvdXJjZUFjdGlvbl9OYW1lOw0KLQ0KLQkvKiogbWVzc2FnZSBjb25zdGFudCAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOYXZpZ2F0ZVRvSW1wbGVtZW50YXRpb25BY3Rpb25fU2hvd0luV2ViU2VydmljZXNBcmVhQWN0aW9uOw0KLQ0KLQkvKiogbWVzc2FnZSBjb25zdGFudCAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOYXZpZ2F0ZVRvSW1wbGVtZW50YXRpb25BY3Rpb25fU2hvd0luRUpCQXJlYUFjdGlvbjsNCi0NCi0Jc3RhdGljDQotCXsNCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIERvbUludGVncmF0aW9uTWVzc2FnZXMuY2xhc3MpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9pbnRlcm5hbC9wbHVnaW4vRG9tSW50ZWdyYXRpb25NZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL2ludGVybmFsL3BsdWdpbi9Eb21JbnRlZ3JhdGlvbk1lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI5MjczNzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL2ludGVybmFsL3BsdWdpbi9Eb21JbnRlZ3JhdGlvbk1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyX0pheFdzV2ViU2VydmljZXNMYWJlbAkJPSBKQVgtV1MgV2ViIFNlcnZpY2VzDQotRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyX0xvYWRpbmdDYW5jZWxlZExhYmVsCQkJPSBMb2FkaW5nIENhbmNlbGVkDQotRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyX0xvYWRpbmdEdW1teUxhYmVsCQkJPSBMb2FkaW5nLi4uDQotRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyX1NlaUxhYmVsCQkJCQkJPSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZXMNCi1ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXJfV2ViU2VydmljZXNMYWJlbAkJCQk9IFdlYiBTZXJ2aWNlcw0KLQ0KLU9wZW5XU1Jlc291cmNlQWN0aW9uX05hbWUJCQkJCQkJCQk9IE9wZW4NCi0NCi1OYXZpZ2F0ZVRvSW1wbGVtZW50YXRpb25BY3Rpb25fU2hvd0luV2ViU2VydmljZXNBcmVhQWN0aW9uCT0gTG9jYXRlIGluIFdlYiBTZXJ2aWNlcyBOb2RlDQotTmF2aWdhdGVUb0ltcGxlbWVudGF0aW9uQWN0aW9uX1Nob3dJbkVKQkFyZWFBY3Rpb24JCQk9IExvY2F0ZSBpbiBEZXBsb3ltZW50IERlc2NyaXB0b3IgTm9kZQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9pbnRlcm5hbC9wbHVnaW4vRG9tSW50ZWdyYXRpb25QbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9pbnRlcm5hbC9wbHVnaW4vRG9tSW50ZWdyYXRpb25QbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmE5YWIwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vaW50ZXJuYWwvcGx1Z2luL0RvbUludGVncmF0aW9uUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24uaW50ZXJuYWwucGx1Z2luOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5Db250cmFjdENoZWNrZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOw0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsNCi0NCi0vKioNCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRG9tSW50ZWdyYXRpb25QbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsNCi0NCi0JLy8gVGhlIHBsdWctaW4gSUQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24iOw0KLQ0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlDQotCXByaXZhdGUgc3RhdGljIERvbUludGVncmF0aW9uUGx1Z2luIHBsdWdpbjsNCi0JDQotCXByaXZhdGUgRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI7DQotCQ0KLQkvKioNCi0JICogVGhlIGNvbnN0cnVjdG9yDQotCSAqLw0KLQlwdWJsaWMgRG9tSW50ZWdyYXRpb25QbHVnaW4oKSB7DQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOw0KLQkJcGx1Z2luID0gdGhpczsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkNCi0JICovDQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCXBsdWdpbiA9IG51bGw7DQotCQlzdXBlci5zdG9wKGNvbnRleHQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UNCi0JICoNCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIERvbUludGVncmF0aW9uUGx1Z2luIGdldERlZmF1bHQoKSB7DQotCQlyZXR1cm4gcGx1Z2luOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldExhYmVsUHJvdmlkZXIoZmluYWwgRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpDQotCXsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShsYWJlbFByb3ZpZGVyLCAibGFiZWxQcm92aWRlciIpOyAvLyROT04tTkxTLTEkDQotCQl0aGlzLmxhYmVsUHJvdmlkZXIgPSBsYWJlbFByb3ZpZGVyOw0KLQl9DQotCQ0KLQlwdWJsaWMgRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoKQ0KLQl7DQotCQlyZXR1cm4gbGFiZWxQcm92aWRlcjsNCi0JfQ0KLQkNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL2ludGVybmFsL3V0aWwvUHJvamVjdEV4cGxvcmVyVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL2ludGVybmFsL3V0aWwvUHJvamVjdEV4cGxvcmVyVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MmY2OGZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9pbnRlcm5hbC91dGlsL1Byb2plY3RFeHBsb3JlclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5pbnRlcm5hbC51dGlsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7DQotDQotLyoqDQotICogVXRpbGl0eSBjbGFzcyB0aGF0IGhvbGRzIG1ldGhvZHMgdG8gbWFuaXB1bGF0ZSBQcm9qZWN0RXhwbG9yZXIgDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0RXhwbG9yZXJVdGlsIA0KLXsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQcm9qZWN0RXhwbG9yZXJVdGlsIElOU1RBTkNFID0gbmV3IFByb2plY3RFeHBsb3JlclV0aWwoKTsNCi0JDQotCS8qKg0KLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIG9ubHkgZnJvbSBVSSB0aHJlYWQgb3RoZXJ3aXNlIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcmV0dXJuZWQNCi0JICogDQotCSAqIEByZXR1cm4gdGhlIHByb2plY3QgZXhwbG9yZXIge0BsaW5rIElWaWV3UGFydH0gaW4gY2FzZSBpdCBpcyBhdmFpbGFibGUgb3RoZXJ3aXNlIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqLw0KLQlwdWJsaWMgSVZpZXdQYXJ0IGZpbmRQcm9qZWN0RXhwbG9yZXIoKQ0KLQl7DQotCQlmaW5hbCBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbiA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7DQotCQlpZiAod29ya2JlbmNoV2luPT1udWxsIHx8IHdvcmtiZW5jaFdpbi5nZXRBY3RpdmVQYWdlKCk9PW51bGwpIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHdvcmtiZW5jaFdpbi5nZXRBY3RpdmVQYWdlKCkuZmluZFZpZXcoIm9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Qcm9qZWN0RXhwbG9yZXIiKTsgLy8kTk9OLU5MUy0xJA0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvQ3VzdG9tRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvQ3VzdG9tRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTVmMjUyMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0N1c3RvbURvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLkRvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIEZhY3RvcnkgdGhhdCBhZGFwdHMgRE9NIG9iamVjdHMgd2l0aCBJdGVtIHByb3ZpZGVyIGFkYXB0ZXJzLiBGb3Ige0BsaW5rIElTRUlDaGlsZExpc3R9IGFuZCANCi0gKiB7QGxpbmsgSVdlYlNlcnZpY2VDaGlsZExpc3R9IGl0IGNyZWF0ZXMgc3BlY2lmaWMgYWRhcHRlciBmb3Igb3RoZXIgRE9NIG9iamVjdHMgZGVsZWdhdGVzIHRvDQotICoge0BsaW5rIERvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5fS4NCi0gKiANCi0gKiBAYXV0aG9yDQotICovDQotcHVibGljIGNsYXNzIEN1c3RvbURvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgDQotew0KLQkvKioNCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDdXN0b21Eb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBJTlNUQU5DRSA9IG5ldyBDdXN0b21Eb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpOw0KLQkNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yDQotCSAqLw0KLQlwcml2YXRlIEN1c3RvbURvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgDQotCXsNCi0JCXN1cGVyKCk7DQotCQkNCi0JCXN1cHBvcnRlZFR5cGVzLmFkZChJV2ViU2VydmljZUNoaWxkTGlzdC5jbGFzcyk7DQotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVNFSUNoaWxkTGlzdC5jbGFzcyk7DQotCX0NCi0JDQotCXByb3RlY3RlZCBBZGFwdGVyIGNyZWF0ZUlXZWJTZXJ2aWNlQ2hpbGRMaXN0QWRhcHRlcihmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qKSANCi0Jew0KLQkJcmV0dXJuIG5ldyBJV2ViU2VydmljZUNoaWxkTGlzdCgpDQotCQkJew0KLQkJCQlwdWJsaWMgRUxpc3Q8SVdlYlNlcnZpY2U+IGdldFdTQ2hpbGRMaXN0KCkNCi0JCQkJew0KLQkJCQkJcmV0dXJuIHdzUHJvai5nZXRXZWJTZXJ2aWNlcygpOw0KLQkJCQl9DQotDQotCQkJCXB1YmxpYyBOb3RpZmllciBnZXRUYXJnZXQoKSANCi0JCQkJew0KLQkJCQkJcmV0dXJuIHdzUHJvajsNCi0JCQkJfQ0KLQ0KLQkJCQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSANCi0JCQkJew0KLQkJCQkJcmV0dXJuIGZhbHNlOw0KLQkJCQl9DQotDQotCQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgDQotCQkJCXsNCi0JCQkJCS8vIG5vIHByb2Nlc3NpbmcgbmVlZGVkIGN1cnJlbnRseQ0KLQkJCQl9DQotDQotCQkJCXB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIA0KLQkJCQl7DQotCQkJCQkvLyBubyBwcm9jZXNzaW5nIG5lZWRlZCBjdXJyZW50bHkNCi0JCQkJfQ0KLQkJCX07DQotCX0NCi0JDQotCXByb3RlY3RlZCBBZGFwdGVyIGNyZWF0ZUlTRUlDaGlsZExpc3RBZGFwdGVyKGZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2opIA0KLQl7DQotCQlyZXR1cm4gbmV3IElTRUlDaGlsZExpc3QoKQ0KLQkJCXsNCi0JCQkJcHVibGljIEVMaXN0PElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U+IGdldFNFSUNoaWxkTGlzdCgpDQotCQkJCXsNCi0JCQkJCXJldHVybiB3c1Byb2ouZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpOw0KLQkJCQl9DQotDQotCQkJCXB1YmxpYyBOb3RpZmllciBnZXRUYXJnZXQoKSANCi0JCQkJew0KLQkJCQkJcmV0dXJuIHdzUHJvajsNCi0JCQkJfQ0KLQ0KLQkJCQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSANCi0JCQkJew0KLQkJCQkJcmV0dXJuIGZhbHNlOw0KLQkJCQl9DQotDQotCQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgDQotCQkJCXsNCi0JCQkJCS8vIG5vIHByb2Nlc3NpbmcgbmVlZGVkIGN1cnJlbnRseQ0KLQkJCQl9DQotDQotCQkJCXB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIA0KLQkJCQl7DQotCQkJCQkvLyBubyBwcm9jZXNzaW5nIG5lZWRlZCBjdXJyZW50bHkNCi0JCQkJfQ0KLQkJCX07DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciBub3RpZmllciwgT2JqZWN0IHR5cGUpDQotCXsNCi0JCWlmIChub3RpZmllciBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlUHJvamVjdCAmJiB0eXBlIGluc3RhbmNlb2YgQ2xhc3MpDQotCQl7DQotCQkJaWYodHlwZS5lcXVhbHMoSVdlYlNlcnZpY2VDaGlsZExpc3QuY2xhc3MpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIGFkYXB0SVdlYlNlcnZpY2VDaGlsZExpc3QoKElXZWJTZXJ2aWNlUHJvamVjdClub3RpZmllcik7DQotCQkJfQ0KLQkJCWVsc2UgaWYodHlwZS5lcXVhbHMoSVNFSUNoaWxkTGlzdC5jbGFzcykpDQotCQkJew0KLQkJCQlyZXR1cm4gYWRhcHRJU0VJQ2hpbGRMaXN0KChJV2ViU2VydmljZVByb2plY3Qpbm90aWZpZXIpOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHN1cGVyLmFkYXB0KG5vdGlmaWVyLCB0eXBlKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIEFkYXB0ZXIgYWRhcHRJU0VJQ2hpbGRMaXN0KGZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QpDQotCXsNCi0JCWZvcihBZGFwdGVyIGFkYXB0ZXIgOiB3c1Byb2plY3QuZUFkYXB0ZXJzKCkpDQotCQl7DQotCQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIElTRUlDaGlsZExpc3QpIHsNCi0JCQkJcmV0dXJuIGFkYXB0ZXI7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlmaW5hbCBBZGFwdGVyIGFkYXB0ZXIgPSBjcmVhdGVJU0VJQ2hpbGRMaXN0QWRhcHRlcih3c1Byb2plY3QpOw0KLQkJYXNzb2NpYXRlKGFkYXB0ZXIsIHdzUHJvamVjdCk7DQotCQkNCi0JCXJldHVybiBhZGFwdGVyOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgQWRhcHRlciBhZGFwdElXZWJTZXJ2aWNlQ2hpbGRMaXN0KGZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QpDQotCXsNCi0JCWZvcihBZGFwdGVyIGFkYXB0ZXIgOiB3c1Byb2plY3QuZUFkYXB0ZXJzKCkpDQotCQl7DQotCQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlQ2hpbGRMaXN0KSB7DQotCQkJCXJldHVybiBhZGFwdGVyOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJZmluYWwgQWRhcHRlciBhZGFwdGVyID0gY3JlYXRlSVdlYlNlcnZpY2VDaGlsZExpc3RBZGFwdGVyKHdzUHJvamVjdCk7DQotCQlhc3NvY2lhdGUoYWRhcHRlciwgd3NQcm9qZWN0KTsNCi0JCQ0KLQkJcmV0dXJuIGFkYXB0ZXI7CQkNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0RPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0RPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVjMGUzZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9ET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3I7DQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLmludGVybmFsLnV0aWwuUHJvamVjdEV4cGxvcmVyVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuSUxvYWRpbmdXc1Byb2plY3QuSUxvYWRpbmdDYW5jZWxlZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuSUxvYWRpbmdXc1Byb2plY3QuSUxvYWRpbmdEdW1teTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXc0RPTVJ1bnRpbWVFeHRlbnNpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdzRG9tTG9hZExpc3RlbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldzRE9NUnVudGltZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5yZWdpc3RyeS5JV3NET01SdW50aW1lSW5mbzsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnJlZ2lzdHJ5LldzRE9NUnVudGltZVJlZ2lzdHJ5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuZmFjZXRzLkZhY2V0VXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLkxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbk5hdmlnYXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vblZpZXdlcjsNCi0NCi0vKiogDQotICogQ29udGVudCBwcm92aWRlciBmb3IgRE9NIHJlbGF0ZWQgb2JqZWN0cw0KLSAqIA0KLSAqIEBhdXRob3IgDQotICovDQotcHVibGljIGNsYXNzIERPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXINCi17DQotCXByaXZhdGUgTWFwPElXc0RPTVJ1bnRpbWVFeHRlbnNpb24sIElXc0RvbUxvYWRMaXN0ZW5lcj4gbG9hZExpc3RlbmVycyA9IG5ldyBIYXNoTWFwPElXc0RPTVJ1bnRpbWVFeHRlbnNpb24sIElXc0RvbUxvYWRMaXN0ZW5lcj4oKTsgDQotCQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3INCi0JICovDQotCXB1YmxpYyBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigpDQotCXsNCi0JCXRoaXMoQ3VzdG9tRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3INCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5DQotCSAqLw0KLQlwdWJsaWMgRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpDQotCXsNCi0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihmaW5hbCBPYmplY3QgY29udGV4dCkNCi0Jew0KLQkJaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKQ0KLQkJew0KLQkJCXJldHVybiBnZXRXc1Byb2plY3QoKElQcm9qZWN0KSgoSUFkYXB0YWJsZSkgY29udGV4dCkuZ2V0QWRhcHRlcihJUHJvamVjdC5jbGFzcykpOw0KLQkJfQ0KLQkJZWxzZSBpZihjb250ZXh0IGluc3RhbmNlb2YgSUxvYWRpbmdXc1Byb2plY3QpIA0KLQkJew0KLQkJCXJldHVybiBuZXcgT2JqZWN0W10geyAoKElMb2FkaW5nV3NQcm9qZWN0KWNvbnRleHQpLmlzTG9hZENhbmNlbGVkKCkgPyBuZXcgSUxvYWRpbmdDYW5jZWxlZCgpe30gOiBuZXcgSUxvYWRpbmdEdW1teSgpe30gfTsNCi0JCX0NCi0JCWVsc2UgaWYoY29udGV4dCBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlUHJvamVjdCkNCi0JCXsNCi0JCQlyZXR1cm4gbmV3IE9iamVjdFtdeyBhZGFwdGVyRmFjdG9yeS5hZGFwdChjb250ZXh0LCBJU0VJQ2hpbGRMaXN0LmNsYXNzKSwNCi0JCQkJCWFkYXB0ZXJGYWN0b3J5LmFkYXB0KGNvbnRleHQsIElXZWJTZXJ2aWNlQ2hpbGRMaXN0LmNsYXNzKSB9Ow0KLQkJfQ0KLQkJZWxzZSBpZihjb250ZXh0IGluc3RhbmNlb2YgSVdlYlNlcnZpY2VDaGlsZExpc3QpDQotCQl7DQotCQkJT2JqZWN0W10gd2ViU2VydmljZXMgPSAoKElXZWJTZXJ2aWNlQ2hpbGRMaXN0KWNvbnRleHQpLmdldFdTQ2hpbGRMaXN0KCkudG9BcnJheSgpOw0KLQkJCQ0KLQkJCWZvcihpbnQgaWk9MDsgaWk8d2ViU2VydmljZXMubGVuZ3RoOyBpaSsrKQ0KLQkJCXsNCi0JCQkJYWRhcHRlckZhY3RvcnkuYWRhcHQod2ViU2VydmljZXNbaWldLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOw0KLQkJCX0NCi0JCQkNCi0JCQlyZXR1cm4gd2ViU2VydmljZXM7DQotCQl9DQotCQllbHNlIGlmKGNvbnRleHQgaW5zdGFuY2VvZiBJU0VJQ2hpbGRMaXN0KQ0KLQkJew0KLQkJCU9iamVjdFtdIHNFSXMgPSAoKElTRUlDaGlsZExpc3QpY29udGV4dCkuZ2V0U0VJQ2hpbGRMaXN0KCkudG9BcnJheSgpOw0KLQkJCQ0KLQkJCWZvcihpbnQgaWk9MDsgaWk8c0VJcy5sZW5ndGg7IGlpKyspDQotCQkJew0KLQkJCQlhZGFwdGVyRmFjdG9yeS5hZGFwdChzRUlzW2lpXSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsNCi0JCQl9DQotCQkJDQotCQkJcmV0dXJuIHNFSXM7DQotCQl9DQotCQllbHNlIGlmKGNvbnRleHQgaW5zdGFuY2VvZiBJV2ViU2VydmljZSkNCi0JCXsNCi0JCQlmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9ICgoSVdlYlNlcnZpY2UpY29udGV4dCkuZ2V0U2VydmljZUVuZHBvaW50KCk7DQotCQkJaWYgKHNlaSA9PSBudWxsKSB7DQotCQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOw0KLQkJCX0NCi0JCQkNCi0JCQlhZGFwdGVyRmFjdG9yeS5hZGFwdChzZWksIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7DQotCQkJcmV0dXJuIG5ldyBPYmplY3RbXXsgc2VpIH07DQotCQl9DQotCQllbHNlIGlmKGNvbnRleHQgaW5zdGFuY2VvZiBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSB7DQotCQkJcmV0dXJuIGV4dHJhY3RNZXRob2RzKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSBjb250ZXh0KTsNCi0JCX0NCi0JCWVsc2UgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBJV2ViTWV0aG9kKSB7DQotCQkJcmV0dXJuIGV4dHJhY3RQYXJhbXMoKElXZWJNZXRob2QpY29udGV4dCk7DQotCQl9DQotCQkNCi0JCXJldHVybiBuZXcgT2JqZWN0WzBdOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgT2JqZWN0W10gZ2V0V3NQcm9qZWN0KGZpbmFsIElQcm9qZWN0IHByb2plY3QpIA0KLQl7DQotCQl0cnkgew0KLQkJCWZpbmFsIElXc0RPTVJ1bnRpbWVFeHRlbnNpb24gcnVudGltZSA9IGdldFN1cHBvcnRpbmdSdW50aW1lKHByb2plY3QpOw0KLQkJCWlmIChydW50aW1lID09IG51bGwpIHsNCi0JCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07DQotCQkJfQ0KLQkJCQ0KLQkJCS8vIFdTIHByb2plY3QgaXMgbG9hZGVkIGFscmVhZHkNCi0JCQlmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0ID0gZ2V0V3NQcm9qZWN0KHJ1bnRpbWUuZ2V0RE9NKCksIHByb2plY3QpOyANCi0JCQlpZiAod3NQcm9qZWN0ICE9IG51bGwpDQotCQkJew0KLQkJCQlhZGFwdGVyRmFjdG9yeS5hZGFwdCh3c1Byb2plY3QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7DQotCQkJCXJldHVybiBuZXcgT2JqZWN0W10geyB3c1Byb2plY3QgfTsNCi0JCQl9DQotCQkJDQotCQkJYWRkUnVudGltZUxvYWRMaXN0ZW5lcihydW50aW1lKTsNCi0JCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgbmV3IExvYWRpbmdXc1Byb2plY3QocHJvamVjdCwgZmFsc2UpIH07DQotCQl9IA0KLQkJY2F0Y2ggKFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uIGUpIHsgLy8gJEpMLUVYQyQNCi0JCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgbmV3IExvYWRpbmdXc1Byb2plY3QocHJvamVjdCwgdHJ1ZSkgfTsgDQotCQl9DQotCX0NCi0JDQotCXByb3RlY3RlZCBJV3NEb21Mb2FkTGlzdGVuZXIgYWRkUnVudGltZUxvYWRMaXN0ZW5lcihmaW5hbCBJV3NET01SdW50aW1lRXh0ZW5zaW9uIHJ1bnRpbWUpIA0KLQl7DQotCQlJV3NEb21Mb2FkTGlzdGVuZXIgbG9hZExpc3RlbmVyID0gbG9hZExpc3RlbmVycy5nZXQocnVudGltZSk7IA0KLQkJaWYgKGxvYWRMaXN0ZW5lciE9bnVsbCkgew0KLQkJCXJldHVybiBsb2FkTGlzdGVuZXI7DQotCQl9DQotCQkNCi0JCWxvYWRMaXN0ZW5lciA9IG5ldyBMb2FkTGlzdGVuZXIocnVudGltZSk7CQkNCi0JCWxvYWRMaXN0ZW5lcnMucHV0KHJ1bnRpbWUsIGxvYWRMaXN0ZW5lcik7CQkNCi0JCXJ1bnRpbWUuYWRkTG9hZExpc3RlbmVyKGxvYWRMaXN0ZW5lcik7DQotCQkNCi0JCXJldHVybiBsb2FkTGlzdGVuZXI7DQotCX0NCi0JDQotCXByb3RlY3RlZCBPYmplY3RbXSBleHRyYWN0TWV0aG9kcyhmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSkgDQotCXsNCi0JCWZpbmFsIExpc3Q8SVdlYk1ldGhvZD4gd2ViTWV0aG9kcyA9IHNlaS5nZXRXZWJNZXRob2RzKCk7DQotCQlmb3IgKElXZWJNZXRob2Qgd2ViTWV0aG9kIDogd2ViTWV0aG9kcykgew0KLQkJCWFkYXB0ZXJGYWN0b3J5LmFkYXB0KHdlYk1ldGhvZCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHdlYk1ldGhvZHMudG9BcnJheSgpOwkJDQotCX0NCi0JDQotCXByb3RlY3RlZCBPYmplY3RbXSBleHRyYWN0UGFyYW1zKGZpbmFsIElXZWJNZXRob2QgbWV0aG9kKSANCi0Jew0KLQkJZmluYWwgTGlzdDxJV2ViUGFyYW0+IHBhcmFtcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJzKCk7DQotCQlmb3IgKElXZWJQYXJhbSB3ZWJQYXJhbSA6IHBhcmFtcykgew0KLQkJCWFkYXB0ZXJGYWN0b3J5LmFkYXB0KHdlYlBhcmFtLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gcGFyYW1zLnRvQXJyYXkoKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KQ0KLQl7DQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlUHJvamVjdCkNCi0JCXsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCWVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIElMb2FkaW5nV3NQcm9qZWN0KSANCi0JCXsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCWVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlQ2hpbGRMaXN0KQ0KLQkJew0KLQkJCXJldHVybiAhKChJV2ViU2VydmljZUNoaWxkTGlzdCllbGVtZW50KS5nZXRXU0NoaWxkTGlzdCgpLmlzRW1wdHkoKTsNCi0JCX0NCi0JCWVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIElTRUlDaGlsZExpc3QpDQotCQl7DQotCQkJcmV0dXJuICEoKElTRUlDaGlsZExpc3QpZWxlbWVudCkuZ2V0U0VJQ2hpbGRMaXN0KCkuaXNFbXB0eSgpOw0KLQkJfQ0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlKQ0KLQkJew0KLQkJCXJldHVybiAoKElXZWJTZXJ2aWNlKSBlbGVtZW50KS5nZXRTZXJ2aWNlRW5kcG9pbnQoKSAhPSBudWxsOyANCi0JCX0NCi0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKQ0KLQkJew0KLQkJCXJldHVybiAhKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKWVsZW1lbnQpLmdldFdlYk1ldGhvZHMoKS5pc0VtcHR5KCk7DQotCQl9DQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVdlYk1ldGhvZCkNCi0JCXsNCi0JCQlyZXR1cm4gISgoSVdlYk1ldGhvZCllbGVtZW50KS5nZXRQYXJhbWV0ZXJzKCkuaXNFbXB0eSgpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVdlYlNlcnZpY2VQcm9qZWN0IGdldFdzUHJvamVjdChmaW5hbCBJRE9NIGRvbSwgZmluYWwgSVByb2plY3QgcHJvamVjdCkNCi0Jew0KLQkJaWYgKGRvbSA9PSBudWxsKSB7DQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotCQkNCi0JCWZvciAoSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdCA6IGRvbS5nZXRXZWJTZXJ2aWNlUHJvamVjdHMoKSkgew0KLQkJCWlmKHdzUHJvamVjdC5nZXROYW1lKCkuZXF1YWxzKHByb2plY3QuZ2V0TmFtZSgpKSkgew0KLQkJCQlyZXR1cm4gd3NQcm9qZWN0Ow0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJV3NET01SdW50aW1lRXh0ZW5zaW9uIGdldFN1cHBvcnRpbmdSdW50aW1lKGZpbmFsIElQcm9qZWN0IHByb2plY3QpDQotCXsNCi0JCWZpbmFsIENvbGxlY3Rpb248SVdzRE9NUnVudGltZUluZm8+IGRvbVJ1bnRpbWVJbmZvcyA9IFdzRE9NUnVudGltZVJlZ2lzdHJ5LmdldFJlZ2lzdGVyZWRSdW50aW1lc0luZm8oKTsNCi0JCU1hcDxTdHJpbmcsIFN0cmluZz4gZmFjZXRzOw0KLQkJZm9yIChJV3NET01SdW50aW1lSW5mbyBkb21SdW50aW1lSW5mbyA6IGRvbVJ1bnRpbWVJbmZvcykgDQotCQl7DQotCQkJZmFjZXRzID0gZG9tUnVudGltZUluZm8uZ2V0UHJvamVjdEZhY2V0cygpOw0KLQkJCWlmIChoYXNGYWNldChmYWNldHMsIHByb2plY3QpKSB7DQotCQkJCXJldHVybiBnZXREb21SdW50aW1lKGRvbVJ1bnRpbWVJbmZvLmdldElkKCkpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNGYWNldChmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IGZhY2V0cywgZmluYWwgSVByb2plY3QgcHJvamVjdCkNCi0Jew0KLQkJZm9yIChTdHJpbmcgZmFjZXRJZCA6IGZhY2V0cy5rZXlTZXQoKSkgDQotCQl7DQotCQkJaWYgKGZhY2V0SWQgPT0gbnVsbCB8fCBmYWNldHMuZ2V0KGZhY2V0SWQpID09IG51bGwpIHsNCi0JCQkJY29udGludWU7DQotCQkJfQ0KLQkJCQ0KLQkJCXRyeSB7DQotCQkJCWlmICgobmV3IEZhY2V0VXRpbHMoKSkuaGFzRmFjZXRXaXRoVmVyc2lvbihwcm9qZWN0LCBmYWNldHMuZ2V0KGZhY2V0SWQpLCBmYWNldElkLCB0cnVlKSl7DQotCQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQkJfQ0KLQkJCX0gDQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCQkobmV3IExvZ2dlcigpKS5sb2dFcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJV3NET01SdW50aW1lRXh0ZW5zaW9uIGdldERvbVJ1bnRpbWUoU3RyaW5nIHJ1bnRpbWVJZCkgew0KLQkJcmV0dXJuIFdzRE9NUnVudGltZU1hbmFnZXIuaW5zdGFuY2UoKS5nZXRET01SdW50aW1lKHJ1bnRpbWVJZCk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBDbGFzcyB0aGF0IGlzIHVzZWQgdG8gbGlzdGVuIHdoZW4gdGhlIERPTSBsb2FkIHdpbGwgYmUgZmluaXNoZWQuIEFmdGVyIHRoZSBsb2FkIGhhcyBmaW5pc2hlZA0KLQkgKiB0aGlzIGNsYXNzIHRyYXZlcnNlcyB0aGUgcHJvamVjdCBleHBsb3JlcnMgdHJlZSBpbiBvcmRlciB0byBmaW5kIGFsbCBpbnN0YW5jZXMgb2YNCi0JICoge0BsaW5rIElMb2FkaW5nV3NQcm9qZWN0fSBhbmQgc3Vic3RpdHV0ZSB0aGVtIHdpdGggbG9hZGVkIHtAbGluayBJV2ViU2VydmljZVByb2plY3R9DQotCSAqIA0KLQkgKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotCSAqLw0KLQlwcm90ZWN0ZWQgY2xhc3MgTG9hZExpc3RlbmVyIGltcGxlbWVudHMgSVdzRG9tTG9hZExpc3RlbmVyDQotCXsNCi0JCXByaXZhdGUgZmluYWwgSVdzRE9NUnVudGltZUV4dGVuc2lvbiBydW50aW1lOw0KLQkJDQotCQlwdWJsaWMgTG9hZExpc3RlbmVyKGZpbmFsIElXc0RPTVJ1bnRpbWVFeHRlbnNpb24gcnVudGltZSkgDQotCQl7DQotCQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKHJ1bnRpbWUsICJydW50aW1lIik7IC8vJE5PTi1OTFMtMSQNCi0JCQl0aGlzLnJ1bnRpbWUgPSBydW50aW1lOw0KLQkJfQ0KLQkJCQ0KLQkJcHVibGljIHZvaWQgZmluaXNoZWQoKSANCi0JCXsNCi0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkNCi0JCQl7DQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIA0KLQkJCQl7DQotCQkJCQlmaW5hbCBJVmlld1BhcnQgdmlld1BhcnQgPSBQcm9qZWN0RXhwbG9yZXJVdGlsLklOU1RBTkNFLmZpbmRQcm9qZWN0RXhwbG9yZXIoKTsNCi0JCQkJCWlmICh2aWV3UGFydCBpbnN0YW5jZW9mIENvbW1vbk5hdmlnYXRvcikgDQotCQkJCQl7DQotCQkJCQkJZmluYWwgQ29tbW9uVmlld2VyIGNvbW1vblZpZXdlciA9ICgoQ29tbW9uTmF2aWdhdG9yKXZpZXdQYXJ0KS5nZXRDb21tb25WaWV3ZXIoKTsNCi0JCQkJCQlmb3IgKFRyZWVJdGVtIGl0ZW0gOiBjb21tb25WaWV3ZXIuZ2V0VHJlZSgpLmdldEl0ZW1zKCkpIHsNCi0JCQkJCQkJZXhjaGFuZ2VEdW1teShpdGVtLCBjb21tb25WaWV3ZXIpOw0KLQkJCQkJCX0NCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0pOw0KLQkJfQkJDQotDQotCQlwcm90ZWN0ZWQgdm9pZCBleGNoYW5nZUR1bW15KGZpbmFsIFRyZWVJdGVtIHRyZWVJdGVtLCBmaW5hbCBDb21tb25WaWV3ZXIgY29tbW9uVmlld2VyKSANCi0JCXsNCi0JCQlpZiAodHJlZUl0ZW0gPT0gbnVsbCB8fCB0cmVlSXRlbS5nZXREYXRhKCkgaW5zdGFuY2VvZiBJV2ViU2VydmljZVByb2plY3QpIHsNCi0JCQkJcmV0dXJuOw0KLQkJCX0NCi0JCQkNCi0JCQlpZiAodHJlZUl0ZW0uZ2V0RGF0YSgpIGluc3RhbmNlb2YgSUxvYWRpbmdXc1Byb2plY3QpIHsNCi0JCQkJZXhjaGFuZ2VUcmVlSXRlbURhdGEodHJlZUl0ZW0sIGNvbW1vblZpZXdlcik7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQlmb3IgKFRyZWVJdGVtIGNoaWxkIDogdHJlZUl0ZW0uZ2V0SXRlbXMoKSkgew0KLQkJCQkJZXhjaGFuZ2VEdW1teShjaGlsZCwgY29tbW9uVmlld2VyKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0NCi0JCXByaXZhdGUgdm9pZCBleGNoYW5nZVRyZWVJdGVtRGF0YShmaW5hbCBUcmVlSXRlbSB0cmVlSXRlbSwgZmluYWwgQ29tbW9uVmlld2VyIGNvbW1vblZpZXdlcikgDQotCQl7DQotCQkJZmluYWwgSUxvYWRpbmdXc1Byb2plY3QgbG9hZGluZ1Byb2plY3QgPSAoSUxvYWRpbmdXc1Byb2plY3QpdHJlZUl0ZW0uZ2V0RGF0YSgpOw0KLQkJCXRyeSB7DQotCQkJCWZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QgPSBnZXRXc1Byb2plY3QocnVudGltZS5nZXRET00oKSwgbG9hZGluZ1Byb2plY3QuZ2V0UHJvamVjdCgpKTsNCi0JCQkJYWRhcHRlckZhY3RvcnkuYWRhcHQod3NQcm9qZWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOw0KLQkJCQl0cmVlSXRlbS5zZXREYXRhKHdzUHJvamVjdCk7DQotDQotCQkJfSBjYXRjaCAoV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24gZSkgeyAvLyAkSkwtRVhDJA0KLQkJCQl0cmVlSXRlbS5zZXREYXRhKG5ldyBMb2FkaW5nV3NQcm9qZWN0KGxvYWRpbmdQcm9qZWN0LmdldFByb2plY3QoKSwgdHJ1ZSkpOw0KLQkJCX0NCi0JCQkNCi0JCQljb21tb25WaWV3ZXIucmVmcmVzaChsb2FkaW5nUHJvamVjdC5nZXRQcm9qZWN0KCkpOw0KLQkJfQ0KLQkJDQotCQlwdWJsaWMgdm9pZCBzdGFydGVkKCkgew0KLQkJCS8vIG5vdGhpbmcgdG8gZG8gaGVyZQ0KLQkJfQ0KLQl9DQotCQ0KLQlwcml2YXRlIGNsYXNzIExvYWRpbmdXc1Byb2plY3QgaW1wbGVtZW50cyBJTG9hZGluZ1dzUHJvamVjdA0KLQl7DQotCQlmaW5hbCBJUHJvamVjdCBwcm9qZWN0Ow0KLQkJZmluYWwgYm9vbGVhbiBpc0NhbmNlbGVkOw0KLQkJDQotCQlwdWJsaWMgTG9hZGluZ1dzUHJvamVjdChmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCBmaW5hbCBib29sZWFuIGlzQ2FuY2VsZWQpIHsNCi0JCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0ocHJvamVjdCwgInByb2plY3QiKTsgLy8kTk9OLU5MUy0xJA0KLQkJCXRoaXMucHJvamVjdCA9IHByb2plY3Q7DQotCQkJdGhpcy5pc0NhbmNlbGVkID0gaXNDYW5jZWxlZDsNCi0JCX0NCi0JCQ0KLQkJcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7DQotCQkJcmV0dXJuIHByb2plY3Q7DQotCQl9DQotDQotCQlwdWJsaWMgYm9vbGVhbiBpc0xvYWRDYW5jZWxlZCgpIHsNCi0JCQlyZXR1cm4gaXNDYW5jZWxlZDsNCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0RPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTQ4NGU4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0RPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3I7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24uaW50ZXJuYWwucGx1Z2luLkRvbUludGVncmF0aW9uTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24uaW50ZXJuYWwucGx1Z2luLkRvbUludGVncmF0aW9uUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5JTG9hZGluZ1dzUHJvamVjdC5JTG9hZGluZ0NhbmNlbGVkOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5JTG9hZGluZ1dzUHJvamVjdC5JTG9hZGluZ0R1bW15Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuSW1hZ2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JRGVzY3JpcHRpb25Qcm92aWRlcjsNCi0NCi0vKioNCi0gKiBET00gYWRhcHRlciBmYWN0b3J5IHRoYXQgZXh0ZW5kcyB7QGxpbmsgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyfSBieSBwcm92aWRpbmcNCi0gKiBpY29ucyBhbmQgbGFiZWxzIGZvciBzb21lIG9iamVjdHMgdGhhdCBhcmUgbm90IHBhcnQgb2YgRE9NIGFuZCBhbHNvIG92ZXJyaWRlcyBzb21lDQotICogbGFiZWxzDQotICogDQotICogQGF1dGhvciANCi0gKi8NCi1wdWJsaWMgY2xhc3MgRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSURlc2NyaXB0aW9uUHJvdmlkZXINCi17DQotCS8qKg0KLQkgKiBEZWZhdWx0IENvbnN0cnVjdG9yIHVzZXMge0BsaW5rIEN1c3RvbURvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5fSBhcyBkZWZhdWx0DQotCSAqIGFkYXB0ZXIgZmFjdG9yeSBwcm92aWRlZCB0byB0aGUgYmFzZSBjbGFzcy4NCi0JICovDQotCXB1YmxpYyBET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoKQ0KLQl7DQotCQlzdXBlcihDdXN0b21Eb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRSk7DQotCQkNCi0JCURvbUludGVncmF0aW9uUGx1Z2luLmdldERlZmF1bHQoKS5zZXRMYWJlbFByb3ZpZGVyKHRoaXMpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpDQotCXsNCi0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJV2ViU2VydmljZUNoaWxkTGlzdCkNCi0JCXsNCi0JCQlyZXR1cm4gSW1hZ2VzLklOU1RBTkNFLmdldEltYWdlKEltYWdlcy5JTUdfV0VCX1NFUlZJQ0VfR1JPVVApOw0KLQkJfQ0KLQkJZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgSVNFSUNoaWxkTGlzdCkNCi0JCXsNCi0JCQlyZXR1cm4gSW1hZ2VzLklOU1RBTkNFLmdldEltYWdlKEltYWdlcy5JTUdfU0VJX0dST1VQKTsNCi0JCX0NCi0JCWVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIElMb2FkaW5nV3NQcm9qZWN0KSANCi0JCXsNCi0JCQlyZXR1cm4gSW1hZ2VzLklOU1RBTkNFLmdldEltYWdlKEltYWdlcy5JTUdfRE9NX1dTX1BST1ZJREVSKTsNCi0JCX0NCi0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTG9hZGluZ0R1bW15IHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBJTG9hZGluZ0NhbmNlbGVkKSANCi0JCXsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKGVsZW1lbnQpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpDQotCXsNCi0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJV2ViU2VydmljZVByb2plY3QgfHwgZWxlbWVudCBpbnN0YW5jZW9mIElMb2FkaW5nV3NQcm9qZWN0KQ0KLQkJew0KLQkJCXJldHVybiBEb21JbnRlZ3JhdGlvbk1lc3NhZ2VzLkRPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcl9KYXhXc1dlYlNlcnZpY2VzTGFiZWw7IA0KLQkJfQ0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTG9hZGluZ0R1bW15KSANCi0JCXsNCi0JCQlyZXR1cm4gRG9tSW50ZWdyYXRpb25NZXNzYWdlcy5ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXJfTG9hZGluZ0R1bW15TGFiZWw7DQotCQl9DQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElMb2FkaW5nQ2FuY2VsZWQpIA0KLQkJew0KLQkJCXJldHVybiBEb21JbnRlZ3JhdGlvbk1lc3NhZ2VzLkRPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcl9Mb2FkaW5nQ2FuY2VsZWRMYWJlbDsNCi0JCX0JCQ0KLQkJZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgSVdlYlNlcnZpY2VDaGlsZExpc3QpDQotCQl7DQotCQkJcmV0dXJuIERvbUludGVncmF0aW9uTWVzc2FnZXMuRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyX1dlYlNlcnZpY2VzTGFiZWw7DQotCQl9DQotCQllbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJU0VJQ2hpbGRMaXN0KQ0KLQkJew0KLQkJCXJldHVybiBEb21JbnRlZ3JhdGlvbk1lc3NhZ2VzLkRPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcl9TZWlMYWJlbDsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7DQotCX0NCi0JDQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oT2JqZWN0IGVsZW1lbnQpDQotCXsNCi0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJV2ViU2VydmljZSkNCi0JCXsNCi0JCQlyZXR1cm4gKChJV2ViU2VydmljZSllbGVtZW50KS5nZXROYW1lKCk7DQotCQl9DQotCQllbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKQ0KLQkJew0KLQkJCXJldHVybiAoKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpZWxlbWVudCkuZ2V0TmFtZSgpOw0KLQkJfQ0KLQkJZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgSVdlYlNlcnZpY2VQcm9qZWN0IHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBJTG9hZGluZ1dzUHJvamVjdCkNCi0JCXsNCi0JCQlyZXR1cm4gRG9tSW50ZWdyYXRpb25NZXNzYWdlcy5ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXJfSmF4V3NXZWJTZXJ2aWNlc0xhYmVsOw0KLQkJfQ0KLQkJZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgSVdlYlNlcnZpY2VDaGlsZExpc3QpDQotCQl7DQotCQkJcmV0dXJuIERvbUludGVncmF0aW9uTWVzc2FnZXMuRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyX1dlYlNlcnZpY2VzTGFiZWw7DQotCQl9DQotCQllbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJU0VJQ2hpbGRMaXN0KQ0KLQkJew0KLQkJCXJldHVybiBEb21JbnRlZ3JhdGlvbk1lc3NhZ2VzLkRPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcl9TZWlMYWJlbDsNCi0JCX0NCi0JCWVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIElXZWJNZXRob2QpDQotCQl7DQotCQkJcmV0dXJuICgoSVdlYk1ldGhvZCllbGVtZW50KS5nZXROYW1lKCk7DQotCQl9DQotCQkNCi0JCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBmaXJlTGFiZWxQcm92aWRlckNoYW5nZWQoT2JqZWN0IGVsZW1lbnQpIA0KLQl7DQotCQlmb3IgKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGFiZWxQcm92aWRlckxpc3RlbmVyIDogbGFiZWxQcm92aWRlckxpc3RlbmVycykgew0KLQkJCWxhYmVsUHJvdmlkZXJMaXN0ZW5lci5sYWJlbFByb3ZpZGVyQ2hhbmdlZChuZXcgTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudCh0aGlzLCBlbGVtZW50KSk7DQotCQl9DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0RGVmYXVsdEltYWdlKE9iamVjdCBvYmplY3QpDQotCXsNCi0JCS8vIE5vIGRmYXVsdCBpbWFnZXMgDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0RPTUl0ZW1WYWx1ZVByb3BlcnR5U291cmNlRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9ET01JdGVtVmFsdWVQcm9wZXJ0eVNvdXJjZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmQ0ZjYzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0RPTUl0ZW1WYWx1ZVByb3BlcnR5U291cmNlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuUHJvcGVydHlTb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuSURPTVByb3BlcnR5VmFsdWU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlOw0KLQ0KLS8qKg0KLSAqIEFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhhdCBjcmVhdGVzIGFkYXB0ZXIgZnJvbSB7QGxpbmsgSURPTVByb3BlcnR5VmFsdWV9IHRvDQotICoge0BsaW5rIElQcm9wZXJ0eVNvdXJjZX0gaW50ZXJmYWNlLiBUaGlzIGZhY3RvcnkgaXMgcmVnaXN0ZXJlZCBpbiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMgZXh0ZW5zaW9uDQotICogcG9pbnQgYW5kIGlzIGNhbGxlZCB3aGVuIG9iamVjdCBvZiB0eXBlIHtAbGluayBJRE9NUHJvcGVydHlWYWx1ZX0gbmVlZHMgdG8gYmUNCi0gKiBkaXNwbGF5ZWQgb3IgZWRpdGVkIGluIHByb3BlcnR5IHNoZWV0Lg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1AU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi1wdWJsaWMgY2xhc3MgRE9NSXRlbVZhbHVlUHJvcGVydHlTb3VyY2VGYWN0b3J5IGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5IA0KLXsNCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3RvcnkjZ2V0QWRhcHRlcihqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuQ2xhc3MpDQotCSAqLw0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIA0KLQl7DQotCQlhc3NlcnQgYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgSURPTVByb3BlcnR5VmFsdWU7DQotCQkNCi0JCWZpbmFsIElET01Qcm9wZXJ0eVZhbHVlIHdyYXBwZXIgPSAoSURPTVByb3BlcnR5VmFsdWUpYWRhcHRhYmxlT2JqZWN0Ow0KLQkJDQotCQlyZXR1cm4gbmV3IFByb3BlcnR5U291cmNlKHdyYXBwZXIuZ2V0RWRpdGFibGVWYWx1ZSgpLCB3cmFwcGVyKTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyTGlzdCgpDQotCSAqLw0KLQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsNCi0JCXJldHVybiBuZXcgQ2xhc3NbXSB7UHJvcGVydHlTb3VyY2UuY2xhc3N9Ow0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2EzMzQzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0RPTVByb3BlcnR5Vmlld0FkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyOw0KLQ0KLXB1YmxpYyBjbGFzcyBET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSANCi17DQotCXByaXZhdGUgRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgYWRhcHRlckZhY3Rvcnk7DQotCQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIENsYXNzIGFkYXB0ZXJUeXBlKSANCi0Jew0KLSAgICAgICAgaWYgKGFkYXB0ZXJUeXBlLmlzSW5zdGFuY2UoYWRhcHRhYmxlT2JqZWN0KSkgDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFkYXB0YWJsZU9iamVjdDsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgaWYgKGFkYXB0ZXJUeXBlID09IElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyLmNsYXNzKSANCi0gICAgICAgIHsNCi0gICAgICAgIAlyZXR1cm4gZ2V0QWRhcHRlckZhY3RvcnkoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgDQotCXsNCi0gICAgICAgIHJldHVybiBuZXcgQ2xhc3NbXSB7DQotICAgICAgICAJCURPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyLmNsYXNzLA0KLSAgICAgICAgfTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIERPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGdldEFkYXB0ZXJGYWN0b3J5KCkNCi0Jew0KLQkJaWYgKGFkYXB0ZXJGYWN0b3J5ID09IG51bGwpIHsNCi0JCQlhZGFwdGVyRmFjdG9yeSA9IG5ldyBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gYWRhcHRlckZhY3Rvcnk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9JTG9hZGluZ1dzUHJvamVjdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9JTG9hZGluZ1dzUHJvamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNjJlYWE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvSUxvYWRpbmdXc1Byb2plY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3I7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ow0KLQ0KLQ0KLS8qKg0KLSAqIEFuIGludGVyZmFjZSBwcmVzZW50aW5nIG5vdCBsb2FkZWQgd2ViIHNlcnZpY2UgcHJvamVjdC4gVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCANCi0gKiB0byBiZSBhZGRlZCB0byB0aGUgcHJvamVjdCBleHBsb3JlciBXUyB0cmVlIGluIGNhc2VzIHdoZW4gdGhlIHByb2plY3QgaXMgcmVsZXZhbnQgDQotICogYnV0IGl0IGlzIG5vdCB5ZXQgbG9hZGVkIGJ5IERPTSBsb2FkZXIuIA0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElMb2FkaW5nV3NQcm9qZWN0IA0KLXsNCi0JLyoqDQotCSAqIEByZXR1cm4gdGhlIHJlbGV2YW50IHByb2plY3QNCi0JICovDQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCk7DQotCQ0KLQkvKioNCi0JICogQHJldHVybiBpZiB0aGUgRE9NIGxvYWRpbmcgaGFzIGJlZW4gY2FuY2VsZWQNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzTG9hZENhbmNlbGVkKCk7DQotCQ0KLQkvKioNCi0JICogSW50ZXJmYWNlIHVzZWQgdG8gYmUgYWRkZWQgdG8gdGhlIHRyZWUgYXMgYSBzdWIgbm9kZSBvZiBJTm90TG9hZGVkV3NQcm9qZWN0IG5vZGUNCi0JICogYW5kIGRpc3BsYXllZCB3aXRoIHRleHQgIkxvYWRpbmcuLi4iLg0KLQkgKiANCi0JICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLQkgKi8NCi0JcHVibGljIGludGVyZmFjZSBJTG9hZGluZ0R1bW15IHt9Ow0KLQkNCi0JcHVibGljIGludGVyZmFjZSBJTG9hZGluZ0NhbmNlbGVkIHt9Ow0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0lTRUlDaGlsZExpc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvSVNFSUNoaWxkTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNGY2YjRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvSVNFSUNoaWxkTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotDQotcHVibGljIGludGVyZmFjZSBJU0VJQ2hpbGRMaXN0IGV4dGVuZHMgQWRhcHRlcg0KLXsNCi0JcHVibGljIEVMaXN0PElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U+IGdldFNFSUNoaWxkTGlzdCgpOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0lXZWJTZXJ2aWNlQ2hpbGRMaXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0lXZWJTZXJ2aWNlQ2hpbGRMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk2MzgxZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9JV2ViU2VydmljZUNoaWxkTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgSVdlYlNlcnZpY2VDaGlsZExpc3QgZXh0ZW5kcyBBZGFwdGVyDQotew0KLQlwdWJsaWMgRUxpc3Q8SVdlYlNlcnZpY2U+IGdldFdTQ2hpbGRMaXN0KCk7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvV2ViU2VydmljZVByb2JsZW1zRGVjb3JhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL1dlYlNlcnZpY2VQcm9ibGVtc0RlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2OWE3N2Y2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvV2ViU2VydmljZVByb2JsZW1zRGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZS5pbnRlcm5hbC5BcHRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhRWxlbWVudEltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuUHJvYmxlbXNMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5Eb21VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWwuRG9tMlJlc291cmNlTWFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uSW5zcGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VQcm9ibGVtc0RlY29yYXRvciBleHRlbmRzIFByb2JsZW1zTGFiZWxEZWNvcmF0b3IKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhJU19ERUNPUkFUT1JfSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuV2ViU2VydmljZURlY29yYXRvciI7IAotCQotCS8qKgotCSAqIFRoZSBBUFQgbWFya2VyIElEcwotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUFRfTUFSS0VSX0lEID0gQXB0UGx1Z2luLkFQVF9DT01QSUxBVElPTl9QUk9CTEVNX01BUktFUjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBUX05PTlJFQ09OQ0lMRV9NQVJLRVJfSUQgPSBBcHRQbHVnaW4uQVBUX05PTlJFQ09OQ0lMRV9DT01QSUxBVElPTl9QUk9CTEVNX01BUktFUjsKLQkKLQkvKiogRW51bSB0byByZXByZXNlbnQgZGlmZmVyZW50IG1hcmtlciB0eXBlcyAqLwotCXB1YmxpYyBlbnVtIFNldmVyaXR5IHtPSywgRVJST1IsIFdBUk5JTkd9OwotCQotCXByaXZhdGUgRG9tVXRpbCBkb21VdGlsID0gRG9tVXRpbC5JTlNUQU5DRTsKLQlwcml2YXRlIGZpbmFsIERvbTJSZXNvdXJjZU1hcHBlciBkb20yUmVzb3VyY2VNYXBwZXIgPSBEb20yUmVzb3VyY2VNYXBwZXIuSU5TVEFOQ0U7Ci0JCi0JcHVibGljIFdlYlNlcnZpY2VQcm9ibGVtc0RlY29yYXRvcigpCi0JewotCQlhZGRMaXN0ZW5lcihuZXcgSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcigpCi0JCXsKLQkJCXB1YmxpYyB2b2lkIGxhYmVsUHJvdmlkZXJDaGFuZ2VkKExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQgZXZlbnQpCi0JCQl7Ci0JCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpCi0JCQkJewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKQotCQkJCQl7Ci0JCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERlY29yYXRvck1hbmFnZXIoKS51cGRhdGUoVEhJU19ERUNPUkFUT1JfSUQpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgaW50IGNvbXB1dGVBZG9ybm1lbnRGbGFncyhPYmplY3Qgb2JqKSAKLQl7Ci0JCWZpbmFsIFNldmVyaXR5IHNldmVyaXR5ID0gZGVmaW5lU2V2ZXJpdHkob2JqKTsJCQotCQlpZiAoc2V2ZXJpdHkgPT0gU2V2ZXJpdHkuRVJST1IpIHsKLQkJCXJldHVybiBKYXZhRWxlbWVudEltYWdlRGVzY3JpcHRvci5FUlJPUjsKLQkJfSAKLQkJCi0JCWlmIChzZXZlcml0eSA9PSBTZXZlcml0eS5XQVJOSU5HKSB7Ci0JCQlyZXR1cm4gSmF2YUVsZW1lbnRJbWFnZURlc2NyaXB0b3IuV0FSTklORzsKLQkJfQotCi0JCXJldHVybiAwOwotCX0JCi0KLQkvKioKLQkgKiBDaGVja3MgdGhlIG9iamVjdCdzIHJlc291cmNlIGZvciBtYXJrZXJzIGFuZCBkZWZpbmVzIHRoZSBzZXZlcml0eSBvZiB0aGUKLQkgKiBwcm9ibGVtIGlmIGFueS4gCi0JICogQHBhcmFtIG9iagotCSAqIEByZXR1cm4gdGhlIHNldmVyaXR5IGNhbGN1bGF0ZWQuCi0JICovCi0JcHJvdGVjdGVkIFNldmVyaXR5IGRlZmluZVNldmVyaXR5KGZpbmFsIE9iamVjdCBvYmopIAotCXsKLQkJdHJ5IAotCQl7Ci0JCQkvLyBwcm9jZXNzIGFkZGl0aW9uYWwgRE9NIG9iamVjdHMgbmVlZGVkIGZvciBVSSAtIElXZWJTZXJ2aWNlQ2hpbGRMaXN0IGFuZCBJU0VJQ2hpbGRMaXN0Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSVdlYlNlcnZpY2VDaGlsZExpc3QpIHsKLQkJCQlyZXR1cm4gZGVmaW5lU2V2ZXJpdHlGb3JFTGlzdCgoKElXZWJTZXJ2aWNlQ2hpbGRMaXN0KW9iaikuZ2V0V1NDaGlsZExpc3QoKSk7Ci0JCQl9Ci0JCQkKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJU0VJQ2hpbGRMaXN0KSB7Ci0JCQkJcmV0dXJuIGRlZmluZVNldmVyaXR5Rm9yRUxpc3QoKChJU0VJQ2hpbGRMaXN0KW9iaikuZ2V0U0VJQ2hpbGRMaXN0KCkpOwotCQkJfQotCQkJCi0JCQkvLyBkbyBub3QgcHJvY2VzcyBub24gRE9NIG9iamVjdHMKLQkJCWlmKCAhKG9iaiBpbnN0YW5jZW9mIEVPYmplY3QpICkgewotCQkJCXJldHVybiBTZXZlcml0eS5PSzsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIGRlZmluZVNldmVyaXR5KChFT2JqZWN0KSBvYmopOwotCQl9IAotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkobmV3IExvZ2dlcigpKS5sb2dFcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQotCQlyZXR1cm4gU2V2ZXJpdHkuT0s7Ci0JfQotCQotCXByb3RlY3RlZCBTZXZlcml0eSBkZWZpbmVTZXZlcml0eUZvckVMaXN0KGZpbmFsIExpc3Q8PyBleHRlbmRzIEVPYmplY3Q+IGxpc3QpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlTZXZlcml0eSBzZXZlcml0eSA9IFNldmVyaXR5Lk9LOwkJCi0JCWZvciAoRU9iamVjdCBlT2JqZWN0IDogbGlzdCkgCi0JCXsKLQkJCVNldmVyaXR5IHRlbXBTZXZlcml0eSA9IGRlZmluZVNldmVyaXR5KGVPYmplY3QpOwotCQkJaWYgKHRlbXBTZXZlcml0eSA9PSBTZXZlcml0eS5FUlJPUikgewotCQkJCXJldHVybiBTZXZlcml0eS5FUlJPUjsKLQkJCX0KLQkJCQotCQkJaWYgKHRlbXBTZXZlcml0eT09U2V2ZXJpdHkuV0FSTklORykgewotCQkJCXNldmVyaXR5ID0gU2V2ZXJpdHkuV0FSTklORzsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHNldmVyaXR5OwotCX0KLQkKLQlwcm90ZWN0ZWQgU2V2ZXJpdHkgZGVmaW5lU2V2ZXJpdHkoZmluYWwgRU9iamVjdCBlT2JqZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAKLQl7IAkJCi0JCWZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSA9IERvbTJSZXNvdXJjZU1hcHBlci5JTlNUQU5DRS5maW5kUmVzb3VyY2UoZU9iamVjdCk7Ci0JCWlmIChyZXNvdXJjZSE9bnVsbCkgewotCQkJcmV0dXJuIGRlZmluZVNldmVyaXR5KGVPYmplY3QsIHJlc291cmNlKTsKLQkJfQotCQkKLQkJcmV0dXJuIFNldmVyaXR5Lk9LOwotCX0KLQkJCi0JcHJvdGVjdGVkIFNldmVyaXR5IGRlZmluZVNldmVyaXR5KGZpbmFsIEVPYmplY3QgZU9iamVjdCwgZmluYWwgSVJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJaWYgKCFyZXNvdXJjZS5pc0FjY2Vzc2libGUoKSkgewotCQkJcmV0dXJuIFNldmVyaXR5Lk9LOwotCQl9Ci0JCQotCQlmaW5hbCBpbnQgZGVwdGggPSAocmVzb3VyY2UuZ2V0VHlwZSgpPT1JUmVzb3VyY2UuUFJPSkVDVCkgPyBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUgOiBJUmVzb3VyY2UuREVQVEhfWkVSTzsKLQkJZmluYWwgQ29sbGVjdGlvbjxJTWFya2VyPiBtYXJrZXJzID0gZmluZEFwdE1hcmtlcnMocmVzb3VyY2UsIGRlcHRoKTsKLQkJU2V2ZXJpdHkgc2V2ZXJpdHkgPSBTZXZlcml0eS5PSzsKLQkJZm9yIChJTWFya2VyIG1hcmtlciA6IG1hcmtlcnMpIAotCQl7Ci0JCQlpZiAoIWlzUmVsZXZhbnRGb3IoZU9iamVjdCwgbWFya2VyKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlpbnQgdGVtcFNldmVyaXR5ID0gKEludGVnZXIpbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZKTsKLQkJCWlmICh0ZW1wU2V2ZXJpdHk9PUlNYXJrZXIuU0VWRVJJVFlfRVJST1IpIHsKLQkJCQlyZXR1cm4gU2V2ZXJpdHkuRVJST1I7Ci0JCQl9IAotCi0JCQlpZih0ZW1wU2V2ZXJpdHk9PUlNYXJrZXIuU0VWRVJJVFlfV0FSTklORykgewotCQkJCXNldmVyaXR5ID0gU2V2ZXJpdHkuV0FSTklORzsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKHNldmVyaXR5ID09IFNldmVyaXR5Lk9LICYmIChlT2JqZWN0IGluc3RhbmNlb2YgSVdlYlNlcnZpY2UpKSAKLQkJewotCQkJLy8gZm9yIGJlYW4gd2l0aCBleHBsaWNpdCBpbnRlcmZhY2Ugd2UgbmVlZCB0byBjaGVjayB0aGUgaW50ZXJmYWNlIGFzIHdlbGwgCi0JCQkvLyBiZWNhdXNlIGl0IHJlc2lkZXMgaW4gYW5vdGhlciByZXNvdXJjZQotCQkJZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSAoKElXZWJTZXJ2aWNlKWVPYmplY3QpLmdldFNlcnZpY2VFbmRwb2ludCgpOwotCQkJaWYgKHNlaSAhPSBudWxsICYmICFzZWkuaXNJbXBsaWNpdCgpKSB7Ci0JCQkJc2V2ZXJpdHkgPSBkZWZpbmVTZXZlcml0eShzZWkpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gc2V2ZXJpdHk7Ci0JfQotCi0JLyoqCi0JICogRGVmaW5lcyBpZiA8Y29kZT5tYXJrZXI8L2NvZGU+IGlzIHJlbGV2YW50IGZvciA8Y29kZT5lT2JqZWN0PC9jb2RlPi4KLQkgKiBPbmx5IGZvciB3ZWIgbWV0aG9kIGFuZCB3ZWIgcGFyYW1ldGVyIHdlIG5lZWQgdG8gZGVmaW5lIGlmIHRoZSBtYXJrZXIgaXMgcmVsZXZhbnQKLQkgKiBiZWNhdXNlIHRoZXkgYXJlIG5vdCB1bmlxdWUgaW4gdGhlIHNjb3BlIG9mIHRoZSByZXNvdXJjZS4gRm9yIGV4YW1wbGUgaWYgdGhlcmUgaXMgYQotCSAqIG1hcmtlciBzZXQgb24gdGhlIHJlc291cmNlIGNvbnRhaW5pbmcgU0VJLCB0aGUgU0VJIHNob3VsZCBiZSBtYXJrZWQgaW4gYW55IGNhc2UgCi0JICogd2hpbGUgdGhlIG1ldGhvZCBvbmx5IGluIGNhc2Ugd2hlbiB0aGUgZXJyb3IgaXMgc3BlY2lmaWNhbGx5IGZvciB0aGlzIG1ldGhvZCBvciAKLQkgKiBtZXRob2QgcGFyYW1ldGVyLiAKLQkgKiBAcGFyYW0gZU9iamVjdCB0aGUgb2JqZWN0IHRvIGJlIHZhbGlkYXRlZAotCSAqIEBwYXJhbSBtYXJrZXIgdGhlIHJlc291cmNlIG1hcmtlciAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGluIGNhc2UgdGhlIG1hcmtlciBpcyByZWxldmFudCBmb3IgPGNvZGU+ZU9iamVjdDwvY29kZT4gCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWxldmFudEZvcihmaW5hbCBFT2JqZWN0IGVPYmplY3QsIGZpbmFsIElNYXJrZXIgbWFya2VyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJc3dpdGNoIChlT2JqZWN0LmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpKQotCQl7Ci0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX01FVEhPRDoKLQkJCXJldHVybiBpc1JlbGV2YW50Rm9yTWV0aG9kKChJV2ViTWV0aG9kKWVPYmplY3QsIG1hcmtlcik7Ci0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNOgotCQkJcmV0dXJuIGlzUmVsZXZhbnRGb3JQYXJhbWV0ZXIoKElXZWJQYXJhbSllT2JqZWN0LCBtYXJrZXIpOwotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogRGVmaW5lcyBpZiA8Y29kZT5tYXJrZXI8L2NvZGU+IGlzIHJlbGV2YW50IGZvciA8Y29kZT53ZWJNZXRob2Q8L2NvZGU+LgotCSAqIENoZWNrcyBpZiB0aGUgbWFya2VyIGlzIHNwZWNpZmljYWxseSBmb3IgdGhpcyBtZXRob2Qgb3Igc29tZSBvZiBpdCdzIHBhcmFtZXRlcnMuCi0JICogQHBhcmFtIHdlYk1ldGhvZCB0aGUgbWV0aG9kIHRvIGJlIGNoZWNrZWQKLQkgKiBAcGFyYW0gbWFya2VyIHRoZSBtYXJrZXIgdG8gYmUgY2hlY2tlZAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW4gY2FzZSBtYXJrZXIgaXMgcmVsZXZhbnQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWxldmFudEZvck1ldGhvZChmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCwgZmluYWwgSU1hcmtlciBtYXJrZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlmaW5hbCBJVHlwZSB0eXBlID0gZG9tMlJlc291cmNlTWFwcGVyLmZpbmRUeXBlKHdlYk1ldGhvZCk7Ci0JCWZpbmFsIElNZXRob2QgamF2YU1ldGhvZCA9IGRvbVV0aWwuZmluZE1ldGhvZCh0eXBlLCB3ZWJNZXRob2QpOwotCQlmaW5hbCBJQW5ub3RhdGlvbkluc3BlY3RvciBhbm5vdGF0aW9uSW5zcGVjdG9yID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3Rvcih0eXBlKTsKLQkJYm9vbGVhbiByZWxldmFudCA9IGlzTWFya2VyUmVsZXZhbnRGb3IoamF2YU1ldGhvZCwgbWFya2VyLCBhbm5vdGF0aW9uSW5zcGVjdG9yKTsKLQkJaWYgKCFyZWxldmFudCkKLQkJewotCQkJZm9yIChTdHJpbmcgbWV0aG9kUGFyYW1ldGVyTmFtZSA6IGphdmFNZXRob2QuZ2V0UGFyYW1ldGVyTmFtZXMoKSkKLQkJCXsKLQkJCQlmaW5hbCBJVHlwZVBhcmFtZXRlciBwYXJhbSA9IGphdmFNZXRob2QuZ2V0VHlwZVBhcmFtZXRlcihtZXRob2RQYXJhbWV0ZXJOYW1lKTsKLQkJCQlyZWxldmFudCA9IHJlbGV2YW50IHx8IGlzTWFya2VyUmVsZXZhbnRGb3IocGFyYW0sIG1hcmtlciwgYW5ub3RhdGlvbkluc3BlY3Rvcik7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVsZXZhbnQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWxldmFudEZvclBhcmFtZXRlcihmaW5hbCBJV2ViUGFyYW0gd2ViUGFyYW0sIGZpbmFsIElNYXJrZXIgbWFya2VyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJZmluYWwgSVR5cGUgdHlwZSA9IGRvbTJSZXNvdXJjZU1hcHBlci5maW5kVHlwZSh3ZWJQYXJhbSk7Ci0JCWZpbmFsIElUeXBlUGFyYW1ldGVyIGphdmFQYXJhbWV0ZXIgPSBmaW5kSmF2YVBhcmFtZXRlcih0eXBlLCB3ZWJQYXJhbSk7Ci0JCXJldHVybiBpc01hcmtlclJlbGV2YW50Rm9yKGphdmFQYXJhbWV0ZXIsIG1hcmtlciwgQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3Rvcih0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgdGhlIHtAbGluayBJVHlwZVBhcmFtZXRlcn0gaW5zdGFuY2Ugd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIHdlYiBwYXJhbWV0ZXIgc3BlY2lmaWVkCi0JICovCi0JcHJpdmF0ZSBJVHlwZVBhcmFtZXRlciBmaW5kSmF2YVBhcmFtZXRlcihmaW5hbCBJVHlwZSB0eXBlLCBmaW5hbCBJV2ViUGFyYW0gd2ViUGFyYW0pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQl7Ci0JCWZpbmFsIElNZXRob2QgamF2YU1ldGhvZCA9IGRvbVV0aWwuZmluZE1ldGhvZCh0eXBlLCAoSVdlYk1ldGhvZCkgd2ViUGFyYW0uZUNvbnRhaW5lcigpKTsKLQkJZm9yIChTdHJpbmcgcGFyYW1OYW1lIDogamF2YU1ldGhvZC5nZXRQYXJhbWV0ZXJOYW1lcygpKQotCQl7Ci0JCQlmaW5hbCBJVHlwZVBhcmFtZXRlciBqYXZhUGFyYW0gPSBqYXZhTWV0aG9kLmdldFR5cGVQYXJhbWV0ZXIocGFyYW1OYW1lKTsKLQkJCWlmICh3ZWJQYXJhbS5nZXRJbXBsZW1lbnRhdGlvbigpLmVxdWFscyhqYXZhUGFyYW0uZ2V0RWxlbWVudE5hbWUoKSkpCi0JCQl7Ci0JCQkJcmV0dXJuIGphdmFQYXJhbTsKLQkJCX0KLQkJfQotCi0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlBhcmFtZXRlciAiICsgd2ViUGFyYW0uZ2V0SW1wbGVtZW50YXRpb24oKSArICIgbm90IGZvdW5kIik7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzTWFya2VyUmVsZXZhbnRGb3IoZmluYWwgSU1ldGhvZCBqYXZhTWV0aG9kLCBmaW5hbCBJTWFya2VyIG1hcmtlciwgZmluYWwgSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJZm9yIChJQW5ub3RhdGlvbjxJTWV0aG9kPiBhbm4gOiBpbnNwZWN0b3IuaW5zcGVjdE1ldGhvZChqYXZhTWV0aG9kKSkKLQkJewotCQkJaWYgKGlzTWFya2VyUmVsZXZhbnRUb0Fubm90YXRpb24obWFya2VyLCBhbm4pKQotCQkJewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc01hcmtlclJlbGV2YW50Rm9yKGZpbmFsIElUeXBlUGFyYW1ldGVyIHBhcmFtZXRlciwgZmluYWwgSU1hcmtlciBtYXJrZXIsIGZpbmFsIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvcikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWZvciAoSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IGFubiA6IGluc3BlY3Rvci5pbnNwZWN0UGFyYW0ocGFyYW1ldGVyKSkKLQkJewotCQkJaWYgKGlzTWFya2VyUmVsZXZhbnRUb0Fubm90YXRpb24obWFya2VyLCBhbm4pKQotCQkJewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENoZWNrIHdoZXRoZXIgdGhlIG1hcmtlciBpcyByZWxldmFudCBmb3IgdGhlIGFubm90YXRpb24gc3BlY2lmaWVkPGJyPgotCSAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3b3VsZCByZWFkIGFsbCB0aGUgYW5ub3RhdGlvbnMgcmVsZXZhbnQgZm9yIHRoZSBqYXZhIGVsZW1lbnQgYW5kIGNoZWNrIHdoZXRoZXIgdGhlIG1hcmtlciBzdGFydC9lbmQgcG9zaXRpb24gaXMgYmV0d2VlbiBhbm5vdGF0aW9uIHN0YXJ0L2VuZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc01hcmtlclJlbGV2YW50VG9Bbm5vdGF0aW9uKGZpbmFsIElNYXJrZXIgbWFya2VyLCBmaW5hbCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm4pIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlmaW5hbCBpbnQgYW5uU3RhcnRQb3MgPSBhbm4uZ2V0TG9jYXRvcigpLmdldFN0YXJ0UG9zaXRpb24oKTsKLQkJZmluYWwgaW50IGFubkVuZFBvcyA9IGFublN0YXJ0UG9zICsgYW5uLmdldExvY2F0b3IoKS5nZXRMZW5ndGgoKSAtIDE7Ci0JCXJldHVybiAoYW5uU3RhcnRQb3MgPD0gKEludGVnZXIpIG1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX1NUQVJUKSkgJiYgKGFubkVuZFBvcyA+PSAoSW50ZWdlcikgbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5EKSk7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgYWxsIEFQVCBub25yZWNvbmNpbGUgbWFya2VycyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlIHNwZWNpZmllZAotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbjxJTWFya2VyPiBmaW5kQXB0TWFya2VycyhmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UsIGZpbmFsIGludCBkZXB0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWZpbmFsIENvbGxlY3Rpb248SU1hcmtlcj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxJTWFya2VyPigpOwotCQkvLyBTZWFyY2ggZm9yIGJvdGggQVBUIG1hcmtlciB0eXBlcy4gT25lIG9mIGVhY2ggSURzIGlzIHVzZWQgb24gTGludXggYW5kIFdpbmRvd3MKLQkJZm9yKGZpbmFsIElNYXJrZXIgbSA6IHJlc291cmNlLmZpbmRNYXJrZXJzKEFQVF9NQVJLRVJfSUQsIGZhbHNlLCBkZXB0aCkpCi0JCXsKLQkJCXJlc3VsdC5hZGQobSk7Ci0JCX0KLQkJCi0JCWZvcihmaW5hbCBJTWFya2VyIG0gOiByZXNvdXJjZS5maW5kTWFya2VycyhBUFRfTk9OUkVDT05DSUxFX01BUktFUl9JRCwgZmFsc2UsIGRlcHRoKSkKLQkJewotCQkJcmVzdWx0LmFkZChtKTsKLQkJfQotCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL2FjdGlvbnMvTmF2aWdhdGVUb0ltcGxlbWVudGF0aW9uQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL2FjdGlvbnMvTmF2aWdhdGVUb0ltcGxlbWVudGF0aW9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBiZjEzNjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9hY3Rpb25zL05hdmlnYXRlVG9JbXBsZW1lbnRhdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuYWN0aW9uczsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlUGF0aDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYi5Hcm91cEVKQlByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuR3JvdXBFamJTZXNzaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLmludGVybmFsLnBsdWdpbi5Eb21JbnRlZ3JhdGlvbk1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5JU0VJQ2hpbGRMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklKYXZhV2ViU2VydmljZUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdzRE9NUnVudGltZUV4dGVuc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Xc0RPTVJ1bnRpbWVNYW5hZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuSUxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuTG9nZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMucmVzb3VyY2VzLlByb2plY3RNYW5hZ2VtZW50VXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uOw0KLQ0KLXB1YmxpYyBjbGFzcyBOYXZpZ2F0ZVRvSW1wbGVtZW50YXRpb25BY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbg0KLQkJaW1wbGVtZW50cyBJQWN0aW9uRGVsZWdhdGUyIHsNCi0JcHJvdGVjdGVkIE9iamVjdCBzcmNPYmplY3Q7DQotDQotCXByaXZhdGUgSUphdmFQcm9qZWN0IHByb2plY3Q7DQotDQotCXByaXZhdGUgU3RydWN0dXJlZFZpZXdlciB2aWV3ZXI7DQotDQotCXByb3RlY3RlZCBOYXZpZ2F0ZVRvSW1wbGVtZW50YXRpb25BY3Rpb24oU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpIHsNCi0JCXRoaXMoRG9tSW50ZWdyYXRpb25NZXNzYWdlcy5PcGVuV1NSZXNvdXJjZUFjdGlvbl9OYW1lKTsNCi0NCi0JCXRoaXMudmlld2VyID0gdmlld2VyOw0KLQl9DQotDQotCXByb3RlY3RlZCBOYXZpZ2F0ZVRvSW1wbGVtZW50YXRpb25BY3Rpb24oU3RyaW5nIHRleHQpIHsNCi0JCXN1cGVyKHRleHQpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKQ0KLQl7DQotCQlpZihzcmNPYmplY3QgaW5zdGFuY2VvZiBTZXNzaW9uQmVhbikNCi0JCXsNCi0JCQlyZXR1cm4gRG9tSW50ZWdyYXRpb25NZXNzYWdlcy5OYXZpZ2F0ZVRvSW1wbGVtZW50YXRpb25BY3Rpb25fU2hvd0luV2ViU2VydmljZXNBcmVhQWN0aW9uOw0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCXJldHVybiBEb21JbnRlZ3JhdGlvbk1lc3NhZ2VzLk5hdmlnYXRlVG9JbXBsZW1lbnRhdGlvbkFjdGlvbl9TaG93SW5FSkJBcmVhQWN0aW9uOw0KLQkJfQ0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgew0KLQkJYm9vbGVhbiBpc0VuYWJsZWQgPSBzdXBlci5pc0VuYWJsZWQoKSANCi0JCSYmIHRoaXMudmlld2VyIGluc3RhbmNlb2YgVHJlZVZpZXdlcg0KLQkJJiYgdGhpcy5wcm9qZWN0ICE9bnVsbA0KLQkJJiYgUHJvamVjdE1hbmFnZW1lbnRVdGlscy5pc0VqYjNQcm9qZWN0KHRoaXMucHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsNCi0JCQ0KLQkJaWYoc3JjT2JqZWN0IGluc3RhbmNlb2YgSVdlYlNlcnZpY2UpDQotCQl7DQotCQkJcmV0dXJuIGlzRW5hYmxlZDsNCi0JCX0NCi0JCQ0KLQkJaWYoc3JjT2JqZWN0IGluc3RhbmNlb2YgU2Vzc2lvbkJlYW4pDQotCQl7DQotCQkJU2Vzc2lvbkJlYW4gc2Vzc2lvbkJlYW4gPSAoKFNlc3Npb25CZWFuKXNyY09iamVjdCk7DQotCQkJSVdlYlNlcnZpY2Ugd2ViU2VydmljZSA9IGdldFdlYlNlcnZpY2Uoc2Vzc2lvbkJlYW4pOw0KLQkJCWlmICh3ZWJTZXJ2aWNlID09IG51bGwpDQotCQkJew0KLQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJfQ0KLQkJCXJldHVybiBpc0VuYWJsZWQ7DQotCQl9DQotCQkNCi0JCWlmKHNyY09iamVjdCBpbnN0YW5jZW9mIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UNCi0JCQkJJiYgKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKXNyY09iamVjdCkuaXNJbXBsaWNpdCgpKQ0KLQkJew0KLQkJCXJldHVybiBpc0VuYWJsZWQ7DQotCQl9DQotCQkNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiAobm9uLUphdmFkb2MpDQotCSAqIA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsNCi0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWINCi0JCXJ1bigpOw0KLQ0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGUgdXNlciBoYXMgaW52b2tlZCB0aGlzIGFjdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgcnVuKCkgew0KLQkJaWYgKCFpc0VuYWJsZWQoKSkNCi0JCQlyZXR1cm47DQotDQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gbnVsbDsNCi0NCi0JCWlmKHNyY09iamVjdCBpbnN0YW5jZW9mIFNlc3Npb25CZWFuKQ0KLQkJew0KLQkJCVNlc3Npb25CZWFuIHNlc3Npb25CZWFuID0gKChTZXNzaW9uQmVhbilzcmNPYmplY3QpOw0KLQkJCVN0cmluZyBlamJDbGFzcyA9IHNlc3Npb25CZWFuLmdldEVqYkNsYXNzKCk7DQotCQkJSVdlYlNlcnZpY2Ugd2ViU2VydmljZSA9IGdldFdlYlNlcnZpY2Uoc2Vzc2lvbkJlYW4pOw0KLQkJCWlmICh3ZWJTZXJ2aWNlID09IG51bGwpDQotCQkJew0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQ0KLQkJCUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc0VJID0gd2ViU2VydmljZS5nZXRTZXJ2aWNlRW5kcG9pbnQoKTsNCi0JCQlib29sZWFuIGlzSW1wbGljaXQgPSBzRUkuaXNJbXBsaWNpdCgpOw0KLQkJCVN0cmluZyBzRUlDbGFzczsNCi0JCQlpZiAoIWlzSW1wbGljaXQpew0KLQkJCQlTdHJpbmcgaW1wbCA9IHNFSS5nZXRJbXBsZW1lbnRhdGlvbigpOw0KLQkJCQlzRUlDbGFzcyA9IGltcGw7DQotCQkJfSBlbHNlIHsNCi0JCQkJc0VJQ2xhc3MgPSBlamJDbGFzczsNCi0JCQl9DQotICAgICAgICAgICAgdHJ5IHsNCi0JCQkJY3UgPSBwcm9qZWN0LmZpbmRUeXBlKHNFSUNsYXNzKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCQkJSVJlc291cmNlIHJlc291cmNlID0gY3UuZ2V0UmVzb3VyY2UoKTsNCi0JCQkJbW92ZVRvU0VJTm9kZShyZXNvdXJjZSk7DQotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgew0KLQkJCQlsb2dnZXIoKS5sb2dFcnJvcigiVW5leHBlY3RlZCBleGNlcHRpb24gb2NjdXJyZWQiLCBqbWUpOyAvLyROT04tTkxTLTEkDQotCQkJCXJldHVybjsNCi0JCQl9DQotICAgICAgICAgICAgDQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJdHJ5IHsNCi0JCQkJY3UgPSBwcm9qZWN0LmZpbmRUeXBlKA0KLQkJCQkJCSgoSUphdmFXZWJTZXJ2aWNlRWxlbWVudCkgc3JjT2JqZWN0KQ0KLQkJCQkJCQkJLmdldEltcGxlbWVudGF0aW9uKCkpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsNCi0JCQkJbG9nZ2VyKCkubG9nRXJyb3IoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIG9jY3VycmVkIiwgam1lKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQkJCQ0KLQkJCW1vdmVUb0VqYk5vZGUoY3UuZ2V0UmVzb3VyY2UoKSk7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgSVdlYlNlcnZpY2UgaWYgc2Vzc2lvbkJlYW4gaGFzIGJlZW4gZXhwb3NlZCBhcyB3ZWIgc2VydmljZS4NCi0JICogQHBhcmFtIHNlc3Npb25CZWFuIGEgc2Vzc2lvbiBiZWFuLg0KLQkgKiBAcmV0dXJuIElXZWJTZXJ2aWNlIGlmIHNlc3Npb25CZWFuIGhhcyBiZWVuIGV4cG9zZWQgYXMgd2ViIHNlcnZpY2UuIElmIHRoZSBzZXNzaW9uIGJlYW4gaGFzIG5vdCBiZWVuDQotCSAqIGV4cG9zZWQgYXMgd2ViIHNlcnZpY2UgLSByZXR1cm5zIG51bGwuDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgc2Vzc2lvbkJlYW4gaXMgbnVsbC4NCi0JICovDQotCXByb3RlY3RlZCBJV2ViU2VydmljZSBnZXRXZWJTZXJ2aWNlKGZpbmFsIFNlc3Npb25CZWFuIHNlc3Npb25CZWFuKSANCi0Jew0KLQkJZmluYWwgSVdzRE9NUnVudGltZUV4dGVuc2lvbiBkb21SdW50aW1lID0gZ2V0RG9tUnVudGltZSgpOw0KLQkJaWYgKGRvbVJ1bnRpbWUgPT0gbnVsbCkgew0KLQkJICAgICAgcmV0dXJuIG51bGw7DQotCQl9DQotDQotCQl0cnkgew0KLQkJCWZpbmFsIElET00gZG9tID0gZG9tUnVudGltZS5nZXRET00oKTsNCi0JCQlpZiAoZG9tID09IG51bGwpIHsNCi0JCQkJcmV0dXJuIG51bGw7DQotCQkJfQ0KLQ0KLQkJCWZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3ZWJTZXJ2aWNlUHJvamVjdCA9IERvbVV0aWwuSU5TVEFOQ0UuZmluZFByb2plY3RCeU5hbWUoZG9tLCB0aGlzLnByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7CQkNCi0JCQlyZXR1cm4gRG9tVXRpbC5JTlNUQU5DRS5maW5kV3NCeUltcGxOYW1lKHdlYlNlcnZpY2VQcm9qZWN0LCBzZXNzaW9uQmVhbi5nZXRFamJDbGFzcygpKTsNCi0JCX0gDQotCQljYXRjaCAoV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24gZSkgeyAvLyAkSkwtRVhDJA0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQl9DQotDQotCXByb3RlY3RlZCBJV3NET01SdW50aW1lRXh0ZW5zaW9uIGdldERvbVJ1bnRpbWUoKSB7DQotCQlyZXR1cm4gV3NET01SdW50aW1lTWFuYWdlci5pbnN0YW5jZSgpLmdldERPTVJ1bnRpbWUoSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvbi5JRCk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIG1vdmVUb1NFSU5vZGUoSVJlc291cmNlIHJlc291cmNlKQ0KLQl7DQotCQlUcmVlVmlld2VyIHRyZWVWaWV3ZXIgPSAoVHJlZVZpZXdlcil0aGlzLnZpZXdlcjsNCi0JCUlTZWxlY3Rpb24gc2VsID0gbnVsbDsNCi0NCi0JCU9iamVjdFtdIGV4cGFuZGVkT2JqZWN0cyA9IHRyZWVWaWV3ZXIuZ2V0RXhwYW5kZWRFbGVtZW50cygpOw0KLQ0KLQkJT2JqZWN0W10gcHJvamVjdEVsZW1lbnRzID0gKChJVHJlZUNvbnRlbnRQcm92aWRlcikgdHJlZVZpZXdlcg0KLQkJCQkuZ2V0Q29udGVudFByb3ZpZGVyKCkpLmdldENoaWxkcmVuKHRoaXMucHJvamVjdC5nZXRQcm9qZWN0KCkpOw0KLQkJSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdCA9IG51bGw7DQotDQotCQlmb3IgKGludCBpaSA9IDA7IGlpIDwgcHJvamVjdEVsZW1lbnRzLmxlbmd0aDsgaWkrKykgew0KLQkJCWlmIChwcm9qZWN0RWxlbWVudHNbaWldIGluc3RhbmNlb2YgSVdlYlNlcnZpY2VQcm9qZWN0KSB7DQotCQkJCXdzUHJvamVjdCA9IChJV2ViU2VydmljZVByb2plY3QpIHByb2plY3RFbGVtZW50c1tpaV07DQotCQkJCXRyZWVWaWV3ZXIuZXhwYW5kVG9MZXZlbCh3c1Byb2plY3QsIDIpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotDQotCQlpZiAod3NQcm9qZWN0ID09IG51bGwpDQotCQkJcmV0dXJuOw0KLQ0KLQkJZm9yKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc0VJIDogd3NQcm9qZWN0LmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKSkNCi0JCXsNCi0JCQl0cnkgew0KLQkJCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gcHJvamVjdC5maW5kVHlwZSgNCi0JCQkJCQkoKElKYXZhV2ViU2VydmljZUVsZW1lbnQpIHNFSSkNCi0JCQkJCQkJCS5nZXRJbXBsZW1lbnRhdGlvbigpKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCQkJDQotCQkJCWlmKGN1LmdldFJlc291cmNlKCkuZXF1YWxzKHJlc291cmNlKSkNCi0JCQkJew0KLQkJCQkJc2VsID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc0VJKTsNCi0JCQkJCVRyZWVQYXRoIHRyZWVQYXRoID0gZ2V0VHJlZVBhdGhGb3JTRUkodHJlZVZpZXdlciwNCi0JCQkJCQkJd3NQcm9qZWN0KTsNCi0JCQkJCU9iamVjdFtdIGVsZW1lbnRzVG9FeHBhbmQgPSBuZXcgT2JqZWN0W3RyZWVQYXRoDQotCQkJCQkJCS5nZXRTZWdtZW50Q291bnQoKV07DQotDQotCQkJCQlmb3IgKGludCBqaiA9IDA7IGpqIDwgZWxlbWVudHNUb0V4cGFuZC5sZW5ndGg7IGpqKyspIHsNCi0JCQkJCQlpZiAobm90QWxyZWFkeUV4cGFuZGVkKHRyZWVQYXRoLmdldFNlZ21lbnQoamopLA0KLQkJCQkJCQkJZXhwYW5kZWRPYmplY3RzKSkgew0KLQkJCQkJCQllbGVtZW50c1RvRXhwYW5kW2pqXSA9IHRyZWVQYXRoLmdldFNlZ21lbnQoamopOw0KLQkJCQkJCX0NCi0JCQkJCX0NCi0NCi0JCQkJCWZvciAoaW50IGpqID0gMDsgamogPCBlbGVtZW50c1RvRXhwYW5kLmxlbmd0aDsgamorKykgew0KLQkJCQkJCWlmIChlbGVtZW50c1RvRXhwYW5kW2pqXSAhPSBudWxsKSB7DQotCQkJCQkJCU9iamVjdFtdIHRtcCA9IGV4cGFuZGVkT2JqZWN0czsNCi0JCQkJCQkJZXhwYW5kZWRPYmplY3RzID0gbmV3IE9iamVjdFtleHBhbmRlZE9iamVjdHMubGVuZ3RoICsgMV07DQotDQotCQkJCQkJCWZvciAoaW50IGtrID0gMDsga2sgPCB0bXAubGVuZ3RoOyBraysrKSB7DQotCQkJCQkJCQlleHBhbmRlZE9iamVjdHNba2tdID0gdG1wW2trXTsNCi0JCQkJCQkJfQ0KLQ0KLQkJCQkJCQlleHBhbmRlZE9iamVjdHNbZXhwYW5kZWRPYmplY3RzLmxlbmd0aCAtIDFdID0gZWxlbWVudHNUb0V4cGFuZFtqal07DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQ0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7DQotCQkJCWxvZ2dlcigpLmxvZ0Vycm9yKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiBvY2N1cnJlZCIsIGptZSk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJcmV0dXJuOw0KLQkJCX0NCi0JCQkNCi0JCX0NCi0JCSBzZXRFeHBhbmRlZEVsZW1lbnRzQW5kU2VsZWN0aW9uKHRyZWVWaWV3ZXIsIGV4cGFuZGVkT2JqZWN0cywgc2VsKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIG1vdmVUb0VqYk5vZGUoSVJlc291cmNlIHJlc291cmNlKSB7DQotCQlUcmVlVmlld2VyIHRyZWVWaWV3ZXIgPSAoVHJlZVZpZXdlcil0aGlzLnZpZXdlcjsNCi0JCUlTZWxlY3Rpb24gc2VsID0gbnVsbDsNCi0NCi0JCU9iamVjdFtdIGV4cGFuZGVkT2JqZWN0cyA9IHRyZWVWaWV3ZXIuZ2V0RXhwYW5kZWRFbGVtZW50cygpOw0KLQ0KLQkJT2JqZWN0W10gcHJvamVjdEVsZW1lbnRzID0gKChJVHJlZUNvbnRlbnRQcm92aWRlcikgdHJlZVZpZXdlcg0KLQkJCQkuZ2V0Q29udGVudFByb3ZpZGVyKCkpLmdldENoaWxkcmVuKHRoaXMucHJvamVjdC5nZXRQcm9qZWN0KCkpOw0KLQkJR3JvdXBFSkJQcm92aWRlciBlamJQcm92aWRlciA9IG51bGw7DQotCQlHcm91cEVqYlNlc3Npb24gZWpiU2Vzc2lvbiA9IG51bGw7DQotDQotCQlmb3IgKGludCBpaSA9IDA7IGlpIDwgcHJvamVjdEVsZW1lbnRzLmxlbmd0aDsgaWkrKykgew0KLQkJCWlmIChwcm9qZWN0RWxlbWVudHNbaWldIGluc3RhbmNlb2YgR3JvdXBFSkJQcm92aWRlcikgew0KLQkJCQllamJQcm92aWRlciA9IChHcm91cEVKQlByb3ZpZGVyKSBwcm9qZWN0RWxlbWVudHNbaWldOw0KLQkJCQl0cmVlVmlld2VyLmV4cGFuZFRvTGV2ZWwoZWpiUHJvdmlkZXIsIDEpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotDQotCQlpZiAoZWpiUHJvdmlkZXIgPT0gbnVsbCkNCi0JCQlyZXR1cm47DQotDQotCQlmb3IgKE9iamVjdCBlamJQcm92aWRlckNoaWxkIDogZWpiUHJvdmlkZXIuZ2V0Q2hpbGRyZW4oKSkgew0KLQkJCWlmIChlamJQcm92aWRlckNoaWxkIGluc3RhbmNlb2YgR3JvdXBFamJTZXNzaW9uKSB7DQotCQkJCWVqYlNlc3Npb24gPSAoR3JvdXBFamJTZXNzaW9uKSBlamJQcm92aWRlckNoaWxkOw0KLQkJCQl0cmVlVmlld2VyLmV4cGFuZFRvTGV2ZWwoZWpiU2Vzc2lvbiwgMik7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJaWYgKGVqYlNlc3Npb24gPT0gbnVsbCkgew0KLQkJCXJldHVybjsNCi0JCX0NCi0NCi0JCU9iamVjdFtdIGVqYnMgPSB0cmVlVmlld2VyLmdldEV4cGFuZGVkRWxlbWVudHMoKTsNCi0NCi0JCWZvciAoaW50IGlpID0gMDsgaWkgPCBlamJzLmxlbmd0aDsgaWkrKykgew0KLQkJCWlmICgoZWpic1tpaV0gaW5zdGFuY2VvZiBTZXNzaW9uQmVhbil8fChlamJzW2lpXSBpbnN0YW5jZW9mIE1lc3NhZ2VEcml2ZW5CZWFuKSkgew0KLQkJCQ0KLQkJCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBmaW5kSmF2YVByb2plY3QoZWpic1tpaV0pOw0KLQkJCQlJVHlwZSB0ID0gbnVsbDsNCi0JCQkJdHJ5IHsNCi0JCQkJCWlmKChlamJzW2lpXSBpbnN0YW5jZW9mIFNlc3Npb25CZWFuKSkNCi0JCQkJCQl0ID0gamF2YVByb2plY3QuZmluZFR5cGUoKChTZXNzaW9uQmVhbillamJzW2lpXSkuZ2V0RWpiQ2xhc3MoKSk7DQotCQkJCQllbHNlDQotCQkJCQkJdCA9IGphdmFQcm9qZWN0LmZpbmRUeXBlKCgoTWVzc2FnZURyaXZlbkJlYW4pZWpic1tpaV0pLmdldEVqYkNsYXNzKCkpOw0KLQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgew0KLQkJCQkJcmV0dXJuOw0KLQkJCQl9DQotCQkJCUlSZXNvdXJjZSByID0gdC5nZXRSZXNvdXJjZSgpOw0KLQkJCQkNCi0JCQkJaWYgKHIuZXF1YWxzKHJlc291cmNlKSkgew0KLQkJCQkJc2VsID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWpic1tpaV0pOw0KLQkJCQkJVHJlZVBhdGggdHJlZVBhdGggPSBnZXRUcmVlUGF0aEZvck9iamVjdCh0cmVlVmlld2VyLA0KLQkJCQkJCQllamJzW2lpXSk7DQotCQkJCQlleHBhbmRFbGVtZW50cyhleHBhbmRlZE9iamVjdHMsIHRyZWVQYXRoKTsNCi0NCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJIHNldEV4cGFuZGVkRWxlbWVudHNBbmRTZWxlY3Rpb24odHJlZVZpZXdlciwgZXhwYW5kZWRPYmplY3RzLCBzZWwpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSUphdmFQcm9qZWN0IGZpbmRKYXZhUHJvamVjdChPYmplY3QgZWpiKQ0KLQl7DQotCQlJUHJvamVjdCBwcm9qID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KGVqYik7DQotCQlyZXR1cm4gSmF2YUNvcmUuY3JlYXRlKHByb2opOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBzZXRFeHBhbmRlZEVsZW1lbnRzQW5kU2VsZWN0aW9uKFRyZWVWaWV3ZXIgdHJlZVZpZXdlciwgT2JqZWN0W10gZXhwYW5kZWRPYmplY3RzLCBJU2VsZWN0aW9uIHNlbCkNCi0Jew0KLQkJdHJlZVZpZXdlci5zZXRFeHBhbmRlZEVsZW1lbnRzKGV4cGFuZGVkT2JqZWN0cyk7DQotDQotCQlpZiAoc2VsICE9IG51bGwpIHsNCi0JCQl0cmVlVmlld2VyLnNldFNlbGVjdGlvbihzZWwsIHRydWUpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwcml2YXRlIHZvaWQgZXhwYW5kRWxlbWVudHMoT2JqZWN0W10gZXhwYW5kZWRPYmplY3RzLCBUcmVlUGF0aCB0cmVlUGF0aCkNCi0Jew0KLQkJDQotCQlPYmplY3RbXSBlbGVtZW50c1RvRXhwYW5kID0gbmV3IE9iamVjdFt0cmVlUGF0aC5nZXRTZWdtZW50Q291bnQoKV07DQotDQotCQlmb3IgKGludCBqaiA9IDA7IGpqIDwgZWxlbWVudHNUb0V4cGFuZC5sZW5ndGg7IGpqKyspIA0KLQkJew0KLQkJCWlmIChub3RBbHJlYWR5RXhwYW5kZWQodHJlZVBhdGguZ2V0U2VnbWVudChqaiksIGV4cGFuZGVkT2JqZWN0cykpIA0KLQkJCXsNCi0JCQkJZWxlbWVudHNUb0V4cGFuZFtqal0gPSB0cmVlUGF0aC5nZXRTZWdtZW50KGpqKTsNCi0JCQl9DQotCQl9DQotDQotCQlmb3IgKGludCBqaiA9IDA7IGpqIDwgZWxlbWVudHNUb0V4cGFuZC5sZW5ndGg7IGpqKyspIHsNCi0JCSAgICBpZiAoZWxlbWVudHNUb0V4cGFuZFtqal0gIT0gbnVsbCkgew0KLQkJICAgIAlPYmplY3RbXSB0bXAgPSBleHBhbmRlZE9iamVjdHM7DQotCQkgICAgICAgIGV4cGFuZGVkT2JqZWN0cyA9IG5ldyBPYmplY3RbZXhwYW5kZWRPYmplY3RzLmxlbmd0aCArIDFdOw0KLQ0KLQkJCQlmb3IgKGludCBrayA9IDA7IGtrIDwgdG1wLmxlbmd0aDsga2srKykgew0KLQkJCQkJZXhwYW5kZWRPYmplY3RzW2trXSA9IHRtcFtra107DQotCQkJCX0NCi0NCi0JCQkJZXhwYW5kZWRPYmplY3RzW2V4cGFuZGVkT2JqZWN0cy5sZW5ndGggLSAxXSA9IGVsZW1lbnRzVG9FeHBhbmRbampdOw0KLQkJICAgIH0NCi0JCX0NCi0JfQ0KLQ0KLQ0KLQlwcml2YXRlIGJvb2xlYW4gbm90QWxyZWFkeUV4cGFuZGVkKE9iamVjdCBvYmosIE9iamVjdFtdIGV4cE9ianMpIHsNCi0JCWZvciAoaW50IGlpID0gMDsgaWkgPCBleHBPYmpzLmxlbmd0aDsgaWkrKykgew0KLQkJCWlmIChleHBPYmpzW2lpXS5lcXVhbHMob2JqKSkgew0KLQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0NCi0JcHJpdmF0ZSBUcmVlUGF0aCBnZXRUcmVlUGF0aEZvclNFSShUcmVlVmlld2VyIHRyZWVWaWV3ZXIsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QpDQotCXsNCi0JCVRyZWVQYXRoW10gdHJlZVBhdGhzID0gdHJlZVZpZXdlci5nZXRFeHBhbmRlZFRyZWVQYXRocygpOw0KLQ0KLQkJZm9yIChpbnQgaWkgPSAwOyBpaSA8IHRyZWVQYXRocy5sZW5ndGg7IGlpKyspIHsNCi0JCQlpZiAodHJlZVBhdGhzW2lpXS5nZXRMYXN0U2VnbWVudCgpIGluc3RhbmNlb2YgSVNFSUNoaWxkTGlzdA0KLQkJCQkJJiYgY29udGFpbnModHJlZVBhdGhzW2lpXSwgd3NQcm9qZWN0KSkgew0KLQkJCQlyZXR1cm4gdHJlZVBhdGhzW2lpXTsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zKFRyZWVQYXRoIHRyZWVQYXRoLCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0KQ0KLQl7DQotCQlmb3IoaW50IGlpPTA7IGlpPHRyZWVQYXRoLmdldFNlZ21lbnRDb3VudCgpOyBpaSsrKQ0KLQkJew0KLQkJCWlmKHRyZWVQYXRoLmdldFNlZ21lbnQoaWkpLmVxdWFscyh3c1Byb2plY3QpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHRydWU7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JcHJpdmF0ZSBUcmVlUGF0aCBnZXRUcmVlUGF0aEZvck9iamVjdChUcmVlVmlld2VyIHRyZWVWaWV3ZXIsIE9iamVjdCBvYmopIHsNCi0JCVRyZWVQYXRoW10gdHJlZVBhdGhzID0gdHJlZVZpZXdlci5nZXRFeHBhbmRlZFRyZWVQYXRocygpOw0KLQ0KLQkJZm9yIChpbnQgaWkgPSAwOyBpaSA8IHRyZWVQYXRocy5sZW5ndGg7IGlpKyspIHsNCi0JCQlpZiAodHJlZVBhdGhzW2lpXS5nZXRMYXN0U2VnbWVudCgpLmVxdWFscyhvYmopKSB7DQotCQkJCXJldHVybiB0cmVlUGF0aHNbaWldOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qDQotCSAqIChub24tSmF2YWRvYykNCi0JICogDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sDQotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsNCi0JCS8vIFRPRE8gSEFDSyENCi0JCXVwZGF0ZVNlbGVjdGlvbigoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbik7DQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwNCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwNCi0JCQlJSmF2YVByb2plY3QgcHJvamVjdCkgew0KLQkJc3VwZXIuc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOw0KLQ0KLQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhlIHN0cnVjdHVyZWQgc2VsZWN0aW9uIGhhcyBjaGFuZ2VkIGluIHRoZSB3b3JrYmVuY2guIFN1YmNsYXNzZXMgc2hvdWxkDQotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHJlYWN0IHRvIHRoZSBjaGFuZ2UuIFJldHVybnMgdHJ1ZSBpZiB0aGUgYWN0aW9uDQotCSAqIHNob3VsZCBiZSBlbmFibGVkIGZvciB0aGlzIHNlbGVjdGlvbiwgYW5kIGZhbHNlIG90aGVyd2lzZS4NCi0JICogDQotCSAqIFdoZW4gdGhpcyBtZXRob2QgaXMgb3ZlcnJpZGRlbiwgdGhlIHN1cGVyIG1ldGhvZCBtdXN0IGFsd2F5cyBiZSBpbnZva2VkLg0KLQkgKiBJZiB0aGUgc3VwZXIgbWV0aG9kIHJldHVybnMgZmFsc2UsIHRoaXMgbWV0aG9kIG11c3QgYWxzbyByZXR1cm4gZmFsc2UuDQotCSAqIA0KLQkgKiBAcGFyYW0gc2VsDQotCSAqICAgICAgICAgICAgdGhlIG5ldyBzdHJ1Y3R1cmVkIHNlbGVjdGlvbg0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHMpIHsNCi0JCWlmICghc3VwZXIudXBkYXRlU2VsZWN0aW9uKHMpKQ0KLQkJCXJldHVybiBmYWxzZTsNCi0NCi0JCXNyY09iamVjdCA9IHMuZ2V0Rmlyc3RFbGVtZW50KCk7DQotDQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBJTG9nZ2VyIGxvZ2dlcigpIHsNCi0JCXJldHVybiBuZXcgTG9nZ2VyKCk7DQotCX0NCi0JDQotCS8qDQotCSAqIChub24tSmF2YWRvYykNCi0JICogDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMiNkaXNwb3NlKCkNCi0JICovDQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7DQotCQkvLyBEaXNwb3NlDQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyI2luaXQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7DQotCQkvLyBpbml0DQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyI3J1bldpdGhFdmVudChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwNCi0JICogICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCkNCi0JICovDQotCXB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChJQWN0aW9uIGFjdGlvbiwgRXZlbnQgZXZlbnQpIHsNCi0JCXJ1bldpdGhFdmVudChldmVudCk7DQotDQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9hY3Rpb25zL09wZW5XU1Jlc291cmNlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL2FjdGlvbnMvT3BlbldTUmVzb3VyY2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjJmODZkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL2FjdGlvbnMvT3BlbldTUmVzb3VyY2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLmFjdGlvbnM7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWVtYmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLmludGVybmFsLnBsdWdpbi5Eb21JbnRlZ3JhdGlvbk1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLklMb2dnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLkxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JEZXNjcmlwdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsNCi0NCi1wdWJsaWMgY2xhc3MgT3BlbldTUmVzb3VyY2VBY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbiBpbXBsZW1lbnRzIElBY3Rpb25EZWxlZ2F0ZTIgDQotew0KLQlwcm90ZWN0ZWQgT2JqZWN0IHNyY09iamVjdDsNCi0NCi0JcHJpdmF0ZSBJSmF2YVByb2plY3QgcHJvamVjdDsNCi0JDQotCXByaXZhdGUgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWk7DQotCXByaXZhdGUgRG9tVXRpbCB1dGlsID0gRG9tVXRpbC5JTlNUQU5DRTsNCi0NCi0JcHJvdGVjdGVkIE9wZW5XU1Jlc291cmNlQWN0aW9uKCkgew0KLQkJdGhpcyhEb21JbnRlZ3JhdGlvbk1lc3NhZ2VzLk9wZW5XU1Jlc291cmNlQWN0aW9uX05hbWUpOw0KLQl9DQotDQotCXByb3RlY3RlZCBPcGVuV1NSZXNvdXJjZUFjdGlvbihTdHJpbmcgdGV4dCkgew0KLQkJc3VwZXIodGV4dCk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsNCi0JCWJvb2xlYW4gaXNFbmFibGVkID0gc3VwZXIuaXNFbmFibGVkKCkNCi0JCSYmIHRoaXMucHJvamVjdCE9bnVsbDsNCi0JCQ0KLQkJaWYoc3JjT2JqZWN0IGluc3RhbmNlb2YgSVdlYlNlcnZpY2UpDQotCQl7DQotCQkJcmV0dXJuIGlzRW5hYmxlZDsNCi0JCX0NCi0JCQ0KLQkJaWYoc3JjT2JqZWN0IGluc3RhbmNlb2YgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSkNCi0JCXsNCi0JCQlyZXR1cm4gaXNFbmFibGVkOw0KLQkJfQ0KLQkJDQotCQlpZihzcmNPYmplY3QgaW5zdGFuY2VvZiBJV2ViTWV0aG9kKQ0KLQkJew0KLQkJCXJldHVybiBpc0VuYWJsZWQ7DQotCQl9DQotCQkNCi0JCWlmKHNyY09iamVjdCBpbnN0YW5jZW9mIElXZWJQYXJhbSkNCi0JCXsNCi0JCQlyZXR1cm4gaXNFbmFibGVkOw0KLQkJfQkJDQotCQkNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQkvKg0KLQkgKiAobm9uLUphdmFkb2MpDQotCSAqIA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsNCi0JCXJ1bigpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGUgdXNlciBoYXMgaW52b2tlZCB0aGlzIGFjdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgcnVuKCkgew0KLQkJaWYgKCFpc0VuYWJsZWQoKSkNCi0JCQlyZXR1cm47DQotDQotCQlJQ29tcGlsYXRpb25Vbml0IGN1Ow0KLQkJSVdlYk1ldGhvZCB3ZWJNZXRob2QgPSBudWxsOw0KLQkJSVdlYlBhcmFtIHdlYlBhcmFtID0gbnVsbDsNCi0JCQ0KLQkJaWYoc3JjT2JqZWN0IGluc3RhbmNlb2YgSVdlYk1ldGhvZCkNCi0JCXsNCi0JCQl3ZWJNZXRob2QgPSAoSVdlYk1ldGhvZClzcmNPYmplY3Q7DQotCQkJc3JjT2JqZWN0ID0gc2VpOw0KLQkJfQ0KLQkJaWYoc3JjT2JqZWN0IGluc3RhbmNlb2YgSVdlYlBhcmFtKQ0KLQkJew0KLQkJCXdlYlBhcmFtID0gKElXZWJQYXJhbSlzcmNPYmplY3Q7DQotCQkJd2ViTWV0aG9kID0gKElXZWJNZXRob2Qpd2ViUGFyYW0uZUNvbnRhaW5lcigpOw0KLQkJCXNyY09iamVjdCA9IHNlaTsNCi0JCX0NCi0JCQ0KLQkJdHJ5IHsNCi0NCi0JCQljdSA9IHByb2plY3QuZmluZFR5cGUoKChJSmF2YVdlYlNlcnZpY2VFbGVtZW50KSBzcmNPYmplY3QpLmdldEltcGxlbWVudGF0aW9uKCkpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQ0KLQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBnZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7DQotDQotCQkJSUVkaXRvckRlc2NyaXB0b3IgZGVzYyA9IGdldFdvcmtiZW5jaCgpLmdldEVkaXRvclJlZ2lzdHJ5KCkuZ2V0RGVmYXVsdEVkaXRvcihjdS5nZXRSZXNvdXJjZSgpLmdldE5hbWUoKSk7DQotCQkNCi0JCQljdSA9IGdldENVVG9PcGVuKGN1LCB3ZWJNZXRob2QpOwkJDQotCQkJaWYgKGN1ID09IG51bGwpDQotCQkJew0KLQkJCQlsb2dnZXIoKS5sb2dFcnJvcigiVW5hYmxlIHRvIGxvY2F0ZSBjb250YWluaW5nIENVIHRvIG9wZW4iKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQkJDQotCQkJSUZpbGUgZmlsZSA9IGdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kRmlsZXNGb3JMb2NhdGlvbihjdS5nZXRSZXNvdXJjZSgpLmdldExvY2F0aW9uKCkpWzBdOyANCi0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBwYWdlLm9wZW5FZGl0b3IobmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlKSwgZGVzYy5nZXRJZCgpKTsNCi0JCQkNCi0JCQlJTWFya2VyIG1hcmtlciA9IGZpbGUuY3JlYXRlTWFya2VyKElNYXJrZXIuVEVYVCk7DQotCQkJSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsNCi0JCQkNCi0JCQltYXAucHV0KElNYXJrZXIuQ0hBUl9TVEFSVCwgZ2V0TWFya2VyUG9zaXRpb24oY3UsIHdlYk1ldGhvZCwgZmFsc2UpKTsNCi0JCQltYXAucHV0KElNYXJrZXIuQ0hBUl9FTkQsIGdldE1hcmtlclBvc2l0aW9uKGN1LCB3ZWJNZXRob2QsIHRydWUpKTsNCi0JCQkNCi0JCQltYXJrZXIuc2V0QXR0cmlidXRlcyhtYXApOw0KLQkJCQ0KLQkJCUlERS5nb3RvTWFya2VyKGVkaXRvciwgbWFya2VyKTsNCi0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIHBpZSkgew0KLQkJCWxvZ2dlcigpLmxvZ0Vycm9yKCJVbmFibGUgdG8gb3BlbiBwYXJ0IGVkaXRvciIsIHBpZSk7IC8vJE5PTi1OTFMtMSQNCi0JCX0gY2F0Y2goQ29yZUV4Y2VwdGlvbiBjZSkgew0KLQkJCWxvZ2dlcigpLmxvZ0Vycm9yKGNlLmdldE1lc3NhZ2UoKSwgY2UpOyANCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIGludCBnZXRNYXJrZXJQb3NpdGlvbihJQ29tcGlsYXRpb25Vbml0IGN1LCBJV2ViTWV0aG9kIHdlYk1ldGhvZCwgYm9vbGVhbiBlbmRQb3MpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSVR5cGVbXSB0eXBlcyA9IGN1LmdldFR5cGVzKCk7DQotCQlmb3IgKGludCBpaSA9IDA7IGlpIDwgdHlwZXMubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmICh3ZWJNZXRob2QgPT0gbnVsbCkNCi0JCQl7DQotCQkJCXJldHVybiBnZXRQb3NpdGlvbih0eXBlc1tpaV0sIGVuZFBvcyk7DQotCQkJfQ0KLQ0KLQkJCWZpbmFsIElNZXRob2QgbWV0aG9kID0gdXRpbC5maW5kTWV0aG9kKHR5cGVzW2lpXSwgd2ViTWV0aG9kKTsNCi0JCQlpZiAobWV0aG9kPT1udWxsKSB7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQkNCi0JCQlyZXR1cm4gZ2V0UG9zaXRpb24obWV0aG9kLCBlbmRQb3MpOw0KLQkJfQ0KLQkJCQkNCi0JCXJldHVybiAwOw0KLQl9DQotCQ0KLQlwcml2YXRlIGludCBnZXRQb3NpdGlvbihJTWVtYmVyIG1lbWJlciwgYm9vbGVhbiBlbmRQb3MpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gDQotCXsNCi0JCXJldHVybiBtZW1iZXIuZ2V0TmFtZVJhbmdlKCkuZ2V0T2Zmc2V0KCkgKyAoKGVuZFBvcykgPyBtZW1iZXIuZ2V0TmFtZVJhbmdlKCkuZ2V0TGVuZ3RoKCkgOiAwKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGdldENVVG9PcGVuKElDb21waWxhdGlvblVuaXQgY3UsIElXZWJNZXRob2Qgd2ViTWV0aG9kKQ0KLQl7DQotCQlpZiAod2ViTWV0aG9kID09IG51bGwpIA0KLQkJew0KLQkJCXJldHVybiBjdTsNCi0JCX0NCi0JCQ0KLQkJdHJ5DQotCQl7DQotCQkJZmluYWwgSVR5cGVbXSB0eXBlcyA9IGN1LmdldFR5cGVzKCk7CQkJDQotCQkJZm9yKGludCBpaT0wOyBpaTx0eXBlcy5sZW5ndGg7IGlpKyspDQotCQkJew0KLQkJCQlJTWV0aG9kIG1ldGhvZCA9IHV0aWwuZmluZE1ldGhvZCh0eXBlc1tpaV0sIHdlYk1ldGhvZCk7DQotCQkJCWlmIChtZXRob2QgIT0gbnVsbCkNCi0JCQkJew0KLQkJCQkJcmV0dXJuIHR5cGVzW2lpXS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCQkNCi0JCQlmb3IoaW50IGlpPTA7IGlpPHR5cGVzLmxlbmd0aDsgaWkrKykNCi0JCQl7DQotCQkJCUlUeXBlW10gc3VwZXJJbnRmVHlwZXMgPSB0eXBlc1tpaV0ubmV3U3VwZXJ0eXBlSGllcmFyY2h5KG51bGwpLmdldFN1cGVySW50ZXJmYWNlcyh0eXBlc1tpaV0pOw0KLQkJCQkNCi0JCQkJZm9yKGludCBqaj0wOyBqajxzdXBlckludGZUeXBlcy5sZW5ndGg7IGpqKyspDQotCQkJCXsNCi0JCQkJCUlDb21waWxhdGlvblVuaXQgY3VUb09wZW4gPSBnZXRDVVRvT3BlbihzdXBlckludGZUeXBlc1tqal0uZ2V0Q29tcGlsYXRpb25Vbml0KCksIHdlYk1ldGhvZCk7DQotCQkJCQkNCi0JCQkJCWlmKGN1VG9PcGVuIT1udWxsKQ0KLQkJCQkJew0KLQkJCQkJCXJldHVybiBjdVRvT3BlbjsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQkNCi0JCQkJSVR5cGUgc3VwZXJDbGFzc1R5cGUgPSB0eXBlc1tpaV0ubmV3U3VwZXJ0eXBlSGllcmFyY2h5KG51bGwpLmdldFN1cGVyY2xhc3ModHlwZXNbaWldKTsNCi0JCQkJDQotCQkJCUlDb21waWxhdGlvblVuaXQgY3VUb09wZW4gPSBnZXRDVVRvT3BlbihzdXBlckNsYXNzVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgd2ViTWV0aG9kKTsNCi0JCQkJCQ0KLQkJCQlpZihjdVRvT3BlbiE9bnVsbCkNCi0JCQkJew0KLQkJCQkJcmV0dXJuIGN1VG9PcGVuOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkNCi0JCXsNCi0JCQlsb2dnZXIoKS5sb2dFcnJvcihqbWUuZ2V0TWVzc2FnZSgpLCBqbWUpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwNCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgew0KLQkJdXBkYXRlU2VsZWN0aW9uKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwgSUphdmFQcm9qZWN0IHByb2plY3QsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpKSB7DQotCQlzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7DQotDQotCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0Ow0KLQkJdGhpcy5zZWkgPSBzZWk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoZSBzdHJ1Y3R1cmVkIHNlbGVjdGlvbiBoYXMgY2hhbmdlZCBpbiB0aGUgd29ya2JlbmNoLiBTdWJjbGFzc2VzIHNob3VsZA0KLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byByZWFjdCB0byB0aGUgY2hhbmdlLiBSZXR1cm5zIHRydWUgaWYgdGhlIGFjdGlvbg0KLQkgKiBzaG91bGQgYmUgZW5hYmxlZCBmb3IgdGhpcyBzZWxlY3Rpb24sIGFuZCBmYWxzZSBvdGhlcndpc2UuDQotCSAqIA0KLQkgKiBXaGVuIHRoaXMgbWV0aG9kIGlzIG92ZXJyaWRkZW4sIHRoZSBzdXBlciBtZXRob2QgbXVzdCBhbHdheXMgYmUgaW52b2tlZC4NCi0JICogSWYgdGhlIHN1cGVyIG1ldGhvZCByZXR1cm5zIGZhbHNlLCB0aGlzIG1ldGhvZCBtdXN0IGFsc28gcmV0dXJuIGZhbHNlLg0KLQkgKiANCi0JICogQHBhcmFtIHNlbA0KLQkgKiAgICAgICAgICAgIHRoZSBuZXcgc3RydWN0dXJlZCBzZWxlY3Rpb24NCi0JICovDQotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzKSB7DQotCQlpZiAoIXN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzKSkNCi0JCQlyZXR1cm4gZmFsc2U7DQotDQotCQlzcmNPYmplY3QgPSBzLmdldEZpcnN0RWxlbWVudCgpOw0KLQ0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0JDQotCS8qDQotCSAqIChub24tSmF2YWRvYykNCi0JICogDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMiNkaXNwb3NlKCkNCi0JICovDQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7DQotCQkvLyBEaXNwb3NlDQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyI2luaXQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7DQotCQkvLyBpbml0DQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyI3J1bldpdGhFdmVudChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwNCi0JICogICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCkNCi0JICovDQotCXB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChJQWN0aW9uIGFjdGlvbiwgRXZlbnQgZXZlbnQpIHsNCi0JCXJ1bldpdGhFdmVudChldmVudCk7DQotDQotCX0NCi0JDQotCXByaXZhdGUgSUxvZ2dlciBsb2dnZXIoKSB7DQotCQlyZXR1cm4gbmV3IExvZ2dlcigpOw0KLQl9DQotDQotCXByaXZhdGUgSVdvcmtiZW5jaCBnZXRXb3JrYmVuY2goKSB7DQotCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgew0KLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL2FjdGlvbnMvV1NBY3Rpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9hY3Rpb25zL1dTQWN0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmRmOGRkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL2FjdGlvbnMvV1NBY3Rpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuYWN0aW9uczsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVTZWxlY3Rpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVBhdGg7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuQ29tbW9uQWN0aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uQWN0aW9uQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vbkFjdGlvbkV4dGVuc2lvblNpdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uTWVudUNvbnN0YW50czsNCi0NCi0NCi1wdWJsaWMgY2xhc3MgV1NBY3Rpb25Qcm92aWRlciBleHRlbmRzIENvbW1vbkFjdGlvblByb3ZpZGVyIA0KLXsNCi0JcHJpdmF0ZSBPcGVuV1NSZXNvdXJjZUFjdGlvbiBvcGVuQWN0aW9uOw0KLQ0KLQlwcml2YXRlIE5hdmlnYXRlVG9JbXBsZW1lbnRhdGlvbkFjdGlvbiBuYXZpZ2F0ZUFjdGlvbjsNCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBmaWxsQWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSANCi0Jew0KLQkJaWYob3BlbkFjdGlvbi5pc0VuYWJsZWQoKSkgDQotCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKElDb21tb25BY3Rpb25Db25zdGFudHMuT1BFTiwgb3BlbkFjdGlvbik7DQotCQkNCi0JCWlmKG5hdmlnYXRlQWN0aW9uLmlzRW5hYmxlZCgpKQ0KLQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkZJTkQuZ2V0SWQoKSwgbmF2aWdhdGVBY3Rpb24pOwkNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBtZW51KSANCi0Jew0KLQkJaWYgKGdldENvbnRleHQoKT09bnVsbCB8fCBnZXRDb250ZXh0KCkuZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKQ0KLQkJCXJldHVybjsNCi0JCQ0KLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRDb250ZXh0KCkuZ2V0U2VsZWN0aW9uKCk7DQotCQlvcGVuQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsNCi0JCW5hdmlnYXRlQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsNCi0JCW5hdmlnYXRlQWN0aW9uLnNldFRleHQobmF2aWdhdGVBY3Rpb24uZ2V0VGV4dCgpKTsNCi0JCQ0KLQkJaWYgKG9wZW5BY3Rpb24uaXNFbmFibGVkKCkpDQotCQkJbWVudS5pbnNlcnRBZnRlcihJQ29tbW9uTWVudUNvbnN0YW50cy5HUk9VUF9PUEVOLCBvcGVuQWN0aW9uKTsNCi0JCQ0KLQkJaWYobmF2aWdhdGVBY3Rpb24uaXNFbmFibGVkKCkpDQotCQkJbWVudS5pbnNlcnRBZnRlcihJQ29tbW9uTWVudUNvbnN0YW50cy5HUk9VUF9PUEVOX1dJVEgsIG5hdmlnYXRlQWN0aW9uKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgaW5pdChJQ29tbW9uQWN0aW9uRXh0ZW5zaW9uU2l0ZSBzaXRlKSB7DQotCQlzdXBlci5pbml0KHNpdGUpOw0KLQkJDQotCQlvcGVuQWN0aW9uID0gbmV3IE9wZW5XU1Jlc291cmNlQWN0aW9uKCk7DQotCQluYXZpZ2F0ZUFjdGlvbiA9IGluaXROYXZpZ2F0ZUFjdGlvbihzaXRlKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIE5hdmlnYXRlVG9JbXBsZW1lbnRhdGlvbkFjdGlvbiBpbml0TmF2aWdhdGVBY3Rpb24oSUNvbW1vbkFjdGlvbkV4dGVuc2lvblNpdGUgc2l0ZSkNCi0Jew0KLQkJcmV0dXJuIG5ldyBOYXZpZ2F0ZVRvSW1wbGVtZW50YXRpb25BY3Rpb24oc2l0ZS5nZXRTdHJ1Y3R1cmVkVmlld2VyKCkpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBzZXRDb250ZXh0KEFjdGlvbkNvbnRleHQgY29udGV4dCkgew0KLQkJaWYgKGNvbnRleHQgIT0gbnVsbCAmJiBjb250ZXh0LmdldFNlbGVjdGlvbigpIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIA0KLQkJew0KLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY29udGV4dC5nZXRTZWxlY3Rpb24oKTsNCi0JCQkNCi0JCQlpZihzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVHJlZVNlbGVjdGlvbikNCi0JCQl7DQotCQkJCVRyZWVQYXRoW10gcGF0aHMgPSAoKElUcmVlU2VsZWN0aW9uKXNlbGVjdGlvbikuZ2V0UGF0aHNGb3Ioc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKTsNCi0JCQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7DQotCQkJCQ0KLQkJCQlmb3IoaW50IGlpPTA7IGlpPHBhdGhzLmxlbmd0aDsgaWkrKykNCi0JCQkJew0KLQkJCQkJVHJlZVBhdGggcGF0aCA9IHBhdGhzW2lpXTsNCi0JCQkJCUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gbnVsbDsNCi0JCQkJCQ0KLQkJCQkJZm9yKGludCBqaj0wOyBqajxwYXRoLmdldFNlZ21lbnRDb3VudCgpOyBqaisrKQ0KLQkJCQkJew0KLQkJCQkJCWlmKHBhdGguZ2V0U2VnbWVudChqaikgaW5zdGFuY2VvZiBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKQ0KLQkJCQkJCXsNCi0JCQkJCQkJc2VpID0gKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpcGF0aC5nZXRTZWdtZW50KGpqKTsNCi0JCQkJCQkJYnJlYWs7DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQkJCQkJDQotCQkJCQlmb3IoaW50IGpqPTA7IGpqPHBhdGguZ2V0U2VnbWVudENvdW50KCk7IGpqKyspDQotCQkJCQl7DQotCQkJCQkJaWYocGF0aC5nZXRTZWdtZW50KGpqKSBpbnN0YW5jZW9mIElQcm9qZWN0KQ0KLQkJCQkJCXsNCi0JCQkJCQkJcHJvamVjdCA9IChJUHJvamVjdClwYXRoLmdldFNlZ21lbnQoamopOw0KLQkJCQkJCQlvcGVuQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uLCBnZXRKYXZhUHJvamVjdChwcm9qZWN0KSwgc2VpKTsNCi0JCQkJCQkJbmF2aWdhdGVBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24sIGdldEphdmFQcm9qZWN0KHByb2plY3QpKTsNCi0JCQkJCQkJc3VwZXIuc2V0Q29udGV4dChjb250ZXh0KTsNCi0JCQkJCQkJcmV0dXJuOw0KLQkJCQkJCX0NCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCQkNCi0JCQlvcGVuQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsNCi0JCQluYXZpZ2F0ZUFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7DQotCQl9DQotCQkNCi0JCXN1cGVyLnNldENvbnRleHQoY29udGV4dCk7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoSVByb2plY3QgcHJvamVjdCkNCi0Jew0KLQkJcmV0dXJuIEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmQxYTQzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3OTM4NzY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWUwNDg0ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNNb24gSnVsIDIwIDE1OjI1OjMxIEVFU1QgMjAwOQ0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTc3MTIwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMA0KLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDINCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjANCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wDQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lO3NpbmdsZXRvbjo9dHJ1ZQ0KLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXINCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4NCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwucGx1Z2luLkpheFdzRG9tUnVudGltZVBsdWdpbg0KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsDQotIG9yZy5lY2xpcHNlLmpkdC5jb3JlLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMsDQotIG9yZy5lY2xpcHNlLnVpLA0KLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywNCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlDQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41DQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzIiwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnBsdWdpbjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMiLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwudXRpbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMiLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbixvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cyIsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9uO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cyIsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9uLmltcGw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzIiwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmRlZmF1bHRzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cyxvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpIiwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzIiwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN0YXRlO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cyxvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpIiwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN5bmM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzIiwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnJlZ2lzdHJ5O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24sb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzIiwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWw7DQotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLA0KLSAgIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cywNCi0gICBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLA0KLSAgIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aSINCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQxMGFmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkF1Z3VzdCAxNSwgMjAwOTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYWFlMjQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwNCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcw0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkyNWI3MzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgTGFuZ3VhZ2UgRmlsZSBmb3IgdGhpcyBQbHVnaW4NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBHZW5lcmljIExhYmVsIGFuZCBEZXNjcmlwdGlvbg0KLUJ1bmRsZS1OYW1lLjA9SkFYLVdTIERPTSBSdW50aW1lDQotQnVuZGxlLVZlbmRvci4wPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtDQotDQotRG9tUnVudGltZXNFeHRlbnNpb25fTmFtZSA9IERPTSBSdW50aW1lcw0KLUV4dGVuc2lvblBvaW50LU5hbWUuMyA9IEpFRTUgRE9NIGNvbnRyaWJ1dGlvbg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NzQ2YTlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4NCi08IS0tDQotICAgIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gICANCi0gICAgQ29udHJpYnV0b3JzOg0KLSAgICAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIC0tPg0KLQ0KLTxwbHVnaW4+DQotDQotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZG9tcnVudGltZXMiIG5hbWU9IiVEb21SdW50aW1lc0V4dGVuc2lvbl9OYW1lIiBzY2hlbWE9InNjaGVtYS9ydW50aW1lcy5leHNkIi8+DQotICAgICAgDQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuc3RhcnR1cCI+DQotICAgICAgPHN0YXJ0dXAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5Xc0RvbVN0YXJ0dXBQYXJ0aWNpcGFudCIvPg0KLSAgIDwvZXh0ZW5zaW9uPg0KLSAgIA0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+DQotICAgCTxwYWNrYWdlIA0KLSAgICAgICB1cmkgPSAiaHR0cDovLy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvZG9tLmVjb3JlIiANCi0gICAgICAgY2xhc3MgPSAib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlIiAvPg0KLSAgCTwvZXh0ZW5zaW9uPg0KLQ0KLQ0KLSAgIDxleHRlbnNpb24NCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5qZWU1IiANCi0gICAgICAgICBuYW1lPSIlRXh0ZW5zaW9uUG9pbnQtTmFtZS4zIg0KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuZG9tcnVudGltZXMiPg0KLSAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkplZTVXc0RvbVJ1bnRpbWVFeHRlbnNpb24iLz4NCi0gICAgICA8cHJvamVjdF9mYWNldCBpZD0ianN0LmVqYiIgdmVyc2lvbj0iMy4wIi8+DQotICAgICAgPHByb2plY3RfZmFjZXQgaWQ9ImpzdC53ZWIiIHZlcnNpb249IjIuNSIvPg0KLSAgIDwvZXh0ZW5zaW9uPg0KLSAgIA0KLTwvcGx1Z2luPg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NjaGVtYS9ydW50aW1lcy5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc2NoZW1hL3J1bnRpbWVzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY5YTBkZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc2NoZW1hL3J1bnRpbWVzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSIgaWQ9InN1cHBvcnRlZHJ1bnRpbWVzIiBuYW1lPSJTdXBwb3J0ZWQgUnVudGltZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIGNvbnRyaWJ1dGluZyB3ZWIgc2VydmljZSBydW50aW1lIGV4dGVuc2lvbnMgKGltcGxlbWVudGF0aW9ucyBvZiB0aGUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV3NET01SdW50aW1lRXh0ZW5zaW9uIGludGVmYWNlKSBwZXIgYSBnaXZlbiBwcm9qZWN0IGZhY2V0IHZlcnNpb24uCi1SdW50aW1lIGV4dGVuc2lvbnMgYXJlIHJlc3BvbnNpYmxlIGZvciBwcm92aWRpbmcgYXJ0aWZhY3RzIGZvciB3ZWIgc2VydmljZXMgaW1wbGVtZW50ZWQgdmlhIGEgZ2l2ZW4gd2ViIHNlcnZpY2UgdGVjaG5vbG9neSAoSkFYLVdTLCBKQVgtUlBDLCBldGMuKQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icHJvamVjdF9mYWNldCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJpbXBsZW1lbnRhdGlvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhpcyBlbGVtZW50IHNwZWNpZmllcyB0aGUgY29udHJpYnV0ZWQgcnVudGltZSBleHRlbnNpb24gY2xhc3MKLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcyB3aGljaCBpbXBsZW1lbnRzIHRoZSBydW50aW1lIGV4dGVuc2lvbgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iOm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdzRE9NUnVudGltZUV4dGVuc2lvbiIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJwcm9qZWN0X2ZhY2V0Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBwcm9qZWN0IGZhY2V0IHZlcnNpb24gdGhpcyBydW50aW1lIGV4dGVuc2lvbiBpcyBhcHBsaWNhYmxlIGZvci4gQSBydW50aW1lIGV4dGVuc2lvbiBtYXkgYmUgYXBwbGljYWJsZSBmb3Igb25lIG9yIG1vcmUgcHJvamVjdCBmYWNldCB2ZXJzaW9ucwotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSUQgb2YgdGhlIHByb2plY3QgZmFjZXQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB2ZXJzaW9uIG9mIHRoZSBwcm9qZWN0IGZhY2V0Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uCi0gICAgICBpZD0mcXVvdDtvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmplZTUmcXVvdDsgCi0gICAgICBuYW1lPSZxdW90O0pFRTUgRE9NIGNvbnRyaWJ1dGlvbiZxdW90OwotICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmRvbXJ1bnRpbWVzJnF1b3Q7Jmd0OwotICAgICAgJmx0O2ltcGxlbWVudGF0aW9uIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KZWU1V3NEb21SdW50aW1lRXh0ZW5zaW9uJnF1b3Q7LyZndDsKLSAgICAgICZsdDtwcm9qZWN0X2ZhY2V0IGlkPSZxdW90O2pzdC5lamImcXVvdDsgdmVyc2lvbj0mcXVvdDszLjAmcXVvdDsvJmd0OwotICAgICAgJmx0O3Byb2plY3RfZmFjZXQgaWQ9JnF1b3Q7anN0LndlYiZxdW90OyB2ZXJzaW9uPSZxdW90OzIuNSZxdW90Oy8mZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsmbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgaW50ZXJmYWNlcyBvZiB0aGUgd2ViIHNlcnZpY2UgbW9kZWwgYXJlIGxvY2F0ZWQgaW4gdGhlICZxdW90O29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkmcXVvdDsgcGFja2FnZS4KLUluIG9yZGVyIHRvIGFjY2VzcyB0aGUgY29udHJpYnV0ZWQgcnVudGltZSBleHRlbnNpb25zIHVzZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldzRE9NUnVudGltZU1hbmFnZXIKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwOSBTQVAgQUcsIFdhbGxkb3JmLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL0RvbVV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvRG9tVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MzczYjg2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvRG9tVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklKYXZhV2ViU2VydmljZUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsLkRvbVN3aXRjaDsNCi0NCi0vKioNCi0gKiANCi0gKiBAbm9leHRlbmQgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgZXh0ZW5kZWQgYnkgY2xpZW50cy4NCi0gKg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBEb21VdGlsDQotew0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERvbVV0aWwgSU5TVEFOQ0UgPSBuZXcgRG9tVXRpbCgpOw0KLQkNCi0JcHJpdmF0ZSBmaW5hbCBEb21Td2l0Y2g8U3RyaW5nPiBpbXBsU3dpdGNoOw0KLQkNCi0JcHVibGljIERvbVV0aWwoKSB7DQotCQlpbXBsU3dpdGNoID0gY3JlYXRlSW1wbEZpbmRlclN3aXRjaCgpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBzZXRGZWF0dXJlVmFsdWUoZmluYWwgRU9iamVjdCBvYmplY3QsIGZpbmFsIGludCBmZWF0dXJlSWQsIGZpbmFsIE9iamVjdCB2YWx1ZSkNCi0Jew0KLQkJZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBvYmplY3QuZUNsYXNzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKGZlYXR1cmVJZCk7DQotCQlvYmplY3QuZVNldChmZWF0dXJlLCB2YWx1ZSk7DQotCX0NCi0NCi0JcHVibGljIE9iamVjdCBnZXRGZWF0dXJlVmFsdWUoZmluYWwgRU9iamVjdCBvYmplY3QsIGZpbmFsIGludCBmZWF0dXJlSWQpDQotCXsNCi0JCWZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gb2JqZWN0LmVDbGFzcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZShmZWF0dXJlSWQpOw0KLQkJcmV0dXJuIG9iamVjdC5lR2V0KGZlYXR1cmUpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGFkZFRvQ29sbGVjdGlvbkZlYXR1cmUoZmluYWwgRU9iamVjdCBvYmplY3QsIGZpbmFsIGludCBmZWF0dXJlSWQsIGZpbmFsIE9iamVjdCB2YWx1ZSkNCi0Jew0KLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCQlmaW5hbCBDb2xsZWN0aW9uPE9iamVjdD4gb2xkVmFsdWUgPSAoQ29sbGVjdGlvbjxPYmplY3Q+KSBnZXRGZWF0dXJlVmFsdWUob2JqZWN0LCBmZWF0dXJlSWQpOw0KLQkJb2xkVmFsdWUuYWRkKHZhbHVlKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgSVdlYlNlcnZpY2VQcm9qZWN0IGZpbmRQcm9qZWN0QnlOYW1lKElET00gZG9tLCBTdHJpbmcgbmFtZSkNCi0Jew0KLQkJZm9yIChJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0IDogZG9tLmdldFdlYlNlcnZpY2VQcm9qZWN0cygpKQ0KLQkJew0KLQkJCWlmICh3c1Byb2plY3QuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkNCi0JCQl7DQotCQkJCXJldHVybiB3c1Byb2plY3Q7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JcHVibGljIElXZWJTZXJ2aWNlIGZpbmRXc0J5SW1wbE5hbWUoSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdCwgU3RyaW5nIG5hbWUpDQotCXsNCi0JCWZvciAoSVdlYlNlcnZpY2Ugd3MgOiB3c1Byb2plY3QuZ2V0V2ViU2VydmljZXMoKSkNCi0JCXsNCi0JCQlpZiAod3MuZ2V0SW1wbGVtZW50YXRpb24oKS5lcXVhbHMobmFtZSkpDQotCQkJew0KLQkJCQlyZXR1cm4gd3M7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JcHVibGljIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgZmluZFNlaUJ5SW1wbE5hbWUoSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdCwgU3RyaW5nIG5hbWUpDQotCXsNCi0JCWZvciAoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgOiB3c1Byb2plY3QuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpKQ0KLQkJew0KLQkJCWlmIChzZWkuZ2V0SW1wbGVtZW50YXRpb24oKS5lcXVhbHMobmFtZSkpDQotCQkJew0KLQkJCQlyZXR1cm4gc2VpOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQkNCi0JcHVibGljIElXZWJNZXRob2QgZmluZFdlYk1ldGhvZEJ5SW1wbChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSwgU3RyaW5nIGltcGwpDQotCXsNCi0JCWZvciAoSVdlYk1ldGhvZCB3bSA6IHNlaS5nZXRXZWJNZXRob2RzKCkpDQotCQl7DQotCQkJaWYgKHdtLmdldEltcGxlbWVudGF0aW9uKCkuZXF1YWxzKGltcGwpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHdtOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwdWJsaWMgSU1ldGhvZCBmaW5kTWV0aG9kKGZpbmFsIElUeXBlIHNlaVR5cGUsIGZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZvciAoSU1ldGhvZCBtZXRob2QgOiBzZWlUeXBlLmdldE1ldGhvZHMoKSkgDQotCQl7DQotCQkJaWYgKHdlYk1ldGhvZC5nZXRJbXBsZW1lbnRhdGlvbigpLmVxdWFscyhjYWxjSW1wbGVtZW50YXRpb24obWV0aG9kKSkpIHsNCi0JCQkJcmV0dXJuIG1ldGhvZDsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9CQ0KLQ0KLQlwdWJsaWMgSUphdmFXZWJTZXJ2aWNlRWxlbWVudCBmaW5kSmF2YVdlYlNlcnZpY2VFbGVtQnlJbXBsTmFtZShJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0LCBTdHJpbmcgbmFtZSkNCi0Jew0KLQkJZmluYWwgSVdlYlNlcnZpY2Ugd3MgPSBmaW5kV3NCeUltcGxOYW1lKHdzUHJvamVjdCwgbmFtZSk7DQotCQlyZXR1cm4gd3MgPT0gbnVsbCA/IGZpbmRTZWlCeUltcGxOYW1lKHdzUHJvamVjdCwgbmFtZSkgOiB3czsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENhbGN1bGF0ZXMgdGhlIG1ldGhvZCBzaWduYXR1cmUgdG8gYmUgdXNlZCBhcyBpbXBsZW1lbnRhdGlvbiBpbiB7QGxpbmsgSVdlYk1ldGhvZH0NCi0JICogQHBhcmFtIG1ldGhvZA0KLQkgKiBAcmV0dXJuIGNhbGN1bGF0ZWQgc3RyaW5nDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGNhbGNJbXBsZW1lbnRhdGlvbihmaW5hbCBJTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7CQkNCi0JCXJldHVybiBtZXRob2QuZ2V0RWxlbWVudE5hbWUoKSArIG1ldGhvZC5nZXRTaWduYXR1cmUoKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIEV4dHJhY3Qge0BsaW5rIElXZWJTZXJ2aWNlUHJvamVjdH0gb3V0IG9mIERPTSBvYmplY3QgYnkgcmVjdXJzaXZlbHkNCi0JICogaXRlcmF0aW5nIHBhcmVudCBvYmplY3RzLg0KLQkgKiBAcGFyYW0gZU9iamVjdA0KLQkgKiBAcmV0dXJuIHRoZSBmb3VuZCBwcm9qZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGluIGNhc2Ugbm90IGZvdW5kDQotCSAqLw0KLQlwdWJsaWMgSVdlYlNlcnZpY2VQcm9qZWN0IGZpbmRXc1Byb2plY3QoRU9iamVjdCBlT2JqZWN0KQ0KLQl7DQotCQlFT2JqZWN0IHBhcmVudCA9IGVPYmplY3Q7DQotCQl3aGlsZSAocGFyZW50IT1udWxsKSANCi0JCXsNCi0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSVdlYlNlcnZpY2VQcm9qZWN0KSB7DQotCQkJCXJldHVybiAoSVdlYlNlcnZpY2VQcm9qZWN0KXBhcmVudDsNCi0JCQl9DQotCQkJDQotCQkJcGFyZW50ID0gcGFyZW50LmVDb250YWluZXIoKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0JCQ0KLQkNCi0JLyoqDQotCSAqIERlZmluZXMgaWYgdGhpcyBTRUkgaXMgcGFydCBvZiBvdXRzaWRlLWluIHdlYiBzZXJ2aWNlDQotCSAqIEBwYXJhbSBzZWkNCi0JICogQHJldHVybiB0cnVlIGlmIHRoZXJlIGlzIGEgd2ViIHNlcnZpY2Ugd2l0aCB3c2RsTG9jYXRpb24gc2V0IHRvIHNvbWV0aGluZyBkaWZmZXJlbnQgdGhhbiA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNPdXRzaWRlSW5XZWJTZXJ2aWNlKGZpbmFsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpKQ0KLQl7DQotCQlpZiAoc2VpID09IG51bGwpIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQkNCi0JCWZvciAoSVdlYlNlcnZpY2Ugd2ViU2VydmljZSA6IHNlaS5nZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpKSB7DQotCQkJaWYgKHdlYlNlcnZpY2UuZ2V0V3NkbExvY2F0aW9uKCkhPW51bGwpIHsNCi0JCQkJcmV0dXJuIHRydWU7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZmFsc2U7DQotCX0JDQotCQ0KLQkvKioNCi0JICogQ2FsY3VsYXRlcyB1bmlxdWUgaW1wbGVtZW50YXRpb24gZm9yIERPTSBvYmplY3QgaW4gdGhlIHNjb3BlIG9mIHRoZSByZXNvdXJjZSBpbiB3aGljaA0KLQkgKiB0aGV5IGV4aXN0LiBVc2VmdWwgd2hlbiB5b3UgbmVlZCB0byB1bmlxdWVseSBpZGVudGlmeSBET00gb2JqZWN0LiANCi0JICogDQotCSAqIEBwYXJhbSBlT2JqZWN0DQotCSAqIEByZXR1cm4gY2FsY3VsYXRlZCBpbXBsZW1lbnRhdGlvbg0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBjYWxjVW5pcXVlSW1wbChmaW5hbCBFT2JqZWN0IGVPYmplY3QpDQotCXsNCi0JCWlmIChlT2JqZWN0LmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpID09IERvbVBhY2thZ2UuSVdFQl9QQVJBTSkgDQotCQl7DQotCQkJZmluYWwgSVdlYlBhcmFtIHdwID0gKElXZWJQYXJhbSkgZU9iamVjdDsNCi0JCQlyZXR1cm4gKChJV2ViTWV0aG9kKXdwLmVDb250YWluZXIoKSkuZ2V0SW1wbGVtZW50YXRpb24oKSArICJbIiArIHdwLmdldEltcGxlbWVudGF0aW9uKCkgKyAiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZXh0cmFjdEltcGxlbWVudGF0aW9uKGVPYmplY3QpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogRXh0cmFjdHMgdGhlIGltcGxlbWVudGF0aW9uIHByb3BlcnR5IGZvciBET00gb2JqZWN0IHdpdGhvdXQgY2FzdGluZyA6LUQuDQotCSAqDQotCSAqIEBwYXJhbSBlT2JqZWN0DQotCSAqIEByZXR1cm4gdGhlIGltcGxlbWVudGF0aW9uIA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBleHRyYWN0SW1wbGVtZW50YXRpb24oZmluYWwgRU9iamVjdCBlT2JqZWN0KSB7DQotCQlyZXR1cm4gaW1wbFN3aXRjaC5kb1N3aXRjaChlT2JqZWN0KTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBEb21Td2l0Y2g8U3RyaW5nPiBjcmVhdGVJbXBsRmluZGVyU3dpdGNoKCkNCi0Jew0KLQkJcmV0dXJuIG5ldyBEb21Td2l0Y2g8U3RyaW5nPigpDQotCQl7DQotCQkJQE92ZXJyaWRlDQotCQkJcHVibGljIFN0cmluZyBjYXNlSVdlYlNlcnZpY2UoSVdlYlNlcnZpY2Ugd3MpIHsNCi0JCQkJcmV0dXJuIHdzLmdldEltcGxlbWVudGF0aW9uKCk7DQotCQkJfQ0KLQkJCQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBTdHJpbmcgY2FzZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkpIHsNCi0JCQkJcmV0dXJuIHNlaS5nZXRJbXBsZW1lbnRhdGlvbigpOw0KLQkJCX0NCi0JCQkNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgU3RyaW5nIGNhc2VJV2ViTWV0aG9kKElXZWJNZXRob2Qgd20pIHsNCi0JCQkJcmV0dXJuIHdtLmdldEltcGxlbWVudGF0aW9uKCk7DQotCQkJfQkNCi0JCQkNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgU3RyaW5nIGNhc2VJV2ViUGFyYW0oSVdlYlBhcmFtIHdwKSB7DQotCQkJCXJldHVybiB3cC5nZXRJbXBsZW1lbnRhdGlvbigpOw0KLQkJCX0NCi0JCQkNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgU3RyaW5nIGNhc2VJV2ViU2VydmljZVByb2plY3QoSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdCkgew0KLQkJCQlyZXR1cm4gd3NQcm9qZWN0LmdldE5hbWUoKTsNCi0JCQl9DQotCQl9Ow0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvSU5hbWVkRXh0ZW5zaW9uSW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JTmFtZWRFeHRlbnNpb25JbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNlNTA5YWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JTmFtZWRFeHRlbnNpb25JbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZTsNCi0NCi0vKioNCi0gKiBJbnRlcmZhY2UgcmVwcmVzZW50aWcgYW5kIGV4dGVudGlvbi4NCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElOYW1lZEV4dGVuc2lvbkluZm8NCi17DQotDQotCS8qKg0KLQkgKiBUaGUgdW5pcXVlIElEIHRvIGlkZW50aWZ5IHRoaXMgY29uc3VtZXIgdHlwZSB3aGVuIGNhbGxpbmcgdGhlIDxjb2RlPlByb3h5R2VuZXJhdG9yRmFjdG9yeTwvY29kZT4sIGUuZy4gPGNvZGU+amVlL2pheHdzPC9jb2RlPg0KLQkgKiANCi0JICogQHJldHVybiBub24tZW1wdHkgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIElEDQotCSAqLw0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldElkKCk7DQotDQotCS8qKg0KLQkgKiBBIHZlcmJvc2UgbmFtZSBmb3IgdGhlIHR5cGUgb2YgY29uc3VtZXIsIGUuZy4gPGNvZGU+SkFYLVdTPC9jb2RlPg0KLQkgKiANCi0JICogQHJldHVybiBsb2NhbGl6ZWQgc3RyaW5nIHVzZWQgZm9yIHRoZSBVSQ0KLQkgKi8NCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXROYW1lKCk7DQotDQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvSVByb3BlcnR5RGVmYXVsdHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvSVByb3BlcnR5RGVmYXVsdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmNiY2QxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL0lQcm9wZXJ0eURlZmF1bHRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCi0NCi0vKioNCi0gKiBJbnRlcmZhY2UgdGhhdCBwcm92aWRlcyBkZWZhdWx0IHZhbHVlcyBmb3IgRE9NIG9iamVjdCdzIHByb3BlcnRpZXMuDQotICogVXN1YWxseSB0aGlzIGludGVyZmFjZSBzaG91bGQgYmUgdXNlZCBieSBjbGllbnRzIHRoYXQgbmVlZCB0byByZXZlcnQgc29tZQ0KLSAqIHByb3BlcnR5IHZhbHVlIHRvIHRoZSBkZWZhdWx0IG9uZS4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGludGVyZmFjZSBJUHJvcGVydHlEZWZhdWx0cyANCi17DQotCS8qKg0KLQkgKiBEZWZpbmVzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIDxjb2RlPmZlYXR1cmU8L2NvZGU+Lg0KLQkgKiANCi0JICogQHBhcmFtIGZlYXR1cmUgdGhlIGZlYXR1cmUgcmVwcmVzZW50aW5nIHRoZSBvYmplY3RzIHByb3BlcnR5IHR5cGUNCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZS4gSW4gY2FzZSA8Y29kZT5udWxsPC9jb2RlPiBpcyBwb3NzaWJsZSBwcm9wZXJ0eSB2YWx1ZQ0KLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBtaWdodCBiZSByZXR1cm5lZA0KLQkgKi8NCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JUHJvcGVydHlTdGF0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JUHJvcGVydHlTdGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlOGM0ZTliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvSVByb3BlcnR5U3RhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSBmb3IgY2hlY2tpbmcgdGhlIHN0YXRlIG9mIHNvbWUgcHJvcGVydHkgZm9yIGNvbmNyZXRlIERPTSBvYmplY3QuDQotICogVGhpcyBpbnRlcmZhY2Ugc2hvdWxkIGJlIHVzZWQgYnkgRE9NIGNsaWVudHMgdGhhdCBuZWVkIHRvIGtub3cgaWYgc29tZSBwcm9wZXJ0eSANCi0gKiBjYW4gYmUgY2hhbmdlZCAtIGZvciBleGFtcGxlIFVJIGVkaXRvciB0aGF0IG5lZWRzIHRvIGtub3cgaWYgdGhlIHByb3BlcnR5IHNob3VsZA0KLSAqIGJlIGVuYWJsZWQgZm9yIGVkaXQgb3IgZGlzYWJsZWQuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3BlcnR5U3RhdGUgDQotew0KLQkvKioNCi0JICogRGVmaW5lcyBpZiBwcm9wZXJ0eSBpcyBjaGFuZ2VhYmxlLg0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGluIGNhc2UgcHJvcGVydHkgY2FuIGJlIGNoYW5nZWQNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzQ2hhbmdlYWJsZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSk7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvV3NEb21TdGFydHVwUGFydGljaXBhbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvV3NEb21TdGFydHVwUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGQxMzg1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL1dzRG9tU3RhcnR1cFBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Xc0RPTVJ1bnRpbWVNYW5hZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwucGx1Z2luLkpheFdzRG9tUnVudGltZU1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU3RhcnR1cDsNCi0NCi0vKioNCi0gKiBTdGFydHVwIHBhcnRpY2lwYW50IHJlZ2lzdGVyZWQgb24gSURFIHN0YXJ0dXAgZXh0ZW5zaW9uIHBvaW50DQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqIEBub2V4dGVuZCBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBleHRlbmRlZCBieSBjbGllbnRzLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBXc0RvbVN0YXJ0dXBQYXJ0aWNpcGFudCBpbXBsZW1lbnRzIElTdGFydHVwIA0KLXsNCi0JDQotCS8qKg0KLQkgKiBDYWxsZWQgYnkgdGhlIEVjbGlwc2Ugb24gd29ya2JlbmNoIHN0YXJ0dXAuDQotCSAqIFN0YXJ0cyBsb2FkIGZvciByZWdpc3RlcmVkIHdlYiBzZXJ2aWNlIHJ1bnRpbWVzIA0KLQkgKi8NCi0gICAgcHVibGljIHZvaWQgZWFybHlTdGFydHVwKCkNCi0gICAgew0KLQkJSm9iIGpvYiA9IG5ldyBKb2IoSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuV3NEb21TdGFydHVwUGFydGljaXBhbnRfU3RhcnR1cF9Kb2JfTWVzc2FnZSkNCi0JCXsNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQ0KLQkJCXsNCi0JCSAgICAJV3NET01SdW50aW1lTWFuYWdlci5pbnN0YW5jZSgpLmNyZWF0ZURPTVJ1bnRpbWVzKG1vbml0b3IpOw0KLQkJICAgIAlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsNCi0JCQl9DQotCQl9Ow0KLQkJDQotCQlqb2Iuc2V0VXNlcihmYWxzZSk7DQotCQlqb2Iuc2V0UHJpb3JpdHkoSm9iLkxPTkcpOw0KLQkJam9iLnNldFJ1bGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7DQotCQlqb2Iuc2NoZWR1bGUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21GYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVhODc2MTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5Ow0KLQ0KLQ0KLS8qKg0KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuDQotICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuDQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UNCi0gKiBAZ2VuZXJhdGVkDQotICovDQotcHVibGljIGludGVyZmFjZSBEb21GYWN0b3J5IGV4dGVuZHMgRUZhY3Rvcnkgew0KLQkvKioNCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCURvbUZhY3RvcnkgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tRmFjdG9yeUltcGwuaW5pdCgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JRE9NPC9lbT4nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JRE9NPC9lbT4nLg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlJRE9NIGNyZWF0ZUlET00oKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SUphdmEgV2ViIFNlcnZpY2UgRWxlbWVudDwvZW0+Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SUphdmEgV2ViIFNlcnZpY2UgRWxlbWVudDwvZW0+Jy4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JSUphdmFXZWJTZXJ2aWNlRWxlbWVudCBjcmVhdGVJSmF2YVdlYlNlcnZpY2VFbGVtZW50KCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SVNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT4nLg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIGNyZWF0ZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SVdlYiBNZXRob2Q8L2VtPicuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklXZWIgTWV0aG9kPC9lbT4nLg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlJV2ViTWV0aG9kIGNyZWF0ZUlXZWJNZXRob2QoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SVdlYiBQYXJhbTwvZW0+Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SVdlYiBQYXJhbTwvZW0+Jy4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JSVdlYlBhcmFtIGNyZWF0ZUlXZWJQYXJhbSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JV2ViIFNlcnZpY2U8L2VtPicuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklXZWIgU2VydmljZTwvZW0+Jy4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JSVdlYlNlcnZpY2UgY3JlYXRlSVdlYlNlcnZpY2UoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SVdlYiBTZXJ2aWNlIFByb2plY3Q8L2VtPicuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklXZWIgU2VydmljZSBQcm9qZWN0PC9lbT4nLg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlJV2ViU2VydmljZVByb2plY3QgY3JlYXRlSVdlYlNlcnZpY2VQcm9qZWN0KCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklXZWIgVHlwZTwvZW0+Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SVdlYiBUeXBlPC9lbT4nLg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlJV2ViVHlwZSBjcmVhdGVJV2ViVHlwZSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5Lg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlEb21QYWNrYWdlIGdldERvbVBhY2thZ2UoKTsNCi0NCi19IC8vRG9tRmFjdG9yeQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDZhYWIwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsNCi0NCi0NCi0vKioNCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLg0KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQNCi0gKiA8dWw+DQotICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPg0KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+DQotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+DQotICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4NCi0gKiA8L3VsPg0KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5DQotICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiDQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgRG9tUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsNCi0JLyoqDQotCSAqIFRoZSBwYWNrYWdlIG5hbWUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlTdHJpbmcgZU5BTUUgPSAiZG9tIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKioNCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCVN0cmluZyBlTlNfVVJJID0gImh0dHA6Ly8vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2RvbS5lY29yZSI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JLyoqDQotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKioNCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCURvbVBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwuaW5pdCgpOw0KLQ0KLQkvKioNCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JRE9NSW1wbCA8ZW0+SURPTTwvZW0+fScgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklET01JbXBsDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwjZ2V0SURPTSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCWludCBJRE9NID0gMDsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XZWIgU2VydmljZSBQcm9qZWN0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSURPTV9fV0VCX1NFUlZJQ0VfUFJPSkVDVFMgPSAwOw0KLQ0KLQkvKioNCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPklET008L2VtPicgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSURPTV9GRUFUVVJFX0NPVU5UID0gMTsNCi0NCi0JLyoqDQotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSUphdmFXZWJTZXJ2aWNlRWxlbWVudEltcGwgPGVtPklKYXZhIFdlYiBTZXJ2aWNlIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JSmF2YVdlYlNlcnZpY2VFbGVtZW50SW1wbA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldElKYXZhV2ViU2VydmljZUVsZW1lbnQoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlpbnQgSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVCA9IDE7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wbGVtZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTiA9IDA7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUgPSAxOw0KLQ0KLQkvKioNCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPklKYXZhIFdlYiBTZXJ2aWNlIEVsZW1lbnQ8L2VtPicgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gMjsNCi0NCi0JLyoqDQotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUltcGwgPGVtPklTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+fScgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJbXBsDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwjZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCWludCBJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0UgPSAyOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGxlbWVudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRBVElPTiA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX05BTUUgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGxpY2l0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVCA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wbGVtZW50aW5nIFdlYiBTZXJ2aWNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRJTkdfV0VCX1NFUlZJQ0VTID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XZWIgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19XRUJfTUVUSE9EUyA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IE5hbWVzcGFjZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fVEFSR0VUX05BTUVTUEFDRSA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFN0eWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfU1RZTEUgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0Ow0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBVc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19VU0UgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1Ow0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEUgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2Ow0KLQ0KLQkvKioNCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPklTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+JyBjbGFzcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfRkVBVFVSRV9DT1VOVCA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDc7DQotDQotCS8qKg0KLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJNZXRob2RJbXBsIDxlbT5JV2ViIE1ldGhvZDwvZW0+fScgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJNZXRob2RJbXBsDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwjZ2V0SVdlYk1ldGhvZCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCWludCBJV0VCX01FVEhPRCA9IDM7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wbGVtZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX01FVEhPRF9fSU1QTEVNRU5UQVRJT04gPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTjsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVdFQl9NRVRIT0RfX05BTUUgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcmFtZXRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfTUVUSE9EX19QQVJBTUVURVJTID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGNsdWRlZDwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfTUVUSE9EX19FWENMVURFRCA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFN0eWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19TVFlMRSA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFVzZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfVVNFID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEUgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0Ow0KLQ0KLQkvKioNCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPklXZWIgTWV0aG9kPC9lbT4nIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfTUVUSE9EX0ZFQVRVUkVfQ09VTlQgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1Ow0KLQ0KLQkvKioNCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViUGFyYW1JbXBsIDxlbT5JV2ViIFBhcmFtPC9lbT59JyBjbGFzcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYlBhcmFtSW1wbA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldElXZWJQYXJhbSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCWludCBJV0VCX1BBUkFNID0gNDsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBsZW1lbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfUEFSQU1fX0lNUExFTUVOVEFUSU9OID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT047DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfUEFSQU1fX05BTUUgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1BBUkFNX19LSU5EID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1BBUkFNX19UWVBFX05BTUUgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfUEFSQU1fX1BBUlRfTkFNRSA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IE5hbWVzcGFjZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0UgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlYWRlcjwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfUEFSQU1fX0hFQURFUiA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7DQotDQotCS8qKg0KLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SVdlYiBQYXJhbTwvZW0+JyBjbGFzcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1BBUkFNX0ZFQVRVUkVfQ09VTlQgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1Ow0KLQ0KLQkvKioNCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViU2VydmljZUltcGwgPGVtPklXZWIgU2VydmljZTwvZW0+fScgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJTZXJ2aWNlSW1wbA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldElXZWJTZXJ2aWNlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JaW50IElXRUJfU0VSVklDRSA9IDU7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wbGVtZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1NFUlZJQ0VfX0lNUExFTUVOVEFUSU9OID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT047DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfU0VSVklDRV9fTkFNRSA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUU7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludDwvYj48L2VtPicgcmVmZXJlbmNlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfU0VSVklDRV9fU0VSVklDRV9FTkRQT0lOVCA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IE5hbWVzcGFjZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfU0VSVklDRV9fVEFSR0VUX05BTUVTUEFDRSA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9ydCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVdFQl9TRVJWSUNFX19QT1JUX05BTUUgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldzZGwgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1NFUlZJQ0VfX1dTRExfTE9DQVRJT04gPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOw0KLQ0KLQkvKioNCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPklXZWIgU2VydmljZTwvZW0+JyBjbGFzcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1NFUlZJQ0VfRkVBVFVSRV9DT1VOVCA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7DQotDQotCS8qKg0KLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJTZXJ2aWNlUHJvamVjdEltcGwgPGVtPklXZWIgU2VydmljZSBQcm9qZWN0PC9lbT59JyBjbGFzcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYlNlcnZpY2VQcm9qZWN0SW1wbA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldElXZWJTZXJ2aWNlUHJvamVjdCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCWludCBJV0VCX1NFUlZJQ0VfUFJPSkVDVCA9IDY7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2ViIFNlcnZpY2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1NFUlZJQ0VfUFJPSkVDVF9fV0VCX1NFUlZJQ0VTID0gMDsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfU0VSVklDRV9QUk9KRUNUX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRVMgPSAxOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1NFUlZJQ0VfUFJPSkVDVF9fTkFNRSA9IDI7DQotDQotCS8qKg0KLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SVdlYiBTZXJ2aWNlIFByb2plY3Q8L2VtPicgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVdFQl9TRVJWSUNFX1BST0pFQ1RfRkVBVFVSRV9DT1VOVCA9IDM7DQotDQotCS8qKg0KLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJUeXBlSW1wbCA8ZW0+SVdlYiBUeXBlPC9lbT59JyBjbGFzcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYlR5cGVJbXBsDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwjZ2V0SVdlYlR5cGUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlpbnQgSVdFQl9UWVBFID0gNzsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBsZW1lbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfVFlQRV9fSU1QTEVNRU5UQVRJT04gPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTjsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVdFQl9UWVBFX19OQU1FID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRTsNCi0NCi0JLyoqDQotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JV2ViIFR5cGU8L2VtPicgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVdFQl9UWVBFX0ZFQVRVUkVfQ09VTlQgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOw0KLQ0KLQkvKioNCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldlYlBhcmFtS2luZCA8ZW0+V2ViIFBhcmFtIEtpbmQ8L2VtPn0nIGVudW0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV2ViUGFyYW1LaW5kDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwjZ2V0V2ViUGFyYW1LaW5kKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JaW50IFdFQl9QQVJBTV9LSU5EID0gODsNCi0NCi0NCi0JLyoqDQotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlIDxlbT5TT0FQIEJpbmRpbmcgU3R5bGU8L2VtPn0nIGVudW0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldFNPQVBCaW5kaW5nU3R5bGUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlpbnQgU09BUF9CSU5ESU5HX1NUWUxFID0gOTsNCi0NCi0JLyoqDQotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZSA8ZW0+U09BUCBCaW5kaW5nIFVzZTwvZW0+fScgZW51bS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldFNPQVBCaW5kaW5nVXNlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JaW50IFNPQVBfQklORElOR19VU0UgPSAxMDsNCi0NCi0JLyoqDQotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIDxlbT5TT0FQIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT59JyBlbnVtLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5Eb21QYWNrYWdlSW1wbCNnZXRTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JaW50IFNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEUgPSAxMTsNCi0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTSA8ZW0+SURPTTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JRE9NPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQ2xhc3MgZ2V0SURPTSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTSNnZXRXZWJTZXJ2aWNlUHJvamVjdHMgPGVtPldlYiBTZXJ2aWNlIFByb2plY3RzPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5XZWIgU2VydmljZSBQcm9qZWN0czwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET00jZ2V0V2ViU2VydmljZVByb2plY3RzKCkNCi0JICogQHNlZSAjZ2V0SURPTSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVSZWZlcmVuY2UgZ2V0SURPTV9XZWJTZXJ2aWNlUHJvamVjdHMoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudCA8ZW0+SUphdmEgV2ViIFNlcnZpY2UgRWxlbWVudDwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JSmF2YSBXZWIgU2VydmljZSBFbGVtZW50PC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudA0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQ2xhc3MgZ2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudCgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklKYXZhV2ViU2VydmljZUVsZW1lbnQjZ2V0SW1wbGVtZW50YXRpb24gPGVtPkltcGxlbWVudGF0aW9uPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW1wbGVtZW50YXRpb248L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50I2dldEltcGxlbWVudGF0aW9uKCkNCi0JICogQHNlZSAjZ2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVBdHRyaWJ1dGUgZ2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudF9JbXBsZW1lbnRhdGlvbigpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklKYXZhV2ViU2VydmljZUVsZW1lbnQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50I2dldE5hbWUoKQ0KLQkgKiBAc2VlICNnZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50KCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUF0dHJpYnV0ZSBnZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50X05hbWUoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA8ZW0+SVNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUNsYXNzIGdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlI2lzSW1wbGljaXQgPGVtPkltcGxpY2l0PC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW1wbGljaXQ8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlI2lzSW1wbGljaXQoKQ0KLQkgKiBAc2VlICNnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUF0dHJpYnV0ZSBnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX0ltcGxpY2l0KCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlI2dldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzIDxlbT5JbXBsZW1lbnRpbmcgV2ViIFNlcnZpY2VzPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5JbXBsZW1lbnRpbmcgV2ViIFNlcnZpY2VzPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSNnZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpDQotCSAqIEBzZWUgI2dldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFUmVmZXJlbmNlIGdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfSW1wbGVtZW50aW5nV2ViU2VydmljZXMoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UjZ2V0V2ViTWV0aG9kcyA8ZW0+V2ViIE1ldGhvZHM8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPldlYiBNZXRob2RzPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSNnZXRXZWJNZXRob2RzKCkNCi0JICogQHNlZSAjZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVSZWZlcmVuY2UgZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9XZWJNZXRob2RzKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSNnZXRUYXJnZXROYW1lc3BhY2UgPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSNnZXRUYXJnZXROYW1lc3BhY2UoKQ0KLQkgKiBAc2VlICNnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUF0dHJpYnV0ZSBnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1RhcmdldE5hbWVzcGFjZSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UjZ2V0U29hcEJpbmRpbmdTdHlsZSA8ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSNnZXRTb2FwQmluZGluZ1N0eWxlKCkNCi0JICogQHNlZSAjZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVBdHRyaWJ1dGUgZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1N0eWxlKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSNnZXRTb2FwQmluZGluZ1VzZSA8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNvYXAgQmluZGluZyBVc2U8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlI2dldFNvYXBCaW5kaW5nVXNlKCkNCi0JICogQHNlZSAjZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVBdHRyaWJ1dGUgZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1VzZSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UjZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSA8ZW0+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlI2dldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKQ0KLQkgKiBAc2VlICNnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUF0dHJpYnV0ZSBnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCA8ZW0+SVdlYiBNZXRob2Q8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SVdlYiBNZXRob2Q8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVDbGFzcyBnZXRJV2ViTWV0aG9kKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kI2dldFBhcmFtZXRlcnMgPGVtPlBhcmFtZXRlcnM8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlBhcmFtZXRlcnM8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kI2dldFBhcmFtZXRlcnMoKQ0KLQkgKiBAc2VlICNnZXRJV2ViTWV0aG9kKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRVJlZmVyZW5jZSBnZXRJV2ViTWV0aG9kX1BhcmFtZXRlcnMoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kI2lzRXhjbHVkZWQgPGVtPkV4Y2x1ZGVkPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXhjbHVkZWQ8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kI2lzRXhjbHVkZWQoKQ0KLQkgKiBAc2VlICNnZXRJV2ViTWV0aG9kKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUF0dHJpYnV0ZSBnZXRJV2ViTWV0aG9kX0V4Y2x1ZGVkKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCNnZXRTb2FwQmluZGluZ1N0eWxlIDxlbT5Tb2FwIEJpbmRpbmcgU3R5bGU8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Tb2FwIEJpbmRpbmcgU3R5bGU8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kI2dldFNvYXBCaW5kaW5nU3R5bGUoKQ0KLQkgKiBAc2VlICNnZXRJV2ViTWV0aG9kKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUF0dHJpYnV0ZSBnZXRJV2ViTWV0aG9kX1NvYXBCaW5kaW5nU3R5bGUoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kI2dldFNvYXBCaW5kaW5nVXNlIDxlbT5Tb2FwIEJpbmRpbmcgVXNlPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2QjZ2V0U29hcEJpbmRpbmdVc2UoKQ0KLQkgKiBAc2VlICNnZXRJV2ViTWV0aG9kKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUF0dHJpYnV0ZSBnZXRJV2ViTWV0aG9kX1NvYXBCaW5kaW5nVXNlKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlIDxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2QjZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpDQotCSAqIEBzZWUgI2dldElXZWJNZXRob2QoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQXR0cmlidXRlIGdldElXZWJNZXRob2RfU29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0gPGVtPklXZWIgUGFyYW08L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SVdlYiBQYXJhbTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQ2xhc3MgZ2V0SVdlYlBhcmFtKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtI2dldEtpbmQgPGVtPktpbmQ8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5LaW5kPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtI2dldEtpbmQoKQ0KLQkgKiBAc2VlICNnZXRJV2ViUGFyYW0oKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQXR0cmlidXRlIGdldElXZWJQYXJhbV9LaW5kKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtI2dldFR5cGVOYW1lIDxlbT5UeXBlIE5hbWU8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlIE5hbWU8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0jZ2V0VHlwZU5hbWUoKQ0KLQkgKiBAc2VlICNnZXRJV2ViUGFyYW0oKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQXR0cmlidXRlIGdldElXZWJQYXJhbV9UeXBlTmFtZSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSNnZXRQYXJ0TmFtZSA8ZW0+UGFydCBOYW1lPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGFydCBOYW1lPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtI2dldFBhcnROYW1lKCkNCi0JICogQHNlZSAjZ2V0SVdlYlBhcmFtKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUF0dHJpYnV0ZSBnZXRJV2ViUGFyYW1fUGFydE5hbWUoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0jZ2V0VGFyZ2V0TmFtZXNwYWNlIDxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSNnZXRUYXJnZXROYW1lc3BhY2UoKQ0KLQkgKiBAc2VlICNnZXRJV2ViUGFyYW0oKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQXR0cmlidXRlIGdldElXZWJQYXJhbV9UYXJnZXROYW1lc3BhY2UoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0jaXNIZWFkZXIgPGVtPkhlYWRlcjwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkhlYWRlcjwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSNpc0hlYWRlcigpDQotCSAqIEBzZWUgI2dldElXZWJQYXJhbSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVBdHRyaWJ1dGUgZ2V0SVdlYlBhcmFtX0hlYWRlcigpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSA8ZW0+SVdlYiBTZXJ2aWNlPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklXZWIgU2VydmljZTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVDbGFzcyBnZXRJV2ViU2VydmljZSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlI2dldFNlcnZpY2VFbmRwb2ludCA8ZW0+U2VydmljZSBFbmRwb2ludDwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlNlcnZpY2UgRW5kcG9pbnQ8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSNnZXRTZXJ2aWNlRW5kcG9pbnQoKQ0KLQkgKiBAc2VlICNnZXRJV2ViU2VydmljZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVSZWZlcmVuY2UgZ2V0SVdlYlNlcnZpY2VfU2VydmljZUVuZHBvaW50KCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2UjZ2V0VGFyZ2V0TmFtZXNwYWNlIDxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlI2dldFRhcmdldE5hbWVzcGFjZSgpDQotCSAqIEBzZWUgI2dldElXZWJTZXJ2aWNlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUF0dHJpYnV0ZSBnZXRJV2ViU2VydmljZV9UYXJnZXROYW1lc3BhY2UoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSNnZXRQb3J0TmFtZSA8ZW0+UG9ydCBOYW1lPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UG9ydCBOYW1lPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2UjZ2V0UG9ydE5hbWUoKQ0KLQkgKiBAc2VlICNnZXRJV2ViU2VydmljZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVBdHRyaWJ1dGUgZ2V0SVdlYlNlcnZpY2VfUG9ydE5hbWUoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSNnZXRXc2RsTG9jYXRpb24gPGVtPldzZGwgTG9jYXRpb248L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xc2RsIExvY2F0aW9uPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2UjZ2V0V3NkbExvY2F0aW9uKCkNCi0JICogQHNlZSAjZ2V0SVdlYlNlcnZpY2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQXR0cmlidXRlIGdldElXZWJTZXJ2aWNlX1dzZGxMb2NhdGlvbigpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3QgPGVtPklXZWIgU2VydmljZSBQcm9qZWN0PC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklXZWIgU2VydmljZSBQcm9qZWN0PC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVDbGFzcyBnZXRJV2ViU2VydmljZVByb2plY3QoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdCNnZXRXZWJTZXJ2aWNlcyA8ZW0+V2ViIFNlcnZpY2VzPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5XZWIgU2VydmljZXM8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3QjZ2V0V2ViU2VydmljZXMoKQ0KLQkgKiBAc2VlICNnZXRJV2ViU2VydmljZVByb2plY3QoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFUmVmZXJlbmNlIGdldElXZWJTZXJ2aWNlUHJvamVjdF9XZWJTZXJ2aWNlcygpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0I2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMgPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlczwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2VzPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0I2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKQ0KLQkgKiBAc2VlICNnZXRJV2ViU2VydmljZVByb2plY3QoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFUmVmZXJlbmNlIGdldElXZWJTZXJ2aWNlUHJvamVjdF9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0I2dldE5hbWUoKQ0KLQkgKiBAc2VlICNnZXRJV2ViU2VydmljZVByb2plY3QoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQXR0cmlidXRlIGdldElXZWJTZXJ2aWNlUHJvamVjdF9OYW1lKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJUeXBlIDxlbT5JV2ViIFR5cGU8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SVdlYiBUeXBlPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlR5cGUNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUNsYXNzIGdldElXZWJUeXBlKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV2ViUGFyYW1LaW5kIDxlbT5XZWIgUGFyYW0gS2luZDwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPldlYiBQYXJhbSBLaW5kPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV2ViUGFyYW1LaW5kDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVFbnVtIGdldFdlYlBhcmFtS2luZCgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGUgPGVtPlNPQVAgQmluZGluZyBTdHlsZTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlNPQVAgQmluZGluZyBTdHlsZTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGUNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUVudW0gZ2V0U09BUEJpbmRpbmdTdHlsZSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlIDxlbT5TT0FQIEJpbmRpbmcgVXNlPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+U09BUCBCaW5kaW5nIFVzZTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVFbnVtIGdldFNPQVBCaW5kaW5nVXNlKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSA8ZW0+U09BUCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlNPQVAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVFbnVtIGdldFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCURvbUZhY3RvcnkgZ2V0RG9tRmFjdG9yeSgpOw0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudA0KLQkgKiA8dWw+DQotCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4NCi0JICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4NCi0JICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+DQotCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+DQotCSAqIDwvdWw+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlpbnRlcmZhY2UgTGl0ZXJhbHMgew0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSURPTUltcGwgPGVtPklET008L2VtPn0nIGNsYXNzLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JRE9NSW1wbA0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5Eb21QYWNrYWdlSW1wbCNnZXRJRE9NKCkNCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUNsYXNzIElET00gPSBlSU5TVEFOQ0UuZ2V0SURPTSgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V2ViIFNlcnZpY2UgUHJvamVjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVSZWZlcmVuY2UgSURPTV9fV0VCX1NFUlZJQ0VfUFJPSkVDVFMgPSBlSU5TVEFOQ0UuZ2V0SURPTV9XZWJTZXJ2aWNlUHJvamVjdHMoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklKYXZhV2ViU2VydmljZUVsZW1lbnRJbXBsIDxlbT5JSmF2YSBXZWIgU2VydmljZSBFbGVtZW50PC9lbT59JyBjbGFzcy4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSUphdmFXZWJTZXJ2aWNlRWxlbWVudEltcGwNCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwjZ2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudCgpDQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVDbGFzcyBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UID0gZUlOU1RBTkNFLmdldElKYXZhV2ViU2VydmljZUVsZW1lbnQoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkltcGxlbWVudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTiA9IGVJTlNUQU5DRS5nZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50X0ltcGxlbWVudGF0aW9uKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FID0gZUlOU1RBTkNFLmdldElKYXZhV2ViU2VydmljZUVsZW1lbnRfTmFtZSgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUltcGwgPGVtPklTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+fScgY2xhc3MuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJbXBsDQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQ0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFQ2xhc3MgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFID0gZUlOU1RBTkNFLmdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkltcGxpY2l0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExJQ0lUID0gZUlOU1RBTkNFLmdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfSW1wbGljaXQoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkltcGxlbWVudGluZyBXZWIgU2VydmljZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVSZWZlcmVuY2UgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRJTkdfV0VCX1NFUlZJQ0VTID0gZUlOU1RBTkNFLmdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfSW1wbGVtZW50aW5nV2ViU2VydmljZXMoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldlYiBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFUmVmZXJlbmNlIElTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fV0VCX01FVEhPRFMgPSBlSU5TVEFOQ0UuZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9XZWJNZXRob2RzKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgTmFtZXNwYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1RBUkdFVF9OQU1FU1BBQ0UgPSBlSU5TVEFOQ0UuZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9UYXJnZXROYW1lc3BhY2UoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVBdHRyaWJ1dGUgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfU1RZTEUgPSBlSU5TVEFOQ0UuZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1N0eWxlKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgVXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19VU0UgPSBlSU5TVEFOQ0UuZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1VzZSgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVBdHRyaWJ1dGUgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFID0gZUlOU1RBTkNFLmdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfU29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYk1ldGhvZEltcGwgPGVtPklXZWIgTWV0aG9kPC9lbT59JyBjbGFzcy4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYk1ldGhvZEltcGwNCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwjZ2V0SVdlYk1ldGhvZCgpDQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVDbGFzcyBJV0VCX01FVEhPRCA9IGVJTlNUQU5DRS5nZXRJV2ViTWV0aG9kKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QYXJhbWV0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFUmVmZXJlbmNlIElXRUJfTUVUSE9EX19QQVJBTUVURVJTID0gZUlOU1RBTkNFLmdldElXZWJNZXRob2RfUGFyYW1ldGVycygpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFQXR0cmlidXRlIElXRUJfTUVUSE9EX19FWENMVURFRCA9IGVJTlNUQU5DRS5nZXRJV2ViTWV0aG9kX0V4Y2x1ZGVkKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgU3R5bGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFQXR0cmlidXRlIElXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfU1RZTEUgPSBlSU5TVEFOQ0UuZ2V0SVdlYk1ldGhvZF9Tb2FwQmluZGluZ1N0eWxlKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgVXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1VTRSA9IGVJTlNUQU5DRS5nZXRJV2ViTWV0aG9kX1NvYXBCaW5kaW5nVXNlKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRSA9IGVJTlNUQU5DRS5nZXRJV2ViTWV0aG9kX1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJQYXJhbUltcGwgPGVtPklXZWIgUGFyYW08L2VtPn0nIGNsYXNzLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViUGFyYW1JbXBsDQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldElXZWJQYXJhbSgpDQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVDbGFzcyBJV0VCX1BBUkFNID0gZUlOU1RBTkNFLmdldElXZWJQYXJhbSgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVBdHRyaWJ1dGUgSVdFQl9QQVJBTV9fS0lORCA9IGVJTlNUQU5DRS5nZXRJV2ViUGFyYW1fS2luZCgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJV0VCX1BBUkFNX19UWVBFX05BTUUgPSBlSU5TVEFOQ0UuZ2V0SVdlYlBhcmFtX1R5cGVOYW1lKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QYXJ0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFQXR0cmlidXRlIElXRUJfUEFSQU1fX1BBUlRfTkFNRSA9IGVJTlNUQU5DRS5nZXRJV2ViUGFyYW1fUGFydE5hbWUoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBOYW1lc3BhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFQXR0cmlidXRlIElXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0UgPSBlSU5TVEFOQ0UuZ2V0SVdlYlBhcmFtX1RhcmdldE5hbWVzcGFjZSgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGVhZGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJV0VCX1BBUkFNX19IRUFERVIgPSBlSU5TVEFOQ0UuZ2V0SVdlYlBhcmFtX0hlYWRlcigpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYlNlcnZpY2VJbXBsIDxlbT5JV2ViIFNlcnZpY2U8L2VtPn0nIGNsYXNzLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViU2VydmljZUltcGwNCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwjZ2V0SVdlYlNlcnZpY2UoKQ0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFQ2xhc3MgSVdFQl9TRVJWSUNFID0gZUlOU1RBTkNFLmdldElXZWJTZXJ2aWNlKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIEVuZHBvaW50PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRVJlZmVyZW5jZSBJV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQgPSBlSU5TVEFOQ0UuZ2V0SVdlYlNlcnZpY2VfU2VydmljZUVuZHBvaW50KCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgTmFtZXNwYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJV0VCX1NFUlZJQ0VfX1RBUkdFVF9OQU1FU1BBQ0UgPSBlSU5TVEFOQ0UuZ2V0SVdlYlNlcnZpY2VfVGFyZ2V0TmFtZXNwYWNlKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3J0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFQXR0cmlidXRlIElXRUJfU0VSVklDRV9fUE9SVF9OQU1FID0gZUlOU1RBTkNFLmdldElXZWJTZXJ2aWNlX1BvcnROYW1lKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xc2RsIExvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJV0VCX1NFUlZJQ0VfX1dTRExfTE9DQVRJT04gPSBlSU5TVEFOQ0UuZ2V0SVdlYlNlcnZpY2VfV3NkbExvY2F0aW9uKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViU2VydmljZVByb2plY3RJbXBsIDxlbT5JV2ViIFNlcnZpY2UgUHJvamVjdDwvZW0+fScgY2xhc3MuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJTZXJ2aWNlUHJvamVjdEltcGwNCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwjZ2V0SVdlYlNlcnZpY2VQcm9qZWN0KCkNCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUNsYXNzIElXRUJfU0VSVklDRV9QUk9KRUNUID0gZUlOU1RBTkNFLmdldElXZWJTZXJ2aWNlUHJvamVjdCgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V2ViIFNlcnZpY2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFUmVmZXJlbmNlIElXRUJfU0VSVklDRV9QUk9KRUNUX19XRUJfU0VSVklDRVMgPSBlSU5TVEFOQ0UuZ2V0SVdlYlNlcnZpY2VQcm9qZWN0X1dlYlNlcnZpY2VzKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVSZWZlcmVuY2UgSVdFQl9TRVJWSUNFX1BST0pFQ1RfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFUyA9IGVJTlNUQU5DRS5nZXRJV2ViU2VydmljZVByb2plY3RfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVBdHRyaWJ1dGUgSVdFQl9TRVJWSUNFX1BST0pFQ1RfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0SVdlYlNlcnZpY2VQcm9qZWN0X05hbWUoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJUeXBlSW1wbCA8ZW0+SVdlYiBUeXBlPC9lbT59JyBjbGFzcy4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYlR5cGVJbXBsDQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldElXZWJUeXBlKCkNCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUNsYXNzIElXRUJfVFlQRSA9IGVJTlNUQU5DRS5nZXRJV2ViVHlwZSgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5XZWJQYXJhbUtpbmQgPGVtPldlYiBQYXJhbSBLaW5kPC9lbT59JyBlbnVtLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldlYlBhcmFtS2luZA0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5Eb21QYWNrYWdlSW1wbCNnZXRXZWJQYXJhbUtpbmQoKQ0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFRW51bSBXRUJfUEFSQU1fS0lORCA9IGVJTlNUQU5DRS5nZXRXZWJQYXJhbUtpbmQoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZSA8ZW0+U09BUCBCaW5kaW5nIFN0eWxlPC9lbT59JyBlbnVtLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGUNCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwjZ2V0U09BUEJpbmRpbmdTdHlsZSgpDQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVFbnVtIFNPQVBfQklORElOR19TVFlMRSA9IGVJTlNUQU5DRS5nZXRTT0FQQmluZGluZ1N0eWxlKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlIDxlbT5TT0FQIEJpbmRpbmcgVXNlPC9lbT59JyBlbnVtLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlDQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldFNPQVBCaW5kaW5nVXNlKCkNCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUVudW0gU09BUF9CSU5ESU5HX1VTRSA9IGVJTlNUQU5DRS5nZXRTT0FQQmluZGluZ1VzZSgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIDxlbT5TT0FQIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT59JyBlbnVtLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUNCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwjZ2V0U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpDQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVFbnVtIFNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEUgPSBlSU5TVEFOQ0UuZ2V0U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpOw0KLQ0KLQl9DQotDQotfSAvL0RvbVBhY2thZ2UNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JRE9NLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JRE9NLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU5NGE4OGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSURPTS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KLQ0KLS8qKg0KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SURPTTwvYj48L2VtPicuDQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICoNCi0gKiA8cD4NCi0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6DQotICogPHVsPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET00jZ2V0V2ViU2VydmljZVByb2plY3RzIDxlbT5XZWIgU2VydmljZSBQcm9qZWN0czwvZW0+fTwvbGk+DQotICogPC91bD4NCi0gKiA8L3A+DQotICoNCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZSNnZXRJRE9NKCkNCi0gKiBAbW9kZWwNCi0gKiBAZ2VuZXJhdGVkDQotICovDQotcHVibGljIGludGVyZmFjZSBJRE9NIGV4dGVuZHMgRU9iamVjdCB7DQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5XZWIgU2VydmljZSBQcm9qZWN0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdH0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDxwPg0KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5XZWIgU2VydmljZSBQcm9qZWN0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwNCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KLQkgKiA8L3A+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XZWIgU2VydmljZSBQcm9qZWN0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UjZ2V0SURPTV9XZWJTZXJ2aWNlUHJvamVjdHMoKQ0KLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHN1cHByZXNzZWRTZXRWaXNpYmlsaXR5PSJ0cnVlIg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFTGlzdDxJV2ViU2VydmljZVByb2plY3Q+IGdldFdlYlNlcnZpY2VQcm9qZWN0cygpOw0KLQ0KLX0gLy8gSURPTQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjEyMDBmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JSmF2YVdlYlNlcnZpY2VFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KLQ0KLS8qKg0KLSAqIEBtb2RlbA0KLSAqICAqIEBhdXRob3IgSHJpc3RvIFNhYmV2DQotICoNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElKYXZhV2ViU2VydmljZUVsZW1lbnQgZXh0ZW5kcyBFT2JqZWN0DQotew0KLQkvKioNCi0JICogQG1vZGVsIGNoYW5nZWFibGU9InRydWUiIHN1cHByZXNzZWRTZXRWaXNpYmlsaXR5PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSINCi0JICogQHJldHVybg0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRJbXBsZW1lbnRhdGlvbigpOw0KLQ0KLQkvKioNCi0JICogQG1vZGVsIGNoYW5nZWFibGU9InRydWUiIHJlcXVpcmVkPSJ0cnVlIg0KLQkgKiBAcmV0dXJuDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsNCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudCNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogQHNlZSAjZ2V0TmFtZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM1ODlkMTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KLQ0KLQ0KLS8qKg0KLSAqIEBtb2RlbA0KLSAqIEBhdXRob3IgSHJpc3RvIFNhYmV2DQotICoNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgZXh0ZW5kcyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50DQotew0KLQkvKioNCi0JICogQG1vZGVsIGNoYW5nZWFibGU9InRydWUiIHN1cHByZXNzZWRTZXRWaXNpYmlsaXR5PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSINCi0JICogQHJldHVybg0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNJbXBsaWNpdCgpOw0KLQ0KLQkvKioNCi0JICogQG1vZGVsIGNoYW5nZWFibGU9InRydWUiIHN1cHByZXNzZWRTZXRWaXNpYmlsaXR5PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIgY29udGFpbm1lbnQ9ImZhbHNlIiBtYW55PSJ0cnVlIiB0eXBlPSJJV2ViU2VydmljZSIgb3Bwb3NpdGU9InNlcnZpY2VFbmRwb2ludCINCi0JICogQHJldHVybg0KLQkgKi8NCi0JcHVibGljIEVMaXN0PElXZWJTZXJ2aWNlPiBnZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpOw0KLQkNCi0JLyoqDQotCSAqIEBtb2RlbCBjaGFuZ2VhYmxlPSJ0cnVlIiBzdXBwcmVzc2VkU2V0VmlzaWJpbGl0eT0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIiBtYW55PSJ0cnVlIiB0eXBlPSJJV2ViTWV0aG9kIg0KLQkgKiBAcmV0dXJuDQotCSAqLw0KLQlwdWJsaWMgRUxpc3Q8SVdlYk1ldGhvZD4gZ2V0V2ViTWV0aG9kcygpOw0KLQkNCi0JLyoqDQotCSAqIEBtb2RlbCBjaGFuZ2VhYmxlPSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSINCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UjZ2V0VGFyZ2V0TmFtZXNwYWNlIDxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogQHNlZSAjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0Jdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIHZhbHVlKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iRE9DVU1FTlQiPC9jb2RlPi4NCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlfS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPHA+DQotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNvYXAgQmluZGluZyBTdHlsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCi0JICogPC9wPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGUNCi0JICogQHNlZSAjc2V0U29hcEJpbmRpbmdTdHlsZShTT0FQQmluZGluZ1N0eWxlKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZSNnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1NvYXBCaW5kaW5nU3R5bGUoKQ0KLQkgKiBAbW9kZWwgZGVmYXVsdD0iRE9DVU1FTlQiIHJlcXVpcmVkPSJ0cnVlIg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlTT0FQQmluZGluZ1N0eWxlIGdldFNvYXBCaW5kaW5nU3R5bGUoKTsNCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSNnZXRTb2FwQmluZGluZ1N0eWxlIDxlbT5Tb2FwIEJpbmRpbmcgU3R5bGU8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNvYXAgQmluZGluZyBTdHlsZTwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlDQotCSAqIEBzZWUgI2dldFNvYXBCaW5kaW5nU3R5bGUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQl2b2lkIHNldFNvYXBCaW5kaW5nU3R5bGUoU09BUEJpbmRpbmdTdHlsZSB2YWx1ZSk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgVXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJMSVRFUkFMIjwvY29kZT4uDQotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdVc2V9Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8cD4NCi0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCi0JICogPC9wPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZQ0KLQkgKiBAc2VlICNzZXRTb2FwQmluZGluZ1VzZShTT0FQQmluZGluZ1VzZSkNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UjZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1VzZSgpDQotCSAqIEBtb2RlbCBkZWZhdWx0PSJMSVRFUkFMIiByZXF1aXJlZD0idHJ1ZSINCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JU09BUEJpbmRpbmdVc2UgZ2V0U29hcEJpbmRpbmdVc2UoKTsNCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSNnZXRTb2FwQmluZGluZ1VzZSA8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZQ0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1VzZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXZvaWQgc2V0U29hcEJpbmRpbmdVc2UoU09BUEJpbmRpbmdVc2UgdmFsdWUpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iV1JBUFBFRCI8L2NvZGU+Lg0KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGV9Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8cD4NCi0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCi0JICogPC9wPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlDQotCSAqIEBzZWUgI3NldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSkNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UjZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkNCi0JICogQG1vZGVsIGRlZmF1bHQ9IldSQVBQRUQiIHJlcXVpcmVkPSJ0cnVlIg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIGdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKTsNCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlIDxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUNCi0JICogQHNlZSAjZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXZvaWQgc2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZShTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIHZhbHVlKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdTRE9NUnVudGltZU1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXU0RPTVJ1bnRpbWVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhMzljYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdTRE9NUnVudGltZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLQ0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgSVdTRE9NUnVudGltZU1hbmFnZXINCi17DQotCS8qKg0KLQkgKiBJbnN0YW50aWF0ZXMgdGhlIERPTSBSdW50aW1lcyBpZiBub3QgYWxyZWFkeS4NCi0JICogQHBhcmFtIHByb2dyZXNzIG1vbml0b3IgdG8gdHJhY2sgcHJvZ3Jlc3MgDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBjcmVhdGVET01SdW50aW1lcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOw0KLQkNCi0JLyoqDQotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gdGhlIERPTSBydW50aW1lIGluc3RhbmNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJ1bnRpbWUgaWQNCi0JICogYW5kIGluc3RhbnRpYXRlIHN1Y2ggRE9NIHJ1bnRpbWUgaW5zdGFuY2UgaWYgbm9uIGV4aXN0ZW50IGF0IHRoZSANCi0JICogbW9tZW50IG9mIGludm9jYXRpb24gb2YgdGhpcyBtZXRob2QuDQotCSAqIA0KLQkgKiBAcGFyYW0gcnVudGltZUlkIC0gc3RyaW5nIGlkZW50aWZpZXIgb2YgdGhlIHJ1bnRpbWUgDQotCSAqIEByZXR1cm4gdGhlIERPTSBydW50aW1lIGluc3RhbmNlLiBOdWxsIGlmIHJ1bnRpbWUgd2l0aCBzdWNoIGlkIGlzIG5vdCByZWdpc3RlcmVkDQotCSAqLw0KLQlwdWJsaWMgIElXc0RPTVJ1bnRpbWVFeHRlbnNpb24gZ2V0RE9NUnVudGltZShTdHJpbmcgcnVudGltZUlkKTsNCi0JDQotCS8qKg0KLQkgKiANCi0JICogQHJldHVybiBhIGxpc3Qgb2YgYWxsIERPTSBSdW50aW1lcyBjdXJyZW50bHkgaW5zdGFudGlhdGVkDQotCSAqLw0KLQlwdWJsaWMgQ29sbGVjdGlvbjxJV3NET01SdW50aW1lRXh0ZW5zaW9uPiBnZXRET01SdW50aW1lcygpOw0KLQ0KLQkvKioNCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIHJlbG9hZCBhbGwgaW5zdGFuY2VzIG9mIERPTSBSdW50aW1lcy4NCi0JICoNCi0JICovDQotCXB1YmxpYyB2b2lkIHJlbG9hZERPTVJ1bnRpbWVzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDcwZDM4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7DQotDQotDQotLyoqDQotICogQG1vZGVsDQotICogQGF1dGhvciBIcmlzdG8gU2FiZXYNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElXZWJNZXRob2QgZXh0ZW5kcyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50DQotew0KLQkvKioNCi0JICogQG1vZGVsIHR5cGU9IklXZWJQYXJhbSIgc3VwcHJlc3NlZFNldFZpc2liaWxpdHk9InRydWUiIG1hbnk9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSINCi0JICogQHJldHVybg0KLQkgKi8NCi0JRUxpc3Q8SVdlYlBhcmFtPiBnZXRQYXJhbWV0ZXJzKCk7DQotCQ0KLQkvKioNCi0JICogQG1vZGVsIHR5cGU9ImJvb2xlYW4iIG1hbnk9ImZhbHNlIiBjaGFuZ2VhYmxlPSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSINCi0JICovDQotCWJvb2xlYW4gaXNFeGNsdWRlZCgpOw0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kI2lzRXhjbHVkZWQgPGVtPkV4Y2x1ZGVkPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeGNsdWRlZDwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgI2lzRXhjbHVkZWQoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQl2b2lkIHNldEV4Y2x1ZGVkKGJvb2xlYW4gdmFsdWUpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFN0eWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJET0NVTUVOVCI8L2NvZGU+Lg0KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGV9Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8cD4NCi0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KLQkgKiA8L3A+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Tb2FwIEJpbmRpbmcgU3R5bGU8L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZQ0KLQkgKiBAc2VlICNzZXRTb2FwQmluZGluZ1N0eWxlKFNPQVBCaW5kaW5nU3R5bGUpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlI2dldElXZWJNZXRob2RfU29hcEJpbmRpbmdTdHlsZSgpDQotCSAqIEBtb2RlbCBkZWZhdWx0PSJET0NVTUVOVCIgcmVxdWlyZWQ9InRydWUiDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCVNPQVBCaW5kaW5nU3R5bGUgZ2V0U29hcEJpbmRpbmdTdHlsZSgpOw0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kI2dldFNvYXBCaW5kaW5nU3R5bGUgPGVtPlNvYXAgQmluZGluZyBTdHlsZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGUNCi0JICogQHNlZSAjZ2V0U29hcEJpbmRpbmdTdHlsZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXZvaWQgc2V0U29hcEJpbmRpbmdTdHlsZShTT0FQQmluZGluZ1N0eWxlIHZhbHVlKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBVc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IkxJVEVSQUwiPC9jb2RlPi4NCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZX0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDxwPg0KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Tb2FwIEJpbmRpbmcgVXNlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KLQkgKiA8L3A+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Tb2FwIEJpbmRpbmcgVXNlPC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlDQotCSAqIEBzZWUgI3NldFNvYXBCaW5kaW5nVXNlKFNPQVBCaW5kaW5nVXNlKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZSNnZXRJV2ViTWV0aG9kX1NvYXBCaW5kaW5nVXNlKCkNCi0JICogQG1vZGVsIGRlZmF1bHQ9IkxJVEVSQUwiIHJlcXVpcmVkPSJ0cnVlIg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlTT0FQQmluZGluZ1VzZSBnZXRTb2FwQmluZGluZ1VzZSgpOw0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kI2dldFNvYXBCaW5kaW5nVXNlIDxlbT5Tb2FwIEJpbmRpbmcgVXNlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Tb2FwIEJpbmRpbmcgVXNlPC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlDQotCSAqIEBzZWUgI2dldFNvYXBCaW5kaW5nVXNlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0Jdm9pZCBzZXRTb2FwQmluZGluZ1VzZShTT0FQQmluZGluZ1VzZSB2YWx1ZSk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJXUkFQUEVEIjwvY29kZT4uDQotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZX0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDxwPg0KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KLQkgKiA8L3A+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUNCi0JICogQHNlZSAjc2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZShTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZSNnZXRJV2ViTWV0aG9kX1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKQ0KLQkgKiBAbW9kZWwgZGVmYXVsdD0iV1JBUFBFRCIgcmVxdWlyZWQ9InRydWUiDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCVNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpOw0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kI2dldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgPGVtPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZQ0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0Jdm9pZCBzZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgdmFsdWUpOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNzY5NmU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTsNCi0NCi0NCi0vKioNCi0gKiANCi0gKiBAYXV0aG9yIEhyaXN0byBTYWJldg0KLSAqDQotICogQG1vZGVsDQotICovDQotcHVibGljIGludGVyZmFjZSBJV2ViUGFyYW0gZXh0ZW5kcyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50DQotew0KLQkvKioNCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBtYW55PSJmYWxzZSIgc3VwcHJlc3NlZFNldFZpc2liaWxpdHk9InRydWUiDQotCSAqIEByZXR1cm4NCi0JICovDQotCVN0cmluZyBnZXRUeXBlTmFtZSgpOw0KLQkNCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhcnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8cD4NCi0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFydCBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KLQkgKiA8L3A+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJ0IE5hbWU8L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlICNzZXRQYXJ0TmFtZShTdHJpbmcpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlI2dldElXZWJQYXJhbV9QYXJ0TmFtZSgpDQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSINCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JU3RyaW5nIGdldFBhcnROYW1lKCk7DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSNnZXRQYXJ0TmFtZSA8ZW0+UGFydCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJ0IE5hbWU8L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlICNnZXRQYXJ0TmFtZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXZvaWQgc2V0UGFydE5hbWUoU3RyaW5nIHZhbHVlKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhcmdldCBOYW1lc3BhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPHA+DQotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLA0KLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQotCSAqIDwvcD4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlICNzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZSNnZXRJV2ViUGFyYW1fVGFyZ2V0TmFtZXNwYWNlKCkNCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSNnZXRUYXJnZXROYW1lc3BhY2UgPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlICNnZXRUYXJnZXROYW1lc3BhY2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQl2b2lkIHNldFRhcmdldE5hbWVzcGFjZShTdHJpbmcgdmFsdWUpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGVhZGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8cD4NCi0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SGVhZGVyPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KLQkgKiA8L3A+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IZWFkZXI8L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlICNzZXRIZWFkZXIoYm9vbGVhbikNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UjZ2V0SVdlYlBhcmFtX0hlYWRlcigpDQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgcmVxdWlyZWQ9InRydWUiDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCWJvb2xlYW4gaXNIZWFkZXIoKTsNCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtI2lzSGVhZGVyIDxlbT5IZWFkZXI8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhlYWRlcjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgI2lzSGVhZGVyKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0Jdm9pZCBzZXRIZWFkZXIoYm9vbGVhbiB2YWx1ZSk7DQotDQotCS8qKg0KLQkgKiBAbW9kZWwgdHlwZT0iV2ViUGFyYW1LaW5kIiByZXF1aXJlZD0idHJ1ZSIgbWFueT0iZmFsc2UiDQotCSAqLw0KLQlXZWJQYXJhbUtpbmQgZ2V0S2luZCgpOw0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0jZ2V0S2luZCA8ZW0+S2luZDwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+S2luZDwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5XZWJQYXJhbUtpbmQNCi0JICogQHNlZSAjZ2V0S2luZCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXZvaWQgc2V0S2luZChXZWJQYXJhbUtpbmQgdmFsdWUpOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjAxMWZlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpOw0KLQ0KLQ0KLS8qKg0KLSAqIEBtb2RlbA0KLSAqIEBhdXRob3IgSHJpc3RvIFNhYmV2DQotICoNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElXZWJTZXJ2aWNlIGV4dGVuZHMgSUphdmFXZWJTZXJ2aWNlRWxlbWVudCANCi17DQotCS8qKg0KLQkgKiBAbW9kZWwgc3VwcHJlc3NlZFNldFZpc2liaWxpdHk9InRydWUiIG9wcG9zaXRlPSJpbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcyIgdHlwZT0iSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSINCi0JICogQHJldHVybg0KLQkgKi8NCi0JcHVibGljIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgZ2V0U2VydmljZUVuZHBvaW50KCk7DQotCQ0KLQkvKioNCi0JICogQG1vZGVsIGNoYW5nZWFibGU9InRydWUiIHJlcXVpcmVkPSJ0cnVlIg0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKTsNCi0JDQotCS8qKg0KLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlI2dldFRhcmdldE5hbWVzcGFjZSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgI2dldFRhcmdldE5hbWVzcGFjZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyB2YWx1ZSk7DQotDQotCS8qKg0KLQkgKiBAbW9kZWwgY2hhbmdlYWJsZT0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFBvcnROYW1lKCk7DQotCQ0KLQkvKioNCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSNnZXRQb3J0TmFtZSA8ZW0+UG9ydCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3J0IE5hbWU8L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlICNnZXRQb3J0TmFtZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXZvaWQgc2V0UG9ydE5hbWUoU3RyaW5nIHZhbHVlKTsNCi0NCi0JLyoqDQotCSAqIEBtb2RlbCBjaGFuZ2VhYmxlPSJ0cnVlIiBzdXBwcmVzc2VkU2V0VmlzaWJpbGl0eT0idHJ1ZSINCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0V3NkbExvY2F0aW9uKCk7DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlI2dldFdzZGxMb2NhdGlvbiA8ZW0+V3NkbCBMb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V3NkbCBMb2NhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgI2dldFdzZGxMb2NhdGlvbigpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXZvaWQgc2V0V3NkbExvY2F0aW9uKFN0cmluZyB2YWx1ZSk7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlUHJvamVjdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2VQcm9qZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI0MWQ1ZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2VQcm9qZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQotDQotDQotLyoqDQotICogQG1vZGVsDQotICogQGF1dGhvciBIcmlzdG8gU2FiZXYNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElXZWJTZXJ2aWNlUHJvamVjdCBleHRlbmRzIEVPYmplY3QNCi17DQotCS8qKg0KLQkgKiBAbW9kZWwgdHlwZT0iSVdlYlNlcnZpY2UiIHN1cHByZXNzZWRTZXRWaXNpYmlsaXR5PSJ0cnVlIiBtYW55PSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSINCi0JICogQHJldHVybg0KLQkgKi8NCi0JcHVibGljIEVMaXN0PElXZWJTZXJ2aWNlPiBnZXRXZWJTZXJ2aWNlcygpOw0KLQkNCi0JDQotCS8qKg0KLQkgKiBAbW9kZWwgdHlwZT0iSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSIgc3VwcHJlc3NlZFNldFZpc2liaWxpdHk9InRydWUiIG1hbnk9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIg0KLQkgKi8NCi0JcHVibGljIEVMaXN0PElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U+IGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKTsNCi0JDQotCS8qKg0KLQkgKiBAbW9kZWwgc3VwcHJlc3NlZFNldFZpc2liaWxpdHk9InRydWUiIHJlcXVpcmVkPSJ0cnVlIg0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MzRkYTk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk7DQotDQotDQotLyoqDQotICogQG1vZGVsDQotICogQGF1dGhvciBIcmlzdG8gU2FiZXYNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElXZWJUeXBlICBleHRlbmRzIElKYXZhV2ViU2VydmljZUVsZW1lbnQgew0KLQkNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRE9NUnVudGltZUV4dGVuc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRE9NUnVudGltZUV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMmI4MDUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTsNCi0NCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotDQotDQotLyoqDQotICogVGhpcyBpbnRlcmZhY2Ugc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IGFsbCBydW50aW1lIHdoaWNoIHdhbnQgdG8gaGF2ZSBET00gVHJlZSANCi0gKiByZXByZXNlbnRhdGlvbiBvbiB0b3Agb2YgdGhlbS4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBIcmlzdG92IEkwMzYyMDENCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElXc0RPTVJ1bnRpbWVFeHRlbnNpb24gDQotew0KLQkvKioNCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGluc3RhbnRpYXRlIHRoZSBET00gaW5zdGFuY2UgZm9yIHRoZSBydW50aW1lIGFuZCBsb2FkcyB0aGUNCi0JICogZGF0YSBpbnRvIGl0LiBUaGUgbWV0aG9kIGxvY2tzIHRoZSB3b3Jrc3BhY2Ugcm9vdCBkdXJpbmcgZXhlY3V0aW9uLiBJZiB5b3UgY2FsbCB0aGlzDQotCSAqIG1ldGhvZCBkdXJpbmcgbG9hZGluZyAoaS5lLiBzb21lYm9keSBhbHJlYWR5IGNhbGxlZCBpdCBpbiBkaWZmZXJlbnQgdGhyZWFkKSB0aGUgbWV0aG9kIA0KLQkgKiB3aWxsIGJsb2NrIHVudGlsIHRoZSBsb2FkIGZpbmlzaGVzIGluc3RlYWQgb2YgdHJpZ2dlcmluZyBET00gcmVsb2FkLiANCi0JICogDQotCSAqIEBwYXJhbSBtb25pdG9yIHByb2dyZXNzIG1vbml0b3IgdG8gYmUgdXNlZCBkdXJpbmcgbG9hZGluZywgY2FuY2VsbGluZyB0aGUgbG9hZCB2aWEgbW9uaXRvciBpcyBzdXBwb3J0ZWQNCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBpbiBjYXNlIHRoZSBET00gbG9hZGluZyBpcyBub3QgYWJsZSB0byByZWFkIHJlcXVpcmVkIGRhdGENCi0JICogQHRocm93cyBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbiBpbiBjYXNlIHRoZSBsb2FkaW5nIHdhcyBjYW5jZWxsZWQgdmlhIHByb3ZpZGVkIA0KLQkgKiA8Y29kZT5tb25pdG9yPC9jb2RlPi4NCi0JICovDQotCXB1YmxpYyB2b2lkIGNyZWF0ZURPTShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiwgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb247DQotCQ0KLQkvKioNCi0JICogQWRkcyBhIGxvYWQgbGlzdGVuZXIgdG8gYmUgbm90aWZpZWQgaW4gbG9hZCBldmVudHMuIEluIGNhc2UgdGhlIGxvYWRpbmcgaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkIA0KLQkgKiB0aGlzIGxpc3RlbmVyJ3MgbWV0aG9kcyBhcmUgY2FsbGVkIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbG9hZC4NCi0JICoge0BsaW5rIElXc0RvbUxvYWRMaXN0ZW5lciNmaW5pc2hlZCgpfSBtZXRob2QgaXMgY2FsbGVkIGluIGFueSBjYXNlIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBsb2FkaW5nDQotCSAqIGhhcyBiZWVuIGNhbmNlbGxlZCBvciBub3QuIA0KLQkgKiBAcGFyYW0gbGlzdGVuZXINCi0JICovDQotCXB1YmxpYyB2b2lkIGFkZExvYWRMaXN0ZW5lcihJV3NEb21Mb2FkTGlzdGVuZXIgbGlzdGVuZXIpOw0KLQkNCi0JLyoqDQotCSAqIFJlbW92ZXMgdGhlIGxpc3RlbmVyIGZyb20gRE9NIGxvYWRpbmcgbGlzdGVuZXJzIGxpc3QNCi0JICogDQotCSAqIEBwYXJhbSBsaXN0ZW5lcg0KLQkgKi8NCi0JcHVibGljIHZvaWQgcmVtb3ZlTG9hZExpc3RlbmVyKElXc0RvbUxvYWRMaXN0ZW5lciBsaXN0ZW5lcik7DQotCQ0KLQkvKioNCi0JICogVG8gZ2V0IGEgaGFuZGxlIHRvIHRoZSBET00gaW5zdGFuY2UgYXZhaWxhYmxlIGZvciB0aGlzIHJ1bnRpbWUuDQotCSAqIA0KLQkgKiBAcmV0dXJuIHRoZSBET00gaW5zdGFuY2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gaW4gY2FzZSB0aGUgbG9hZGluZyB3YXMgbm90IHN0YXJ0ZWQgeWV0IG9yDQotCSAqIGlzIG5vdCBmaW5pc2hlZCB5ZXQuDQotCSAqIEB0aHJvd3MgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24gaW4gY2FzZSBsb2FkaW5nIGhhcyBiZWVuIGNhbGxlZCBhbHJlYWR5IGJ1dCB0aGUgbG9hZA0KLQkgKiBoYXMgYmVlbiBjYW5jZWxsZWQNCi0JICovDQotCXB1YmxpYyBJRE9NIGdldERPTSgpIHRocm93cyBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbjsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRG9tTG9hZExpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV3NEb21Mb2FkTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODc5YjA0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV3NEb21Mb2FkTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTsNCi0NCi0NCi0NCi0vKioNCi0gKiBJbnRlcmZhY2UgdG8gYmUgaW1wbGVtZW50ZWQgYnkgaW50ZXJlc3RlZCBpbiBET00gbG9hZCBwcm9jZXNzLiBJbXBsZW1lbnRvcnMgY2FuIGJlIGFkZGVkIHRvDQotICogdGhlIHtAbGluayBJV3NET01SdW50aW1lRXh0ZW5zaW9ufSB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMgb24gbG9hZCBzdGFydHVwL2ZpbmlzaCAgDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSVdzRG9tTG9hZExpc3RlbmVyIA0KLXsNCi0JLyoqDQotCSAqIENhbGxlZCBieSB7QGxpbmsgSVdzRE9NUnVudGltZUV4dGVuc2lvbn0ganVzdCBiZWZvcmUgdGhlIERPTSBsb2FkIHN0YXJ0IA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc3RhcnRlZCgpOw0KLQkNCi0JLyoqDQotCSAqIENhbGxlZCBieSB7QGxpbmsgSVdzRE9NUnVudGltZUV4dGVuc2lvbn0gd2hlbiB0aGUgRE9NIGxvYWQgaGFzIGZpbmlzaGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBmaW5pc2hlZCgpOwkNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NTY4NTVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOw0KLQ0KLQ0KLS8qKg0KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+U09BUCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicsDQotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uDQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UjZ2V0U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpDQotICogQG1vZGVsDQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBlbnVtIFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgaW1wbGVtZW50cyBFbnVtZXJhdG9yIHsNCi0JLyoqDQotCSAqIFRoZSAnPGVtPjxiPldSQVBQRUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjV1JBUFBFRF9WQUxVRQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlXUkFQUEVEKDAsICJXUkFQUEVEIiwgIldSQVBQRUQiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotDQotCS8qKg0KLQkgKiBUaGUgJzxlbT48Yj5CQVJFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI0JBUkVfVkFMVUUNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JQkFSRSgxLCAiQkFSRSIsICJCQVJFIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQ0KLQkvKioNCi0JICogVGhlICc8ZW0+PGI+V1JBUFBFRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPHA+DQotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+V1JBUFBFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsDQotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCi0JICogPC9wPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjV1JBUFBFRA0KLQkgKiBAbW9kZWwNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV1JBUFBFRF9WQUxVRSA9IDA7DQotDQotCS8qKg0KLQkgKiBUaGUgJzxlbT48Yj5CQVJFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8cD4NCi0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5CQVJFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwNCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KLQkgKiA8L3A+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNCQVJFDQotCSAqIEBtb2RlbA0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQVJFX1ZBTFVFID0gMTsNCi0NCi0JLyoqDQotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5TT0FQIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGVbXSBWQUxVRVNfQVJSQVkgPQ0KLQkJbmV3IFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGVbXQ0KLQkJew0KLQkJCVdSQVBQRUQsDQotCQkJQkFSRSwNCi0JCX07DQotDQotCS8qKg0KLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicgZW51bWVyYXRvcnMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5TT0FQIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIGdldChTdHJpbmcgbGl0ZXJhbCkgew0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpDQotCQl7DQotCQkJU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07DQotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkNCi0JCQl7DQotCQkJCXJldHVybiByZXN1bHQ7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQ0KLQkJew0KLQkJCVNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOw0KLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkNCi0JCQl7DQotCQkJCXJldHVybiByZXN1bHQ7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSBnZXQoaW50IHZhbHVlKSB7DQotCQlzd2l0Y2ggKHZhbHVlKQ0KLQkJew0KLQkJCWNhc2UgV1JBUFBFRF9WQUxVRTogcmV0dXJuIFdSQVBQRUQ7DQotCQkJY2FzZSBCQVJFX1ZBTFVFOiByZXR1cm4gQkFSRTsNCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsNCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOw0KLQ0KLQkvKioNCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7DQotCQl0aGlzLnZhbHVlID0gdmFsdWU7DQotCQl0aGlzLm5hbWUgPSBuYW1lOw0KLQkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7DQotCSAgcmV0dXJuIHZhbHVlOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgew0KLQkgIHJldHVybiBuYW1lOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkgew0KLQkgIHJldHVybiBsaXRlcmFsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCQlyZXR1cm4gbGl0ZXJhbDsNCi0JfQ0KLQkNCi19IC8vU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjA4MjI1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsNCi0NCi0NCi0vKioNCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlNPQVAgQmluZGluZyBTdHlsZTwvYj48L2VtPicsDQotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uDQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UjZ2V0U09BUEJpbmRpbmdTdHlsZSgpDQotICogQG1vZGVsDQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBlbnVtIFNPQVBCaW5kaW5nU3R5bGUgaW1wbGVtZW50cyBFbnVtZXJhdG9yIHsNCi0JLyoqDQotCSAqIFRoZSAnPGVtPjxiPkRPQ1VNRU5UPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI0RPQ1VNRU5UX1ZBTFVFDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCURPQ1VNRU5UKDAsICJET0NVTUVOVCIsICJET0NVTUVOVCIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0NCi0JLyoqDQotCSAqIFRoZSAnPGVtPjxiPlJQQzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNSUENfVkFMVUUNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JUlBDKDEsICJSUEMiLCAiUlBDIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQ0KLQkvKioNCi0JICogVGhlICc8ZW0+PGI+RE9DVU1FTlQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDxwPg0KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkRPQ1VNRU5UPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwNCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KLQkgKiA8L3A+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNET0NVTUVOVA0KLQkgKiBAbW9kZWwNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRE9DVU1FTlRfVkFMVUUgPSAwOw0KLQ0KLQkvKioNCi0JICogVGhlICc8ZW0+PGI+UlBDPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8cD4NCi0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5SUEM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLA0KLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQotCSAqIDwvcD4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI1JQQw0KLQkgKiBAbW9kZWwNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlBDX1ZBTFVFID0gMTsNCi0NCi0JLyoqDQotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5TT0FQIEJpbmRpbmcgU3R5bGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU09BUEJpbmRpbmdTdHlsZVtdIFZBTFVFU19BUlJBWSA9DQotCQluZXcgU09BUEJpbmRpbmdTdHlsZVtdDQotCQl7DQotCQkJRE9DVU1FTlQsDQotCQkJUlBDLA0KLQkJfTsNCi0NCi0JLyoqDQotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5TT0FQIEJpbmRpbmcgU3R5bGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFNPQVBCaW5kaW5nU3R5bGU+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFN0eWxlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTT0FQQmluZGluZ1N0eWxlIGdldChTdHJpbmcgbGl0ZXJhbCkgew0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpDQotCQl7DQotCQkJU09BUEJpbmRpbmdTdHlsZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07DQotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkNCi0JCQl7DQotCQkJCXJldHVybiByZXN1bHQ7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFN0eWxlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTT0FQQmluZGluZ1N0eWxlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgew0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpDQotCQl7DQotCQkJU09BUEJpbmRpbmdTdHlsZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07DQotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHJlc3VsdDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5TT0FQIEJpbmRpbmcgU3R5bGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFNPQVBCaW5kaW5nU3R5bGUgZ2V0KGludCB2YWx1ZSkgew0KLQkJc3dpdGNoICh2YWx1ZSkNCi0JCXsNCi0JCQljYXNlIERPQ1VNRU5UX1ZBTFVFOiByZXR1cm4gRE9DVU1FTlQ7DQotCQkJY2FzZSBSUENfVkFMVUU6IHJldHVybiBSUEM7DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOw0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsNCi0NCi0JLyoqDQotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgU09BUEJpbmRpbmdTdHlsZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgew0KLQkJdGhpcy52YWx1ZSA9IHZhbHVlOw0KLQkJdGhpcy5uYW1lID0gbmFtZTsNCi0JCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgaW50IGdldFZhbHVlKCkgew0KLQkgIHJldHVybiB2YWx1ZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsNCi0JICByZXR1cm4gbmFtZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsNCi0JICByZXR1cm4gbGl0ZXJhbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLQkJcmV0dXJuIGxpdGVyYWw7DQotCX0NCi0JDQotfSAvL1NPQVBCaW5kaW5nU3R5bGUNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjM1YjE4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7DQotDQotDQotLyoqDQotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5TT0FQIEJpbmRpbmcgVXNlPC9iPjwvZW0+JywNCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4NCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZSNnZXRTT0FQQmluZGluZ1VzZSgpDQotICogQG1vZGVsDQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBlbnVtIFNPQVBCaW5kaW5nVXNlIGltcGxlbWVudHMgRW51bWVyYXRvciB7DQotCS8qKg0KLQkgKiBUaGUgJzxlbT48Yj5MSVRFUkFMPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI0xJVEVSQUxfVkFMVUUNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JTElURVJBTCgwLCAiTElURVJBTCIsICJMSVRFUkFMIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQ0KLQkvKioNCi0JICogVGhlICc8ZW0+PGI+RU5DT0RFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNFTkNPREVEX1ZBTFVFDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCUVOQ09ERUQoMSwgIkVOQ09ERUQiLCAiRU5DT0RFRCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0NCi0JLyoqDQotCSAqIFRoZSAnPGVtPjxiPkxJVEVSQUw8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDxwPg0KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkxJVEVSQUw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLA0KLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQotCSAqIDwvcD4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI0xJVEVSQUwNCi0JICogQG1vZGVsDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJVEVSQUxfVkFMVUUgPSAwOw0KLQ0KLQkvKioNCi0JICogVGhlICc8ZW0+PGI+RU5DT0RFRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPHA+DQotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RU5DT0RFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsDQotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCi0JICogPC9wPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjRU5DT0RFRA0KLQkgKiBAbW9kZWwNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5DT0RFRF9WQUxVRSA9IDE7DQotDQotCS8qKg0KLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFVzZTwvYj48L2VtPicgZW51bWVyYXRvcnMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTT0FQQmluZGluZ1VzZVtdIFZBTFVFU19BUlJBWSA9DQotCQluZXcgU09BUEJpbmRpbmdVc2VbXQ0KLQkJew0KLQkJCUxJVEVSQUwsDQotCQkJRU5DT0RFRCwNCi0JCX07DQotDQotCS8qKg0KLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFVzZTwvYj48L2VtPicgZW51bWVyYXRvcnMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8U09BUEJpbmRpbmdVc2U+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFVzZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU09BUEJpbmRpbmdVc2UgZ2V0KFN0cmluZyBsaXRlcmFsKSB7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkNCi0JCXsNCi0JCQlTT0FQQmluZGluZ1VzZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07DQotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkNCi0JCQl7DQotCQkJCXJldHVybiByZXN1bHQ7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFVzZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU09BUEJpbmRpbmdVc2UgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkNCi0JCXsNCi0JCQlTT0FQQmluZGluZ1VzZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07DQotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHJlc3VsdDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5TT0FQIEJpbmRpbmcgVXNlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTT0FQQmluZGluZ1VzZSBnZXQoaW50IHZhbHVlKSB7DQotCQlzd2l0Y2ggKHZhbHVlKQ0KLQkJew0KLQkJCWNhc2UgTElURVJBTF9WQUxVRTogcmV0dXJuIExJVEVSQUw7DQotCQkJY2FzZSBFTkNPREVEX1ZBTFVFOiByZXR1cm4gRU5DT0RFRDsNCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsNCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOw0KLQ0KLQkvKioNCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBTT0FQQmluZGluZ1VzZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgew0KLQkJdGhpcy52YWx1ZSA9IHZhbHVlOw0KLQkJdGhpcy5uYW1lID0gbmFtZTsNCi0JCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgaW50IGdldFZhbHVlKCkgew0KLQkgIHJldHVybiB2YWx1ZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsNCi0JICByZXR1cm4gbmFtZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsNCi0JICByZXR1cm4gbGl0ZXJhbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLQkJcmV0dXJuIGxpdGVyYWw7DQotCX0NCi0JDQotfSAvL1NPQVBCaW5kaW5nVXNlDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDkyNjQzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOw0KLQ0KLS8qKg0KLSAqIEBtb2RlbA0KLSAqIEBhdXRob3IgSHJpc3RvIFNhYmV2DQotICoNCi0gKi8NCi1wdWJsaWMgZW51bSBXZWJQYXJhbUtpbmQgaW1wbGVtZW50cyBFbnVtZXJhdG9yIHsvKipAbW9kZWwqL0lOKDAsICJJTiIsICJJTiIpLCAvKipAbW9kZWwqL0lOT1VUKDEsICJJTk9VVCIsICJJTk9VVCIpLCAvKipAbW9kZWwqL09VVCgyLCAiT1VUIiwgIk9VVCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JA0KLQ0KLS8qKg0KLQkgKiBUaGUgJzxlbT48Yj5JTjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPHA+DQotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SU48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLA0KLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQotCSAqIDwvcD4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI0lODQotCSAqIEBtb2RlbA0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTl9WQUxVRSA9IDA7DQotLyoqDQotCSAqIFRoZSAnPGVtPjxiPklOT1VUPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8cD4NCi0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5JTk9VVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsDQotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCi0JICogPC9wPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjSU5PVVQNCi0JICogQG1vZGVsDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOT1VUX1ZBTFVFID0gMTsNCi0vKioNCi0JICogVGhlICc8ZW0+PGI+T1VUPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8cD4NCi0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5PVVQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLA0KLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQotCSAqIDwvcD4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI09VVA0KLQkgKiBAbW9kZWwNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1VUX1ZBTFVFID0gMjsNCi0vKioNCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPldlYiBQYXJhbSBLaW5kPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFdlYlBhcmFtS2luZFtdIFZBTFVFU19BUlJBWSA9DQotCQluZXcgV2ViUGFyYW1LaW5kW10NCi0JCXsNCi0JCQlJTiwNCi0JCQlJTk9VVCwNCi0JCQlPVVQsDQotCQl9Ow0KLS8qKg0KLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+V2ViIFBhcmFtIEtpbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFdlYlBhcmFtS2luZD4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOw0KLQ0KLS8qKg0KLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPldlYiBQYXJhbSBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBXZWJQYXJhbUtpbmQgZ2V0KFN0cmluZyBsaXRlcmFsKSB7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkNCi0JCXsNCi0JCQlXZWJQYXJhbUtpbmQgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOw0KLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpDQotCQkJew0KLQkJCQlyZXR1cm4gcmVzdWx0Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotLyoqDQotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+V2ViIFBhcmFtIEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFdlYlBhcmFtS2luZCBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQ0KLQkJew0KLQkJCVdlYlBhcmFtS2luZCByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07DQotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHJlc3VsdDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLS8qKg0KLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPldlYiBQYXJhbSBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBXZWJQYXJhbUtpbmQgZ2V0KGludCB2YWx1ZSkgew0KLQkJc3dpdGNoICh2YWx1ZSkNCi0JCXsNCi0JCQljYXNlIElOX1ZBTFVFOiByZXR1cm4gSU47DQotCQkJY2FzZSBJTk9VVF9WQUxVRTogcmV0dXJuIElOT1VUOw0KLQkJCWNhc2UgT1VUX1ZBTFVFOiByZXR1cm4gT1VUOw0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0vKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOw0KLS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsNCi0vKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7DQotDQotLyoqDQotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgV2ViUGFyYW1LaW5kKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7DQotCQl0aGlzLnZhbHVlID0gdmFsdWU7DQotCQl0aGlzLm5hbWUgPSBuYW1lOw0KLQkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsNCi0JfQ0KLQ0KLS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIGludCBnZXRWYWx1ZSgpIHsNCi0JICByZXR1cm4gdmFsdWU7DQotCX0NCi0NCi0vKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsNCi0JICByZXR1cm4gbmFtZTsNCi0JfQ0KLQ0KLS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkgew0KLQkgIHJldHVybiBsaXRlcmFsOw0KLQl9DQotDQotLyoqDQotCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JCXJldHVybiBsaXRlcmFsOw0KLQl9fQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NzEwNDdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5Db250cmFjdENoZWNrZXI7DQotDQotDQotLyoqDQotICogRXhjZXB0aW9uIHRocm93biBpbiBjYXNlIHRoZSBsb2FkaW5nIG9mIFdTIERPTSBoYXMgYmVlbiBjYW5jZWxsZWQNCi0gKiAgDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiANCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOw0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBsb2NhbGl6ZWRNZXNzYWdlOw0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0cyBleGNlcHRpb24gd2l0aCBhYmlsaXR5IHRvIHByb3ZpZGUgbG9jYWxpemVkIG1lc3NhZ2UNCi0JICogQHBhcmFtIG1lc3NhZ2UgLSB0aGUgZGV0YWlsIG1lc3NhZ2UgKHdoaWNoIGlzIHNhdmVkIGZvciBsYXRlciByZXRyaWV2YWwNCi0gICAgICogICAgICAgICBieSB0aGUge0BsaW5rICNnZXRNZXNzYWdlKCl9IG1ldGhvZCkNCi0JICogQHBhcmFtIGxvY2FsaXplZE1lc3NhZ2UgLSB0aGUgbG9jYWxpemVkIG1lc3NhZ2UgKHdoaWNoIGlzIHNhdmVkIGZvciBsYXRlciByZXRyaWV2YWwNCi0gICAgICogICAgICAgICBieSB0aGUge0BsaW5rICNnZXRMb2NhbGl6ZWRNZXNzYWdlKCl9IG1ldGhvZCkNCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gIC0gaW4gY2FzZSBsb2NhbGlzZWQgbWVzc2FnZSBpcyBudWxsDQotCSAqICovDQotCXB1YmxpYyBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgU3RyaW5nIGxvY2FsaXplZE1lc3NhZ2UpIHsNCi0JCXN1cGVyKG1lc3NhZ2UpOw0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKGxvY2FsaXplZE1lc3NhZ2UsICJsb2NhbGl6ZWRNZXNzYWdlIik7IC8vJE5PTi1OTFMtMSQNCi0JCXRoaXMubG9jYWxpemVkTWVzc2FnZSA9IGxvY2FsaXplZE1lc3NhZ2U7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZXR1cm5zIGxvY2FsaXplZCBtZXNzYWdlIHdpdGggd2hpY2ggdGhlIGV4Y2VwdGlvbiB3YXMgY29uc3RydWN0ZWQuKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxpemVkTWVzc2FnZSgpIHsNCi0JCXJldHVybiBsb2NhbGl6ZWRNZXNzYWdlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dzRE9NUnVudGltZU1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dzRE9NUnVudGltZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDZkNGE2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTVJ1bnRpbWVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucmVnaXN0cnkuSVdzRE9NUnVudGltZUluZm87DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5yZWdpc3RyeS5Xc0RPTVJ1bnRpbWVSZWdpc3RyeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuSUxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLS8qKg0KLSAqIEZhY3RvcnkgY2xhc3MgZm9yIGluc3RhbnRpYXRpbmcgRE9NIFJ1bnRpbWVzIGFuZCBtYW5hZ2luZyB0aG9zZSBpbnN0YW5jZXMuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgSHJpc3Rvdg0KLSAqDQotICovDQotcHVibGljIGNsYXNzIFdzRE9NUnVudGltZU1hbmFnZXIgaW1wbGVtZW50cyBJV1NET01SdW50aW1lTWFuYWdlcg0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgV3NET01SdW50aW1lTWFuYWdlciBpbnN0YW5jZSA9IG5ldyBXc0RPTVJ1bnRpbWVNYW5hZ2VyKCk7DQotDQotCXByaXZhdGUgTWFwPFN0cmluZyxJV3NET01SdW50aW1lRXh0ZW5zaW9uPiBkb21SdW50aW1lcyA9IG5ldyBIYXNoTWFwPFN0cmluZyxJV3NET01SdW50aW1lRXh0ZW5zaW9uPigpOw0KLQ0KLQlwcm90ZWN0ZWQgV3NET01SdW50aW1lTWFuYWdlcigpDQotCXsNCi0JCS8vIHNpbmdsZXRvbg0KLQl9DQotCQ0KLQlwdWJsaWMgc3RhdGljIElXU0RPTVJ1bnRpbWVNYW5hZ2VyIGluc3RhbmNlKCkNCi0Jew0KLQkJcmV0dXJuIGluc3RhbmNlOw0KLQl9CQ0KLQkNCi0JLyoqDQotCSAqIEluc3RhbnRpYXRlcyB0aGUgRE9NIFJ1bnRpbWVzIGlmIG5vdCBhbHJlYWR5Lg0KLQkgKg0KLQkgKi8NCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNyZWF0ZURPTVJ1bnRpbWVzKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikNCi0Jew0KLQkJZm9yIChJV3NET01SdW50aW1lSW5mbyBydW50aW1lSW5mbyA6IFdzRE9NUnVudGltZVJlZ2lzdHJ5LmdldFJlZ2lzdGVyZWRSdW50aW1lc0luZm8oKSkgew0KLQkJCWNyZWF0ZURPTVJ1bnRpbWUocnVudGltZUluZm8sIG1vbml0b3IpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVdzRE9NUnVudGltZUV4dGVuc2lvbiBjcmVhdGVET01SdW50aW1lKGZpbmFsIElXc0RPTVJ1bnRpbWVJbmZvIHJ1bnRpbWVJbmZvLCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpDQotCXsNCi0JCWZpbmFsIElXc0RPTVJ1bnRpbWVFeHRlbnNpb24gZG9tUnVudGltZSA9IGdldERPTVJ1bnRpbWUocnVudGltZUluZm8pOwkJDQotCQlpZiAoZG9tUnVudGltZSA9PSBudWxsKSB7DQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotCQkNCi0JCXRyeSB7DQotCQkJZG9tUnVudGltZS5jcmVhdGVET00obW9uaXRvcik7DQotCQl9IA0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiB1bmV4cGVjdGVkKSB7DQotCQkJbG9nZ2VyKCkubG9nRXJyb3IoIlVuZXhwZWN0ZWQgRXhjZXB0aW9uISBEb20gZnJvbSBydW50aW1lICIgKyBydW50aW1lSW5mby5nZXROYW1lKCkgKyAiIHdpbGwgbm90IGJlIHByb2Nlc3NlZCEiLCB1bmV4cGVjdGVkKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQl9DQotCQkNCi0JCXJldHVybiBkb21SdW50aW1lOw0KLQl9DQotCQ0KLQkvKioNCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiB0aGUgRE9NIHJ1bnRpbWUgaW5zdGFuY2UgY29ycmVzcG9uZGluZyB0byB0aGUgZGVzY3JpcHRvciBvYmplY3QNCi0JICogb2YgdHlwZSBJUnVudGltZUluZm8gYW5kIGluc3RhbnRpYXRlIHN1Y2ggRE9NIHJ1bnRpbWUgaW5zdGFuY2UgaWYgbm9uIGV4aXN0ZW50IGF0IHRoZSANCi0JICogbW9tZW50IG9mIGludm9jYXRpb24gb2YgdGhpcyBtZXRob2QuDQotCSAqIA0KLQkgKiBAcGFyYW0gcnVudGltZUluZm8gLSBkZXNjcmlwdG9yIG9mIHRoZSBET00gcnVudGltZSB0byBiZSBpbnN0YW50aWF0ZWQgYW5kIHJldHVybmVkIA0KLQkgKiBAcmV0dXJuIHRoZSBET00gcnVudGltZSBpbnN0YW5jZQ0KLQkgKi8NCi0JcHVibGljIElXc0RPTVJ1bnRpbWVFeHRlbnNpb24gZ2V0RE9NUnVudGltZShmaW5hbCBJV3NET01SdW50aW1lSW5mbyBydW50aW1lSW5mbykNCi0Jew0KLQkJaWYgKHJ1bnRpbWVJbmZvID09IG51bGwpIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JCQ0KLQkJSVdzRE9NUnVudGltZUV4dGVuc2lvbiBkb21SdW50aW1lID0gZG9tUnVudGltZXMuZ2V0KHJ1bnRpbWVJbmZvLmdldElkKCkpOwkJDQotCQlpZiAoZG9tUnVudGltZSA9PSBudWxsKQ0KLQkJew0KLQkJCWRvbVJ1bnRpbWUgPSBXc0RPTVJ1bnRpbWVSZWdpc3RyeS5pbnN0YW50aWF0ZVJ1bnRpbWUocnVudGltZUluZm8pOw0KLQkJCWlmIChkb21SdW50aW1lICE9IG51bGwpIHsNCi0JCQkJc3luY2hyb25pemVkKGRvbVJ1bnRpbWVzKSB7DQotCQkJCQlkb21SdW50aW1lcy5wdXQocnVudGltZUluZm8uZ2V0SWQoKSwgZG9tUnVudGltZSk7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBkb21SdW50aW1lOw0KLQl9DQotCQ0KLQkvKioNCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiB0aGUgRE9NIHJ1bnRpbWUgaW5zdGFuY2UgY29ycmVzcG9uZGluZyB0byB0aGUgcnVudGltZSBpZA0KLQkgKiBhbmQgaW5zdGFudGlhdGUgc3VjaCBET00gcnVudGltZSBpbnN0YW5jZSBpZiBub24gZXhpc3RlbnQgYXQgdGhlIA0KLQkgKiBtb21lbnQgb2YgaW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZC4NCi0JICogDQotCSAqIEBwYXJhbSBydW50aW1lSWQgLSBzdHJpbmcgaWRlbnRpZmllciBvZiB0aGUgcnVudGltZSANCi0JICogQHJldHVybiB0aGUgRE9NIHJ1bnRpbWUgaW5zdGFuY2UNCi0JICovDQotCXB1YmxpYyBJV3NET01SdW50aW1lRXh0ZW5zaW9uIGdldERPTVJ1bnRpbWUoZmluYWwgU3RyaW5nIHJ1bnRpbWVJZCkNCi0Jew0KLQkJcmV0dXJuIGdldERPTVJ1bnRpbWUoV3NET01SdW50aW1lUmVnaXN0cnkuZ2V0UnVudGltZUluZm8ocnVudGltZUlkKSk7DQotCX0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgYWxsIGluc3RhbnRpYXRlZCBET00gUnVudGltZXMNCi0gICAgICovDQotICAgIHB1YmxpYyBDb2xsZWN0aW9uPElXc0RPTVJ1bnRpbWVFeHRlbnNpb24+IGdldERPTVJ1bnRpbWVzKCkNCi0gICAgew0KLSAgICAJaWYgKGRvbVJ1bnRpbWVzLnNpemUoKSA9PSAwKSANCi0gICAgCXsNCi0JICAgIAlmaW5hbCBDb2xsZWN0aW9uPElXc0RPTVJ1bnRpbWVJbmZvPiBydEluZm9zID0gV3NET01SdW50aW1lUmVnaXN0cnkuZ2V0UmVnaXN0ZXJlZFJ1bnRpbWVzSW5mbygpOw0KLQkgICAgCWZvciAoSVdzRE9NUnVudGltZUluZm8gcnVudGltZUluZm8gOiBydEluZm9zKSB7DQotCQkJCWdldERPTVJ1bnRpbWUocnVudGltZUluZm8pOw0KLQkJCX0NCi0gICAgCX0NCi0gICAgCQ0KLSAgICAJcmV0dXJuIGRvbVJ1bnRpbWVzLnZhbHVlcygpOw0KLSAgICB9DQotCQ0KLQkvKioNCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIHJlbG9hZCBhbGwgaW5zdGFuY2VzIG9mIERPTSBSdW50aW1lcy4NCi0JICoNCi0JICovDQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWxvYWRET01SdW50aW1lcyhmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpDQotCXsNCi0JCXN5bmNocm9uaXplZChkb21SdW50aW1lcykgew0KLQkJCWRvbVJ1bnRpbWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLElXc0RPTVJ1bnRpbWVFeHRlbnNpb24+KCk7DQotCQl9DQotCQkNCi0JCWNyZWF0ZURPTVJ1bnRpbWVzKG1vbml0b3IpOw0KLQl9DQotDQotCXByaXZhdGUgSUxvZ2dlciBsb2dnZXIoKSB7DQotCQlyZXR1cm4gbmV3IExvZ2dlcigpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvZG9tLmVjb3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9kb20uZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwNDFlZGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9kb20uZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0iZG9tIgotICAgIG5zVVJJPSJodHRwOi8vL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9kb20uZWNvcmUiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUiPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklET00iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3ZWJTZXJ2aWNlUHJvamVjdHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSVdlYlNlcnZpY2VQcm9qZWN0IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJzdXBwcmVzc2VkU2V0VmlzaWJpbGl0eSIgdmFsdWU9InRydWUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUphdmFXZWJTZXJ2aWNlRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImltcGxlbWVudGF0aW9uIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJzdXBwcmVzc2VkU2V0VmlzaWJpbGl0eSIgdmFsdWU9InRydWUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIiBlU3VwZXJUeXBlcz0iIy8vSUphdmFXZWJTZXJ2aWNlRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImltcGxpY2l0IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ic3VwcHJlc3NlZFNldFZpc2liaWxpdHkiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImltcGxlbWVudGluZ1dlYlNlcnZpY2VzIgotICAgICAgICBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0lXZWJTZXJ2aWNlIiBlT3Bwb3NpdGU9IiMvL0lXZWJTZXJ2aWNlL3NlcnZpY2VFbmRwb2ludCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ic3VwcHJlc3NlZFNldFZpc2liaWxpdHkiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndlYk1ldGhvZHMiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vSVdlYk1ldGhvZCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ic3VwcHJlc3NlZFNldFZpc2liaWxpdHkiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhcmdldE5hbWVzcGFjZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzb2FwQmluZGluZ1N0eWxlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vU09BUEJpbmRpbmdTdHlsZSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iRE9DVU1FTlQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic29hcEJpbmRpbmdVc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9TT0FQQmluZGluZ1VzZSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iTElURVJBTCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iV1JBUFBFRCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJV2ViTWV0aG9kIiBlU3VwZXJUeXBlcz0iIy8vSUphdmFXZWJTZXJ2aWNlRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBhcmFtZXRlcnMiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vSVdlYlBhcmFtIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJzdXBwcmVzc2VkU2V0VmlzaWJpbGl0eSIgdmFsdWU9InRydWUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXhjbHVkZWQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNvYXBCaW5kaW5nU3R5bGUiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9TT0FQQmluZGluZ1N0eWxlIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJET0NVTUVOVCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzb2FwQmluZGluZ1VzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1NPQVBCaW5kaW5nVXNlIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJMSVRFUkFMIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJXUkFQUEVEIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklXZWJQYXJhbSIgZVN1cGVyVHlwZXM9IiMvL0lKYXZhV2ViU2VydmljZUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJraW5kIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vV2ViUGFyYW1LaW5kIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGVOYW1lIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJzdXBwcmVzc2VkU2V0VmlzaWJpbGl0eSIgdmFsdWU9InRydWUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGFydE5hbWUiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGFyZ2V0TmFtZXNwYWNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImhlYWRlciIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklXZWJTZXJ2aWNlIiBlU3VwZXJUeXBlcz0iIy8vSUphdmFXZWJTZXJ2aWNlRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlcnZpY2VFbmRwb2ludCIgZVR5cGU9IiMvL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UiCi0gICAgICAgIGVPcHBvc2l0ZT0iIy8vSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS9pbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ic3VwcHJlc3NlZFNldFZpc2liaWxpdHkiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhcmdldE5hbWVzcGFjZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwb3J0TmFtZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3c2RsTG9jYXRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSVdlYlNlcnZpY2VQcm9qZWN0Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2ViU2VydmljZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSVdlYlNlcnZpY2UiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9InN1cHByZXNzZWRTZXRWaXNpYmlsaXR5IiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9InN1cHByZXNzZWRTZXRWaXNpYmlsaXR5IiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJzdXBwcmVzc2VkU2V0VmlzaWJpbGl0eSIgdmFsdWU9InRydWUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSVdlYlR5cGUiIGVTdXBlclR5cGVzPSIjLy9JSmF2YVdlYlNlcnZpY2VFbGVtZW50Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJXZWJQYXJhbUtpbmQiPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iSU4iLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IklOT1VUIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iT1VUIiB2YWx1ZT0iMiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlNPQVBCaW5kaW5nU3R5bGUiPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iRE9DVU1FTlQiIGxpdGVyYWw9IkRPQ1VNRU5UIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJSUEMiIHZhbHVlPSIxIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iU09BUEJpbmRpbmdVc2UiPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iTElURVJBTCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iRU5DT0RFRCIgdmFsdWU9IjEiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIj4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IldSQVBQRUQiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkJBUkUiIHZhbHVlPSIxIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvZG9tLndzLmdlbm1vZGVsIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9kb20ud3MuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI0MjY5YWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9kb20ud3MuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgbW9kZWxEaXJlY3Rvcnk9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMiCi0gICAgZWRpdERpcmVjdG9yeT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMiIGVkaXRvckRpcmVjdG9yeT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmVkaXRvci9zcmMiCi0gICAgbW9kZWxQbHVnaW5JRD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lIiBtb2RlbE5hbWU9IkRvbSIgZWRpdFBsdWdpbkNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLmludGVybmFsLnBsdWdpbi5Eb21VaSIKLSAgICBlZGl0b3JQbHVnaW5DbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS5uYXZpZ2F0b3IuZ2VuZXJhdGVkLkRvbUVkaXRvclBsdWdpbiIKLSAgICBub25OTFNNYXJrZXJzPSJ0cnVlIiB0ZXN0c0RpcmVjdG9yeT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYyIKLSAgICBpbXBvcnRlcklEPSJvcmcuZWNsaXBzZS5lbWYuaW1wb3J0ZXIuamF2YSIgY29tcGxpYW5jZUxldmVsPSI1LjAiIGNvcHlyaWdodEZpZWxkcz0iZmFsc2UiCi0gICAgcHJvdmlkZXJSb290RXh0ZW5kc0NsYXNzPSIiPgotICA8Zm9yZWlnbk1vZGVsPkBtb2RlbDwvZm9yZWlnbk1vZGVsPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJEb20iIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCi0gICAgICBpbnRlcmZhY2VQYWNrYWdlU3VmZml4PSJydW50aW1lLmFwaSIgbWV0YURhdGFQYWNrYWdlU3VmZml4PSJydW50aW1lLmFwaSIgY2xhc3NQYWNrYWdlU3VmZml4PSJydW50aW1lLmludGVybmFsLmltcGwiCi0gICAgICB1dGlsaXR5UGFja2FnZVN1ZmZpeD0icnVudGltZS51dGlsIiBwcm92aWRlclBhY2thZ2VTdWZmaXg9InVpIiBnZW5lcmF0ZUV4YW1wbGVDbGFzcz0iZmFsc2UiCi0gICAgICBlY29yZVBhY2thZ2U9ImRvbS5lY29yZSMvIj4KLSAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0iZG9tLmVjb3JlIy8vV2ViUGFyYW1LaW5kIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZG9tLmVjb3JlIy8vV2ViUGFyYW1LaW5kL0lOIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImRvbS5lY29yZSMvL1dlYlBhcmFtS2luZC9JTk9VVCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJkb20uZWNvcmUjLy9XZWJQYXJhbUtpbmQvT1VUIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0iZG9tLmVjb3JlIy8vU09BUEJpbmRpbmdTdHlsZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImRvbS5lY29yZSMvL1NPQVBCaW5kaW5nU3R5bGUvRE9DVU1FTlQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZG9tLmVjb3JlIy8vU09BUEJpbmRpbmdTdHlsZS9SUEMiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJkb20uZWNvcmUjLy9TT0FQQmluZGluZ1VzZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImRvbS5lY29yZSMvL1NPQVBCaW5kaW5nVXNlL0xJVEVSQUwiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZG9tLmVjb3JlIy8vU09BUEJpbmRpbmdVc2UvRU5DT0RFRCIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09ImRvbS5lY29yZSMvL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJkb20uZWNvcmUjLy9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlL1dSQVBQRUQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZG9tLmVjb3JlIy8vU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS9CQVJFIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkb20uZWNvcmUjLy9JRE9NIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZG9tLmVjb3JlIy8vSURPTS93ZWJTZXJ2aWNlUHJvamVjdHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZG9tLmVjb3JlIy8vSUphdmFXZWJTZXJ2aWNlRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZG9tLmVjb3JlIy8vSUphdmFXZWJTZXJ2aWNlRWxlbWVudC9pbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRvbS5lY29yZSMvL0lKYXZhV2ViU2VydmljZUVsZW1lbnQvbmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkb20uZWNvcmUjLy9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkb20uZWNvcmUjLy9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlL2ltcGxpY2l0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZG9tLmVjb3JlIy8vSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS9pbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBkb20uZWNvcmUjLy9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlL3dlYk1ldGhvZHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkb20uZWNvcmUjLy9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlL3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRvbS5lY29yZSMvL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Uvc29hcEJpbmRpbmdTdHlsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRvbS5lY29yZSMvL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Uvc29hcEJpbmRpbmdVc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkb20uZWNvcmUjLy9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlL3NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZG9tLmVjb3JlIy8vSVdlYk1ldGhvZCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGRvbS5lY29yZSMvL0lXZWJNZXRob2QvcGFyYW1ldGVycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRvbS5lY29yZSMvL0lXZWJNZXRob2QvZXhjbHVkZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkb20uZWNvcmUjLy9JV2ViTWV0aG9kL3NvYXBCaW5kaW5nU3R5bGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkb20uZWNvcmUjLy9JV2ViTWV0aG9kL3NvYXBCaW5kaW5nVXNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZG9tLmVjb3JlIy8vSVdlYk1ldGhvZC9zb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRvbS5lY29yZSMvL0lXZWJQYXJhbSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZG9tLmVjb3JlIy8vSVdlYlBhcmFtL2tpbmQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkb20uZWNvcmUjLy9JV2ViUGFyYW0vdHlwZU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkb20uZWNvcmUjLy9JV2ViUGFyYW0vcGFydE5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkb20uZWNvcmUjLy9JV2ViUGFyYW0vdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZG9tLmVjb3JlIy8vSVdlYlBhcmFtL2hlYWRlciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkb20uZWNvcmUjLy9JV2ViU2VydmljZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZG9tLmVjb3JlIy8vSVdlYlNlcnZpY2Uvc2VydmljZUVuZHBvaW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZG9tLmVjb3JlIy8vSVdlYlNlcnZpY2UvdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZG9tLmVjb3JlIy8vSVdlYlNlcnZpY2UvcG9ydE5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkb20uZWNvcmUjLy9JV2ViU2VydmljZS93c2RsTG9jYXRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZG9tLmVjb3JlIy8vSVdlYlNlcnZpY2VQcm9qZWN0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZG9tLmVjb3JlIy8vSVdlYlNlcnZpY2VQcm9qZWN0L3dlYlNlcnZpY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGRvbS5lY29yZSMvL0lXZWJTZXJ2aWNlUHJvamVjdC9zZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZG9tLmVjb3JlIy8vSVdlYlNlcnZpY2VQcm9qZWN0L25hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZG9tLmVjb3JlIy8vSVdlYlR5cGUiLz4KLSAgPC9nZW5QYWNrYWdlcz4KLTwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvRG9tRmFjdG9yeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9Eb21GYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MWQzYTc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9Eb21GYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5XZWJQYXJhbUtpbmQ7DQotDQotDQotLyoqDQotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uDQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBEb21GYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIERvbUZhY3Rvcnkgew0KLQkvKioNCi0JICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBEb21GYWN0b3J5IGluaXQoKSB7DQotCQl0cnkNCi0JCXsNCi0JCQlEb21GYWN0b3J5IHRoZURvbUZhY3RvcnkgPSAoRG9tRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiaHR0cDovLy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvZG9tLmVjb3JlIik7IC8vJE5PTi1OTFMtMSQgDQotCQkJaWYgKHRoZURvbUZhY3RvcnkgIT0gbnVsbCkNCi0JCQl7DQotCQkJCXJldHVybiB0aGVEb21GYWN0b3J5Ow0KLQkJCX0NCi0JCX0NCi0JCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKQ0KLQkJew0KLQkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOw0KLQkJfQ0KLQkJcmV0dXJuIG5ldyBEb21GYWN0b3J5SW1wbCgpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIERvbUZhY3RvcnlJbXBsKCkgew0KLQkJc3VwZXIoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgew0KLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklET006IHJldHVybiBjcmVhdGVJRE9NKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlQ6IHJldHVybiBjcmVhdGVJSmF2YVdlYlNlcnZpY2VFbGVtZW50KCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRTogcmV0dXJuIGNyZWF0ZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0Q6IHJldHVybiBjcmVhdGVJV2ViTWV0aG9kKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU06IHJldHVybiBjcmVhdGVJV2ViUGFyYW0oKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFOiByZXR1cm4gY3JlYXRlSVdlYlNlcnZpY2UoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1Q6IHJldHVybiBjcmVhdGVJV2ViU2VydmljZVByb2plY3QoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9UWVBFOiByZXR1cm4gY3JlYXRlSVdlYlR5cGUoKTsNCi0JCQlkZWZhdWx0Og0KLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgew0KLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLldFQl9QQVJBTV9LSU5EOg0KLQkJCQlyZXR1cm4gY3JlYXRlV2ViUGFyYW1LaW5kRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7DQotCQkJY2FzZSBEb21QYWNrYWdlLlNPQVBfQklORElOR19TVFlMRToNCi0JCQkJcmV0dXJuIGNyZWF0ZVNPQVBCaW5kaW5nU3R5bGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuU09BUF9CSU5ESU5HX1VTRToNCi0JCQkJcmV0dXJuIGNyZWF0ZVNPQVBCaW5kaW5nVXNlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7DQotCQkJY2FzZSBEb21QYWNrYWdlLlNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEU6DQotCQkJCXJldHVybiBjcmVhdGVTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7DQotCQkJZGVmYXVsdDoNCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsNCi0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5XRUJfUEFSQU1fS0lORDoNCi0JCQkJcmV0dXJuIGNvbnZlcnRXZWJQYXJhbUtpbmRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5TT0FQX0JJTkRJTkdfU1RZTEU6DQotCQkJCXJldHVybiBjb252ZXJ0U09BUEJpbmRpbmdTdHlsZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7DQotCQkJY2FzZSBEb21QYWNrYWdlLlNPQVBfQklORElOR19VU0U6DQotCQkJCXJldHVybiBjb252ZXJ0U09BUEJpbmRpbmdVc2VUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFOg0KLQkJCQlyZXR1cm4gY29udmVydFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOw0KLQkJCWRlZmF1bHQ6DQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIElET00gY3JlYXRlSURPTSgpIHsNCi0JCUlET01JbXBsIGlkb20gPSBuZXcgSURPTUltcGwoKTsNCi0JCXJldHVybiBpZG9tOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIElKYXZhV2ViU2VydmljZUVsZW1lbnQgY3JlYXRlSUphdmFXZWJTZXJ2aWNlRWxlbWVudCgpIHsNCi0JCUlKYXZhV2ViU2VydmljZUVsZW1lbnRJbXBsIGlKYXZhV2ViU2VydmljZUVsZW1lbnQgPSBuZXcgSUphdmFXZWJTZXJ2aWNlRWxlbWVudEltcGwoKTsNCi0JCXJldHVybiBpSmF2YVdlYlNlcnZpY2VFbGVtZW50Ow0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgY3JlYXRlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpIHsNCi0JCUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJbXBsIGlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPSBuZXcgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUltcGwoKTsNCi0JCXJldHVybiBpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIElXZWJNZXRob2QgY3JlYXRlSVdlYk1ldGhvZCgpIHsNCi0JCUlXZWJNZXRob2RJbXBsIGlXZWJNZXRob2QgPSBuZXcgSVdlYk1ldGhvZEltcGwoKTsNCi0JCXJldHVybiBpV2ViTWV0aG9kOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIElXZWJQYXJhbSBjcmVhdGVJV2ViUGFyYW0oKSB7DQotCQlJV2ViUGFyYW1JbXBsIGlXZWJQYXJhbSA9IG5ldyBJV2ViUGFyYW1JbXBsKCk7DQotCQlyZXR1cm4gaVdlYlBhcmFtOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIElXZWJTZXJ2aWNlIGNyZWF0ZUlXZWJTZXJ2aWNlKCkgew0KLQkJSVdlYlNlcnZpY2VJbXBsIGlXZWJTZXJ2aWNlID0gbmV3IElXZWJTZXJ2aWNlSW1wbCgpOw0KLQkJcmV0dXJuIGlXZWJTZXJ2aWNlOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIElXZWJTZXJ2aWNlUHJvamVjdCBjcmVhdGVJV2ViU2VydmljZVByb2plY3QoKSB7DQotCQlJV2ViU2VydmljZVByb2plY3RJbXBsIGlXZWJTZXJ2aWNlUHJvamVjdCA9IG5ldyBJV2ViU2VydmljZVByb2plY3RJbXBsKCk7DQotCQlyZXR1cm4gaVdlYlNlcnZpY2VQcm9qZWN0Ow0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIElXZWJUeXBlIGNyZWF0ZUlXZWJUeXBlKCkgew0KLQkJSVdlYlR5cGVJbXBsIGlXZWJUeXBlID0gbmV3IElXZWJUeXBlSW1wbCgpOw0KLQkJcmV0dXJuIGlXZWJUeXBlOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFdlYlBhcmFtS2luZCBjcmVhdGVXZWJQYXJhbUtpbmRGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsNCi0JCVdlYlBhcmFtS2luZCByZXN1bHQgPSBXZWJQYXJhbUtpbmQuZ2V0KGluaXRpYWxWYWx1ZSk7DQotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRXZWJQYXJhbUtpbmRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgew0KLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgU09BUEJpbmRpbmdTdHlsZSBjcmVhdGVTT0FQQmluZGluZ1N0eWxlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7DQotCQlTT0FQQmluZGluZ1N0eWxlIHJlc3VsdCA9IFNPQVBCaW5kaW5nU3R5bGUuZ2V0KGluaXRpYWxWYWx1ZSk7DQotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRTT0FQQmluZGluZ1N0eWxlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsNCi0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFNPQVBCaW5kaW5nVXNlIGNyZWF0ZVNPQVBCaW5kaW5nVXNlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7DQotCQlTT0FQQmluZGluZ1VzZSByZXN1bHQgPSBTT0FQQmluZGluZ1VzZS5nZXQoaW5pdGlhbFZhbHVlKTsNCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJA0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgY29udmVydFNPQVBCaW5kaW5nVXNlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsNCi0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgY3JlYXRlU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgew0KLQkJU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSByZXN1bHQgPSBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmdldChpbml0aWFsVmFsdWUpOw0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBjb252ZXJ0U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7DQotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBEb21QYWNrYWdlIGdldERvbVBhY2thZ2UoKSB7DQotCQlyZXR1cm4gKERvbVBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBkZXByZWNhdGVkDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBEZXByZWNhdGVkDQotCXB1YmxpYyBzdGF0aWMgRG9tUGFja2FnZSBnZXRQYWNrYWdlKCkgew0KLQkJcmV0dXJuIERvbVBhY2thZ2UuZUlOU1RBTkNFOw0KLQl9DQotDQotfSAvL0RvbUZhY3RvcnlJbXBsDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0RvbVBhY2thZ2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvRG9tUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzk1ODhhNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvRG9tUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsOw0KLQ0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklKYXZhV2ViU2VydmljZUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldlYlBhcmFtS2luZDsNCi0NCi0vKioNCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4NCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0gKiBAZ2VuZXJhdGVkDQotICovDQotcHVibGljIGNsYXNzIERvbVBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgRG9tUGFja2FnZSB7DQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBFQ2xhc3MgaWRvbUVDbGFzcyA9IG51bGw7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBFQ2xhc3MgaUphdmFXZWJTZXJ2aWNlRWxlbWVudEVDbGFzcyA9IG51bGw7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBFQ2xhc3MgaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUVDbGFzcyA9IG51bGw7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBFQ2xhc3MgaVdlYk1ldGhvZEVDbGFzcyA9IG51bGw7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBFQ2xhc3MgaVdlYlBhcmFtRUNsYXNzID0gbnVsbDsNCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcml2YXRlIEVDbGFzcyBpV2ViU2VydmljZUVDbGFzcyA9IG51bGw7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBFQ2xhc3MgaVdlYlNlcnZpY2VQcm9qZWN0RUNsYXNzID0gbnVsbDsNCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcml2YXRlIEVDbGFzcyBpV2ViVHlwZUVDbGFzcyA9IG51bGw7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBFRW51bSB3ZWJQYXJhbUtpbmRFRW51bSA9IG51bGw7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBFRW51bSBzb2FwQmluZGluZ1N0eWxlRUVudW0gPSBudWxsOw0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgRUVudW0gc29hcEJpbmRpbmdVc2VFRW51bSA9IG51bGw7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBFRW51bSBzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlRUVudW0gPSBudWxsOw0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aA0KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQ0KLQkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4NCi0JICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYw0KLQkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3Jtcw0KLQkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLA0KLQkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZSNlTlNfVVJJDQotCSAqIEBzZWUgI2luaXQoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcml2YXRlIERvbVBhY2thZ2VJbXBsKCkgew0KLQkJc3VwZXIoZU5TX1VSSSwgRG9tRmFjdG9yeS5lSU5TVEFOQ0UpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOw0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzDQotCSAqIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiAgU2ltcGxlDQotCSAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsDQotCSAqIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIFRoaXMgbWV0aG9kIGRyaXZlcw0KLQkgKiBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQgcGFja2FnZXMgZGlyZWN0bHksIGluIHBhcmFsbGVsDQotCSAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuDQotCSAqIDxwPk9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2gNCi0JICogaGF2ZSBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkDQotCSAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoNCi0JICogbWV0YS1tb2RlbCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkNCi0JICogYXJlIGluaXRpYWxpemVkLCBzaW5jZSBvbmUgcGFja2FnZSdzIG1ldGEtbW9kZWwgb2JqZWN0cyBtYXkgcmVmZXIgdG8NCi0JICogdGhvc2Ugb2YgYW5vdGhlci4NCi0JICogPHA+SW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQ0KLQkgKiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNlTlNfVVJJDQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpDQotCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIERvbVBhY2thZ2UgaW5pdCgpIHsNCi0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChEb21QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKERvbVBhY2thZ2UuZU5TX1VSSSk7DQotDQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlDQotCQlEb21QYWNrYWdlSW1wbCB0aGVEb21QYWNrYWdlID0gKERvbVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIERvbVBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgRG9tUGFja2FnZUltcGwoKSk7DQotDQotCQlpc0luaXRlZCA9IHRydWU7DQotDQotCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cw0KLQkJdGhlRG9tUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsNCi0NCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGENCi0JCXRoZURvbVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOw0KLQ0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZA0KLQkJdGhlRG9tUGFja2FnZS5mcmVlemUoKTsNCi0NCi0JCXJldHVybiB0aGVEb21QYWNrYWdlOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVDbGFzcyBnZXRJRE9NKCkgew0KLQkJcmV0dXJuIGlkb21FQ2xhc3M7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJRE9NX1dlYlNlcnZpY2VQcm9qZWN0cygpIHsNCi0JCXJldHVybiAoRVJlZmVyZW5jZSlpZG9tRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUNsYXNzIGdldElKYXZhV2ViU2VydmljZUVsZW1lbnQoKSB7DQotCQlyZXR1cm4gaUphdmFXZWJTZXJ2aWNlRWxlbWVudEVDbGFzczsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQXR0cmlidXRlIGdldElKYXZhV2ViU2VydmljZUVsZW1lbnRfSW1wbGVtZW50YXRpb24oKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaUphdmFXZWJTZXJ2aWNlRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudF9OYW1lKCkgew0KLQkJcmV0dXJuIChFQXR0cmlidXRlKWlKYXZhV2ViU2VydmljZUVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQ2xhc3MgZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpIHsNCi0JCXJldHVybiBpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlRUNsYXNzOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9JbXBsaWNpdCgpIHsNCi0JCXJldHVybiAoRUF0dHJpYnV0ZSlpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX0ltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkgew0KLQkJcmV0dXJuIChFUmVmZXJlbmNlKWlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFUmVmZXJlbmNlIGdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfV2ViTWV0aG9kcygpIHsNCi0JCXJldHVybiAoRVJlZmVyZW5jZSlpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1RhcmdldE5hbWVzcGFjZSgpIHsNCi0JCXJldHVybiAoRUF0dHJpYnV0ZSlpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1NvYXBCaW5kaW5nU3R5bGUoKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1VzZSgpIHsNCi0JCXJldHVybiAoRUF0dHJpYnV0ZSlpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVDbGFzcyBnZXRJV2ViTWV0aG9kKCkgew0KLQkJcmV0dXJuIGlXZWJNZXRob2RFQ2xhc3M7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJV2ViTWV0aG9kX1BhcmFtZXRlcnMoKSB7DQotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaVdlYk1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SVdlYk1ldGhvZF9FeGNsdWRlZCgpIHsNCi0JCXJldHVybiAoRUF0dHJpYnV0ZSlpV2ViTWV0aG9kRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJV2ViTWV0aG9kX1NvYXBCaW5kaW5nU3R5bGUoKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVdlYk1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SVdlYk1ldGhvZF9Tb2FwQmluZGluZ1VzZSgpIHsNCi0JCXJldHVybiAoRUF0dHJpYnV0ZSlpV2ViTWV0aG9kRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJV2ViTWV0aG9kX1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVdlYk1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVDbGFzcyBnZXRJV2ViUGFyYW0oKSB7DQotCQlyZXR1cm4gaVdlYlBhcmFtRUNsYXNzOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SVdlYlBhcmFtX0tpbmQoKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVdlYlBhcmFtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJV2ViUGFyYW1fVHlwZU5hbWUoKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVdlYlBhcmFtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJV2ViUGFyYW1fUGFydE5hbWUoKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVdlYlBhcmFtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJV2ViUGFyYW1fVGFyZ2V0TmFtZXNwYWNlKCkgew0KLQkJcmV0dXJuIChFQXR0cmlidXRlKWlXZWJQYXJhbUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SVdlYlBhcmFtX0hlYWRlcigpIHsNCi0JCXJldHVybiAoRUF0dHJpYnV0ZSlpV2ViUGFyYW1FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQ2xhc3MgZ2V0SVdlYlNlcnZpY2UoKSB7DQotCQlyZXR1cm4gaVdlYlNlcnZpY2VFQ2xhc3M7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJV2ViU2VydmljZV9TZXJ2aWNlRW5kcG9pbnQoKSB7DQotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaVdlYlNlcnZpY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQXR0cmlidXRlIGdldElXZWJTZXJ2aWNlX1RhcmdldE5hbWVzcGFjZSgpIHsNCi0JCXJldHVybiAoRUF0dHJpYnV0ZSlpV2ViU2VydmljZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SVdlYlNlcnZpY2VfUG9ydE5hbWUoKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVdlYlNlcnZpY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQXR0cmlidXRlIGdldElXZWJTZXJ2aWNlX1dzZGxMb2NhdGlvbigpIHsNCi0JCXJldHVybiAoRUF0dHJpYnV0ZSlpV2ViU2VydmljZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVDbGFzcyBnZXRJV2ViU2VydmljZVByb2plY3QoKSB7DQotCQlyZXR1cm4gaVdlYlNlcnZpY2VQcm9qZWN0RUNsYXNzOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SVdlYlNlcnZpY2VQcm9qZWN0X1dlYlNlcnZpY2VzKCkgew0KLQkJcmV0dXJuIChFUmVmZXJlbmNlKWlXZWJTZXJ2aWNlUHJvamVjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SVdlYlNlcnZpY2VQcm9qZWN0X1NlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKSB7DQotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaVdlYlNlcnZpY2VQcm9qZWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJV2ViU2VydmljZVByb2plY3RfTmFtZSgpIHsNCi0JCXJldHVybiAoRUF0dHJpYnV0ZSlpV2ViU2VydmljZVByb2plY3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQ2xhc3MgZ2V0SVdlYlR5cGUoKSB7DQotCQlyZXR1cm4gaVdlYlR5cGVFQ2xhc3M7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUVudW0gZ2V0V2ViUGFyYW1LaW5kKCkgew0KLQkJcmV0dXJuIHdlYlBhcmFtS2luZEVFbnVtOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVFbnVtIGdldFNPQVBCaW5kaW5nU3R5bGUoKSB7DQotCQlyZXR1cm4gc29hcEJpbmRpbmdTdHlsZUVFbnVtOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVFbnVtIGdldFNPQVBCaW5kaW5nVXNlKCkgew0KLQkJcmV0dXJuIHNvYXBCaW5kaW5nVXNlRUVudW07DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUVudW0gZ2V0U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpIHsNCi0JCXJldHVybiBzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlRUVudW07DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRG9tRmFjdG9yeSBnZXREb21GYWN0b3J5KCkgew0KLQkJcmV0dXJuIChEb21GYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsNCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcw0KLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7DQotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47DQotCQlpc0NyZWF0ZWQgPSB0cnVlOw0KLQ0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzDQotCQlpZG9tRUNsYXNzID0gY3JlYXRlRUNsYXNzKElET00pOw0KLQkJY3JlYXRlRVJlZmVyZW5jZShpZG9tRUNsYXNzLCBJRE9NX19XRUJfU0VSVklDRV9QUk9KRUNUUyk7DQotDQotCQlpSmF2YVdlYlNlcnZpY2VFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlQpOw0KLQkJY3JlYXRlRUF0dHJpYnV0ZShpSmF2YVdlYlNlcnZpY2VFbGVtZW50RUNsYXNzLCBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTik7DQotCQljcmVhdGVFQXR0cmlidXRlKGlKYXZhV2ViU2VydmljZUVsZW1lbnRFQ2xhc3MsIElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUpOw0KLQ0KLQkJaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0UpOw0KLQkJY3JlYXRlRUF0dHJpYnV0ZShpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlRUNsYXNzLCBJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExJQ0lUKTsNCi0JCWNyZWF0ZUVSZWZlcmVuY2UoaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUVDbGFzcywgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRJTkdfV0VCX1NFUlZJQ0VTKTsNCi0JCWNyZWF0ZUVSZWZlcmVuY2UoaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUVDbGFzcywgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19XRUJfTUVUSE9EUyk7DQotCQljcmVhdGVFQXR0cmlidXRlKGlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VFQ2xhc3MsIElTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fVEFSR0VUX05BTUVTUEFDRSk7DQotCQljcmVhdGVFQXR0cmlidXRlKGlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VFQ2xhc3MsIElTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1NUWUxFKTsNCi0JCWNyZWF0ZUVBdHRyaWJ1dGUoaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUVDbGFzcywgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfVVNFKTsNCi0JCWNyZWF0ZUVBdHRyaWJ1dGUoaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUVDbGFzcywgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFKTsNCi0NCi0JCWlXZWJNZXRob2RFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSVdFQl9NRVRIT0QpOw0KLQkJY3JlYXRlRVJlZmVyZW5jZShpV2ViTWV0aG9kRUNsYXNzLCBJV0VCX01FVEhPRF9fUEFSQU1FVEVSUyk7DQotCQljcmVhdGVFQXR0cmlidXRlKGlXZWJNZXRob2RFQ2xhc3MsIElXRUJfTUVUSE9EX19FWENMVURFRCk7DQotCQljcmVhdGVFQXR0cmlidXRlKGlXZWJNZXRob2RFQ2xhc3MsIElXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfU1RZTEUpOw0KLQkJY3JlYXRlRUF0dHJpYnV0ZShpV2ViTWV0aG9kRUNsYXNzLCBJV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1VTRSk7DQotCQljcmVhdGVFQXR0cmlidXRlKGlXZWJNZXRob2RFQ2xhc3MsIElXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFKTsNCi0NCi0JCWlXZWJQYXJhbUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJV0VCX1BBUkFNKTsNCi0JCWNyZWF0ZUVBdHRyaWJ1dGUoaVdlYlBhcmFtRUNsYXNzLCBJV0VCX1BBUkFNX19LSU5EKTsNCi0JCWNyZWF0ZUVBdHRyaWJ1dGUoaVdlYlBhcmFtRUNsYXNzLCBJV0VCX1BBUkFNX19UWVBFX05BTUUpOw0KLQkJY3JlYXRlRUF0dHJpYnV0ZShpV2ViUGFyYW1FQ2xhc3MsIElXRUJfUEFSQU1fX1BBUlRfTkFNRSk7DQotCQljcmVhdGVFQXR0cmlidXRlKGlXZWJQYXJhbUVDbGFzcywgSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRSk7DQotCQljcmVhdGVFQXR0cmlidXRlKGlXZWJQYXJhbUVDbGFzcywgSVdFQl9QQVJBTV9fSEVBREVSKTsNCi0NCi0JCWlXZWJTZXJ2aWNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKElXRUJfU0VSVklDRSk7DQotCQljcmVhdGVFUmVmZXJlbmNlKGlXZWJTZXJ2aWNlRUNsYXNzLCBJV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQpOw0KLQkJY3JlYXRlRUF0dHJpYnV0ZShpV2ViU2VydmljZUVDbGFzcywgSVdFQl9TRVJWSUNFX19UQVJHRVRfTkFNRVNQQUNFKTsNCi0JCWNyZWF0ZUVBdHRyaWJ1dGUoaVdlYlNlcnZpY2VFQ2xhc3MsIElXRUJfU0VSVklDRV9fUE9SVF9OQU1FKTsNCi0JCWNyZWF0ZUVBdHRyaWJ1dGUoaVdlYlNlcnZpY2VFQ2xhc3MsIElXRUJfU0VSVklDRV9fV1NETF9MT0NBVElPTik7DQotDQotCQlpV2ViU2VydmljZVByb2plY3RFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSVdFQl9TRVJWSUNFX1BST0pFQ1QpOw0KLQkJY3JlYXRlRVJlZmVyZW5jZShpV2ViU2VydmljZVByb2plY3RFQ2xhc3MsIElXRUJfU0VSVklDRV9QUk9KRUNUX19XRUJfU0VSVklDRVMpOw0KLQkJY3JlYXRlRVJlZmVyZW5jZShpV2ViU2VydmljZVByb2plY3RFQ2xhc3MsIElXRUJfU0VSVklDRV9QUk9KRUNUX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRVMpOw0KLQkJY3JlYXRlRUF0dHJpYnV0ZShpV2ViU2VydmljZVByb2plY3RFQ2xhc3MsIElXRUJfU0VSVklDRV9QUk9KRUNUX19OQU1FKTsNCi0NCi0JCWlXZWJUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKElXRUJfVFlQRSk7DQotDQotCQkvLyBDcmVhdGUgZW51bXMNCi0JCXdlYlBhcmFtS2luZEVFbnVtID0gY3JlYXRlRUVudW0oV0VCX1BBUkFNX0tJTkQpOw0KLQkJc29hcEJpbmRpbmdTdHlsZUVFbnVtID0gY3JlYXRlRUVudW0oU09BUF9CSU5ESU5HX1NUWUxFKTsNCi0JCXNvYXBCaW5kaW5nVXNlRUVudW0gPSBjcmVhdGVFRW51bShTT0FQX0JJTkRJTkdfVVNFKTsNCi0JCXNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGVFRW51bSA9IGNyZWF0ZUVFbnVtKFNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsNCi0NCi0JLyoqDQotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzDQotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgew0KLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsNCi0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOw0KLQ0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlDQotCQlzZXROYW1lKGVOQU1FKTsNCi0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOw0KLQkJc2V0TnNVUkkoZU5TX1VSSSk7DQotDQotCQkvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzDQotDQotCQkvLyBTZXQgYm91bmRzIGZvciB0eXBlIHBhcmFtZXRlcnMNCi0NCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMNCi0JCWlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50KCkpOw0KLQkJaVdlYk1ldGhvZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElKYXZhV2ViU2VydmljZUVsZW1lbnQoKSk7DQotCQlpV2ViUGFyYW1FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50KCkpOw0KLQkJaVdlYlNlcnZpY2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50KCkpOw0KLQkJaVdlYlR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50KCkpOw0KLQ0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMNCi0JCWluaXRFQ2xhc3MoaWRvbUVDbGFzcywgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NLmNsYXNzLCAiSURPTSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SURPTV9XZWJTZXJ2aWNlUHJvamVjdHMoKSwgdGhpcy5nZXRJV2ViU2VydmljZVByb2plY3QoKSwgbnVsbCwgIndlYlNlcnZpY2VQcm9qZWN0cyIsIG51bGwsIDAsIC0xLCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET00uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCWluaXRFQ2xhc3MoaUphdmFXZWJTZXJ2aWNlRWxlbWVudEVDbGFzcywgSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5jbGFzcywgIklKYXZhV2ViU2VydmljZUVsZW1lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFQXR0cmlidXRlKGdldElKYXZhV2ViU2VydmljZUVsZW1lbnRfSW1wbGVtZW50YXRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImltcGxlbWVudGF0aW9uIiwgbnVsbCwgMSwgMSwgSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudF9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMSwgMSwgSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJaW5pdEVDbGFzcyhpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlRUNsYXNzLCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmNsYXNzLCAiSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9JbXBsaWNpdCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImltcGxpY2l0IiwgbnVsbCwgMSwgMSwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9JbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpLCB0aGlzLmdldElXZWJTZXJ2aWNlKCksIHRoaXMuZ2V0SVdlYlNlcnZpY2VfU2VydmljZUVuZHBvaW50KCksICJpbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcyIsIG51bGwsIDEsIC0xLCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkDQotCQlpbml0RVJlZmVyZW5jZShnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1dlYk1ldGhvZHMoKSwgdGhpcy5nZXRJV2ViTWV0aG9kKCksIG51bGwsICJ3ZWJNZXRob2RzIiwgbnVsbCwgMSwgLTEsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFQXR0cmlidXRlKGdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfVGFyZ2V0TmFtZXNwYWNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0YXJnZXROYW1lc3BhY2UiLCBudWxsLCAxLCAxLCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkDQotCQlpbml0RUF0dHJpYnV0ZShnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1NvYXBCaW5kaW5nU3R5bGUoKSwgdGhpcy5nZXRTT0FQQmluZGluZ1N0eWxlKCksICJzb2FwQmluZGluZ1N0eWxlIiwgIkRPQ1VNRU5UIiwgMSwgMSwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQlpbml0RUF0dHJpYnV0ZShnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1NvYXBCaW5kaW5nVXNlKCksIHRoaXMuZ2V0U09BUEJpbmRpbmdVc2UoKSwgInNvYXBCaW5kaW5nVXNlIiwgIkxJVEVSQUwiLCAxLCAxLCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCWluaXRFQXR0cmlidXRlKGdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfU29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpLCB0aGlzLmdldFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSwgInNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUiLCAiV1JBUFBFRCIsIDEsIDEsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQ0KLQkJaW5pdEVDbGFzcyhpV2ViTWV0aG9kRUNsYXNzLCBJV2ViTWV0aG9kLmNsYXNzLCAiSVdlYk1ldGhvZCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SVdlYk1ldGhvZF9QYXJhbWV0ZXJzKCksIHRoaXMuZ2V0SVdlYlBhcmFtKCksIG51bGwsICJwYXJhbWV0ZXJzIiwgbnVsbCwgMSwgLTEsIElXZWJNZXRob2QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFQXR0cmlidXRlKGdldElXZWJNZXRob2RfRXhjbHVkZWQoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJleGNsdWRlZCIsIG51bGwsIDEsIDEsIElXZWJNZXRob2QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFQXR0cmlidXRlKGdldElXZWJNZXRob2RfU29hcEJpbmRpbmdTdHlsZSgpLCB0aGlzLmdldFNPQVBCaW5kaW5nU3R5bGUoKSwgInNvYXBCaW5kaW5nU3R5bGUiLCAiRE9DVU1FTlQiLCAxLCAxLCBJV2ViTWV0aG9kLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCWluaXRFQXR0cmlidXRlKGdldElXZWJNZXRob2RfU29hcEJpbmRpbmdVc2UoKSwgdGhpcy5nZXRTT0FQQmluZGluZ1VzZSgpLCAic29hcEJpbmRpbmdVc2UiLCAiTElURVJBTCIsIDEsIDEsIElXZWJNZXRob2QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SVdlYk1ldGhvZF9Tb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCksIHRoaXMuZ2V0U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpLCAic29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSIsICJXUkFQUEVEIiwgMSwgMSwgSVdlYk1ldGhvZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotDQotCQlpbml0RUNsYXNzKGlXZWJQYXJhbUVDbGFzcywgSVdlYlBhcmFtLmNsYXNzLCAiSVdlYlBhcmFtIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkDQotCQlpbml0RUF0dHJpYnV0ZShnZXRJV2ViUGFyYW1fS2luZCgpLCB0aGlzLmdldFdlYlBhcmFtS2luZCgpLCAia2luZCIsIG51bGwsIDEsIDEsIElXZWJQYXJhbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SVdlYlBhcmFtX1R5cGVOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0eXBlTmFtZSIsIG51bGwsIDEsIDEsIElXZWJQYXJhbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SVdlYlBhcmFtX1BhcnROYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwYXJ0TmFtZSIsIG51bGwsIDEsIDEsIElXZWJQYXJhbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SVdlYlBhcmFtX1RhcmdldE5hbWVzcGFjZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidGFyZ2V0TmFtZXNwYWNlIiwgbnVsbCwgMSwgMSwgSVdlYlBhcmFtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkDQotCQlpbml0RUF0dHJpYnV0ZShnZXRJV2ViUGFyYW1fSGVhZGVyKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiaGVhZGVyIiwgImZhbHNlIiwgMSwgMSwgSVdlYlBhcmFtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0NCi0JCWluaXRFQ2xhc3MoaVdlYlNlcnZpY2VFQ2xhc3MsIElXZWJTZXJ2aWNlLmNsYXNzLCAiSVdlYlNlcnZpY2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFUmVmZXJlbmNlKGdldElXZWJTZXJ2aWNlX1NlcnZpY2VFbmRwb2ludCgpLCB0aGlzLmdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSwgdGhpcy5nZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX0ltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCksICJzZXJ2aWNlRW5kcG9pbnQiLCBudWxsLCAwLCAxLCBJV2ViU2VydmljZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SVdlYlNlcnZpY2VfVGFyZ2V0TmFtZXNwYWNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0YXJnZXROYW1lc3BhY2UiLCBudWxsLCAxLCAxLCBJV2ViU2VydmljZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SVdlYlNlcnZpY2VfUG9ydE5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInBvcnROYW1lIiwgbnVsbCwgMSwgMSwgSVdlYlNlcnZpY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFQXR0cmlidXRlKGdldElXZWJTZXJ2aWNlX1dzZGxMb2NhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAid3NkbExvY2F0aW9uIiwgbnVsbCwgMCwgMSwgSVdlYlNlcnZpY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCWluaXRFQ2xhc3MoaVdlYlNlcnZpY2VQcm9qZWN0RUNsYXNzLCBJV2ViU2VydmljZVByb2plY3QuY2xhc3MsICJJV2ViU2VydmljZVByb2plY3QiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFUmVmZXJlbmNlKGdldElXZWJTZXJ2aWNlUHJvamVjdF9XZWJTZXJ2aWNlcygpLCB0aGlzLmdldElXZWJTZXJ2aWNlKCksIG51bGwsICJ3ZWJTZXJ2aWNlcyIsIG51bGwsIDAsIC0xLCBJV2ViU2VydmljZVByb2plY3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFUmVmZXJlbmNlKGdldElXZWJTZXJ2aWNlUHJvamVjdF9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCksIHRoaXMuZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpLCBudWxsLCAic2VydmljZUVuZHBvaW50SW50ZXJmYWNlcyIsIG51bGwsIDAsIC0xLCBJV2ViU2VydmljZVByb2plY3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFQXR0cmlidXRlKGdldElXZWJTZXJ2aWNlUHJvamVjdF9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMSwgMSwgSVdlYlNlcnZpY2VQcm9qZWN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkDQotDQotCQlpbml0RUNsYXNzKGlXZWJUeXBlRUNsYXNzLCBJV2ViVHlwZS5jbGFzcywgIklXZWJUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkDQotDQotCQkvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscw0KLQkJaW5pdEVFbnVtKHdlYlBhcmFtS2luZEVFbnVtLCBXZWJQYXJhbUtpbmQuY2xhc3MsICJXZWJQYXJhbUtpbmQiKTsgLy8kTk9OLU5MUy0xJA0KLQkJYWRkRUVudW1MaXRlcmFsKHdlYlBhcmFtS2luZEVFbnVtLCBXZWJQYXJhbUtpbmQuSU4pOw0KLQkJYWRkRUVudW1MaXRlcmFsKHdlYlBhcmFtS2luZEVFbnVtLCBXZWJQYXJhbUtpbmQuSU5PVVQpOw0KLQkJYWRkRUVudW1MaXRlcmFsKHdlYlBhcmFtS2luZEVFbnVtLCBXZWJQYXJhbUtpbmQuT1VUKTsNCi0NCi0JCWluaXRFRW51bShzb2FwQmluZGluZ1N0eWxlRUVudW0sIFNPQVBCaW5kaW5nU3R5bGUuY2xhc3MsICJTT0FQQmluZGluZ1N0eWxlIik7IC8vJE5PTi1OTFMtMSQNCi0JCWFkZEVFbnVtTGl0ZXJhbChzb2FwQmluZGluZ1N0eWxlRUVudW0sIFNPQVBCaW5kaW5nU3R5bGUuRE9DVU1FTlQpOw0KLQkJYWRkRUVudW1MaXRlcmFsKHNvYXBCaW5kaW5nU3R5bGVFRW51bSwgU09BUEJpbmRpbmdTdHlsZS5SUEMpOw0KLQ0KLQkJaW5pdEVFbnVtKHNvYXBCaW5kaW5nVXNlRUVudW0sIFNPQVBCaW5kaW5nVXNlLmNsYXNzLCAiU09BUEJpbmRpbmdVc2UiKTsgLy8kTk9OLU5MUy0xJA0KLQkJYWRkRUVudW1MaXRlcmFsKHNvYXBCaW5kaW5nVXNlRUVudW0sIFNPQVBCaW5kaW5nVXNlLkxJVEVSQUwpOw0KLQkJYWRkRUVudW1MaXRlcmFsKHNvYXBCaW5kaW5nVXNlRUVudW0sIFNPQVBCaW5kaW5nVXNlLkVOQ09ERUQpOw0KLQ0KLQkJaW5pdEVFbnVtKHNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGVFRW51bSwgU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5jbGFzcywgIlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJYWRkRUVudW1MaXRlcmFsKHNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGVFRW51bSwgU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5XUkFQUEVEKTsNCi0JCWFkZEVFbnVtTGl0ZXJhbChzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlRUVudW0sIFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuQkFSRSk7DQotDQotCQkvLyBDcmVhdGUgcmVzb3VyY2UNCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOw0KLQl9DQotDQotfSAvL0RvbVBhY2thZ2VJbXBsDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lET01JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvSURPTUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGFlODY3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvSURPTUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsOw0KLQ0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotDQotLyoqDQotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SURPTTwvYj48L2VtPicuDQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogPHA+DQotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6DQotICogPHVsPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JRE9NSW1wbCNnZXRXZWJTZXJ2aWNlUHJvamVjdHMgPGVtPldlYiBTZXJ2aWNlIFByb2plY3RzPC9lbT59PC9saT4NCi0gKiA8L3VsPg0KLSAqIDwvcD4NCi0gKg0KLSAqIEBnZW5lcmF0ZWQNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSURPTUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIElET00gew0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V2ViU2VydmljZVByb2plY3RzKCkgPGVtPldlYiBTZXJ2aWNlIFByb2plY3RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFdlYlNlcnZpY2VQcm9qZWN0cygpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBFTGlzdDxJV2ViU2VydmljZVByb2plY3Q+IHdlYlNlcnZpY2VQcm9qZWN0czsNCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgSURPTUltcGwoKSB7DQotCQlzdXBlcigpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgew0KLQkJcmV0dXJuIERvbVBhY2thZ2UuTGl0ZXJhbHMuSURPTTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFTGlzdDxJV2ViU2VydmljZVByb2plY3Q+IGdldFdlYlNlcnZpY2VQcm9qZWN0cygpIHsNCi0JCWlmICh3ZWJTZXJ2aWNlUHJvamVjdHMgPT0gbnVsbCkNCi0JCXsNCi0JCQl3ZWJTZXJ2aWNlUHJvamVjdHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8SVdlYlNlcnZpY2VQcm9qZWN0PihJV2ViU2VydmljZVByb2plY3QuY2xhc3MsIHRoaXMsIERvbVBhY2thZ2UuSURPTV9fV0VCX1NFUlZJQ0VfUFJPSkVDVFMpOw0KLQkJfQ0KLQkJcmV0dXJuIHdlYlNlcnZpY2VQcm9qZWN0czsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSURPTV9fV0VCX1NFUlZJQ0VfUFJPSkVDVFM6DQotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0V2ViU2VydmljZVByb2plY3RzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsNCi0JCX0NCi0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSURPTV9fV0VCX1NFUlZJQ0VfUFJPSkVDVFM6DQotCQkJCXJldHVybiBnZXRXZWJTZXJ2aWNlUHJvamVjdHMoKTsNCi0JCX0NCi0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklET01fX1dFQl9TRVJWSUNFX1BST0pFQ1RTOg0KLQkJCQlnZXRXZWJTZXJ2aWNlUHJvamVjdHMoKS5jbGVhcigpOw0KLQkJCQlnZXRXZWJTZXJ2aWNlUHJvamVjdHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIElXZWJTZXJ2aWNlUHJvamVjdD4pbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQl9DQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSURPTV9fV0VCX1NFUlZJQ0VfUFJPSkVDVFM6DQotCQkJCWdldFdlYlNlcnZpY2VQcm9qZWN0cygpLmNsZWFyKCk7DQotCQkJCXJldHVybjsNCi0JCX0NCi0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSURPTV9fV0VCX1NFUlZJQ0VfUFJPSkVDVFM6DQotCQkJCXJldHVybiB3ZWJTZXJ2aWNlUHJvamVjdHMgIT0gbnVsbCAmJiAhd2ViU2VydmljZVByb2plY3RzLmlzRW1wdHkoKTsNCi0JCX0NCi0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsNCi0JfQ0KLQ0KLX0gLy9JRE9NSW1wbA0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JSmF2YVdlYlNlcnZpY2VFbGVtZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lKYXZhV2ViU2VydmljZUVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ4MGMxMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lKYXZhV2ViU2VydmljZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbDsNCi0NCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50Ow0KLQ0KLS8qKg0KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPklKYXZhIFdlYiBTZXJ2aWNlIEVsZW1lbnQ8L2I+PC9lbT4nLg0KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLSAqIDxwPg0KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOg0KLSAqIDx1bD4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSUphdmFXZWJTZXJ2aWNlRWxlbWVudEltcGwjZ2V0SW1wbGVtZW50YXRpb24gPGVtPkltcGxlbWVudGF0aW9uPC9lbT59PC9saT4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSUphdmFXZWJTZXJ2aWNlRWxlbWVudEltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+DQotICogPC91bD4NCi0gKiA8L3A+DQotICoNCi0gKiBAZ2VuZXJhdGVkDQotICovDQotcHVibGljIGNsYXNzIElKYXZhV2ViU2VydmljZUVsZW1lbnRJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50IHsNCi0JLyoqDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbXBsZW1lbnRhdGlvbigpIDxlbT5JbXBsZW1lbnRhdGlvbjwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0SW1wbGVtZW50YXRpb24oKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBMRU1FTlRBVElPTl9FREVGQVVMVCA9IG51bGw7DQotDQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbXBsZW1lbnRhdGlvbigpIDxlbT5JbXBsZW1lbnRhdGlvbjwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0SW1wbGVtZW50YXRpb24oKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgU3RyaW5nIGltcGxlbWVudGF0aW9uID0gSU1QTEVNRU5UQVRJT05fRURFRkFVTFQ7DQotDQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXROYW1lKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7DQotDQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldE5hbWUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOw0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByb3RlY3RlZCBJSmF2YVdlYlNlcnZpY2VFbGVtZW50SW1wbCgpIHsNCi0JCXN1cGVyKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7DQotCQlyZXR1cm4gRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRJbXBsZW1lbnRhdGlvbigpIHsNCi0JCXJldHVybiBpbXBsZW1lbnRhdGlvbjsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldEltcGxlbWVudGF0aW9uKFN0cmluZyBuZXdJbXBsZW1lbnRhdGlvbikgew0KLQkJU3RyaW5nIG9sZEltcGxlbWVudGF0aW9uID0gaW1wbGVtZW50YXRpb247DQotCQlpbXBsZW1lbnRhdGlvbiA9IG5ld0ltcGxlbWVudGF0aW9uOw0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT04sIG9sZEltcGxlbWVudGF0aW9uLCBpbXBsZW1lbnRhdGlvbikpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgew0KLQkJcmV0dXJuIG5hbWU7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7DQotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7DQotCQluYW1lID0gbmV3TmFtZTsNCi0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEb21QYWNrYWdlLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT046DQotCQkJCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FOg0KLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOw0KLQkJfQ0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTjoNCi0JCQkJc2V0SW1wbGVtZW50YXRpb24oKFN0cmluZyluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRToNCi0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsNCi0JCQkJcmV0dXJuOw0KLQkJfQ0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OOg0KLQkJCQlzZXRJbXBsZW1lbnRhdGlvbihJTVBMRU1FTlRBVElPTl9FREVGQVVMVCk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRToNCi0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsNCi0JCQkJcmV0dXJuOw0KLQkJfQ0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTjoNCi0JCQkJcmV0dXJuIElNUExFTUVOVEFUSU9OX0VERUZBVUxUID09IG51bGwgPyBpbXBsZW1lbnRhdGlvbiAhPSBudWxsIDogIUlNUExFTUVOVEFUSU9OX0VERUZBVUxULmVxdWFscyhpbXBsZW1lbnRhdGlvbik7DQotCQkJY2FzZSBEb21QYWNrYWdlLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUU6DQotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsNCi0NCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOw0KLQkJcmVzdWx0LmFwcGVuZCgiIChpbXBsZW1lbnRhdGlvbjogIik7IC8vJE5PTi1OTFMtMSQNCi0JCXJlc3VsdC5hcHBlbmQoaW1wbGVtZW50YXRpb24pOw0KLQkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsNCi0JCXJlc3VsdC5hcHBlbmQoJyknKTsNCi0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsNCi0JfQ0KLQ0KLX0gLy9JSmF2YVdlYlNlcnZpY2VFbGVtZW50SW1wbA0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhkMGU1MWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlOw0KLQ0KLQ0KLS8qKg0KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPklTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvYj48L2VtPicuDQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogPHA+DQotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6DQotICogPHVsPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSW1wbCNpc0ltcGxpY2l0IDxlbT5JbXBsaWNpdDwvZW0+fTwvbGk+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJbXBsI2dldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzIDxlbT5JbXBsZW1lbnRpbmcgV2ViIFNlcnZpY2VzPC9lbT59PC9saT4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUltcGwjZ2V0V2ViTWV0aG9kcyA8ZW0+V2ViIE1ldGhvZHM8L2VtPn08L2xpPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSW1wbCNnZXRUYXJnZXROYW1lc3BhY2UgPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPn08L2xpPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSW1wbCNnZXRTb2FwQmluZGluZ1N0eWxlIDxlbT5Tb2FwIEJpbmRpbmcgU3R5bGU8L2VtPn08L2xpPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSW1wbCNnZXRTb2FwQmluZGluZ1VzZSA8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+fTwvbGk+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJbXBsI2dldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgPGVtPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPn08L2xpPg0KLSAqIDwvdWw+DQotICogPC9wPg0KLSAqDQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSW1wbCBleHRlbmRzIElKYXZhV2ViU2VydmljZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSB7DQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJbXBsaWNpdCgpIDxlbT5JbXBsaWNpdDwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjaXNJbXBsaWNpdCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJTVBMSUNJVF9FREVGQVVMVCA9IGZhbHNlOw0KLQ0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJbXBsaWNpdCgpIDxlbT5JbXBsaWNpdDwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjaXNJbXBsaWNpdCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBib29sZWFuIGltcGxpY2l0ID0gSU1QTElDSVRfRURFRkFVTFQ7DQotDQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpIDxlbT5JbXBsZW1lbnRpbmcgV2ViIFNlcnZpY2VzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIEVMaXN0PElXZWJTZXJ2aWNlPiBpbXBsZW1lbnRpbmdXZWJTZXJ2aWNlczsNCi0NCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdlYk1ldGhvZHMoKSA8ZW0+V2ViIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0V2ViTWV0aG9kcygpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBFTGlzdDxJV2ViTWV0aG9kPiB3ZWJNZXRob2RzOw0KLQ0KLQkvKioNCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhcmdldE5hbWVzcGFjZSgpIDxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRUYXJnZXROYW1lc3BhY2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfTkFNRVNQQUNFX0VERUZBVUxUID0gbnVsbDsNCi0NCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhcmdldE5hbWVzcGFjZSgpIDxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRUYXJnZXROYW1lc3BhY2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IFRBUkdFVF9OQU1FU1BBQ0VfRURFRkFVTFQ7DQotDQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U29hcEJpbmRpbmdTdHlsZSgpIDxlbT5Tb2FwIEJpbmRpbmcgU3R5bGU8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFNvYXBCaW5kaW5nU3R5bGUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFNPQVBCaW5kaW5nU3R5bGUgU09BUF9CSU5ESU5HX1NUWUxFX0VERUZBVUxUID0gU09BUEJpbmRpbmdTdHlsZS5ET0NVTUVOVDsNCi0NCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvYXBCaW5kaW5nU3R5bGUoKSA8ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1N0eWxlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIFNPQVBCaW5kaW5nU3R5bGUgc29hcEJpbmRpbmdTdHlsZSA9IFNPQVBfQklORElOR19TVFlMRV9FREVGQVVMVDsNCi0NCi0JLyoqDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb2FwQmluZGluZ1VzZSgpIDxlbT5Tb2FwIEJpbmRpbmcgVXNlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1VzZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU09BUEJpbmRpbmdVc2UgU09BUF9CSU5ESU5HX1VTRV9FREVGQVVMVCA9IFNPQVBCaW5kaW5nVXNlLkxJVEVSQUw7DQotDQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb2FwQmluZGluZ1VzZSgpIDxlbT5Tb2FwIEJpbmRpbmcgVXNlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1VzZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBTT0FQQmluZGluZ1VzZSBzb2FwQmluZGluZ1VzZSA9IFNPQVBfQklORElOR19VU0VfRURFRkFVTFQ7DQotDQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpIDxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIFNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEVfRURFRkFVTFQgPSBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLldSQVBQRUQ7DQotDQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkgPGVtPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSBzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlID0gU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRV9FREVGQVVMVDsNCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUltcGwoKSB7DQotCQlzdXBlcigpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgew0KLQkJcmV0dXJuIERvbVBhY2thZ2UuTGl0ZXJhbHMuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNJbXBsaWNpdCgpIHsNCi0JCXJldHVybiBpbXBsaWNpdDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldEltcGxpY2l0KGJvb2xlYW4gbmV3SW1wbGljaXQpIHsNCi0JCWJvb2xlYW4gb2xkSW1wbGljaXQgPSBpbXBsaWNpdDsNCi0JCWltcGxpY2l0ID0gbmV3SW1wbGljaXQ7DQotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExJQ0lULCBvbGRJbXBsaWNpdCwgaW1wbGljaXQpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFTGlzdDxJV2ViU2VydmljZT4gZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKSB7DQotCQlpZiAoaW1wbGVtZW50aW5nV2ViU2VydmljZXMgPT0gbnVsbCkNCi0JCXsNCi0JCQlpbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcyA9IG5ldyBFT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdDxJV2ViU2VydmljZT4oSVdlYlNlcnZpY2UuY2xhc3MsIHRoaXMsIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRJTkdfV0VCX1NFUlZJQ0VTLCBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fU0VSVklDRV9FTkRQT0lOVCk7DQotCQl9DQotCQlyZXR1cm4gaW1wbGVtZW50aW5nV2ViU2VydmljZXM7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUxpc3Q8SVdlYk1ldGhvZD4gZ2V0V2ViTWV0aG9kcygpIHsNCi0JCWlmICh3ZWJNZXRob2RzID09IG51bGwpDQotCQl7DQotCQkJd2ViTWV0aG9kcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxJV2ViTWV0aG9kPihJV2ViTWV0aG9kLmNsYXNzLCB0aGlzLCBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fV0VCX01FVEhPRFMpOw0KLQkJfQ0KLQkJcmV0dXJuIHdlYk1ldGhvZHM7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsNCi0JCXJldHVybiB0YXJnZXROYW1lc3BhY2U7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIG5ld1RhcmdldE5hbWVzcGFjZSkgew0KLQkJU3RyaW5nIG9sZFRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsNCi0JCXRhcmdldE5hbWVzcGFjZSA9IG5ld1RhcmdldE5hbWVzcGFjZTsNCi0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fVEFSR0VUX05BTUVTUEFDRSwgb2xkVGFyZ2V0TmFtZXNwYWNlLCB0YXJnZXROYW1lc3BhY2UpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTT0FQQmluZGluZ1N0eWxlIGdldFNvYXBCaW5kaW5nU3R5bGUoKSB7DQotCQlyZXR1cm4gc29hcEJpbmRpbmdTdHlsZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFNvYXBCaW5kaW5nU3R5bGUoU09BUEJpbmRpbmdTdHlsZSBuZXdTb2FwQmluZGluZ1N0eWxlKSB7DQotCQlTT0FQQmluZGluZ1N0eWxlIG9sZFNvYXBCaW5kaW5nU3R5bGUgPSBzb2FwQmluZGluZ1N0eWxlOw0KLQkJc29hcEJpbmRpbmdTdHlsZSA9IG5ld1NvYXBCaW5kaW5nU3R5bGUgPT0gbnVsbCA/IFNPQVBfQklORElOR19TVFlMRV9FREVGQVVMVCA6IG5ld1NvYXBCaW5kaW5nU3R5bGU7DQotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19TVFlMRSwgb2xkU29hcEJpbmRpbmdTdHlsZSwgc29hcEJpbmRpbmdTdHlsZSkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFNPQVBCaW5kaW5nVXNlIGdldFNvYXBCaW5kaW5nVXNlKCkgew0KLQkJcmV0dXJuIHNvYXBCaW5kaW5nVXNlOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0U29hcEJpbmRpbmdVc2UoU09BUEJpbmRpbmdVc2UgbmV3U29hcEJpbmRpbmdVc2UpIHsNCi0JCVNPQVBCaW5kaW5nVXNlIG9sZFNvYXBCaW5kaW5nVXNlID0gc29hcEJpbmRpbmdVc2U7DQotCQlzb2FwQmluZGluZ1VzZSA9IG5ld1NvYXBCaW5kaW5nVXNlID09IG51bGwgPyBTT0FQX0JJTkRJTkdfVVNFX0VERUZBVUxUIDogbmV3U29hcEJpbmRpbmdVc2U7DQotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19VU0UsIG9sZFNvYXBCaW5kaW5nVXNlLCBzb2FwQmluZGluZ1VzZSkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpIHsNCi0JCXJldHVybiBzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZShTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIG5ld1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUpIHsNCi0JCVNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgb2xkU29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSA9IHNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGU7DQotCQlzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlID0gbmV3U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSA9PSBudWxsID8gU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRV9FREVGQVVMVCA6IG5ld1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGU7DQotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEUsIG9sZFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUsIHNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5USU5HX1dFQl9TRVJWSUNFUzoNCi0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDxJbnRlcm5hbEVPYmplY3Q+KShJbnRlcm5hbEVMaXN0PD8+KWdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsNCi0JCX0NCi0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRJTkdfV0VCX1NFUlZJQ0VTOg0KLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19XRUJfTUVUSE9EUzoNCi0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRXZWJNZXRob2RzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsNCi0JCX0NCi0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVDoNCi0JCQkJcmV0dXJuIGlzSW1wbGljaXQoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRJTkdfV0VCX1NFUlZJQ0VTOg0KLQkJCQlyZXR1cm4gZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19XRUJfTUVUSE9EUzoNCi0JCQkJcmV0dXJuIGdldFdlYk1ldGhvZHMoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19UQVJHRVRfTkFNRVNQQUNFOg0KLQkJCQlyZXR1cm4gZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1NUWUxFOg0KLQkJCQlyZXR1cm4gZ2V0U29hcEJpbmRpbmdTdHlsZSgpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19VU0U6DQotCQkJCXJldHVybiBnZXRTb2FwQmluZGluZ1VzZSgpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEU6DQotCQkJCXJldHVybiBnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCk7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExJQ0lUOg0KLQkJCQlzZXRJbXBsaWNpdCgoQm9vbGVhbiluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRJTkdfV0VCX1NFUlZJQ0VTOg0KLQkJCQlnZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpLmNsZWFyKCk7DQotCQkJCWdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJV2ViU2VydmljZT4pbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fV0VCX01FVEhPRFM6DQotCQkJCWdldFdlYk1ldGhvZHMoKS5jbGVhcigpOw0KLQkJCQlnZXRXZWJNZXRob2RzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJV2ViTWV0aG9kPiluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19UQVJHRVRfTkFNRVNQQUNFOg0KLQkJCQlzZXRUYXJnZXROYW1lc3BhY2UoKFN0cmluZyluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfU1RZTEU6DQotCQkJCXNldFNvYXBCaW5kaW5nU3R5bGUoKFNPQVBCaW5kaW5nU3R5bGUpbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1VTRToNCi0JCQkJc2V0U29hcEJpbmRpbmdVc2UoKFNPQVBCaW5kaW5nVXNlKW5ld1ZhbHVlKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEU6DQotCQkJCXNldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUpbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQl9DQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVDoNCi0JCQkJc2V0SW1wbGljaXQoSU1QTElDSVRfRURFRkFVTFQpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5USU5HX1dFQl9TRVJWSUNFUzoNCi0JCQkJZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKS5jbGVhcigpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fV0VCX01FVEhPRFM6DQotCQkJCWdldFdlYk1ldGhvZHMoKS5jbGVhcigpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fVEFSR0VUX05BTUVTUEFDRToNCi0JCQkJc2V0VGFyZ2V0TmFtZXNwYWNlKFRBUkdFVF9OQU1FU1BBQ0VfRURFRkFVTFQpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1NUWUxFOg0KLQkJCQlzZXRTb2FwQmluZGluZ1N0eWxlKFNPQVBfQklORElOR19TVFlMRV9FREVGQVVMVCk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfVVNFOg0KLQkJCQlzZXRTb2FwQmluZGluZ1VzZShTT0FQX0JJTkRJTkdfVVNFX0VERUZBVUxUKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEU6DQotCQkJCXNldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRV9FREVGQVVMVCk7DQotCQkJCXJldHVybjsNCi0JCX0NCi0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVDoNCi0JCQkJcmV0dXJuIGltcGxpY2l0ICE9IElNUExJQ0lUX0VERUZBVUxUOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExFTUVOVElOR19XRUJfU0VSVklDRVM6DQotCQkJCXJldHVybiBpbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcyAhPSBudWxsICYmICFpbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcy5pc0VtcHR5KCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fV0VCX01FVEhPRFM6DQotCQkJCXJldHVybiB3ZWJNZXRob2RzICE9IG51bGwgJiYgIXdlYk1ldGhvZHMuaXNFbXB0eSgpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1RBUkdFVF9OQU1FU1BBQ0U6DQotCQkJCXJldHVybiBUQVJHRVRfTkFNRVNQQUNFX0VERUZBVUxUID09IG51bGwgPyB0YXJnZXROYW1lc3BhY2UgIT0gbnVsbCA6ICFUQVJHRVRfTkFNRVNQQUNFX0VERUZBVUxULmVxdWFscyh0YXJnZXROYW1lc3BhY2UpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19TVFlMRToNCi0JCQkJcmV0dXJuIHNvYXBCaW5kaW5nU3R5bGUgIT0gU09BUF9CSU5ESU5HX1NUWUxFX0VERUZBVUxUOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19VU0U6DQotCQkJCXJldHVybiBzb2FwQmluZGluZ1VzZSAhPSBTT0FQX0JJTkRJTkdfVVNFX0VERUZBVUxUOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEU6DQotCQkJCXJldHVybiBzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlICE9IFNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEVfRURFRkFVTFQ7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsNCi0NCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOw0KLQkJcmVzdWx0LmFwcGVuZCgiIChpbXBsaWNpdDogIik7IC8vJE5PTi1OTFMtMSQNCi0JCXJlc3VsdC5hcHBlbmQoaW1wbGljaXQpOw0KLQkJcmVzdWx0LmFwcGVuZCgiLCB0YXJnZXROYW1lc3BhY2U6ICIpOyAvLyROT04tTkxTLTEkDQotCQlyZXN1bHQuYXBwZW5kKHRhcmdldE5hbWVzcGFjZSk7DQotCQlyZXN1bHQuYXBwZW5kKCIsIHNvYXBCaW5kaW5nU3R5bGU6ICIpOyAvLyROT04tTkxTLTEkDQotCQlyZXN1bHQuYXBwZW5kKHNvYXBCaW5kaW5nU3R5bGUpOw0KLQkJcmVzdWx0LmFwcGVuZCgiLCBzb2FwQmluZGluZ1VzZTogIik7IC8vJE5PTi1OTFMtMSQNCi0JCXJlc3VsdC5hcHBlbmQoc29hcEJpbmRpbmdVc2UpOw0KLQkJcmVzdWx0LmFwcGVuZCgiLCBzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlOiAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmVzdWx0LmFwcGVuZChzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKTsNCi0JCXJlc3VsdC5hcHBlbmQoJyknKTsNCi0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlIA0KLQlwdWJsaWMgRU9iamVjdCBlQ29udGFpbmVyKCkNCi0Jew0KLQkJaWYgKHN1cGVyLmVDb250YWluZXIoKSE9bnVsbCkgew0KLQkJCXJldHVybiBzdXBlci5lQ29udGFpbmVyKCk7DQotCQl9DQotCQkNCi0JCWZvciAoSVdlYlNlcnZpY2Ugd3MgOiBnZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpKSB7DQotCQkJaWYgKHdzLmVDb250YWluZXIoKSE9bnVsbCkgew0KLQkJCQlyZXR1cm4gd3MuZUNvbnRhaW5lcigpOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi19IC8vSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUltcGwNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvSVdlYk1ldGhvZEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JV2ViTWV0aG9kSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YmJhNDlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JV2ViTWV0aG9kSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGw7DQotDQotDQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZTsNCi0NCi0vKioNCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JV2ViIE1ldGhvZDwvYj48L2VtPicuDQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogPHA+DQotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6DQotICogPHVsPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViTWV0aG9kSW1wbCNnZXRQYXJhbWV0ZXJzIDxlbT5QYXJhbWV0ZXJzPC9lbT59PC9saT4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYk1ldGhvZEltcGwjaXNFeGNsdWRlZCA8ZW0+RXhjbHVkZWQ8L2VtPn08L2xpPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViTWV0aG9kSW1wbCNnZXRTb2FwQmluZGluZ1N0eWxlIDxlbT5Tb2FwIEJpbmRpbmcgU3R5bGU8L2VtPn08L2xpPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViTWV0aG9kSW1wbCNnZXRTb2FwQmluZGluZ1VzZSA8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+fTwvbGk+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJNZXRob2RJbXBsI2dldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgPGVtPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPn08L2xpPg0KLSAqIDwvdWw+DQotICogPC9wPg0KLSAqDQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBJV2ViTWV0aG9kSW1wbCBleHRlbmRzIElKYXZhV2ViU2VydmljZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgSVdlYk1ldGhvZCB7DQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJhbWV0ZXJzKCkgPGVtPlBhcmFtZXRlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0UGFyYW1ldGVycygpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBFTGlzdDxJV2ViUGFyYW0+IHBhcmFtZXRlcnM7DQotDQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFeGNsdWRlZCgpIDxlbT5FeGNsdWRlZDwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjaXNFeGNsdWRlZCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBFWENMVURFRF9FREVGQVVMVCA9IGZhbHNlOw0KLQ0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFeGNsdWRlZCgpIDxlbT5FeGNsdWRlZDwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjaXNFeGNsdWRlZCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBib29sZWFuIGV4Y2x1ZGVkID0gRVhDTFVERURfRURFRkFVTFQ7DQotDQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U29hcEJpbmRpbmdTdHlsZSgpIDxlbT5Tb2FwIEJpbmRpbmcgU3R5bGU8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFNvYXBCaW5kaW5nU3R5bGUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFNPQVBCaW5kaW5nU3R5bGUgU09BUF9CSU5ESU5HX1NUWUxFX0VERUZBVUxUID0gU09BUEJpbmRpbmdTdHlsZS5ET0NVTUVOVDsNCi0NCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvYXBCaW5kaW5nU3R5bGUoKSA8ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1N0eWxlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIFNPQVBCaW5kaW5nU3R5bGUgc29hcEJpbmRpbmdTdHlsZSA9IFNPQVBfQklORElOR19TVFlMRV9FREVGQVVMVDsNCi0NCi0JLyoqDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb2FwQmluZGluZ1VzZSgpIDxlbT5Tb2FwIEJpbmRpbmcgVXNlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1VzZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU09BUEJpbmRpbmdVc2UgU09BUF9CSU5ESU5HX1VTRV9FREVGQVVMVCA9IFNPQVBCaW5kaW5nVXNlLkxJVEVSQUw7DQotDQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb2FwQmluZGluZ1VzZSgpIDxlbT5Tb2FwIEJpbmRpbmcgVXNlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1VzZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBTT0FQQmluZGluZ1VzZSBzb2FwQmluZGluZ1VzZSA9IFNPQVBfQklORElOR19VU0VfRURFRkFVTFQ7DQotDQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpIDxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIFNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEVfRURFRkFVTFQgPSBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLldSQVBQRUQ7DQotDQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkgPGVtPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSBzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlID0gU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRV9FREVGQVVMVDsNCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgSVdlYk1ldGhvZEltcGwoKSB7DQotCQlzdXBlcigpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgew0KLQkJcmV0dXJuIERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9NRVRIT0Q7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUxpc3Q8SVdlYlBhcmFtPiBnZXRQYXJhbWV0ZXJzKCkgew0KLQkJaWYgKHBhcmFtZXRlcnMgPT0gbnVsbCkNCi0JCXsNCi0JCQlwYXJhbWV0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PElXZWJQYXJhbT4oSVdlYlBhcmFtLmNsYXNzLCB0aGlzLCBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19QQVJBTUVURVJTKTsNCi0JCX0NCi0JCXJldHVybiBwYXJhbWV0ZXJzOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNFeGNsdWRlZCgpIHsNCi0JCXJldHVybiBleGNsdWRlZDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVkKGJvb2xlYW4gbmV3RXhjbHVkZWQpIHsNCi0JCWJvb2xlYW4gb2xkRXhjbHVkZWQgPSBleGNsdWRlZDsNCi0JCWV4Y2x1ZGVkID0gbmV3RXhjbHVkZWQ7DQotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fRVhDTFVERUQsIG9sZEV4Y2x1ZGVkLCBleGNsdWRlZCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFNPQVBCaW5kaW5nU3R5bGUgZ2V0U29hcEJpbmRpbmdTdHlsZSgpIHsNCi0JCXJldHVybiBzb2FwQmluZGluZ1N0eWxlOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0U29hcEJpbmRpbmdTdHlsZShTT0FQQmluZGluZ1N0eWxlIG5ld1NvYXBCaW5kaW5nU3R5bGUpIHsNCi0JCVNPQVBCaW5kaW5nU3R5bGUgb2xkU29hcEJpbmRpbmdTdHlsZSA9IHNvYXBCaW5kaW5nU3R5bGU7DQotCQlzb2FwQmluZGluZ1N0eWxlID0gbmV3U29hcEJpbmRpbmdTdHlsZSA9PSBudWxsID8gU09BUF9CSU5ESU5HX1NUWUxFX0VERUZBVUxUIDogbmV3U29hcEJpbmRpbmdTdHlsZTsNCi0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfU1RZTEUsIG9sZFNvYXBCaW5kaW5nU3R5bGUsIHNvYXBCaW5kaW5nU3R5bGUpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTT0FQQmluZGluZ1VzZSBnZXRTb2FwQmluZGluZ1VzZSgpIHsNCi0JCXJldHVybiBzb2FwQmluZGluZ1VzZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFNvYXBCaW5kaW5nVXNlKFNPQVBCaW5kaW5nVXNlIG5ld1NvYXBCaW5kaW5nVXNlKSB7DQotCQlTT0FQQmluZGluZ1VzZSBvbGRTb2FwQmluZGluZ1VzZSA9IHNvYXBCaW5kaW5nVXNlOw0KLQkJc29hcEJpbmRpbmdVc2UgPSBuZXdTb2FwQmluZGluZ1VzZSA9PSBudWxsID8gU09BUF9CSU5ESU5HX1VTRV9FREVGQVVMVCA6IG5ld1NvYXBCaW5kaW5nVXNlOw0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19VU0UsIG9sZFNvYXBCaW5kaW5nVXNlLCBzb2FwQmluZGluZ1VzZSkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpIHsNCi0JCXJldHVybiBzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZShTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIG5ld1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUpIHsNCi0JCVNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgb2xkU29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSA9IHNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGU7DQotCQlzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlID0gbmV3U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSA9PSBudWxsID8gU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRV9FREVGQVVMVCA6IG5ld1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGU7DQotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRSwgb2xkU29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSwgc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fUEFSQU1FVEVSUzoNCi0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQYXJhbWV0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsNCi0JCX0NCi0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1BBUkFNRVRFUlM6DQotCQkJCXJldHVybiBnZXRQYXJhbWV0ZXJzKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19FWENMVURFRDoNCi0JCQkJcmV0dXJuIGlzRXhjbHVkZWQoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19TVFlMRToNCi0JCQkJcmV0dXJuIGdldFNvYXBCaW5kaW5nU3R5bGUoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19VU0U6DQotCQkJCXJldHVybiBnZXRTb2FwQmluZGluZ1VzZSgpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRToNCi0JCQkJcmV0dXJuIGdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKTsNCi0JCX0NCi0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19QQVJBTUVURVJTOg0KLQkJCQlnZXRQYXJhbWV0ZXJzKCkuY2xlYXIoKTsNCi0JCQkJZ2V0UGFyYW1ldGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSVdlYlBhcmFtPiluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX0VYQ0xVREVEOg0KLQkJCQlzZXRFeGNsdWRlZCgoQm9vbGVhbiluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19TVFlMRToNCi0JCQkJc2V0U29hcEJpbmRpbmdTdHlsZSgoU09BUEJpbmRpbmdTdHlsZSluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19VU0U6DQotCQkJCXNldFNvYXBCaW5kaW5nVXNlKChTT0FQQmluZGluZ1VzZSluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEU6DQotCQkJCXNldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUpbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQl9DQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1BBUkFNRVRFUlM6DQotCQkJCWdldFBhcmFtZXRlcnMoKS5jbGVhcigpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19FWENMVURFRDoNCi0JCQkJc2V0RXhjbHVkZWQoRVhDTFVERURfRURFRkFVTFQpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfU1RZTEU6DQotCQkJCXNldFNvYXBCaW5kaW5nU3R5bGUoU09BUF9CSU5ESU5HX1NUWUxFX0VERUZBVUxUKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1VTRToNCi0JCQkJc2V0U29hcEJpbmRpbmdVc2UoU09BUF9CSU5ESU5HX1VTRV9FREVGQVVMVCk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEU6DQotCQkJCXNldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRV9FREVGQVVMVCk7DQotCQkJCXJldHVybjsNCi0JCX0NCi0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1BBUkFNRVRFUlM6DQotCQkJCXJldHVybiBwYXJhbWV0ZXJzICE9IG51bGwgJiYgIXBhcmFtZXRlcnMuaXNFbXB0eSgpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fRVhDTFVERUQ6DQotCQkJCXJldHVybiBleGNsdWRlZCAhPSBFWENMVURFRF9FREVGQVVMVDsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19TVFlMRToNCi0JCQkJcmV0dXJuIHNvYXBCaW5kaW5nU3R5bGUgIT0gU09BUF9CSU5ESU5HX1NUWUxFX0VERUZBVUxUOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1VTRToNCi0JCQkJcmV0dXJuIHNvYXBCaW5kaW5nVXNlICE9IFNPQVBfQklORElOR19VU0VfRURFRkFVTFQ7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFOg0KLQkJCQlyZXR1cm4gc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSAhPSBTT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFX0VERUZBVUxUOw0KLQkJfQ0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7DQotDQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsNCi0JCXJlc3VsdC5hcHBlbmQoIiAoZXhjbHVkZWQ6ICIpOyAvLyROT04tTkxTLTEkDQotCQlyZXN1bHQuYXBwZW5kKGV4Y2x1ZGVkKTsNCi0JCXJlc3VsdC5hcHBlbmQoIiwgc29hcEJpbmRpbmdTdHlsZTogIik7IC8vJE5PTi1OTFMtMSQNCi0JCXJlc3VsdC5hcHBlbmQoc29hcEJpbmRpbmdTdHlsZSk7DQotCQlyZXN1bHQuYXBwZW5kKCIsIHNvYXBCaW5kaW5nVXNlOiAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmVzdWx0LmFwcGVuZChzb2FwQmluZGluZ1VzZSk7DQotCQlyZXN1bHQuYXBwZW5kKCIsIHNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGU6ICIpOyAvLyROT04tTkxTLTEkDQotCQlyZXN1bHQuYXBwZW5kKHNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUpOw0KLQkJcmVzdWx0LmFwcGVuZCgnKScpOw0KLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOw0KLQl9DQotDQotfSAvL0lXZWJNZXRob2RJbXBsDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lXZWJQYXJhbUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JV2ViUGFyYW1JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYxNTA0ZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lXZWJQYXJhbUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsOw0KLQ0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldlYlBhcmFtS2luZDsNCi0NCi0vKioNCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JV2ViIFBhcmFtPC9iPjwvZW0+Jy4NCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0gKiA8cD4NCi0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoNCi0gKiA8dWw+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJQYXJhbUltcGwjZ2V0S2luZCA8ZW0+S2luZDwvZW0+fTwvbGk+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJQYXJhbUltcGwjZ2V0VHlwZU5hbWUgPGVtPlR5cGUgTmFtZTwvZW0+fTwvbGk+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJQYXJhbUltcGwjZ2V0UGFydE5hbWUgPGVtPlBhcnQgTmFtZTwvZW0+fTwvbGk+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJQYXJhbUltcGwjZ2V0VGFyZ2V0TmFtZXNwYWNlIDxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT59PC9saT4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYlBhcmFtSW1wbCNpc0hlYWRlciA8ZW0+SGVhZGVyPC9lbT59PC9saT4NCi0gKiA8L3VsPg0KLSAqIDwvcD4NCi0gKg0KLSAqIEBnZW5lcmF0ZWQNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSVdlYlBhcmFtSW1wbCBleHRlbmRzIElKYXZhV2ViU2VydmljZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgSVdlYlBhcmFtIHsNCi0JLyoqDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRLaW5kKCkgPGVtPktpbmQ8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldEtpbmQoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFdlYlBhcmFtS2luZCBLSU5EX0VERUZBVUxUID0gV2ViUGFyYW1LaW5kLklOOw0KLQ0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0S2luZCgpIDxlbT5LaW5kPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRLaW5kKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIFdlYlBhcmFtS2luZCBraW5kID0gS0lORF9FREVGQVVMVDsNCi0NCi0JLyoqDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlTmFtZSgpIDxlbT5UeXBlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFR5cGVOYW1lKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9OQU1FX0VERUZBVUxUID0gbnVsbDsNCi0NCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGVOYW1lKCkgPGVtPlR5cGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0VHlwZU5hbWUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgU3RyaW5nIHR5cGVOYW1lID0gVFlQRV9OQU1FX0VERUZBVUxUOw0KLQ0KLQkvKioNCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcnROYW1lKCkgPGVtPlBhcnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0UGFydE5hbWUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJUX05BTUVfRURFRkFVTFQgPSBudWxsOw0KLQ0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFydE5hbWUoKSA8ZW0+UGFydCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRQYXJ0TmFtZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBTdHJpbmcgcGFydE5hbWUgPSBQQVJUX05BTUVfRURFRkFVTFQ7DQotDQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFRhcmdldE5hbWVzcGFjZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9OQU1FU1BBQ0VfRURFRkFVTFQgPSBudWxsOw0KLQ0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFRhcmdldE5hbWVzcGFjZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVDsNCi0NCi0JLyoqDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0hlYWRlcigpIDxlbT5IZWFkZXI8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2lzSGVhZGVyKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEhFQURFUl9FREVGQVVMVCA9IGZhbHNlOw0KLQ0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNIZWFkZXIoKSA8ZW0+SGVhZGVyPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNpc0hlYWRlcigpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBib29sZWFuIGhlYWRlciA9IEhFQURFUl9FREVGQVVMVDsNCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgSVdlYlBhcmFtSW1wbCgpIHsNCi0JCXN1cGVyKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7DQotCQlyZXR1cm4gRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFdlYlBhcmFtS2luZCBnZXRLaW5kKCkgew0KLQkJcmV0dXJuIGtpbmQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRLaW5kKFdlYlBhcmFtS2luZCBuZXdLaW5kKSB7DQotCQlXZWJQYXJhbUtpbmQgb2xkS2luZCA9IGtpbmQ7DQotCQlraW5kID0gbmV3S2luZCA9PSBudWxsID8gS0lORF9FREVGQVVMVCA6IG5ld0tpbmQ7DQotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19LSU5ELCBvbGRLaW5kLCBraW5kKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgew0KLQkJcmV0dXJuIHR5cGVOYW1lOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0VHlwZU5hbWUoU3RyaW5nIG5ld1R5cGVOYW1lKSB7DQotCQlTdHJpbmcgb2xkVHlwZU5hbWUgPSB0eXBlTmFtZTsNCi0JCXR5cGVOYW1lID0gbmV3VHlwZU5hbWU7DQotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19UWVBFX05BTUUsIG9sZFR5cGVOYW1lLCB0eXBlTmFtZSkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRQYXJ0TmFtZSgpIHsNCi0JCXJldHVybiBwYXJ0TmFtZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFBhcnROYW1lKFN0cmluZyBuZXdQYXJ0TmFtZSkgew0KLQkJU3RyaW5nIG9sZFBhcnROYW1lID0gcGFydE5hbWU7DQotCQlwYXJ0TmFtZSA9IG5ld1BhcnROYW1lOw0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fUEFSVF9OQU1FLCBvbGRQYXJ0TmFtZSwgcGFydE5hbWUpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgew0KLQkJcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFRhcmdldE5hbWVzcGFjZShTdHJpbmcgbmV3VGFyZ2V0TmFtZXNwYWNlKSB7DQotCQlTdHJpbmcgb2xkVGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOw0KLQkJdGFyZ2V0TmFtZXNwYWNlID0gbmV3VGFyZ2V0TmFtZXNwYWNlOw0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRSwgb2xkVGFyZ2V0TmFtZXNwYWNlLCB0YXJnZXROYW1lc3BhY2UpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzSGVhZGVyKCkgew0KLQkJcmV0dXJuIGhlYWRlcjsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldEhlYWRlcihib29sZWFuIG5ld0hlYWRlcikgew0KLQkJYm9vbGVhbiBvbGRIZWFkZXIgPSBoZWFkZXI7DQotCQloZWFkZXIgPSBuZXdIZWFkZXI7DQotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19IRUFERVIsIG9sZEhlYWRlciwgaGVhZGVyKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX0tJTkQ6DQotCQkJCXJldHVybiBnZXRLaW5kKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX1RZUEVfTkFNRToNCi0JCQkJcmV0dXJuIGdldFR5cGVOYW1lKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX1BBUlRfTkFNRToNCi0JCQkJcmV0dXJuIGdldFBhcnROYW1lKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0U6DQotCQkJCXJldHVybiBnZXRUYXJnZXROYW1lc3BhY2UoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fSEVBREVSOg0KLQkJCQlyZXR1cm4gaXNIZWFkZXIoKTsNCi0JCX0NCi0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fS0lORDoNCi0JCQkJc2V0S2luZCgoV2ViUGFyYW1LaW5kKW5ld1ZhbHVlKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19UWVBFX05BTUU6DQotCQkJCXNldFR5cGVOYW1lKChTdHJpbmcpbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX1BBUlRfTkFNRToNCi0JCQkJc2V0UGFydE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRToNCi0JCQkJc2V0VGFyZ2V0TmFtZXNwYWNlKChTdHJpbmcpbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX0hFQURFUjoNCi0JCQkJc2V0SGVhZGVyKChCb29sZWFuKW5ld1ZhbHVlKTsNCi0JCQkJcmV0dXJuOw0KLQkJfQ0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX0tJTkQ6DQotCQkJCXNldEtpbmQoS0lORF9FREVGQVVMVCk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fVFlQRV9OQU1FOg0KLQkJCQlzZXRUeXBlTmFtZShUWVBFX05BTUVfRURFRkFVTFQpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX1BBUlRfTkFNRToNCi0JCQkJc2V0UGFydE5hbWUoUEFSVF9OQU1FX0VERUZBVUxUKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19UQVJHRVRfTkFNRVNQQUNFOg0KLQkJCQlzZXRUYXJnZXROYW1lc3BhY2UoVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVCk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fSEVBREVSOg0KLQkJCQlzZXRIZWFkZXIoSEVBREVSX0VERUZBVUxUKTsNCi0JCQkJcmV0dXJuOw0KLQkJfQ0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19LSU5EOg0KLQkJCQlyZXR1cm4ga2luZCAhPSBLSU5EX0VERUZBVUxUOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19UWVBFX05BTUU6DQotCQkJCXJldHVybiBUWVBFX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGVOYW1lICE9IG51bGwgOiAhVFlQRV9OQU1FX0VERUZBVUxULmVxdWFscyh0eXBlTmFtZSk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX1BBUlRfTkFNRToNCi0JCQkJcmV0dXJuIFBBUlRfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gcGFydE5hbWUgIT0gbnVsbCA6ICFQQVJUX05BTUVfRURFRkFVTFQuZXF1YWxzKHBhcnROYW1lKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRToNCi0JCQkJcmV0dXJuIFRBUkdFVF9OQU1FU1BBQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHRhcmdldE5hbWVzcGFjZSAhPSBudWxsIDogIVRBUkdFVF9OQU1FU1BBQ0VfRURFRkFVTFQuZXF1YWxzKHRhcmdldE5hbWVzcGFjZSk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX0hFQURFUjoNCi0JCQkJcmV0dXJuIGhlYWRlciAhPSBIRUFERVJfRURFRkFVTFQ7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsNCi0NCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOw0KLQkJcmVzdWx0LmFwcGVuZCgiIChraW5kOiAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmVzdWx0LmFwcGVuZChraW5kKTsNCi0JCXJlc3VsdC5hcHBlbmQoIiwgdHlwZU5hbWU6ICIpOyAvLyROT04tTkxTLTEkDQotCQlyZXN1bHQuYXBwZW5kKHR5cGVOYW1lKTsNCi0JCXJlc3VsdC5hcHBlbmQoIiwgcGFydE5hbWU6ICIpOyAvLyROT04tTkxTLTEkDQotCQlyZXN1bHQuYXBwZW5kKHBhcnROYW1lKTsNCi0JCXJlc3VsdC5hcHBlbmQoIiwgdGFyZ2V0TmFtZXNwYWNlOiAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmVzdWx0LmFwcGVuZCh0YXJnZXROYW1lc3BhY2UpOw0KLQkJcmVzdWx0LmFwcGVuZCgiLCBoZWFkZXI6ICIpOyAvLyROT04tTkxTLTEkDQotCQlyZXN1bHQuYXBwZW5kKGhlYWRlcik7DQotCQlyZXN1bHQuYXBwZW5kKCcpJyk7DQotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7DQotCX0NCi0NCi19IC8vSVdlYlBhcmFtSW1wbA0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JV2ViU2VydmljZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JV2ViU2VydmljZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGU4NDVlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvSVdlYlNlcnZpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbDsNCi0NCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLQ0KLS8qKg0KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPklXZWIgU2VydmljZTwvYj48L2VtPicuDQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogPHA+DQotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6DQotICogPHVsPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViU2VydmljZUltcGwjZ2V0U2VydmljZUVuZHBvaW50IDxlbT5TZXJ2aWNlIEVuZHBvaW50PC9lbT59PC9saT4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYlNlcnZpY2VJbXBsI2dldFRhcmdldE5hbWVzcGFjZSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fTwvbGk+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJTZXJ2aWNlSW1wbCNnZXRQb3J0TmFtZSA8ZW0+UG9ydCBOYW1lPC9lbT59PC9saT4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYlNlcnZpY2VJbXBsI2dldFdzZGxMb2NhdGlvbiA8ZW0+V3NkbCBMb2NhdGlvbjwvZW0+fTwvbGk+DQotICogPC91bD4NCi0gKiA8L3A+DQotICoNCi0gKiBAZ2VuZXJhdGVkDQotICovDQotcHVibGljIGNsYXNzIElXZWJTZXJ2aWNlSW1wbCBleHRlbmRzIElKYXZhV2ViU2VydmljZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgSVdlYlNlcnZpY2Ugew0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZUVuZHBvaW50KCkgPGVtPlNlcnZpY2UgRW5kcG9pbnQ8L2VtPn0nIHJlZmVyZW5jZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFNlcnZpY2VFbmRwb2ludCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlcnZpY2VFbmRwb2ludDsNCi0NCi0JLyoqDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXROYW1lc3BhY2UoKSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVCA9IG51bGw7DQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXROYW1lc3BhY2UoKSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBUQVJHRVRfTkFNRVNQQUNFX0VERUZBVUxUOw0KLQkvKioNCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvcnROYW1lKCkgPGVtPlBvcnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0UG9ydE5hbWUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUX05BTUVfRURFRkFVTFQgPSBudWxsOw0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9ydE5hbWUoKSA8ZW0+UG9ydCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRQb3J0TmFtZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBTdHJpbmcgcG9ydE5hbWUgPSBQT1JUX05BTUVfRURFRkFVTFQ7DQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbExvY2F0aW9uKCkgPGVtPldzZGwgTG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFdzZGxMb2NhdGlvbigpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfTE9DQVRJT05fRURFRkFVTFQgPSBudWxsOw0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbExvY2F0aW9uKCkgPGVtPldzZGwgTG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFdzZGxMb2NhdGlvbigpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBTdHJpbmcgd3NkbExvY2F0aW9uID0gV1NETF9MT0NBVElPTl9FREVGQVVMVDsNCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgSVdlYlNlcnZpY2VJbXBsKCkgew0KLQkJc3VwZXIoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsNCi0JCXJldHVybiBEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfU0VSVklDRTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIGdldFNlcnZpY2VFbmRwb2ludCgpIHsNCi0JCWlmIChzZXJ2aWNlRW5kcG9pbnQgIT0gbnVsbCAmJiBzZXJ2aWNlRW5kcG9pbnQuZUlzUHJveHkoKSkNCi0JCXsNCi0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkU2VydmljZUVuZHBvaW50ID0gKEludGVybmFsRU9iamVjdClzZXJ2aWNlRW5kcG9pbnQ7DQotCQkJc2VydmljZUVuZHBvaW50ID0gKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpZVJlc29sdmVQcm94eShvbGRTZXJ2aWNlRW5kcG9pbnQpOw0KLQkJCWlmIChzZXJ2aWNlRW5kcG9pbnQgIT0gb2xkU2VydmljZUVuZHBvaW50KQ0KLQkJCXsNCi0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19TRVJWSUNFX0VORFBPSU5ULCBvbGRTZXJ2aWNlRW5kcG9pbnQsIHNlcnZpY2VFbmRwb2ludCkpOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBzZXJ2aWNlRW5kcG9pbnQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBiYXNpY0dldFNlcnZpY2VFbmRwb2ludCgpIHsNCi0JCXJldHVybiBzZXJ2aWNlRW5kcG9pbnQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTZXJ2aWNlRW5kcG9pbnQoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBuZXdTZXJ2aWNlRW5kcG9pbnQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsNCi0JCUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugb2xkU2VydmljZUVuZHBvaW50ID0gc2VydmljZUVuZHBvaW50Ow0KLQkJc2VydmljZUVuZHBvaW50ID0gbmV3U2VydmljZUVuZHBvaW50Ow0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJew0KLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fU0VSVklDRV9FTkRQT0lOVCwgb2xkU2VydmljZUVuZHBvaW50LCBuZXdTZXJ2aWNlRW5kcG9pbnQpOw0KLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsNCi0JCX0NCi0JCXJldHVybiBtc2dzOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0U2VydmljZUVuZHBvaW50KElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgbmV3U2VydmljZUVuZHBvaW50KSB7DQotCQlpZiAobmV3U2VydmljZUVuZHBvaW50ICE9IHNlcnZpY2VFbmRwb2ludCkNCi0JCXsNCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsNCi0JCQlpZiAoc2VydmljZUVuZHBvaW50ICE9IG51bGwpDQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClzZXJ2aWNlRW5kcG9pbnQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRJTkdfV0VCX1NFUlZJQ0VTLCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmNsYXNzLCBtc2dzKTsNCi0JCQlpZiAobmV3U2VydmljZUVuZHBvaW50ICE9IG51bGwpDQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdTZXJ2aWNlRW5kcG9pbnQpLmVJbnZlcnNlQWRkKHRoaXMsIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRJTkdfV0VCX1NFUlZJQ0VTLCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmNsYXNzLCBtc2dzKTsNCi0JCQltc2dzID0gYmFzaWNTZXRTZXJ2aWNlRW5kcG9pbnQobmV3U2VydmljZUVuZHBvaW50LCBtc2dzKTsNCi0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7DQotCQl9DQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fU0VSVklDRV9FTkRQT0lOVCwgbmV3U2VydmljZUVuZHBvaW50LCBuZXdTZXJ2aWNlRW5kcG9pbnQpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgew0KLQkJcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFRhcmdldE5hbWVzcGFjZShTdHJpbmcgbmV3VGFyZ2V0TmFtZXNwYWNlKSB7DQotCQlTdHJpbmcgb2xkVGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOw0KLQkJdGFyZ2V0TmFtZXNwYWNlID0gbmV3VGFyZ2V0TmFtZXNwYWNlOw0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19UQVJHRVRfTkFNRVNQQUNFLCBvbGRUYXJnZXROYW1lc3BhY2UsIHRhcmdldE5hbWVzcGFjZSkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRQb3J0TmFtZSgpIHsNCi0JCXJldHVybiBwb3J0TmFtZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFBvcnROYW1lKFN0cmluZyBuZXdQb3J0TmFtZSkgew0KLQkJU3RyaW5nIG9sZFBvcnROYW1lID0gcG9ydE5hbWU7DQotCQlwb3J0TmFtZSA9IG5ld1BvcnROYW1lOw0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19QT1JUX05BTUUsIG9sZFBvcnROYW1lLCBwb3J0TmFtZSkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRXc2RsTG9jYXRpb24oKSB7DQotCQlyZXR1cm4gd3NkbExvY2F0aW9uOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0V3NkbExvY2F0aW9uKFN0cmluZyBuZXdXc2RsTG9jYXRpb24pIHsNCi0JCVN0cmluZyBvbGRXc2RsTG9jYXRpb24gPSB3c2RsTG9jYXRpb247DQotCQl3c2RsTG9jYXRpb24gPSBuZXdXc2RsTG9jYXRpb247DQotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1dTRExfTE9DQVRJT04sIG9sZFdzZGxMb2NhdGlvbiwgd3NkbExvY2F0aW9uKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fU0VSVklDRV9FTkRQT0lOVDoNCi0JCQkJaWYgKHNlcnZpY2VFbmRwb2ludCAhPSBudWxsKQ0KLQkJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXNlcnZpY2VFbmRwb2ludCkuZUludmVyc2VSZW1vdmUodGhpcywgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExFTUVOVElOR19XRUJfU0VSVklDRVMsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuY2xhc3MsIG1zZ3MpOw0KLQkJCQlyZXR1cm4gYmFzaWNTZXRTZXJ2aWNlRW5kcG9pbnQoKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Upb3RoZXJFbmQsIG1zZ3MpOw0KLQkJfQ0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQ6DQotCQkJCXJldHVybiBiYXNpY1NldFNlcnZpY2VFbmRwb2ludChudWxsLCBtc2dzKTsNCi0JCX0NCi0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19TRVJWSUNFX0VORFBPSU5UOg0KLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFNlcnZpY2VFbmRwb2ludCgpOw0KLQkJCQlyZXR1cm4gYmFzaWNHZXRTZXJ2aWNlRW5kcG9pbnQoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19UQVJHRVRfTkFNRVNQQUNFOg0KLQkJCQlyZXR1cm4gZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fUE9SVF9OQU1FOg0KLQkJCQlyZXR1cm4gZ2V0UG9ydE5hbWUoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19XU0RMX0xPQ0FUSU9OOg0KLQkJCQlyZXR1cm4gZ2V0V3NkbExvY2F0aW9uKCk7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fU0VSVklDRV9FTkRQT0lOVDoNCi0JCQkJc2V0U2VydmljZUVuZHBvaW50KChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKW5ld1ZhbHVlKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1RBUkdFVF9OQU1FU1BBQ0U6DQotCQkJCXNldFRhcmdldE5hbWVzcGFjZSgoU3RyaW5nKW5ld1ZhbHVlKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1BPUlRfTkFNRToNCi0JCQkJc2V0UG9ydE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19XU0RMX0xPQ0FUSU9OOg0KLQkJCQlzZXRXc2RsTG9jYXRpb24oKFN0cmluZyluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCX0NCi0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQ6DQotCQkJCXNldFNlcnZpY2VFbmRwb2ludCgoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSludWxsKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1RBUkdFVF9OQU1FU1BBQ0U6DQotCQkJCXNldFRhcmdldE5hbWVzcGFjZShUQVJHRVRfTkFNRVNQQUNFX0VERUZBVUxUKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1BPUlRfTkFNRToNCi0JCQkJc2V0UG9ydE5hbWUoUE9SVF9OQU1FX0VERUZBVUxUKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1dTRExfTE9DQVRJT046DQotCQkJCXNldFdzZGxMb2NhdGlvbihXU0RMX0xPQ0FUSU9OX0VERUZBVUxUKTsNCi0JCQkJcmV0dXJuOw0KLQkJfQ0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQ6DQotCQkJCXJldHVybiBzZXJ2aWNlRW5kcG9pbnQgIT0gbnVsbDsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19UQVJHRVRfTkFNRVNQQUNFOg0KLQkJCQlyZXR1cm4gVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVCA9PSBudWxsID8gdGFyZ2V0TmFtZXNwYWNlICE9IG51bGwgOiAhVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVC5lcXVhbHModGFyZ2V0TmFtZXNwYWNlKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19QT1JUX05BTUU6DQotCQkJCXJldHVybiBQT1JUX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHBvcnROYW1lICE9IG51bGwgOiAhUE9SVF9OQU1FX0VERUZBVUxULmVxdWFscyhwb3J0TmFtZSk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fV1NETF9MT0NBVElPTjoNCi0JCQkJcmV0dXJuIFdTRExfTE9DQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHdzZGxMb2NhdGlvbiAhPSBudWxsIDogIVdTRExfTE9DQVRJT05fRURFRkFVTFQuZXF1YWxzKHdzZGxMb2NhdGlvbik7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsNCi0NCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOw0KLQkJcmVzdWx0LmFwcGVuZCgiICh0YXJnZXROYW1lc3BhY2U6ICIpOyAvLyROT04tTkxTLTEkDQotCQlyZXN1bHQuYXBwZW5kKHRhcmdldE5hbWVzcGFjZSk7DQotCQlyZXN1bHQuYXBwZW5kKCIsIHBvcnROYW1lOiAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmVzdWx0LmFwcGVuZChwb3J0TmFtZSk7DQotCQlyZXN1bHQuYXBwZW5kKCIsIHdzZGxMb2NhdGlvbjogIik7IC8vJE5PTi1OTFMtMSQNCi0JCXJlc3VsdC5hcHBlbmQod3NkbExvY2F0aW9uKTsNCi0JCXJlc3VsdC5hcHBlbmQoJyknKTsNCi0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsNCi0JfQ0KLQ0KLX0gLy9JV2ViU2VydmljZUltcGwNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvSVdlYlNlcnZpY2VQcm9qZWN0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lXZWJTZXJ2aWNlUHJvamVjdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWIxM2YzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvSVdlYlNlcnZpY2VQcm9qZWN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGw7DQotDQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi0NCi0vKioNCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JV2ViIFNlcnZpY2UgUHJvamVjdDwvYj48L2VtPicuDQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogPHA+DQotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6DQotICogPHVsPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViU2VydmljZVByb2plY3RJbXBsI2dldFdlYlNlcnZpY2VzIDxlbT5XZWIgU2VydmljZXM8L2VtPn08L2xpPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViU2VydmljZVByb2plY3RJbXBsI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMgPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlczwvZW0+fTwvbGk+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJTZXJ2aWNlUHJvamVjdEltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+DQotICogPC91bD4NCi0gKiA8L3A+DQotICoNCi0gKiBAZ2VuZXJhdGVkDQotICovDQotcHVibGljIGNsYXNzIElXZWJTZXJ2aWNlUHJvamVjdEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIElXZWJTZXJ2aWNlUHJvamVjdCB7DQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXZWJTZXJ2aWNlcygpIDxlbT5XZWIgU2VydmljZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0V2ViU2VydmljZXMoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgRUxpc3Q8SVdlYlNlcnZpY2U+IHdlYlNlcnZpY2VzOw0KLQ0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpIDxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBFTGlzdDxJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPiBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzOw0KLQ0KLQkvKioNCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0TmFtZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOw0KLQ0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXROYW1lKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsNCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgSVdlYlNlcnZpY2VQcm9qZWN0SW1wbCgpIHsNCi0JCXN1cGVyKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7DQotCQlyZXR1cm4gRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1NFUlZJQ0VfUFJPSkVDVDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFTGlzdDxJV2ViU2VydmljZT4gZ2V0V2ViU2VydmljZXMoKSB7DQotCQlpZiAod2ViU2VydmljZXMgPT0gbnVsbCkNCi0JCXsNCi0JCQl3ZWJTZXJ2aWNlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxJV2ViU2VydmljZT4oSVdlYlNlcnZpY2UuY2xhc3MsIHRoaXMsIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX1dFQl9TRVJWSUNFUyk7DQotCQl9DQotCQlyZXR1cm4gd2ViU2VydmljZXM7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUxpc3Q8SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZT4gZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpIHsNCi0JCWlmIChzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzID09IG51bGwpDQotCQl7DQotCQkJc2VydmljZUVuZHBvaW50SW50ZXJmYWNlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPihJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmNsYXNzLCB0aGlzLCBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9QUk9KRUNUX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRVMpOw0KLQkJfQ0KLQkJcmV0dXJuIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZXM7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7DQotCQlyZXR1cm4gbmFtZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsNCi0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsNCi0JCW5hbWUgPSBuZXdOYW1lOw0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX1dFQl9TRVJWSUNFUzoNCi0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRXZWJTZXJ2aWNlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9QUk9KRUNUX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRVM6DQotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9QUk9KRUNUX19XRUJfU0VSVklDRVM6DQotCQkJCXJldHVybiBnZXRXZWJTZXJ2aWNlcygpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VTOg0KLQkJCQlyZXR1cm4gZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fTkFNRToNCi0JCQkJcmV0dXJuIGdldE5hbWUoKTsNCi0JCX0NCi0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9QUk9KRUNUX19XRUJfU0VSVklDRVM6DQotCQkJCWdldFdlYlNlcnZpY2VzKCkuY2xlYXIoKTsNCi0JCQkJZ2V0V2ViU2VydmljZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIElXZWJTZXJ2aWNlPiluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFUzoNCi0JCQkJZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpLmNsZWFyKCk7DQotCQkJCWdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U+KW5ld1ZhbHVlKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fTkFNRToNCi0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsNCi0JCQkJcmV0dXJuOw0KLQkJfQ0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9QUk9KRUNUX19XRUJfU0VSVklDRVM6DQotCQkJCWdldFdlYlNlcnZpY2VzKCkuY2xlYXIoKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VTOg0KLQkJCQlnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkuY2xlYXIoKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fTkFNRToNCi0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsNCi0JCQkJcmV0dXJuOw0KLQkJfQ0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fV0VCX1NFUlZJQ0VTOg0KLQkJCQlyZXR1cm4gd2ViU2VydmljZXMgIT0gbnVsbCAmJiAhd2ViU2VydmljZXMuaXNFbXB0eSgpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VTOg0KLQkJCQlyZXR1cm4gc2VydmljZUVuZHBvaW50SW50ZXJmYWNlcyAhPSBudWxsICYmICFzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzLmlzRW1wdHkoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX05BTUU6DQotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsNCi0NCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOw0KLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsNCi0JCXJlc3VsdC5hcHBlbmQoJyknKTsNCi0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsNCi0JfQ0KLQ0KLX0gLy9JV2ViU2VydmljZVByb2plY3RJbXBsDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lXZWJUeXBlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lXZWJUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MWM1OThlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JV2ViVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGw7DQotDQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViVHlwZTsNCi0NCi0vKioNCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JV2ViIFR5cGU8L2I+PC9lbT4nLg0KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLSAqIDxwPg0KLSAqIDwvcD4NCi0gKg0KLSAqIEBnZW5lcmF0ZWQNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSVdlYlR5cGVJbXBsIGV4dGVuZHMgSUphdmFXZWJTZXJ2aWNlRWxlbWVudEltcGwgaW1wbGVtZW50cyBJV2ViVHlwZSB7DQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIElXZWJUeXBlSW1wbCgpIHsNCi0JCXN1cGVyKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7DQotCQlyZXR1cm4gRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1RZUEU7DQotCX0NCi0NCi19IC8vSVdlYlR5cGVJbXBsDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9wbHVnaW4vSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvcGx1Z2luL0pheFdzRG9tUnVudGltZU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg0MDM0MmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9wbHVnaW4vSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnBsdWdpbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsNCi0NCi1wdWJsaWMgY2xhc3MgSmF4V3NEb21SdW50aW1lTWVzc2FnZXMgZXh0ZW5kcyBOTFMgew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnBsdWdpbi5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV3NEb21TdGFydHVwUGFydGljaXBhbnRfU3RhcnR1cF9Kb2JfTWVzc2FnZTsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya3NwYWNlQ1VGaW5kZXJfTE9BRElOR19DQU5DRUxFRDsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfRE9NX0xPQURJTkc7DQotCQ0KLQlzdGF0aWMgew0KLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUNCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEpheFdzRG9tUnVudGltZU1lc3NhZ2VzLmNsYXNzKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIEpheFdzRG9tUnVudGltZU1lc3NhZ2VzKCkgew0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvcGx1Z2luL0pheFdzRG9tUnVudGltZVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9wbHVnaW4vSmF4V3NEb21SdW50aW1lUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE5ZjhmZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9wbHVnaW4vSmF4V3NEb21SdW50aW1lUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5wbHVnaW47DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47DQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQ0KLSAqLw0KLXB1YmxpYyBjbGFzcyBKYXhXc0RvbVJ1bnRpbWVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gew0KLQ0KLQkvLyBUaGUgcGx1Zy1pbiBJRA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lIjsNCi0NCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQ0KLQlwcml2YXRlIHN0YXRpYyBKYXhXc0RvbVJ1bnRpbWVQbHVnaW4gcGx1Z2luOw0KLQkNCi0JLyoqDQotCSAqIFRoZSBjb25zdHJ1Y3Rvcg0KLQkgKi8NCi0JcHVibGljIEpheFdzRG9tUnVudGltZVBsdWdpbigpIHsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbnMjc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gew0KLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7DQotCQlwbHVnaW4gPSB0aGlzOw0KLQl9DQotDQotCS8qDQotCSAqIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQlwbHVnaW4gPSBudWxsOw0KLQkJc3VwZXIuc3RvcChjb250ZXh0KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlDQotCSAqDQotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBKYXhXc0RvbVJ1bnRpbWVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsNCi0JCXJldHVybiBwbHVnaW47DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9wbHVnaW4vbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvcGx1Z2luL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY2OWRlNDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9wbHVnaW4vbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi1Xc0RvbVN0YXJ0dXBQYXJ0aWNpcGFudF9TdGFydHVwX0pvYl9NZXNzYWdlCT1Mb2FkaW5nIFdlYiBTZXJ2aWNlIERPTS4uLg0KLVdvcmtzcGFjZUNVRmluZGVyX0xPQURJTkdfQ0FOQ0VMRUQ9SkFYLVdTIERPTSBsb2FkaW5nIGNhbmNlbGVkDQotSkFYV1NfRE9NX0xPQURJTkc9TG9hZGluZyBET00gZm9yIEpBWC1XUyBXZWIgU2VydmljZXMNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL3V0aWwvTmFtZWRFeHRlbnNpb25JbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL3V0aWwvTmFtZWRFeHRlbnNpb25JbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk3Y2E1MWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC91dGlsL05hbWVkRXh0ZW5zaW9uSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklOYW1lZEV4dGVuc2lvbkluZm87DQotDQotLyoqDQotICogSW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHtAbGluayBJTmFtZWRFeHRlbnNpb25JbmZvfS4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgTmFtZWRFeHRlbnNpb25JbmZvIGltcGxlbWVudHMgSU5hbWVkRXh0ZW5zaW9uSW5mbw0KLXsNCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaWQ7DQotDQotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7DQotDQotCXByb3RlY3RlZCBOYW1lZEV4dGVuc2lvbkluZm8oZmluYWwgU3RyaW5nIHBJZCwgZmluYWwgU3RyaW5nIHBMYWJlbCkNCi0Jew0KLQkJdGhpcy5pZCA9IHBJZDsNCi0JCXRoaXMubmFtZSA9IHBMYWJlbDsNCi0JfQ0KLQ0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkNCi0Jew0KLQkJcmV0dXJuIGlkOw0KLQl9DQotDQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpDQotCXsNCi0JCXJldHVybiBuYW1lOw0KLQl9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvdXRpbC9YcFV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvdXRpbC9YcFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDY0MjJiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL3V0aWwvWHBVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC51dGlsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLklMb2dnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLkxvZ2dlcjsNCi0NCi0NCi0vKioNCi0gKiBVdGlsaXR5IGNsYXNzIGZvciB3b3JraW5nIHdpdGggZXh0ZW5kaW9uIHBvaW50cy4NCi0gKi8NCi1wdWJsaWMgZmluYWwgY2xhc3MgWHBVdGlsDQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX05PVF9QUk9QRVJMWV9SRUdJU1RFUkVEID0gIkNvbnN1bWVyVHlwZSBleHRlbnNpb24gbm90IHByb3Blcmx5IHJlZ2lzdGVyZWQgKGVycm9yIGluIHBsdWdpbi54bWwpIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKiogICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhQX0lNUExFTUVOVEFUSU9OX0VMRU1FTlQgPSAiaW1wbGVtZW50YXRpb24iOyAvLyROT04tTkxTLTEkDQotDQotCS8qKiAgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFBfSU1QTEVNRU5UQVRJT05fRUxFTUVOVF9DTEFTU19BVFRSID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgZXhlY3V0YWJsZSBleHRlbnNpb24uDQotCSAqIA0KLQkgKiBAcGFyYW0gZXh0DQotCSAqIEByZXR1cm4gaW5zdGFuY2Ugb2YgZXh0ZW50aW9uIGltcGxlbWVudGF0aW9uDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBpbnN0YW50aWF0ZUltcGxlbWVudGF0aW9uKGZpbmFsIElFeHRlbnNpb24gZXh0KQ0KLQl7DQotCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBlbCA6IGV4dC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKSkNCi0JCXsNCi0JCQlpZiAoZWwuZ2V0TmFtZSgpLmVxdWFscyhYUF9JTVBMRU1FTlRBVElPTl9FTEVNRU5UKSkNCi0JCQl7DQotCQkJCXRyeQ0KLQkJCQl7DQotCQkJCQlyZXR1cm4gZWwuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihYUF9JTVBMRU1FTlRBVElPTl9FTEVNRU5UX0NMQVNTX0FUVFIpOw0KLQkJCQl9IGNhdGNoIChmaW5hbCBDb3JlRXhjZXB0aW9uIGUpDQotCQkJCXsNCi0JCQkJCWxvZ2dlcigpLmxvZ0Vycm9yKCJVbmFibGUgdG8gY3JlYXRlIGV4dGVuc2lvbiIsIGUpOyAvLyROT04tTkxTLTEkDQotCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCWxvZ2dlcigpLmxvZ0Vycm9yKEVYVEVOU0lPTl9OT1RfUFJPUEVSTFlfUkVHSVNURVJFRCk7DQotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihFWFRFTlNJT05fTk9UX1BST1BFUkxZX1JFR0lTVEVSRUQpOw0KLQl9DQotDQotCXByaXZhdGUgc3RhdGljIElMb2dnZXIgbG9nZ2VyKCkNCi0Jew0KLQkJcmV0dXJuIG5ldyBMb2dnZXIoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0lBbm5vdGF0aW9uU2VyaWFsaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9JQW5ub3RhdGlvblNlcmlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWM4ZWVlZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0lBbm5vdGF0aW9uU2VyaWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCi0NCi0vKioNCi0gKiBUaGlzIGludGVyZmFjZSBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkgY2xhc3NlcyB0aGF0IGludGVuZCB0byBkbyBzZXJpYWxpemF0aW9uIGZvciANCi0gKiBET00gb2JqZWN0cy4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGludGVyZmFjZSBJQW5ub3RhdGlvblNlcmlhbGl6ZXIgDQotew0KLQlwdWJsaWMgdm9pZCBzYXZlKGZpbmFsIE5vdGlmaWNhdGlvbiBtc2cpOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0lDb21waWxhdGlvblVuaXRGaW5kZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSUNvbXBpbGF0aW9uVW5pdEZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZDY2OTBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSUNvbXBpbGF0aW9uVW5pdEZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBJbXBsZW1lbnRzIGEgdmlzaXRvciBwYXR0ZXJuIGZvciB0cmF2ZXJzaW5nIGNvbXBpbGF0aW9uIHVuaXQuIFRoaXMgaW50ZXJmYWNlIGRvZXMgbm90IGRlZmluZSB3aGF0IHNldCBvZiBjb21waWxhdGlvbg0KLSAqIHVuaXRzIHdpbGwgYmUgdHJhdmVyZXNlZC4gVGhpcyBjb3VsZCBiZSBhIHNpbmdsZSBqYXZhIHByb2plY3QsIHRoZSB3aG9sZSB3b3Jrc3BhY2Ugb3IganVzdCBhIGdpdmVuIHBhY2thZ2UuIFRoZSBzZXQgb2YNCi0gKiB0cmF2ZXJzZWQgY29tcGlsYXRpb24gdW5pdHMgaXMgbGVmdCB1cCB0byB0aGUgaW1wbGVtZW50YXRpb24uIE5ldmVydGhlbGVzcyBhcyB0aGVzZSBjb21waWxhdGlvbiB1bml0cyBhcmUgYWx3YXlzIGNvbnRhaW5lZA0KLSAqIGluc2lkZSBhIGphdmEgcHJvamVjdCwgdGhlIDwvYz5JQ29tcGlsYXRpb25Vbml0SGFuZGxlci5oYW5kbGVQcm9qZWN0KElKYXZhUHJvamVjdCk8L2M+IGhhcyB0byBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIHRvDQotICogbm90aWZ5IHRoZSBoYW5kbGVyIGZvciBlYWNoIHByb2plY3QgYmVpbmcgcHJvY2Vzc2VkLiBUaGUgY29tcGlsYXRpb24gdW5pdCBoYW5kbGVyIHdpbGwgYmUgZmlyc3Qgbm90aWZpZWQgdGhhdCB0aGUgcHJvY2Vzc2luZw0KLSAqIG9mIGdpdmVuIHByb2plY3QgaGFzIGJlZ2FuIGFuZCBpbW1lZGlhdGVseSBhZnRlciB0aGlzIGl0IHdpbGwgYmUgbm90aWZpZWQgZm9yIGFsbCBhbm5vdGF0aW9ucyBpbiB0aGlzIHByb2plY3QgZGlzY292ZXJlZCBieQ0KLSAqIHRoZSBnaXZlbiBpbXBsZW1lbnRhdGlvbi4gDQotICogQGF1dGhvciBIcmlzdG8gU2FiZXYNCi0gKg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbXBpbGF0aW9uVW5pdEZpbmRlcg0KLXsNCi0JLyoqDQotCSAqIFN0YXJ0cyB0aGUgdHJhdmVyc2FsIG9mIGNvbXBpbGF0aW9uIHVuaXRzDQotCSAqIEBwYXJhbSBtb25pdG9yIC0gdGhlIHByb2dyZXNzIG1vbml0b3IgdG8gYmUgdXNlZCBmb3IgdGhlIHRyYXZlcnNhbC4NCi0JICogQHBhcmFtIGN1SGFuZGxlciAtIGNvbXBpbGF0aW9uIHVuaXQgaGFuZGxlciB0byBiZSBub3RpZmllZCBmb3IgYSBnaXZlbiBwcm9qZWN0DQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAtIHRocm93biBpZiB1bmV4cGVjdGVkIHByb2JsZW0gb2NjdXJyZWQgd2hpbGUgdHJhdmVyc2luZyBhbm5vdGF0aW9ucw0KLQkgKi8NCi0JcHVibGljIHZvaWQgZmluZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElDb21waWxhdGlvblVuaXRIYW5kbGVyIGN1SGFuZGxlcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0lDb21waWxhdGlvblVuaXRIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0lDb21waWxhdGlvblVuaXRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkzYTMxNWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9JQ29tcGlsYXRpb25Vbml0SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsNCi0NCi0vKioNCi0gKiBBIGxpc3RlbmVyIGZvciBldmVudHMgaXNzZXVkIGJ5IGFuIDxjPklDb21waWxhdGlvblVuaXRGaW5kZXI8L2M+IGluc3RhbmNlIGR1cmluZyBjb21waWxhdGlvbiB1bml0IHRyYXZlcnNhbHMNCi0gKiANCi0gKiBAYXV0aG9yIEhyaXN0byBTYWJldg0KLSAqIA0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbXBpbGF0aW9uVW5pdEhhbmRsZXINCi17DQotCS8qKg0KLQkgKiBjYWxsZWQgYnkgdGhlIDxjPntAbGluayBJQ29tcGlsYXRpb25Vbml0RmluZGVyfTwvYz4gaW5zdGFuY2Ugd2hlbiBpdCBoYXMgc3RhcnRlZCB0byB0cmF2ZXJzZSB0aGUgYW5ub3RhdGlvbiBzZXQuIEFsbCBjYWxscyB0byA8Yz5oYW5kbGUoLi4uKTwvYz4NCi0JICogbWV0aG9kcyBpcyBpbnNpZGUgYSBzdGFydGVkLWZpbmlzaGVkIGJsb2NrLg0KLQkgKi8NCi0JcHVibGljIHZvaWQgc3RhcnRlZCgpOw0KLQ0KLQkvKioNCi0JICogY2FsbGVkIGJ5IHRoZSA8Yz57QGxpbmsgSUNvbXBpbGF0aW9uVW5pdEZpbmRlcn08L2M+IGluc3RhbmNlIHdoZW4gaXQgaGFzIGZpbmlzaGVkIHRvIHRyYXZlcnNlIHRoZSBhbm5vdGF0aW9uIHNldC4NCi0JICovDQotCXB1YmxpYyB2b2lkIGZpbmlzaGVkKCk7DQotDQotCS8qKg0KLQkgKiBDYWxsZWQgd2hlbiB0aGUgPGM+e0BsaW5rIElDb21waWxhdGlvblVuaXRGaW5kZXJ9PC9jPiBpbnN0YW5jZSBmb3VuZCBhIGNvbXBpbGF0aW9uIHVuaXQuIFRoaXMgbWV0aG9kIGlzIGF3bGF5cyBjYWxsZWQgYWZ0ZXIgYSBjYWxsIHRvIDxjPntAbGluayAjaGFuZGxlKEphdmFQcm9qZWN0KSBoYW5kbGUoSmF2YVByb2plY3QpfTwvYz4uDQotCSAqIFRoZSByZXBvcnRlZCBjb21waWxhdGlvbiB1bml0IGlzIGd1YXJhbnRlZWQgdG8gYmUgZm91bmQgaW5zaWRlIHRoZSA8Yz5KYXZhUHJvamVjdDwvYz4gcmVwb3J0ZWQgYnkgdGhlIGxhc3QgY2FsbCB0byA8Yz57QGxpbmsjaGFuZGxlKEphdmFQcm9qZWN0KSBoYW5kbGUoSmF2YVByb2plY3QpfTwvYz4uDQotCSAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBmb3IgZWFjaCBjb21waWxhdGlvbiB1bml0DQotCSAqIA0KLQkgKiBAcGFyYW0gY3UgLQ0KLQkgKiAgICAgICAgICAgIHRoZSBjb21waWxhdGlvbiB1bml0IGZvdW5kIGJ5IHRoZSBmaW5kZXINCi0JICovDQotCXB1YmxpYyB2b2lkIGhhbmRsZShJQ29tcGlsYXRpb25Vbml0IGN1KTsNCi0NCi0JLyoqDQotCSAqIENhbGxlZCB3aGVuIHRoZSA8Yz57QGxpbmsgSUNvbXBpbGF0aW9uVW5pdEZpbmRlcn08L2M+IGluc3RhbmNlIGZvdW5kIGEgamF2YSBwcm9qZWN0LiBUaGlzIG1ldGhvZCBpcyBhbHdheXMgY2FsbGVkIGJlZm9yZSB0aGUgPGM+e0BsaW5rICNoYW5kbGUoSUNvbXBpbGF0aW9uVW5pdCl9PC9jPg0KLQkgKiBmb3IgYW55IGNvbXBpbGF0aW9uIHVuaXQgZm91bmQgaW4gdGhpcyBwcm9qZWN0LiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgZm9yIGVhY2ggZm91bmQgcHJvamVjdC4NCi0JICogDQotCSAqIEBwYXJhbSBqcHJqIC0NCi0JICogICAgICAgICAgICB0aGUgamF2YSBwcm9qZWN0IGZvdW5kIGJ5IHRoZSBmaW5kZXINCi0JICovDQotCXB1YmxpYyB2b2lkIGhhbmRsZShJSmF2YVByb2plY3QganByaik7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSU1vZGVsRWxlbWVudFN5bmNocm9uaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9JTW9kZWxFbGVtZW50U3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUwMGZjNWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9JTW9kZWxFbGVtZW50U3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLkRvbVV0aWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZS5TZXJ2aWNlTW9kZWxEYXRhOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZy5JTG9nZ2VyOw0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZGVsRWxlbWVudFN5bmNocm9uaXplcg0KLXsNCi0JcHVibGljIERvbVV0aWwgdXRpbCgpOw0KLQlwdWJsaWMgU2VydmljZU1vZGVsRGF0YSBzZXJ2aWNlRGF0YSgpOwkNCi0JcHVibGljIElMb2dnZXIgbG9nZ2VyKCk7DQotCXB1YmxpYyBJRE9NIGdldERvbUJlaW5nTG9hZGVkKCk7DQotCXB1YmxpYyBEb21GYWN0b3J5IGRvbUZhY3RvcnkoKTsJDQotCXB1YmxpYyBJSmF2YU1vZGVsIGphdmFNb2RlbCgpOwkNCi0JcHVibGljIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgcmVzb3VyY2UoKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9JUHJvamVjdFNlbGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0lQcm9qZWN0U2VsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjVhZDVmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0lQcm9qZWN0U2VsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7DQotDQotLyoqDQotICogU3BlY2lmaWVzIHdoYXQgamF2YSBwcm9qZWN0cyB3aWxsIGJlIHRyYXZlcnNlZCBieSBhIGdpdmVuIDxjPklDb21waWxhdGlvblVuaXRGaW5kZXI8L2M+IGluc3RhbmNlLiBJZiBhbnkgb2YgdGhlIHJlZ2lzdGVyZWQNCi0gKiBzZWxlY3RvcnMgYXBwcm92ZWQgdGhlIHByb2plY3QgaS5lLiA8Yz5JUHJvamVjdFNlbGVjdG9yLmFwcHJvdmUoSUphdmFQcm9qZWN0KTwvYz4gcmV0dXJuZWQgdHJ1ZSwgdGhlbiB0aGlzIHByb2plY3Qgd2lsbA0KLSAqIGJlIHRyYXZlcnNlZC4gSS5lLiB0aGUgcHJvamVjdCBuZWVkcyB0byBiZSByZWplY3RlZCBieSBhbGwgdGhlIHNlbGVjdG9ycyBpbiBvcmRlciBub3QgdG8gYmUgdHJhdmVyc2VkLg0KLSAqIA0KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgaW50ZXJmYWNlIHNob3VsZCByZWplY3QgYSBwcm9qZWN0IHRoYXQgaXQgaGFzIG5vIGtub3dsZWRnZSBhYm91dC4NCi0gKiBAYXV0aG9yIEhyaXN0byBTYWJldg0KLSAqDQotICovDQotcHVibGljIGludGVyZmFjZSBJUHJvamVjdFNlbGVjdG9yDQotew0KLQkvKioNCi0JICogQXBwcm92ZXMgdGhlIHNwZWNpZmllZCBwcm9qZWN0IGZvciB0cmF2ZXJzYWwNCi0JICogQHBhcmFtIHByaiAtIHRoZSBwcm9qZWN0IHRvIGFwcHJvdmUgb3IgcmVqZWN0DQotCSAqIEByZXR1cm4gLSB0cnVlIGlmIHRoZSBwcm9qZWN0IHNob3VsZCBiZSB0cmF2ZXJzZWQgYWNjb3JkaW5nIHRvIHRoaXMgc2VsZWN0b3IsIGZhbHNlIG90aGVyd2lzZS4NCi0JICovDQotCXB1YmxpYyBib29sZWFuIGFwcHJvdmUoSUphdmFQcm9qZWN0IHByaik7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGI5ZDc3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0pheFdzRGVmYXVsdHNDYWxjdWxhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5XZWJQYXJhbUtpbmQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBDb250YWlucyB1dGlsaXR5IG1ldGhvZHMgZm9yIGNhbGN1bGF0aW5nIGRlZmF1bHQgdmFsdWVzIG9mIHNvbWUgYXR0cmlidXRlcy9wcm9wZXJ0aWVzIGluIA0KLSAqIGFubm90YXRpb25zIGFuZCBET00gb2JqZWN0cy4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIEpheFdzRGVmYXVsdHNDYWxjdWxhdG9yIA0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFSRyA9ICJhcmciOyAvLyROT04tTkxTLTEkDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVRVUk4gPSAicmV0dXJuIjsgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTUE9OU0UgPSAiUmVzcG9uc2UiOyAvLyROT04tTkxTLTEkDQotCQ0KLQkvKioNCi0JICogRGVmaW5lcyB0aGUgU09BUEJpbmRpbmdTdHlsZS4gSWYgdGhlcmUgaXMgYSB2YWx1ZSBmb3Igc3R5bGUgYXR0cmlidXRlIGluIDxjb2RlPnNiQW5ub3RhdGlvbjwvY29kZT4gcmV0dXJucyB0aGF0IHZhbHVlDQotCSAqIG90aGVyd2lzZSByZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGF0dHJpYnV0ZS4NCi0JICogQHBhcmFtIHNiQW5ub3RhdGlvbg0KLQkgKiBAcmV0dXJuIHRoZSBzdHlsZQ0KLQkgKi8NCi0JcHVibGljIFNPQVBCaW5kaW5nU3R5bGUgZGVmaW5lU0JTdHlsZShmaW5hbCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBzYkFubm90YXRpb24pDQotCXsNCi0JCWZpbmFsIFN0cmluZyB2YWx1ZSA9IHNiQW5ub3RhdGlvbiE9bnVsbCA/IHNiQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFNCQW5ub3RhdGlvbkZlYXR1cmVzLlNUWUxFX0FUVFJJQlVURSkgOiBudWxsOw0KLQkJaWYgKHZhbHVlIT1udWxsICYmIFNCQW5ub3RhdGlvbkZlYXR1cmVzLlNCX1NUWUxFX1JQQy5lbmRzV2l0aCh2YWx1ZS50cmltKCkpKSB7DQotCQkJcmV0dXJuIFNPQVBCaW5kaW5nU3R5bGUuUlBDOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gU09BUEJpbmRpbmdTdHlsZS5ET0NVTUVOVDsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIERlZmluZXMgdGhlIFNPQVBCaW5kaW5nVXNlLiBJZiB0aGVyZSBpcyBhIHZhbHVlIGZvciB1c2UgYXR0cmlidXRlIGluIDxjb2RlPnNiQW5ub3RhdGlvbjwvY29kZT4gcmV0dXJucyB0aGF0IHZhbHVlDQotCSAqIG90aGVyd2lzZSByZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGF0dHJpYnV0ZS4NCi0JICogQHBhcmFtIHNiQW5ub3RhdGlvbg0KLQkgKiBAcmV0dXJuIHRoZSBzdHlsZQ0KLQkgKi8NCi0JcHVibGljIFNPQVBCaW5kaW5nVXNlIGRlZmluZVNCVXNlKGZpbmFsIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IHNiQW5ub3RhdGlvbikgew0KLQkJZmluYWwgU3RyaW5nIHZhbHVlID0gc2JBbm5vdGF0aW9uIT1udWxsID8gc2JBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoU0JBbm5vdGF0aW9uRmVhdHVyZXMuVVNFX0FUVFJJQlVURSkgOiBudWxsOw0KLQkJaWYodmFsdWUhPW51bGwgJiYgU0JBbm5vdGF0aW9uRmVhdHVyZXMuU0JfVVNFX0VOQ09ERUQuZW5kc1dpdGgodmFsdWUudHJpbSgpKSkgew0KLQkJCXJldHVybiBTT0FQQmluZGluZ1VzZS5FTkNPREVEOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gU09BUEJpbmRpbmdVc2UuTElURVJBTDsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIERlZmluZXMgdGhlIFNPQVBCaW5kaW5nVXNlLiBJZiB0aGVyZSBpcyBhIHZhbHVlIGZvciBwYXJhbWV0ZXJTdHlsZSBhdHRyaWJ1dGUgaW4gPGNvZGU+c2JBbm5vdGF0aW9uPC9jb2RlPiANCi0JICogcmV0dXJucyB0aGF0IHZhbHVlIG90aGVyd2lzZSByZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGF0dHJpYnV0ZS4NCi0JICogQHBhcmFtIHNiQW5ub3RhdGlvbg0KLQkgKiBAcmV0dXJuIHRoZSBzdHlsZQ0KLQkgKi8JDQotCXB1YmxpYyBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIGRlZmluZVNCUGFyYW1ldGVyU3R5bGUoZmluYWwgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gc2JBbm5vdGF0aW9uKQ0KLQl7DQotCQlmaW5hbCBTdHJpbmcgdmFsdWUgPSBzYkFubm90YXRpb24hPW51bGwgPyBzYkFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShTQkFubm90YXRpb25GZWF0dXJlcy5QQVJBTUVURVJfU1RZTEVfQVRUUklCVVRFKSA6IG51bGw7DQotCQlpZiAodmFsdWUhPW51bGwgJiYgU0JBbm5vdGF0aW9uRmVhdHVyZXMuU0JfUEFSQU1FVEVSX1NUWUxFX0JBUkUuZW5kc1dpdGgodmFsdWUudHJpbSgpKSkgew0KLQkJCXJldHVybiBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLkJBUkU7DQotCQl9DQotCQkNCi0JCXJldHVybiBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLldSQVBQRUQ7CQkNCi0JfQkNCi0JDQotCS8qKg0KLQkgKiBEZWZpbmVzIHRoZSBkZWZhdWx0IG9wZXJhdGlvbiBwYXJhbWV0ZXIgbmFtZSBhY2NvcmRpbmcgdG8gSlNSLTE4MSBwb2ludCA0LjQgLSBXZWJQYXJhbSBuYW1lDQotCSAqIGF0dHJpYnV0ZSAgDQotCSAqIEBwYXJhbSB3ZWJNZXRob2QgdGhlIG1ldGhvZCBob2xkaW5nIHRoZSBwYXJhbWV0ZXINCi0JICogQHBhcmFtIHBhcmFtUG9zaXRpb24gdGhlIHBhcmFtZXRlciBwb3NpdGlvbiBpbiBtZXRob2QgYXJndW1lbnRzIGxpc3Qgc3RhcnRpbmcgd2l0aCAwDQotCSAqIEByZXR1cm4gY2FsY3VsYXRlZCBuYW1lDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGNhbGNXZWJQYXJhbURlZmF1bHROYW1lKGZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kLCBmaW5hbCBpbnQgcGFyYW1Qb3NpdGlvbikNCi0Jew0KLQkJaWYod2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nU3R5bGUoKT09U09BUEJpbmRpbmdTdHlsZS5ET0NVTUVOVCAmJg0KLQkJICAgd2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKT09U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5CQVJFKSANCi0JCXsNCi0JCQlyZXR1cm4gd2ViTWV0aG9kLmdldE5hbWUoKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIEFSRyArIHBhcmFtUG9zaXRpb247IA0KLQl9DQotCQ0KLQkvKioNCi0JICogRGVmaW5lcyB0aGUgZGVmYXVsdCBvcGVyYXRpb24gcGFyYW1ldGVyIG5hbWUgYWNjb3JkaW5nIHRvIEpTUi0xODEgcG9pbnQgNC40IC0gV2ViUGFyYW0gbmFtZQ0KLQkgKiBhdHRyaWJ1dGUgDQotCSAqIEBwYXJhbSB3ZWJQYXJhbQ0KLQkgKiBAcmV0dXJuDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGNhbGNXZWJQYXJhbURlZmF1bHROYW1lKGZpbmFsIElXZWJQYXJhbSB3ZWJQYXJhbSkgDQotCXsNCi0JCWZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kID0gKElXZWJNZXRob2Qpd2ViUGFyYW0uZUNvbnRhaW5lcigpOw0KLQkJcmV0dXJuIGNhbGNXZWJQYXJhbURlZmF1bHROYW1lKHdlYk1ldGhvZCwgZ2V0UGFyYW1Qb3NpdGlvbih3ZWJNZXRob2QsIHdlYlBhcmFtKSk7CQkNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENhbGN1bGF0ZXMgdGhlIHBvc2l0aW9uIG9mIDxjb2RlPnBhcmFtPC9jb2RlPiBpbiA8Y29kZT5tZXRob2Q8L2NvZGU+IHNpZ25hdHVyZSBzdGFydGluZyBmcm9tIDANCi0JICogQHBhcmFtIHdlYk1ldGhvZA0KLQkgKiBAcGFyYW0gcGFyYW0NCi0JICogQHJldHVybiB0aGUgcGFyYW0gcG9zaXRpb24NCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT53ZWJNZXRob2Q8L2NvZGU+IGRvZXMgbm90IGNvbnRhaW4gPGNvZGU+cGFyYW08L2NvZGU+DQotCSAqLw0KLQlwcm90ZWN0ZWQgaW50IGdldFBhcmFtUG9zaXRpb24oZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QsIGZpbmFsIElXZWJQYXJhbSBwYXJhbSkNCi0Jew0KLQkJaW50IHBvc2l0aW9uID0gMDsNCi0JCWZvciAoSVdlYlBhcmFtIHdlYlBhcmFtIDogd2ViTWV0aG9kLmdldFBhcmFtZXRlcnMoKSkgDQotCQl7DQotCQkJaWYgKHdlYlBhcmFtLmdldEltcGxlbWVudGF0aW9uKCkuZXF1YWxzKCJyZXR1cm4iKSkgey8vJE5PTi1OTFMtMSQNCi0JCQkJY29udGludWU7DQotCQkJfQ0KLQkJCQ0KLQkJCWlmICh3ZWJQYXJhbT09cGFyYW0pIHsNCi0JCQkJcmV0dXJuIHBvc2l0aW9uOw0KLQkJCX0NCi0JCQkNCi0JCQlwb3NpdGlvbisrOw0KLQkJfQ0KLQkJDQotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQYXJhbWV0ZXJbIiArIHBhcmFtLmdldEltcGxlbWVudGF0aW9uKCkgKyAiXSB3YXMgbm90IGZvdW5kIGluIG1ldGhvZCBbIiArIHdlYk1ldGhvZC5nZXRJbXBsZW1lbnRhdGlvbigpICsgIl0iKTsvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMyQNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIERlZmluZXMgdGhlIGRlZmF1bHQgb3BlcmF0aW9uIHBhcmFtZXRlciBuYW1lIGFjY29yZGluZyB0byBKU1ItMTgxIHBvaW50IDQuNCAtIFdlYlBhcmFtIHRhcmdldCBOUy4NCi0JICogQHBhcmFtIHdlYk1ldGhvZCB0aGUgbWV0aG9kIGhvbGRpbmcgdGhlIHBhcmFtZXRlcg0KLQkgKiBAcGFyYW0gd2ViUGFyYW0NCi0JICogQHJldHVybiBjYWxjdWxhdGVkIE5TDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGNhbGNXZWJQYXJhbURlZmF1bHRUYXJnZXROUyhmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCwgZmluYWwgSVdlYlBhcmFtIHdlYlBhcmFtKQ0KLQl7DQotCQlpZih3ZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdTdHlsZSgpPT1TT0FQQmluZGluZ1N0eWxlLkRPQ1VNRU5UICYmDQotCQkgICB3ZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpPT1TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLldSQVBQRUQgJiYNCi0JCSAgICF3ZWJQYXJhbS5pc0hlYWRlcigpKSANCi0JCXsNCi0JCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKXdlYk1ldGhvZC5lQ29udGFpbmVyKCkpLmdldFRhcmdldE5hbWVzcGFjZSgpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBraW5kIGZvciB3ZWIgcGFyYW1ldGVycyAtIHJldHVybnMge0BsaW5rIFdlYlBhcmFtS2luZCNJTn0NCi0JICovDQotCXB1YmxpYyBXZWJQYXJhbUtpbmQgZ2V0RGVmYXVsdFBhcmFtS2luZCgpIHsNCi0JCXJldHVybiBXZWJQYXJhbUtpbmQuSU47CQkNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIEByZXR1cm4gZmFsc2UgYmVjYXVzZSB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgV2ViUGFyYW0oaGVhZGVyKSBpcyBmYWxzZQ0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gZ2V0RGVmYXVsdFBhcmFtSW5IZWRhZXIoKSB7DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBEZWZpbmVzIHRoZSBkZWZhdWx0IG9wZXJhdGlvbiBwYXJhbWV0ZXIgbmFtZSBhY2NvcmRpbmcgdG8gSlNSLTE4MSBwb2ludCA0LjUgLSBXZWJSZXN1bHQgbmFtZS4NCi0JICogQHBhcmFtIHdlYk1ldGhvZCB0aGUgbWV0aG9kIGhvbGRpbmcgdGhlIHBhcmFtZXRlcg0KLQkgKiBAcmV0dXJuIGNhbGN1bGF0ZWQgbmFtZQ0KLQkgKi8JDQotCXB1YmxpYyBTdHJpbmcgY2FsY1dlYlJlc3VsdERlZmF1bHROYW1lKGZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kKSANCi0Jew0KLQkJaWYod2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nU3R5bGUoKT09U09BUEJpbmRpbmdTdHlsZS5ET0NVTUVOVCAmJiANCi0JCSAgIHdlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCk9PVNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuQkFSRSkNCi0JCXsNCi0JCQlyZXR1cm4gd2ViTWV0aG9kLmdldE5hbWUoKSArIFJFU1BPTlNFOyANCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIFJFVFVSTjsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0pheFdzV29ya3NwYWNlUmVzb3VyY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMDk1Y2RlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5FbGVtZW50Q2hhbmdlZEV2ZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRWxlbWVudENoYW5nZWRMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXIuU2VyaWFsaXplckFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYy5Jbml0aWFsTW9kZWxTeW5jaHJvbml6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jLk9uRXZlbnRNb2RlbFN5bmNocm9uaXplcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb25JbnNwZWN0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5mYWNldHMuRmFjZXRVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmZhY2V0cy5JRmFjZXRVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuSUxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLS8qKg0KLSAqIFJlcHJlc2VudHMgdGhlIHJlc291cmNlIGZvciBKQVgtV1Mgd2ViIHNlcnZpY2UgRE9NIG1vZGVsLiBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBsb2FkaW5nIHRoZSANCi0gKiBtb2RlbC4gSXQgaXMgY2FwYWJsZSB0byB1c2Uge0BsaW5rIElQcm9ncmVzc01vbml0b3J9IHRvIHRyYWNrIHByb2dyZXNzIGFuZCBjYW5jZWwgcmVxdWVzdHMuDQotICogDQotICogQGF1dGhvciANCi0gKi8NCi1wdWJsaWMgY2xhc3MgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSBleHRlbmRzIE5vblN0cmVhbVJlc291cmNlDQotew0KLQlwcml2YXRlIGZpbmFsIElKYXZhTW9kZWwgamF2YU1vZGVsOw0KLQlwcml2YXRlIGZpbmFsIFNlcnZpY2VNb2RlbERhdGEgc2VydmljZURhdGE7DQotCXByaXZhdGUgZmluYWwgT25FdmVudE1vZGVsU3luY2hyb25pemVyIG1vZGVsU3luY2hyb25pemVyOw0KLQlwcml2YXRlIGZpbmFsIFNlcmlhbGl6ZXJBZGFwdGVyRmFjdG9yeSBzZXJpYWxpemVyRmFjdG9yeTsgDQotDQotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOw0KLQkNCi0JcHJpdmF0ZSBib29sZWFuIHNhdmVFbmFibGVkOw0KLQlwcml2YXRlIGJvb2xlYW4gbG9hZENuYWNlbGVkOw0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3INCi0JICogQHBhcmFtIGphdmFNb2RlbA0KLQkgKi8NCi0JcHVibGljIEpheFdzV29ya3NwYWNlUmVzb3VyY2UoZmluYWwgSUphdmFNb2RlbCBqYXZhTW9kZWwpDQotCXsNCi0JCXRoaXMuamF2YU1vZGVsID0gamF2YU1vZGVsOw0KLQkJc2VydmljZURhdGEgPSBuZXcgU2VydmljZU1vZGVsRGF0YSgpOw0KLQkJbW9kZWxTeW5jaHJvbml6ZXIgPSBuZXcgT25FdmVudE1vZGVsU3luY2hyb25pemVyKHRoaXMsIHNlcnZpY2VEYXRhKTsNCi0JCXNhdmVFbmFibGVkID0gdHJ1ZTsNCi0JCXNlcmlhbGl6ZXJGYWN0b3J5ID0gbmV3IFNlcmlhbGl6ZXJBZGFwdGVyRmFjdG9yeSh0aGlzKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0IHByb2dyZXNzIG1vbml0b3IgaW4gY2FzZSB0aGUgcHJvY2Vzc2luZyBwcm9ncmVzcyBzaG91bGQgYmUgdHJhY2tlZCBhbmQNCi0JICogYWxzbyBpbiBjYXNlIGl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIHByb2Nlc3NpbmcgY2FuIGJlIGNhbmNlbGVkIA0KLQkgKiBAcGFyYW0gcG0gdGhlIG1vbml0b3IgLSBjYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4NCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFByb2dyZXNzTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIHBtKQ0KLQl7DQotCQl0aGlzLm1vbml0b3IgPSBwbTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHJldHVybiB0aGUgbG9hZGVkIERPTSBpbiBjYXNlIGl0IGlzIHN1Y2Nlc3NmdWxseSBsb2FkZWQuIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqIGluIGNhc2UgbG9hZGluZyBoYXMgbm90IGJlZW4gc3RhcnRlZCBhdCBhbGwgb3IgaW4gY2FzZSBsb2FkaW5nIGhhcyBiZWVuIGNhbmNlbGVkLiBUbyBjaGVjayBpZiB0aGUNCi0JICogbG9hZGluZyBoYXMgYmVlbiBjYW5jZWxlZCBjYWxsIGlzTG9hZGluZ0NhbmNlbGVkKCkuDQotCSAqLw0KLQlwdWJsaWMgSURPTSBnZXRET00oKQ0KLQl7DQotCQlpZiAoZ2V0Q29udGVudHMoKS5zaXplKCkgPT0gMCkgew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gKElET00pIGdldENvbnRlbnRzKCkuZ2V0KDApOw0KLQl9DQotDQotCS8qKg0KLQkgKiBBZGRzIGxpc3RlbmVyIGZvciBjaGFuZ2VzIHRvIEphdmEgZWxlbWVudHMgaW4gb3JkZXIgdG8ga2VlcCB0aGUgbW9kZWwgaW4gc3luYw0KLQkgKiB3aXRoIHRoZXNlIGNoYW5nZXMNCi0JICovDQotCXB1YmxpYyB2b2lkIHN0YXJ0U3luY2hyb25pemluZygpDQotCXsNCi0JCUphdmFDb3JlLmFkZEVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIobW9kZWxTeW5jaHJvbml6ZXIsIEVsZW1lbnRDaGFuZ2VkRXZlbnQuUE9TVF9SRUNPTkNJTEUgfCBFbGVtZW50Q2hhbmdlZEV2ZW50LlBPU1RfQ0hBTkdFKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmVtb3ZlcyBsaXN0ZW5lciBmb3IgY2hhbmdlcyB0byBKYXZhIGVsZW1lbnRzLiBLZWVwIGluIG1pbmQgdGhhdCBhZnRlciBjYWxsaW5nDQotCSAqIHRoaXMgbWV0aG9kIGNoYW5nZXMgaW4gamF2YSBlbGVtZW50cyB3aWxsIG5vdCBiZSByZWZsZWN0ZWQgaW4gRE9NIG1vZGVsDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzdG9wU3luY2hyb25pemluZygpDQotCXsNCi0JCUphdmFDb3JlLnJlbW92ZUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIobW9kZWxTeW5jaHJvbml6ZXIpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBAcmV0dXJuIHRoZSBsb2dnZXIgdG8gdXNlIHdoZW4gc29tZSBldmVudCBuZWVkcyB0byBiZSBsb2dnZWQNCi0JICovDQotCXB1YmxpYyBJTG9nZ2VyIGxvZ2dlcigpDQotCXsNCi0JCXJldHVybiBuZXcgTG9nZ2VyKCk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBAcmV0dXJuIHRoZSBqYXZhIG1vZGVsDQotCSAqLw0KLQlwdWJsaWMgSUphdmFNb2RlbCBqYXZhTW9kZWwoKQ0KLQl7DQotCQlyZXR1cm4gamF2YU1vZGVsOw0KLQl9CQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIHZvaWQgZG9Mb2FkKGZpbmFsIE1hcDw/LCA/PiBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24NCi0Jew0KLQkJbG9hZENuYWNlbGVkID0gZmFsc2U7DQotCQlnZXRDb250ZW50cygpLmNsZWFyKCk7DQotDQotCQlmaW5hbCBJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkNCi0JCXsNCi0JCQlwdWJsaWMgdm9pZCBydW4oZmluYWwgSVByb2dyZXNzTW9uaXRvciBzdWJNb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQkJCXsNCi0JCQkJdHJ5IA0KLQkJCQl7CQkNCi0JCQkJCW5ldyBJbml0aWFsTW9kZWxTeW5jaHJvbml6ZXIoSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZS50aGlzLCBzZXJ2aWNlRGF0YSkubG9hZChvcHRpb25zLCBzdWJNb25pdG9yKTsNCi0JCQkJfSANCi0JCQkJY2F0Y2ggKFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uIGUpIHsNCi0JCQkJCWxvYWRDbmFjZWxlZCA9IHRydWU7DQotCQkJCQlsb2dnZXIoKS5sb2dFcnJvcigiSkFYIFdTIFdlYiBTZXJ2aWNlcyBET00gbG9hZGluZyBoYXMgYmVlbiBjYW5jZWxlZCBieSB0aGUgdXNlciwgc29tZSBKQVggV1MgV2ViIFNlcnZpY2VzIGZ1bmN0aW9uYWxpdGllcyB3b24ndCBiZSBhdmFpbGFibGUiLCBlKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQl9DQotCQkJfQ0KLQkJfTsNCi0JCQ0KLQkJdHJ5IHsNCi0JCQlqYXZhTW9kZWwoKS5nZXRXb3Jrc3BhY2UoKS5ydW4ocnVubmFibGUsIG1vbml0b3IpOw0KLQkJfSANCi0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7DQotCQkJdGhyb3cgbmV3IElPV3JhcHBlZEV4Y2VwdGlvbihjZSk7DQotCQl9DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgdm9pZCBkb1NhdmUoTWFwPD8sID8+IG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbgl7DQotCQkvLyBubyBwcm9jZXNzaW5nIG5lZWRlZA0KLQl9DQotDQotCXByb3RlY3RlZCBJRWxlbWVudENoYW5nZWRMaXN0ZW5lciBnZXRTeW5jaHJvbml6aW5nTGlzdGVuZXIoKSB7DQotCQlyZXR1cm4gbW9kZWxTeW5jaHJvbml6ZXI7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBDcmVhdGVzIGNvbXBpbGF0aW9uIHVuaXQgZmluZGVyIHRoYXQgY3Jhd2xzIHRocm91Z2ggamF2YU1vZGVsIGFuZCBjYWxscyANCi0JICogY29tcGlsYXRpb24gdW5pdCBoYW5kbGVyIHRvIHByb2Nlc3MgYXZhaWxhYmxlIENVJ3MgDQotCSAqIEBwYXJhbSBqTW9kZWwNCi0JICogQHBhcmFtIHByb2plY3RTZWxlY3RvcnMNCi0JICogQHJldHVybiBub24gPGNvZGU+bnVsbDwvY29kZT4ge0BsaW5rIElDb21waWxhdGlvblVuaXRGaW5kZXJ9IGluc3RhbmNlIA0KLQkgKi8NCi0JcHVibGljIElDb21waWxhdGlvblVuaXRGaW5kZXIgbmV3Q29tcGlsYXRpb25Vbml0RmluZGVyKGZpbmFsIElKYXZhTW9kZWwgak1vZGVsLCBmaW5hbCBJUHJvamVjdFNlbGVjdG9yW10gcHJvamVjdFNlbGVjdG9ycykNCi0Jew0KLQkJcmV0dXJuIG5ldyBXb3Jrc3BhY2VDVUZpbmRlcihqTW9kZWwsIHByb2plY3RTZWxlY3RvcnMpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBBcHByb3ZlcyB0aGF0IDxjb2RlPnByajwvY29kZT4gaXMgSkFYLVdTIHdlYiBzZXJ2aWNlIGVuYWJsZWQgDQotCSAqIEBwYXJhbSBwcmoNCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbiBjYXNlIHRoaXMgcHJvamVjdCBtaWdodCBjb250YWluIEpBWC1XUyB3ZWIgc2VydmljZXMNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGFwcHJvdmVQcm9qZWN0KGZpbmFsIElKYXZhUHJvamVjdCBwcmopDQotCXsNCi0JCWZpbmFsIElGYWNldFV0aWxzIGZhY2V0VXRpbHMgPSBuZXcgRmFjZXRVdGlscygpOw0KLQkJdHJ5IHsNCi0JCQlyZXR1cm4gZmFjZXRVdGlscy5oYXNGYWNldFdpdGhWZXJzaW9uKHByai5nZXRQcm9qZWN0KCksIEZhY2V0VXRpbHMuRUpCXzMwX0ZBQ0VUX1ZFUlNJT04sIEZhY2V0VXRpbHMuRUpCXzMwX0ZBQ0VUX0lELCB0cnVlKQ0KLQkJCQl8fCBmYWNldFV0aWxzLmhhc0ZhY2V0V2l0aFZlcnNpb24ocHJqLmdldFByb2plY3QoKSwgRmFjZXRVdGlscy5XRUJfMjVfRkFDRVRfVkVSU0lPTiwgRmFjZXRVdGlscy5XRUJfMjVfRkFDRVRfSUQsIHRydWUpOw0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkNCi0JCXsNCi0JCQlsb2dnZXIoKS5sb2dFcnJvcigiVW5hYmxlIHRvIHJlYWQgZmFjZXQgb24gcHJvamVjdCAiICsgcHJqLmdldEVsZW1lbnROYW1lKCkgKyAiLiBBbnkgV2ViIFNlcnZpY2UgZWxlbWVudHMgaW4gdGhpcyBwcm9qZWN0IHdpbGwgbm90IGJlIHNob3duIGluIHRoZSBuYXZpZ2F0aW9uIHRyZWUiLCBjZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENyZWF0ZXMgbmV3IGluc3RhbmNlIG9mIHtAbGluayBJQW5ub3RhdGlvbkluc3BlY3Rvcn0gZm9yIDxjb2RlPnR5cGU8L2NvZGU+DQotCSAqIEBwYXJhbSB0eXBlDQotCSAqIEByZXR1cm4gbm9uIDxjb2RlPm51bGw8L2NvZGU+IGluc3BlY3Rvcg0KLQkgKi8NCi0JcHVibGljIElBbm5vdGF0aW9uSW5zcGVjdG9yIG5ld0Fubm90YXRpb25JbnNwZWN0b3IoZmluYWwgSVR5cGUgdHlwZSkNCi0Jew0KLQkJcmV0dXJuIEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IodHlwZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gbm9uIGVtcHR5IGFycmF5IG9mIHByb2plY3RzIHNlbGVjdG9ycyByZXNwb25zaWJsZSBmb3IgZmlsdGVyaW5nIHByb2Nlc3NlZCBwcm9qZWN0cyANCi0JICovDQotCXB1YmxpYyBJUHJvamVjdFNlbGVjdG9yW10gZ2V0UHJvamVjdFNlbGVjdG9ycygpDQotCXsNCi0JCXJldHVybiBuZXcgSVByb2plY3RTZWxlY3RvcltdIHsgbmV3IElQcm9qZWN0U2VsZWN0b3IoKQ0KLQkJew0KLQkJCXB1YmxpYyBib29sZWFuIGFwcHJvdmUoSUphdmFQcm9qZWN0IHByaikNCi0JCQl7DQotCQkJCXJldHVybiBhcHByb3ZlUHJvamVjdChwcmopOw0KLQkJCX0NCi0JCX0gfTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHJldHVybiB0aGUgc2VyaWFsaXplciBmYWN0b3J5IHVzZWQgdG8gYWRhcHQgRE9NIG9iamVjdHMgd2l0aCBzZXJpYWxpemVyIGFkYXB0ZXJzICANCi0JICovDQotCXB1YmxpYyBTZXJpYWxpemVyQWRhcHRlckZhY3RvcnkgZ2V0U2VyaWFsaXplckZhY3RvcnkoKSB7DQotCQlyZXR1cm4gc2VyaWFsaXplckZhY3Rvcnk7DQotCX0NCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNhdmluZyBpcyBlbmFibGVkDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVFbmFibGVkKCkgew0KLQkJcmV0dXJuIHNhdmVFbmFibGVkOw0KLQl9DQotDQotCS8qKg0KLQkgKiBjYWxsIHRoaXMgbWV0aG9kIHRvIGVuYWJsZSBzYXZpbmcgb2YgbW9kZWwgb2JqZWN0cyB0byB1bmRlcmx5aW5nIHJlc291cmNlcw0KLQkgKi8NCi0Jc3luY2hyb25pemVkIHB1YmxpYyB2b2lkIGVuYWJsZVNhdmluZygpIHsNCi0JCXRoaXMuc2F2ZUVuYWJsZWQgPSB0cnVlOw0KLQl9DQotCQ0KLQkvKioNCi0JICogY2FsbCB0aGlzIG1ldGhvZCB0byBkaXNhYmxlIHNhdmluZyBvZiBtb2RlbCBvYmplY3RzIHRvIHVuZGVybHlpbmcgcmVzb3VyY2VzDQotCSAqLw0KLQlzeW5jaHJvbml6ZWQgcHVibGljIHZvaWQgZGlzYWJsZVNhdmluZygpIHsNCi0JCXRoaXMuc2F2ZUVuYWJsZWQgPSBmYWxzZTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW4gY2FzZSB0aGUgbG9hZCBvZiBET00gbW9kZWwgaGFzIGJlZW4gY2FuY2VsZWQNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzTG9hZENuYWNlbGVkKCkgew0KLQkJcmV0dXJuIGxvYWRDbmFjZWxlZDsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIEhvbGRzIG1vZGVsIGRhdGEgaGVscGZ1bCBpbiBtb2RlbCBwcm9jZXNzaW5nDQotCSAqLw0KLQlwdWJsaWMgY2xhc3MgU2VydmljZU1vZGVsRGF0YQ0KLQl7DQotCQlwcml2YXRlIE1hcDxJV2ViU2VydmljZSwgU3RyaW5nPiB3czJzZWkgPSBuZXcgSGFzaE1hcDxJV2ViU2VydmljZSwgU3RyaW5nPigpOw0KLQ0KLQkJcHJpdmF0ZSBNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPElXZWJTZXJ2aWNlPj4gc2VpMndzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPElXZWJTZXJ2aWNlPj4oKTsNCi0NCi0JCXByaXZhdGUgTWFwPFN0cmluZywgQ29sbGVjdGlvbjxJQ29tcGlsYXRpb25Vbml0Pj4gdHlwZTJpbmhlcml0ZWQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENvbGxlY3Rpb248SUNvbXBpbGF0aW9uVW5pdD4+KCk7DQotDQotCQlwdWJsaWMgdm9pZCBtYXAoSVdlYlNlcnZpY2Ugd3MsIFN0cmluZyBzZWlJbXBsKQ0KLQkJew0KLQkJCXdzMnNlaS5wdXQod3MsIHNlaUltcGwpOw0KLQkJCWdldEltcGxlbWVudGluZ1dzKHNlaUltcGwpLmFkZCh3cyk7DQotCQl9DQotDQotCQlTdHJpbmcgZ2V0U2VpSW1wbChJV2ViU2VydmljZSB3cykNCi0JCXsNCi0JCQlyZXR1cm4gd3Myc2VpLmdldCh3cyk7DQotCQl9DQotDQotCQlwdWJsaWMgQ29sbGVjdGlvbjxJV2ViU2VydmljZT4gZ2V0SW1wbGVtZW50aW5nV3MoU3RyaW5nIHNlaUltbCkNCi0JCXsNCi0JCQlDb2xsZWN0aW9uPElXZWJTZXJ2aWNlPiB3c3MgPSBzZWkyd3MuZ2V0KHNlaUltbCk7DQotCQkJaWYgKHdzcyA9PSBudWxsKQ0KLQkJCXsNCi0JCQkJd3NzID0gbmV3IEFycmF5TGlzdDxJV2ViU2VydmljZT4oKTsNCi0JCQkJc2VpMndzLnB1dChzZWlJbWwsIHdzcyk7DQotCQkJfQ0KLQkJCXJldHVybiB3c3M7DQotCQl9DQotDQotCQlwdWJsaWMgdm9pZCB1bm1hcChJV2ViU2VydmljZSB3cykNCi0JCXsNCi0JCQlmaW5hbCBTdHJpbmcgc2VpID0gd3Myc2VpLnJlbW92ZSh3cyk7DQotCQkJZmluYWwgQ29sbGVjdGlvbjxJV2ViU2VydmljZT4gaW1wbGVtZW50aW5nV2ViU2VydmljZXMgPSBnZXRJbXBsZW1lbnRpbmdXcyhzZWkpOw0KLQkJCWltcGxlbWVudGluZ1dlYlNlcnZpY2VzLnJlbW92ZSh3cyk7DQotCQkJaWYgKGltcGxlbWVudGluZ1dlYlNlcnZpY2VzLnNpemUoKSA9PSAwKQ0KLQkJCXsNCi0JCQkJc2VpMndzLnJlbW92ZShzZWkpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXB1YmxpYyB2b2lkIHJlY29yZEhpZXJhcmNoeShTdHJpbmcgZnFOYW1lLCBDb2xsZWN0aW9uPElDb21waWxhdGlvblVuaXQ+IGluaGVyaXRlZFR5cGVzKQ0KLQkJew0KLQkJCXR5cGUyaW5oZXJpdGVkLnB1dChmcU5hbWUsIGluaGVyaXRlZFR5cGVzKTsNCi0JCX0NCi0NCi0JCS8qKg0KLQkJICogQHBhcmFtIGZxTmFtZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUNCi0JCSAqIEByZXR1cm4gY29sbGVjdGlvbiBvZiBjbGFzc2VzIHRoYXQgYXJlIHN1cGVyIGZvciBjbGFzcyA8Y29kZT5mcU5hbWU8L2NvZGU+DQotCQkgKi8NCi0JCXB1YmxpYyBDb2xsZWN0aW9uPElDb21waWxhdGlvblVuaXQ+IGdldEhpZXJhcmNoeShTdHJpbmcgZnFOYW1lKQ0KLQkJew0KLQkJCXJldHVybiB0eXBlMmluaGVyaXRlZC5nZXQoZnFOYW1lKTsNCi0JCX0NCi0NCi0JCS8qKg0KLQkJICogQ2xlYXJzIHJlY29yZGVyIGhpZXJhcmNoeSBmb3IgY2xhc3Mgd2l0aCBGUU5hbWUgPGNvZGU+ZnFOYW1lPC9jb2RlPg0KLQkJICogQHBhcmFtIGZxTmFtZQ0KLQkJICovDQotCQlwdWJsaWMgdm9pZCBjbGVhckhpZXJhcmNoeShTdHJpbmcgZnFOYW1lKQ0KLQkJew0KLQkJCXR5cGUyaW5oZXJpdGVkLnJlbW92ZShmcU5hbWUpOw0KLQkJfQ0KLQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9KZWU1V3NEb21SdW50aW1lRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhmMTJkMmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9KZWU1V3NEb21SdW50aW1lRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U7DQotDQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET007DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdzRE9NUnVudGltZUV4dGVuc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV3NEb21Mb2FkTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5wbHVnaW4uSmF4V3NEb21SdW50aW1lTWVzc2FnZXM7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtOw0KLQ0KLXB1YmxpYyBjbGFzcyBKZWU1V3NEb21SdW50aW1lRXh0ZW5zaW9uIGltcGxlbWVudHMgSVdzRE9NUnVudGltZUV4dGVuc2lvbg0KLXsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5qZWU1IjsvLyROT04tTkxTLTEkDQotCQ0KLQlwcml2YXRlIExpc3Q8SVdzRG9tTG9hZExpc3RlbmVyPiBsaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElXc0RvbUxvYWRMaXN0ZW5lcj4oKTsNCi0JcHJpdmF0ZSBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHdvcmtzcGFjZVJlc291cmNlOw0KLQlwcml2YXRlIGJvb2xlYW4gZmluaXNoZWQ7DQotCXByaXZhdGUgYm9vbGVhbiBzdGFydGVkOw0KLQ0KLQlwdWJsaWMgdm9pZCBjcmVhdGVET00oZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uDQotCXsNCi0JCUpvYi5nZXRKb2JNYW5hZ2VyKCkuYmVnaW5SdWxlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCksIG1vbml0b3IpOw0KLQkJdHJ5IHsNCi0JCQlpZiAod29ya3NwYWNlUmVzb3VyY2UgPT0gbnVsbCB8fCB3b3Jrc3BhY2VSZXNvdXJjZS5pc0xvYWRDbmFjZWxlZCgpKSB7CQkJDQotCQkJCXBlcmZvcm1Mb2FkKG1vbml0b3IpOw0KLQkJCX0NCi0JCX0gZmluYWxseSB7DQotCQkJSm9iLmdldEpvYk1hbmFnZXIoKS5lbmRSdWxlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOw0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBwZXJmb3JtTG9hZChmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiwgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24gDQotCXsNCi0JCXdvcmtzcGFjZVJlc291cmNlID0gY3JlYXRlUmVzb3VyY2UoKTsNCi0JCXdvcmtzcGFjZVJlc291cmNlLnNldFByb2dyZXNzTW9uaXRvcihtb25pdG9yKTsNCi0JCXRyeSB7DQotCQkJc3RhcnRlZCgpOw0KLQkJCXdvcmtzcGFjZVJlc291cmNlLmxvYWQobnVsbCk7DQotCQkJaWYgKHdvcmtzcGFjZVJlc291cmNlLmlzTG9hZENuYWNlbGVkKCkpIHsNCi0JCQkJdGhyb3cgY3JlYXRlQ2FuY2VsZWRFeGNlcHRpb24oKTsNCi0JCQl9DQotCQl9IGZpbmFsbHkgew0KLQkJCWZpbmlzaGVkKCk7DQotCQl9DQotCQkNCi0JCXdvcmtzcGFjZVJlc291cmNlLnN0YXJ0U3luY2hyb25pemluZygpOw0KLQl9DQotDQotCXB1YmxpYyBJRE9NIGdldERPTSgpIHRocm93cyBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbg0KLQl7DQotCQlpZiAod29ya3NwYWNlUmVzb3VyY2UgPT0gbnVsbCkgew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQkJDQotCQlpZiAod29ya3NwYWNlUmVzb3VyY2UuaXNMb2FkQ25hY2VsZWQoKSkgew0KLQkJCXRocm93IGNyZWF0ZUNhbmNlbGVkRXhjZXB0aW9uKCk7DQotCQl9DQotCQkNCi0JCXJldHVybiB3b3Jrc3BhY2VSZXNvdXJjZS5nZXRET00oKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgYWRkTG9hZExpc3RlbmVyKElXc0RvbUxvYWRMaXN0ZW5lciBsaXN0ZW5lcikgDQotCXsNCi0JCW51bGxDaGVja1BhcmFtKGxpc3RlbmVyLCAibGlzdGVuZXIiKTsvLyROT04tTkxTLTEkDQotCQkNCi0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJzKSB7DQotCQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7DQotCQl9DQotCQkNCi0JCWlmIChzdGFydGVkKSB7DQotCQkJbGlzdGVuZXIuc3RhcnRlZCgpOwkJCQ0KLQkJfQ0KLQkJDQotCQlpZiAoZmluaXNoZWQpIHsNCi0JCQlsaXN0ZW5lci5maW5pc2hlZCgpOwkJCQ0KLQkJfQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCByZW1vdmVMb2FkTGlzdGVuZXIoSVdzRG9tTG9hZExpc3RlbmVyIGxpc3RlbmVyKSANCi0Jew0KLQkJbnVsbENoZWNrUGFyYW0obGlzdGVuZXIsICJsaXN0ZW5lciIpOy8vJE5PTi1OTFMtMSQNCi0JCQ0KLQkJc3luY2hyb25pemVkIChsaXN0ZW5lcnMpIHsNCi0JCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElKYXZhTW9kZWwgamF2YU1vZGVsKCkgew0KLQkJcmV0dXJuIEphdmFDb3JlLmNyZWF0ZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoKSB7IA0KLQkJcmV0dXJuIG5ldyBKYXhXc1dvcmtzcGFjZVJlc291cmNlKGphdmFNb2RlbCgpKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIHZvaWQgZmluaXNoZWQoKSANCi0Jew0KLQkJZmluaXNoZWQgPSB0cnVlOw0KLQkJZm9yIChJV3NEb21Mb2FkTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsNCi0JCQlsaXN0ZW5lci5maW5pc2hlZCgpOw0KLQkJfQ0KLQl9DQotDQotCXByb3RlY3RlZCB2b2lkIHN0YXJ0ZWQoKSANCi0Jew0KLQkJc3RhcnRlZCA9IHRydWU7DQotCQlmaW5pc2hlZCA9IGZhbHNlOw0KLQkJZm9yIChJV3NEb21Mb2FkTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsNCi0JCQlsaXN0ZW5lci5zdGFydGVkKCk7DQotCQl9DQotCX0NCi0JDQotCXByaXZhdGUgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24gY3JlYXRlQ2FuY2VsZWRFeGNlcHRpb24oKSB7DQotCQlyZXR1cm4gbmV3IFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uKCJKQVgtV1MgRE9NIGxvYWRpbmcgY2FuY2VsZWQiLCBKYXhXc0RvbVJ1bnRpbWVNZXNzYWdlcy5Xb3Jrc3BhY2VDVUZpbmRlcl9MT0FESU5HX0NBTkNFTEVEKTsgLy8kTk9OLU5MUy0xJA0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvTm9uU3RyZWFtUmVzb3VyY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvTm9uU3RyZWFtUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGY2YTVhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL05vblN0cmVhbVJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U7DQotDQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlSW1wbDsNCi0NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTm9uU3RyZWFtUmVzb3VyY2UgZXh0ZW5kcyBSZXNvdXJjZUltcGwgew0KLQ0KLQkvKioNCi0JICogU2luY2UgdGhpcyBSZXNvdXJjZSBpcyBub3Qgc3RyZWFtIGJhc2VkLCB0aGlzIG1ldGhvZCBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkLg0KLQkgKiBJZiBjYWxsZWQgaXQgd2lsbCB0aHJvdyA8Yz5VbnN1cHBvcnRlZEV4Y2VwdGlvbjwvYz4NCi0JICogQHBhcmFtIGFyZzAgLSBpZ25vcnJlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGRvTG9hZChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgTWFwPD8sPz4gb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCXN1cGVyLmRvTG9hZChpbnB1dFN0cmVhbSwgb3B0aW9ucyk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBTaW5jZSB0aGlzIFJlc291cmNlIGlzIG5vdCBzdHJlYW0gYmFzZWQsIHRoaXMgbWV0aG9kIHNob3VsZCBuZXZlciBiZSBjYWxsZWQuDQotCSAqIElmIGNhbGxlZCBpdCB3aWxsIHRocm93IDxjPlVuc3VwcG9ydGVkRXhjZXB0aW9uPC9jPg0KLQkgKiBAcGFyYW0gYXJnMCAtIGlnbm9ycmVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZG9TYXZlKE91dHB1dFN0cmVhbSBhcmcwLCBNYXA8Pyw/PiBhcmcxKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJc3VwZXIuZG9TYXZlKGFyZzAsIGFyZzEpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBBbGx3YXN5IHRocm93cyA8Yz5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjwvYz4uIFN0cmVhbXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyByZXNvdXJjZS4NCi0JICogQHJldHVybiBub3RoaW5nLiB0aGlzIG1ldGhvZCBhbGx3YXlzIHRocm93cyA8Yz5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjwvYz4NCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc0NvbnRlbnRaaXBFbnRyeShaaXBFbnRyeSBhcmcwKSB7DQotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2luY2UgdGhpcyByZXNvdXJjZSBkb2Vzbid0IHN1cHBvcnQgc3RyZWFtcyB0aGlzIG1ldGhvZCBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkLiBBbGx3YXN5IHRocm93cyA8Yz5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjwvYz4uDQotCSAqIEByZXR1cm4gbm90aGluZy4gdGhpcyBtZXRob2QgYWxsd2F5cyB0aHJvd3MgPGM+VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb248L2M+DQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIGZpbmFsIFppcEVudHJ5IG5ld0NvbnRlbnRaaXBFbnRyeSgpIHsNCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogU2luY2UgdGhpcyByZXNvdXJjZSBkb2Vzbid0IHN1cHBvcnQgc3RyZWFtcyB0aGlzIG1ldGhvZCBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkLiBBbGx3YXN5IHRocm93cyA8Yz5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjwvYz4uDQotCSAqIEByZXR1cm4gbm90aGluZy4gdGhpcyBtZXRob2QgYWxsd2F5cyB0aHJvd3MgPGM+VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb248L2M+DQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gdXNlWmlwKCkgew0KLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBmaW5hbCB2b2lkIGxvYWQoTWFwPD8sPz4gb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0NCi0JCWlmICghaXNMb2FkZWQoKSkgew0KLQkJCU5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24gPSBzZXRMb2FkZWQodHJ1ZSk7DQotCQkJaXNMb2FkaW5nID0gdHJ1ZTsNCi0JCQlpZiAoZXJyb3JzICE9IG51bGwpIHsNCi0JCQkJZXJyb3JzLmNsZWFyKCk7DQotCQkJfQ0KLQkJCWlmICh3YXJuaW5ncyAhPSBudWxsKSB7DQotCQkJCXdhcm5pbmdzLmNsZWFyKCk7DQotCQkJfQ0KLQkJCXRyeSB7DQotCQkJICAgIE1hcDw/LD8+IG1lcmdlZE9wdGlvbnMgPSBtZXJnZU1hcHMob3B0aW9ucywgZGVmYXVsdExvYWRPcHRpb25zKTsNCi0JCQkJZG9Mb2FkKG1lcmdlZE9wdGlvbnMpOw0KLQkJCX0gZmluYWxseSB7DQotCQkJCQ0KLQkJCQlpc0xvYWRpbmcgPSBmYWxzZTsNCi0JCQkJaWYgKG5vdGlmaWNhdGlvbiAhPSBudWxsKSB7DQotCQkJCQllTm90aWZ5KG5vdGlmaWNhdGlvbik7DQotCQkJCX0NCi0JCQkJc2V0TW9kaWZpZWQoZmFsc2UpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENhbGxlZCB0byBsb2FkIHRoZSByZXNvdXJjZSB1c2luZyBubyBzdHJlYW1zLg0KLQkgKg0KLQkgKiBAcGFyYW0gb3B0aW9ucyAtIG9wdGlvbnMgc3VwcGxpZWQgYnkgdGhlIGNhbGxlci4gVGhpcyBtZXRvZCB3aWxsIGlnbm9yZSBhbnkgb3B0aW9ucyB0aGF0IGl0IGRvZXNuJ3QgcmVjb2duaXplLiBUaGUga2V5cyBhbmQgdGhlIHZhbHVlcyBjYW4gYmUgYXJiaXRyYXJ5IG9iamVjdHMuDQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gLSB0aHJvd24gaWYgZXJyb3Igb2NjdXJyZWQgd2hpbGUgbG9hZGluZyB0aGUgY29udGVudCBvZiB0aGlzIHJlc291cmNlDQotCSAqLw0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBkb0xvYWQoTWFwPD8sPz4gb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uOw0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBmaW5hbCB2b2lkIHNhdmUoTWFwPD8sPz4gb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JICAgIGlmIChlcnJvcnMgIT0gbnVsbCkNCi0JICAgIHsNCi0JICAgICAgZXJyb3JzLmNsZWFyKCk7DQotCSAgICB9DQotCSAgICBpZiAod2FybmluZ3MgIT0gbnVsbCkNCi0JICAgIHsNCi0JICAgICAgd2FybmluZ3MuY2xlYXIoKTsNCi0JICAgIH0NCi0JICAgIE1hcDw/LD8+IG1lcmdlZE9wdGlvbnMgPSBtZXJnZU1hcHMob3B0aW9ucywgZGVmYXVsdFNhdmVPcHRpb25zKTsNCi0JICAgIGRvU2F2ZShtZXJnZWRPcHRpb25zKTsNCi0JICAgIHNldE1vZGlmaWVkKGZhbHNlKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENhbGxlZCB0byBzYXZlIHRoZSByZXNvdXJjZSB1c2luZyBubyBzdHJlYW1zLg0KLQkgKiBAcGFyYW0gb3B0aW9ucyAtIG9wdGlvbnMgc3VwcGxpZWQgYnkgdGhlIGNhbGxlci4gVGhpcyBtZXRvZCB3aWxsIGlnbm9yZSBhbnkgb3B0aW9ucyB0aGF0IGl0IGRvZXNuJ3QgcmVjb2duaXplLiBUaGUga2V5cyBhbmQgdGhlIHZhbHVlcyBjYW4gYmUgYXJiaXRyYXJ5IG9iamVjdHMuDQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gLSBpZiBwcm9ibGVtIGR1cmluZyB0aGUgc2F2aW5nIG9jY3VycmVkLg0KLQkgKi8NCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9TYXZlKE1hcDw/LD8+IG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbjsNCi0JDQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvU0JBbm5vdGF0aW9uRmVhdHVyZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvU0JBbm5vdGF0aW9uRmVhdHVyZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2E4MWZiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL1NCQW5ub3RhdGlvbkZlYXR1cmVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZTsNCi0NCi0vKioNCi0gKiBDb250YWlucyBTT0FQQmluZGluZyBhbm5vdGF0aW9uIG5hbWUsIGF0dHJpYnV0ZXMgYW5kIHBvc3NpYmxlIHZhbHVlcw0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgU0JBbm5vdGF0aW9uRmVhdHVyZXMgDQotew0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQl9BTk5PVEFUSU9OID0gImphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nIjsvLyROT04tTkxTLTEkDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUWUxFX0FUVFJJQlVURSA9ICJzdHlsZSI7Ly8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfQVRUUklCVVRFID0gInVzZSI7Ly8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJfU1RZTEVfQVRUUklCVVRFID0gInBhcmFtZXRlclN0eWxlIjsvLyROT04tTkxTLTEkDQotCQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQl9TVFlMRV9ET0NVTUVOVCAJPSBTQl9BTk5PVEFUSU9OICsgIi5TdHlsZS5ET0NVTUVOVCI7Ly8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQl9TVFlMRV9SUEMgCQk9IFNCX0FOTk9UQVRJT04gKyAiLlNPQVBCaW5kaW5nLlN0eWxlLlJQQyI7Ly8kTk9OLU5MUy0xJA0KLQkNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0JfVVNFX0xJVEVSQUwgCT0gU0JfQU5OT1RBVElPTiArICIuVXNlLkxJVEVSQUwiOy8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0JfVVNFX0VOQ09ERUQgCT0gU0JfQU5OT1RBVElPTiArICIuVXNlLkVOQ09ERUQiOy8vJE5PTi1OTFMtMSQNCi0JDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNCX1BBUkFNRVRFUl9TVFlMRV9CQVJFIAkJPSBTQl9BTk5PVEFUSU9OICsgIi5QYXJhbWV0ZXJTdHlsZS5CQVJFIjsvLyROT04tTkxTLTEkDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNCX1BBUkFNRVRFUl9TVFlMRV9XUkFQUEVECT0gU0JfQU5OT1RBVElPTiArICIuUGFyYW1ldGVyU3R5bGUuV1JBUFBFRCI7Ly8kTk9OLU5MUy0xJA0KLQkNCi0JDQotCXByaXZhdGUgU0JBbm5vdGF0aW9uRmVhdHVyZXMoKSB7DQotCQkvLyBubyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL1dNQW5ub3RhdGlvbkZlYXR1cmVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL1dNQW5ub3RhdGlvbkZlYXR1cmVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE0OTg5Y2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9XTUFubm90YXRpb25GZWF0dXJlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U7DQotDQotcHVibGljIGZpbmFsIGNsYXNzIFdNQW5ub3RhdGlvbkZlYXR1cmVzDQotew0KLQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTV9BTk5PVEFUSU9OID0gImphdmF4Lmp3cy5XZWJNZXRob2QiOy8vJE5PTi1OTFMtMSQNCi0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01fTkFNRV9BVFRSSUJVVEUgPSAib3BlcmF0aW9uTmFtZSI7Ly8kTk9OLU5MUy0xJA0KLQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTV9FWENMVURFRF9BVFRSSUJVVEUgPSAiZXhjbHVkZSI7Ly8kTk9OLU5MUy0xJA0KLQ0KLQlwcml2YXRlIFdNQW5ub3RhdGlvbkZlYXR1cmVzKCkNCi0Jew0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvV1BBbm5vdGF0aW9uRmVhdHVyZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvV1BBbm5vdGF0aW9uRmVhdHVyZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDdjMzJmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL1dQQW5ub3RhdGlvbkZlYXR1cmVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZTsNCi0NCi0NCi0vKioNCi0gKiBDbGFzcyB0aGF0IGhvbGRzIGluZm9ybWF0aW9uIG9uIGphdmF4Lmp3cy5XZWJQYXJhbSBhbm5vdGF0aW9uIG5hbWUgYW5kIGF0dHJpYnV0ZSBuYW1lcy4gDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLWZpbmFsIHB1YmxpYyBjbGFzcyBXUEFubm90YXRpb25GZWF0dXJlcyANCi17DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdQX0FOTk9UQVRJT04gPSAiamF2YXguandzLldlYlBhcmFtIjsvLyROT04tTkxTLTEkDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfQVRUUklCVVRFID0gIm5hbWUiOy8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSVF9OQU1FX0FUVFJJQlVURSA9ICJwYXJ0TmFtZSI7Ly8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfTkFNRVNQQUNFX0FUVFJJQlVURSA9ICJ0YXJnZXROYW1lc3BhY2UiOy8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ERV9BVFRSSUJVVEUgPSAibW9kZSI7Ly8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQVRUUklCVVRFID0gImhlYWRlciI7Ly8kTk9OLU5MUy0xJA0KLQkNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX1BBUkFNX01PREUgPSAiamF2YXguandzLldlYlBhcmFtLk1vZGUiOy8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX1BBUkFNX01PREVfSU4gPSBXRUJfUEFSQU1fTU9ERSArICIuSU4iOy8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX1BBUkFNX01PREVfT1VUID0gV0VCX1BBUkFNX01PREUgKyAiLk9VVCI7Ly8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfUEFSQU1fTU9ERV9JTk9VVCA9IFdFQl9QQVJBTV9NT0RFICsgIi5JTk9VVCI7Ly8kTk9OLU5MUy0xJA0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL1dTQW5ub3RhdGlvbkZlYXR1cmVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL1dTQW5ub3RhdGlvbkZlYXR1cmVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA5ZjE1ZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9XU0Fubm90YXRpb25GZWF0dXJlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U7DQotDQotZmluYWwgcHVibGljIGNsYXNzIFdTQW5ub3RhdGlvbkZlYXR1cmVzDQotew0KLQlwcml2YXRlIFdTQW5ub3RhdGlvbkZlYXR1cmVzKCkNCi0Jew0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTX0FOTk9UQVRJT04gPSAiamF2YXguandzLldlYlNlcnZpY2UiOy8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9BVFRSSUJVVEUgPSAibmFtZSI7Ly8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRQT0lOVF9JTlRFUkZBQ0VfQVRUUklCVVRFID0gImVuZHBvaW50SW50ZXJmYWNlIjsvLyROT04tTkxTLTEkDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfTkFNRV9BVFRSSUJVVEUgPSAic2VydmljZU5hbWUiOy8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9MT0NBVElPTl9BVFRSSUJVVEUgPSAid3NkbExvY2F0aW9uIjsvLyROT04tTkxTLTEkDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9OQU1FU1BBQ0VfQVRUUklCVVRFID0gInRhcmdldE5hbWVzcGFjZSI7Ly8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUX05BTUVfQVRUUklCVVRFID0gInBvcnROYW1lIjsJLy8kTk9OLU5MUy0xJA0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL1dvcmtzcGFjZUNVRmluZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL1dvcmtzcGFjZUNVRmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlkYzhmMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9Xb3Jrc3BhY2VDVUZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5wbHVnaW4uSmF4V3NEb21SdW50aW1lTWVzc2FnZXM7DQotDQotcHVibGljIGNsYXNzIFdvcmtzcGFjZUNVRmluZGVyIGltcGxlbWVudHMgSUNvbXBpbGF0aW9uVW5pdEZpbmRlcg0KLXsNCi0JcHJpdmF0ZSBmaW5hbCBJSmF2YU1vZGVsIGphdmFNb2RlbDsNCi0JcHJpdmF0ZSBmaW5hbCBJUHJvamVjdFNlbGVjdG9yW10gc2VsZWN0b3JzOw0KLQkNCi0JcHVibGljIFdvcmtzcGFjZUNVRmluZGVyKElKYXZhTW9kZWwgamF2YU1vZGVsLCBJUHJvamVjdFNlbGVjdG9yW10gc2VsZWN0b3JzKSB7DQotCQlpZiAoamF2YU1vZGVsID09IG51bGwpIHsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImphdmFNb2RlbCIpOy8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCXRoaXMuamF2YU1vZGVsID0gamF2YU1vZGVsOw0KLQkJaWYgKHNlbGVjdG9ycyA9PSBudWxsKSB7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJzZWxlY3RvciIpOy8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCXRoaXMuc2VsZWN0b3JzID0gc2VsZWN0b3JzOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBmaW5kKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgZmluYWwgSUNvbXBpbGF0aW9uVW5pdEhhbmRsZXIgY3VIYW5kbGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24NCi0Jew0KLQkJY3VIYW5kbGVyLnN0YXJ0ZWQoKTsNCi0JCWlmIChtb25pdG9yICE9IG51bGwpIHsNCi0JCQltb25pdG9yLmJlZ2luVGFzayhKYXhXc0RvbVJ1bnRpbWVNZXNzYWdlcy5KQVhXU19ET01fTE9BRElORywgYXNzdW1lV29yaygpKTsNCi0JCX0JCQ0KLQkJdHJ5IHsNCi0JCQlmb3IgKElKYXZhUHJvamVjdCBwcmogOiBqYXZhTW9kZWwuZ2V0SmF2YVByb2plY3RzKCkpDQotCQkJew0KLQkJCQlpZiAobW9uaXRvciE9bnVsbCAmJiBtb25pdG9yLmlzQ2FuY2VsZWQoKSkgew0KLQkJCQkJdGhyb3cgbmV3IFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uKCJKQVgtV1MgRE9NIGxvYWRpbmcgY2FuY2VsZWQiLCBKYXhXc0RvbVJ1bnRpbWVNZXNzYWdlcy5Xb3Jrc3BhY2VDVUZpbmRlcl9MT0FESU5HX0NBTkNFTEVEKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQl9DQotCQkJCQ0KLQkJCQlpZiAoYXBwcm92ZShwcmopKQ0KLQkJCQl7DQotCQkJCQljdUhhbmRsZXIuaGFuZGxlKHByaik7DQotCQkJCQlwYXJzZVByb2plY3QocHJqLCBtb25pdG9yLCBjdUhhbmRsZXIpOw0KLQkJCQl9DQotCQkJfQ0KLQkJCWN1SGFuZGxlci5maW5pc2hlZCgpOw0KLQkJfSBmaW5hbGx5IHsNCi0JCQlpZiAobW9uaXRvciAhPSBudWxsKSB7DQotCQkJCW1vbml0b3IuZG9uZSgpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIGludCBhc3N1bWVXb3JrKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIENvdW50aW5nQ1VIYW5kbGVyIGNvdW50aW5nSGFuZGxlciA9IG5ldyBDb3VudGluZ0NVSGFuZGxlcigpOw0KLQkJZm9yIChJSmF2YVByb2plY3QgcHJqIDogamF2YU1vZGVsLmdldEphdmFQcm9qZWN0cygpKSB7CQkNCi0JCQlpZiAoYXBwcm92ZShwcmopKSB7DQotCQkJCXBhcnNlUHJvamVjdChwcmosIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIGNvdW50aW5nSGFuZGxlcik7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gY291bnRpbmdIYW5kbGVyLmNvdW50Ow0KLQl9DQotCQ0KLQlwcml2YXRlIHZvaWQgcGFyc2VQcm9qZWN0KGZpbmFsIElKYXZhUHJvamVjdCBwcmosIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgZmluYWwgSUNvbXBpbGF0aW9uVW5pdEhhbmRsZXIgY3VIYW5kbGVyKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbiANCi0Jew0KLQkJZm9yIChJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA6IHByai5nZXRQYWNrYWdlRnJhZ21lbnRzKCkpIA0KLQkJew0KLQkJCWlmIChwYWNrYWdlRnJhZ21lbnQuZ2V0S2luZCgpICE9IElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFKSB7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQkNCi0JCQlmb3IgKElDb21waWxhdGlvblVuaXQgY3UgOiBwYWNrYWdlRnJhZ21lbnQuZ2V0Q29tcGlsYXRpb25Vbml0cygpKSANCi0JCQl7DQotCQkJCWlmIChtb25pdG9yIT1udWxsICYmIG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7DQotCQkJCQl0aHJvdyBuZXcgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24oIkpBWC1XUyBET00gbG9hZGluZyBjYW5jZWxlZCIsSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuV29ya3NwYWNlQ1VGaW5kZXJfTE9BRElOR19DQU5DRUxFRCk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJfQ0KLQkJCQkNCi0JCQkJY3VIYW5kbGVyLmhhbmRsZShjdSk7DQotCQkJCQ0KLQkJCQlpZiAobW9uaXRvciAhPSBudWxsKSB7DQotCQkJCQltb25pdG9yLndvcmtlZCgxKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSBib29sZWFuIGFwcHJvdmUoSUphdmFQcm9qZWN0IHByaikgew0KLQkJZm9yIChJUHJvamVjdFNlbGVjdG9yIHNlbGVjdG9yIDogc2VsZWN0b3JzKSB7DQotCQkJaWYgKHNlbGVjdG9yLmFwcHJvdmUocHJqKSkgew0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBUaGlzIGhhbmRsZXIgY291bnRzIHRoZSBjb21waWxhdGlvbiB1bml0cyANCi0JICogIA0KLQkgKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotCSAqLw0KLQlwcm90ZWN0ZWQgY2xhc3MgQ291bnRpbmdDVUhhbmRsZXIgaW1wbGVtZW50cyBJQ29tcGlsYXRpb25Vbml0SGFuZGxlciANCi0Jew0KLQkJcHJpdmF0ZSBpbnQgY291bnQ7DQotCQkNCi0JCXB1YmxpYyB2b2lkIHN0YXJ0ZWQoKSB7DQotCQkJY291bnQgPSAwOw0KLQkJfQ0KLQkJDQotCQlwdWJsaWMgdm9pZCBoYW5kbGUoSUNvbXBpbGF0aW9uVW5pdCBjdSkgew0KLQkJCWNvdW50Kys7DQotCQl9DQotCQkNCi0JCXB1YmxpYyB2b2lkIGZpbmlzaGVkKCkgeyAvKiBubyBwcm9jZXNzaW5nIG5lZWRlZCAqLyB9DQotCQlwdWJsaWMgdm9pZCBoYW5kbGUoSUphdmFQcm9qZWN0IGpwcmopIHsgLyogbm8gcHJvY2Vzc2luZyBuZWVkZWQgKi8gfQ0KLQl9CQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2Fubm90YXRpb24vQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2Fubm90YXRpb24vQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZlYWZhZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9hbm5vdGF0aW9uL0Fubm90YXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuYW5ub3RhdGlvbi5pbXBsLkFubm90YXRpb25BZGFwdGVyOw0KLQ0KLS8qKg0KLSAqIEZhY3RvcnkgdGhhdCBhZGFwdHMgRE9NIG9iamVjdHMgdG8ge0BsaW5rIElBbm5vdGF0aW9uQWRhcHRlcn0gaW50ZXJmYWNlLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsDQotew0KLQkvKioNCi0JICogU2luZ2xldG9uIC0gdXNlIHRoaXMgc3RhdGljIGluc3RhbmNlIHRvIGFkYXB0IG9iamVjdHMNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5IElOU1RBTkNFID0gbmV3IEFubm90YXRpb25BZGFwdGVyRmFjdG9yeSgpOw0KLQkNCi0JcHJpdmF0ZSBBbm5vdGF0aW9uQWRhcHRlckZhY3RvcnkoKSB7DQotCQkvLyBzaW5nbGV0b24NCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsNCi0JCXJldHVybiB0eXBlID09IElBbm5vdGF0aW9uQWRhcHRlci5jbGFzczsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIA0KLQl7DQotCQlyZXR1cm4gbmV3IEFubm90YXRpb25BZGFwdGVyKCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9hbm5vdGF0aW9uL0lBbm5vdGF0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9hbm5vdGF0aW9uL0lBbm5vdGF0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZjQyNzUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvYW5ub3RhdGlvbi9JQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEFkYXB0ZXIgdGhhdCBob2xkcyBsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGFubm90YXRpb25zIGFwcGxpZWQgb24gdGhlDQotICogamF2YSBhcnRpZmFjdC9zIHdoaWNoIGlzIHJlcHJlc2VudCBieSB0aGUgRE9NIG9iamVjdCBhZGFwdGVkIHRvIHRoaXMgaW50ZXJmYWNlLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElBbm5vdGF0aW9uQWRhcHRlciANCi17DQotCS8qKg0KLQkgKiBQcm92aWRlcyB0aGUge0BsaW5rIElBbm5vdGF0aW9ufSBmb3IgYW5ub3RhdGlvbiB3aXRoIDxjb2RlPmFubkZRTmFtZTwvY29kZT4uIA0KLQkgKiBAcGFyYW0gYW5uRlFOYW1lIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgYW5ub3RhdGlvbg0KLQkgKiBAcmV0dXJuIGxvY2F0b3IgaW5zdGFuY2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGV4aXN0aW5nDQotCSAqLw0KLQlwdWJsaWMgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gZ2V0QW5ub3RhdGlvbihTdHJpbmcgYW5uRlFOYW1lKTsNCi0JDQotCS8qKg0KLQkgKiBBZGRzIGFubm90YXRpb24gdG8gdGhlIGxpc3Qgb2YgdXNlZCBhbm5vdGF0aW9ucy4NCi0JICogPGNvZGU+YW5ub3RhdGlvbjwvY29kZT4gY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+IHRoZW4gdGhlIGxvY2F0b3IgZm9yIHRoaXMgYW5ub3RhdGlvbg0KLQkgKiBpcyByZW1vdmVkLg0KLQkgKiBAcGFyYW0gYW5uRlFOYW1lIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgYW5ub3RhdGlvbg0KLQkgKiBAcGFyYW0gYW5ub3RhdGlvbiB0aCBhbm5vdGF0aW9uIGluc3RhbmNlDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBhZGRBbm5vdGF0aW9uKFN0cmluZyBhbm5GUU5hbWUsIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGFubm90YXRpb24pOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2Fubm90YXRpb24vaW1wbC9Bbm5vdGF0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9hbm5vdGF0aW9uL2ltcGwvQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWQ2ZmJiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2Fubm90YXRpb24vaW1wbC9Bbm5vdGF0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuYW5ub3RhdGlvbi5pbXBsOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuYW5ub3RhdGlvbi5JQW5ub3RhdGlvbkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5Db250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW07DQotDQotLyoqDQotICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElMb2NhdG9yQWRhcHRlcn0uDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgSUFubm90YXRpb25BZGFwdGVyDQotew0KLQlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+PiBhbm5vdGF0aW9uTG9jYXRvcnM7DQotCQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3INCi0JICovDQotCXB1YmxpYyBBbm5vdGF0aW9uQWRhcHRlcigpIHsNCi0JCWFubm90YXRpb25Mb2NhdG9ycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4+KCk7DQotCX0NCi0JDQotCXB1YmxpYyBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBnZXRBbm5vdGF0aW9uKGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uRlFOYW1lKSANCi0Jew0KLQkJbnVsbENoZWNrUGFyYW0oYW5ub3RhdGlvbkZRTmFtZSwgImFubm90YXRpb25GUU5hbWUiKTsvLyROT04tTkxTLTEkDQotCQlyZXR1cm4gYW5ub3RhdGlvbkxvY2F0b3JzLmdldChhbm5vdGF0aW9uRlFOYW1lKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBhZGRBbm5vdGF0aW9uKGZpbmFsIFN0cmluZyBhbm5GUU5hbWUsIGZpbmFsIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGFubm90YXRpb24pIA0KLQl7DQotCQludWxsQ2hlY2tQYXJhbShhbm5GUU5hbWUsICJhbm5GUU5hbWUiKTsvLyROT04tTkxTLTEkDQotCQlhbm5vdGF0aW9uTG9jYXRvcnMucHV0KGFubkZRTmFtZSwgYW5ub3RhdGlvbik7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsNCi0JCXJldHVybiBJQW5ub3RhdGlvbkFkYXB0ZXIuY2xhc3MgPT0gdHlwZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2RlZmF1bHRzL01ldGhvZFByb3BlcnR5RGVmYXVsdHNBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2RlZmF1bHRzL01ldGhvZFByb3BlcnR5RGVmYXVsdHNBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYzYjc0YjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9NZXRob2RQcm9wZXJ0eURlZmF1bHRzQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuZGVmYXVsdHM7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5JUHJvcGVydHlEZWZhdWx0czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotDQotLyoqDQotICogQWRhcHRlciB0aGF0IGdpdmVzIGRlZmF1bHQgdmFsdWVzIGZvciB7QGxpbmsgSVdlYk1ldGhvZH0gb2JqZWN0cw0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTWV0aG9kUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIElQcm9wZXJ0eURlZmF1bHRzDQotew0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgew0KLQkJcmV0dXJuIElQcm9wZXJ0eURlZmF1bHRzLmNsYXNzID09IHR5cGU7DQotCX0NCi0JDQotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdChmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgDQotCXsNCi0JCWZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kID0gKElXZWJNZXRob2QpZ2V0VGFyZ2V0KCk7IA0KLQkJc3dpdGNoKGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkpDQotCQl7DQotCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX05BTUU6DQotCQkJcmV0dXJuIGdldE1ldGhvZE5hbWUod2ViTWV0aG9kKTsNCi0JCX0JDQotCQkNCi0JCXJldHVybiB3ZWJNZXRob2QuZUdldChmZWF0dXJlKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIFN0cmluZyBnZXRNZXRob2ROYW1lKGZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kKQ0KLQl7DQotCQlpbnQgcG9zID0gd2ViTWV0aG9kLmdldEltcGxlbWVudGF0aW9uKCkuaW5kZXhPZignKCcpOw0KLQkJaWYgKHBvcyA+IC0xKSB7DQotCQkJcmV0dXJuIHdlYk1ldGhvZC5nZXRJbXBsZW1lbnRhdGlvbigpLnN1YnN0cmluZygwLCBwb3MpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gd2ViTWV0aG9kLmdldEltcGxlbWVudGF0aW9uKCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9QYXJhbWV0ZXJQcm9wZXJ0eURlZmF1bHRzQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9QYXJhbWV0ZXJQcm9wZXJ0eURlZmF1bHRzQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYmI5ZTFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvZGVmYXVsdHMvUGFyYW1ldGVyUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmRlZmF1bHRzOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuSVByb3BlcnR5RGVmYXVsdHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzRGVmYXVsdHNDYWxjdWxhdG9yOw0KLQ0KLS8qKg0KLSAqIENsYXNzIHRoYXQgZGVmaW5lcyB3aGljaCBwcm9wZXJ0aWVzIGZvciB7QGxpbmsgSVdlYlBhcmFtfSBhcmUgZWRpdGFibGUNCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFBhcmFtZXRlclByb3BlcnR5RGVmYXVsdHNBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBJUHJvcGVydHlEZWZhdWx0cw0KLXsNCi0JcHJpdmF0ZSBmaW5hbCBKYXhXc0RlZmF1bHRzQ2FsY3VsYXRvciBkZWZDYWxjID0gbmV3IEpheFdzRGVmYXVsdHNDYWxjdWxhdG9yKCk7DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgew0KLQkJcmV0dXJuIElQcm9wZXJ0eURlZmF1bHRzLmNsYXNzID09IHR5cGU7DQotCX0NCi0JDQotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkNCi0Jew0KLQkJYXNzZXJ0IGdldFRhcmdldCgpIGluc3RhbmNlb2YgSVdlYlBhcmFtOw0KLQkJDQotCQlmaW5hbCBJV2ViUGFyYW0gd2ViUGFyYW0gPSAoSVdlYlBhcmFtKWdldFRhcmdldCgpOw0KLQkJDQotCQlzd2l0Y2goZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSkgDQotCQl7DQotCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fTkFNRToNCi0JCQlyZXR1cm4gZGVmQ2FsYygpLmNhbGNXZWJQYXJhbURlZmF1bHROYW1lKHdlYlBhcmFtKTsJCQkNCi0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19QQVJUX05BTUU6DQotCQkJcmV0dXJuIGRlZkNhbGMoKS5jYWxjV2ViUGFyYW1EZWZhdWx0TmFtZSh3ZWJQYXJhbSk7CQkJDQotCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRToNCi0JCQlyZXR1cm4gZGVmQ2FsYygpLmNhbGNXZWJQYXJhbURlZmF1bHRUYXJnZXROUygoSVdlYk1ldGhvZCl3ZWJQYXJhbS5lQ29udGFpbmVyKCksIHdlYlBhcmFtKTsNCi0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19IRUFERVI6DQotCQkJcmV0dXJuIGRlZkNhbGMoKS5nZXREZWZhdWx0UGFyYW1JbkhlZGFlcigpOw0KLQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX0tJTkQ6DQotCQkJcmV0dXJuIGRlZkNhbGMoKS5nZXREZWZhdWx0UGFyYW1LaW5kKCk7DQotCQl9DQotCQkNCi0JCXJldHVybiB3ZWJQYXJhbS5lR2V0KGZlYXR1cmUpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3IgZGVmQ2FsYygpIHsNCi0JCXJldHVybiBkZWZDYWxjOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvZGVmYXVsdHMvUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2RlZmF1bHRzL1Byb3BlcnR5RGVmYXVsdHNBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjODJiZTVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvZGVmYXVsdHMvUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5kZWZhdWx0czsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklQcm9wZXJ0eURlZmF1bHRzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuSVByb3BlcnR5U3RhdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsLkRvbUFkYXB0ZXJGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIEFkYXB0ZXIgZmFjdG9yeSBmb3IgYWRhcHRlcnMgaW1wbGVtZW50aW5nIHtAbGluayBJUHJvcGVydHlTdGF0ZX0gaW50ZXJmYWNlLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgRG9tQWRhcHRlckZhY3RvcnkNCi17DQotCS8qKg0KLQkgKiBTaW5nbGV0b24gaW5zdGFuY2UgZm9yIHRoaXMgYWRhcHRlciBmYWN0b3J5IA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQcm9wZXJ0eURlZmF1bHRzQWRhcHRlckZhY3RvcnkgSU5TVEFOQ0UgPSBuZXcgUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJGYWN0b3J5KCk7DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7DQotCQlyZXR1cm4gSVByb3BlcnR5RGVmYXVsdHMuY2xhc3MgPT0gb2JqZWN0Ow0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSVdlYlNlcnZpY2VBZGFwdGVyKCkgew0KLQkJcmV0dXJuIG5ldyBXc1Byb3BlcnR5RGVmYXVsdHNBZGFwdGVyKCk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlQWRhcHRlcigpIHsNCi0JCXJldHVybiBuZXcgU2VpUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXIoKTsNCi0JfQkNCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJV2ViTWV0aG9kQWRhcHRlcigpIHsNCi0JCXJldHVybiBuZXcgTWV0aG9kUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXIoKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlXZWJQYXJhbUFkYXB0ZXIoKXsNCi0JCXJldHVybiBuZXcgUGFyYW1ldGVyUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXIoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2RlZmF1bHRzL1NlaVByb3BlcnR5RGVmYXVsdHNBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2RlZmF1bHRzL1NlaVByb3BlcnR5RGVmYXVsdHNBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI5Y2NhN2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9TZWlQcm9wZXJ0eURlZmF1bHRzQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuZGVmYXVsdHM7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5JUHJvcGVydHlEZWZhdWx0czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5KYXhXc1V0aWxzOw0KLQ0KLS8qKg0KLSAqIEFkYXB0ZXIgdGhhdCBwcm92aWRlcyBkZWZhdWx0IHZhbHVlcyBmb3Ige0BsaW5rIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2V9IHByb3BlcnRpZXMgDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTZWlQcm9wZXJ0eURlZmF1bHRzQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgSVByb3BlcnR5RGVmYXVsdHMgDQotew0KLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIA0KLQl7DQotCQlmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKWdldFRhcmdldCgpOw0KLQkJDQotCQlzd2l0Y2goZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSkNCi0JCXsNCi0JCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX05BTUU6DQotCQkJcmV0dXJuIEpheFdzVXRpbHMuZ2V0RGVmYXVsdFBvcnR0eXBlTmFtZShzZWkuZ2V0SW1wbGVtZW50YXRpb24oKSk7DQotCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19UQVJHRVRfTkFNRVNQQUNFOg0KLQkJCXJldHVybiBKYXhXc1V0aWxzLmNvbXBvc2VKYXhXc1RhcmdldE5hbWVzcGFjZUJ5RlFOYW1lKHNlaS5nZXRJbXBsZW1lbnRhdGlvbigpKTsNCi0JCX0JCQkNCi0JCQ0KLQkJcmV0dXJuIHNlaS5lR2V0KGZlYXR1cmUpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgew0KLQkJcmV0dXJuIElQcm9wZXJ0eURlZmF1bHRzLmNsYXNzID09IHR5cGU7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9Xc1Byb3BlcnR5RGVmYXVsdHNBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2RlZmF1bHRzL1dzUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDdhYzk0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2RlZmF1bHRzL1dzUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmRlZmF1bHRzOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuSVByb3BlcnR5RGVmYXVsdHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkpheFdzVXRpbHM7DQotDQotcHVibGljIGNsYXNzIFdzUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIElQcm9wZXJ0eURlZmF1bHRzIA0KLXsNCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSANCi0Jew0KLQkJZmluYWwgSVdlYlNlcnZpY2Ugd3MgPSAoSVdlYlNlcnZpY2UpZ2V0VGFyZ2V0KCk7DQotCQkNCi0JCXN3aXRjaChmZWF0dXJlLmdldEZlYXR1cmVJRCgpKQ0KLQkJew0KLQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fTkFNRTogDQotCQkJcmV0dXJuIEpheFdzVXRpbHMuZ2V0RGVmYXVsdFNlcnZpY2VOYW1lKHdzLmdldEltcGxlbWVudGF0aW9uKCkpOw0KLQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fUE9SVF9OQU1FOg0KLQkJCXJldHVybiBKYXhXc1V0aWxzLmdldERlZmF1bHRQb3J0TmFtZSh3cy5nZXRJbXBsZW1lbnRhdGlvbigpKTsNCi0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1RBUkdFVF9OQU1FU1BBQ0U6DQotCQkJcmV0dXJuIEpheFdzVXRpbHMuY29tcG9zZUpheFdzVGFyZ2V0TmFtZXNwYWNlQnlGUU5hbWUod3MuZ2V0SW1wbGVtZW50YXRpb24oKSk7DQotCQl9DQotCQkNCi0JCXJldHVybiB3cy5lR2V0KGZlYXR1cmUpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgew0KLQkJcmV0dXJuIElQcm9wZXJ0eURlZmF1bHRzLmNsYXNzID09IHR5cGU7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL0Fic3RyYWN0U2VyaWFsaXplckFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9BYnN0cmFjdFNlcmlhbGl6ZXJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMwMTY4MTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL0Fic3RyYWN0U2VyaWFsaXplckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JQW5ub3RhdGlvblNlcmlhbGl6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc0RlZmF1bHRzQ2FsY3VsYXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsLlBhcmFtVmFsdWVDb21wYXJhdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbldyaXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVZhbHVlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZy5JTG9nZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZy5Mb2dnZXI7DQotDQotLyoqDQotICogQmFzZSBjbGFzcyBmb3IgRE9NIGFkYXB0ZXJzIHRoYXQgbGlzdGVuIHRvIGNoYW5nZXMgaW4gRE9NIG9iamVjdHMgYW5kIGFwcGxpZXMgaXQNCi0gKiB0byB0aGUgdW5kZXJseWluZyBqYXZhIGNsYXNzLiBFeHRlbmRlcnMgc2hvdWxkIGltcGxlbWVudCA8Y29kZT5nZXRBbm5vdGF0aW9uKCk8L2NvZGU+DQotICogbWV0aG9kIHRvIHByb3ZpZGUgdGhlIHtAbGluayBJQW5ub3RhdGlvbn0gaW5zdGFuY2UgdG8gYmUgc2F2ZWQgdG8gamF2YSBjbGFzcy4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2VyaWFsaXplckFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIElBbm5vdGF0aW9uU2VyaWFsaXplcg0KLXsNCi0JcHJpdmF0ZSBmaW5hbCBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlOw0KLQlwcml2YXRlIGZpbmFsIERvbVV0aWwgdXRpbCA9IG5ldyBEb21VdGlsKCk7DQotCXByaXZhdGUgZmluYWwgSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3IgZGVmQ2FsYyA9IG5ldyBKYXhXc0RlZmF1bHRzQ2FsY3VsYXRvcigpOw0KLQkNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yDQotCSAqIEBwYXJhbSByZXNvdXJjZQ0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIGNhc2UgPGNvZGU+cmVzb3VyY2U8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqLw0KLQlwdWJsaWMgQWJzdHJhY3RTZXJpYWxpemVyQWRhcHRlcihmaW5hbCBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlKSANCi0Jew0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKHJlc291cmNlLCAicmVzb3VyY2UiKTsvLyROT04tTkxTLTEkDQotCQkNCi0JCXRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoZmluYWwgTm90aWZpY2F0aW9uIG1zZykNCi0Jew0KLQkJaWYgKCFyZXNvdXJjZS5pc1NhdmVFbmFibGVkKCkgfHwgbXNnLmlzVG91Y2goKSkgew0KLQkJCXJldHVybjsNCi0JCX0NCi0JCQ0KLQkJaWYgKG1zZy5nZXRFdmVudFR5cGUoKSAhPSBOb3RpZmljYXRpb24uU0VUICYmIG1zZy5nZXRFdmVudFR5cGUoKSAhPSBOb3RpZmljYXRpb24uVU5TRVQpIHsNCi0JCQlyZXR1cm47DQotCQl9DQotCQkNCi0JCWlmIChjaGVja1ZhbHVlKG1zZykpIHsNCi0JCQlzYXZlKG1zZyk7DQotCQl9DQotCX0NCi0JDQotCS8qKg0KLQkgKiBEZWZhdWx0IHZhbHVlIGNoZWNrIC0gd29ya3Mgb25seSBmb3IgU3RyaW5nIHZhbHVlcywgdHJpbXMgdGhlDQotCSAqIG5ldyB2YWx1ZSBjaGVja3MgZm9yIDxjb2RlPm51bGw8L2NvZGU+IGFuZCBpZiBpdCBpcyBub3QgbnVsbCBwdXRzIHRoZQ0KLQkgKiB2YWx1ZSB0byB0aGUgb2JqZWN0IGFuZCByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4NCi0JICogQHBhcmFtIG1zZw0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGluIGNhc2UgdGhlIHZhbHVlIGlzIHZhbGlkDQotCSAqLw0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja1ZhbHVlKGZpbmFsIE5vdGlmaWNhdGlvbiBtc2cpDQotCXsNCi0JCUVPYmplY3Qgb2JqID0gKEVPYmplY3QpZ2V0VGFyZ2V0KCk7DQotCQlmaW5hbCBTdHJpbmcgbmV3VmFsdWUgPSBnZXROZXdTdHJpbmdWYWx1ZShtc2cpOw0KLQkJaWYgKG5ld1ZhbHVlPT1udWxsKSB7CQkJDQotCQkJcmV0dXJuIHJldmVydFZhbHVlKG9iaiwgbXNnKTsNCi0JCX0NCi0JCQ0KLQkJLy8gdGhpcyBjYWxsIGlzIG5lZWRlZCBjYXVzZSBuZXdWYWx1ZSBtaWdodCBiZSB0cmltbWVkDQotCQlwdXRWYWx1ZShvYmosIChFU3RydWN0dXJhbEZlYXR1cmUpbXNnLmdldEZlYXR1cmUoKSwgbmV3VmFsdWUpOw0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHNhdmUoZmluYWwgTm90aWZpY2F0aW9uIG1zZykNCi0Jew0KLQkJYm9vbGVhbiBwcm9jZXNzZWQgPSBmYWxzZTsNCi0JCXRyeSB7DQotCQkJZmluYWwgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gYW5ub3RhdGlvbiA9IGdldEFubm90YXRpb24oKTsNCi0JCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQkJDQotCQkJaWYgKGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpPT0wICYmICFpc0Fubm90YXRpb25SZXF1aXJlZCgpKSB7DQotCQkJCWdldEFubm90YXRpb25Xcml0ZXIoKS5yZW1vdmUoYW5ub3RhdGlvbik7DQotCQkJfSBlbHNlIHsNCi0JCQkJZ2V0QW5ub3RhdGlvbldyaXRlcigpLnVwZGF0ZShhbm5vdGF0aW9uKTsNCi0JCQl9DQotCQkJcHJvY2Vzc2VkID0gdHJ1ZTsNCi0JCX0gDQotCQljYXRjaCAoQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbiBlKSB7DQotCQkJbG9nZ2VyKCkubG9nRXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJfSANCi0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQlsb2dnZXIoKS5sb2dFcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7DQotCQl9DQotCQlmaW5hbGx5IHsNCi0JCQlpZighcHJvY2Vzc2VkKSB7DQotCQkJCXJldmVydFZhbHVlKChFT2JqZWN0KWdldFRhcmdldCgpLCBtc2cpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIGFic3RyYWN0IElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGdldEFubm90YXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOw0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBpc0Fubm90YXRpb25SZXF1aXJlZCgpOw0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpDQotCXsNCi0JICAgIHJldHVybiBJQW5ub3RhdGlvblNlcmlhbGl6ZXIuY2xhc3M9PXR5cGU7DQotCX0NCi0JDQotCXByb3RlY3RlZCBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlKCkJew0KLQkJcmV0dXJuIHJlc291cmNlOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgRG9tVXRpbCB1dGlsKCkgew0KLQkJcmV0dXJuIHV0aWw7DQotCX0NCi0JDQotCXByb3RlY3RlZCBKYXhXc0RlZmF1bHRzQ2FsY3VsYXRvciBkZWZDYWxjKCkJew0KLQkJcmV0dXJuIGRlZkNhbGM7DQotCX0NCi0JDQotCXByb3RlY3RlZCBBbm5vdGF0aW9uV3JpdGVyIGdldEFubm90YXRpb25Xcml0ZXIoKQ0KLQl7DQotCQlyZXR1cm4gQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpOw0KLQl9DQotDQotCXByb3RlY3RlZCBJUGFyYW1WYWx1ZVBhaXIgY3JlYXRlUGFyYW1WYWx1ZShTdHJpbmcgcGFyYW0sIFN0cmluZyB2YWx1ZSkNCi0Jew0KLQkJZmluYWwgSVZhbHVlIGlWYWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKHZhbHVlKTsNCi0JCXJldHVybiBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKHBhcmFtLCBpVmFsdWUpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVBhcmFtVmFsdWVQYWlyIGNyZWF0ZVBhcmFtVmFsdWUoU3RyaW5nIHBhcmFtLCBib29sZWFuIHZhbHVlKQ0KLQl7DQotCQlmaW5hbCBJVmFsdWUgaVZhbHVlID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQm9vbGVhblZhbHVlKHZhbHVlKTsNCi0JCXJldHVybiBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKHBhcmFtLCBpVmFsdWUpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVR5cGUgZmluZFR5cGUoZmluYWwgRU9iamVjdCBvYmplY3QsIGZpbmFsIFN0cmluZyB0eXBlRlFOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCUVPYmplY3Qgd2ViUHJvamVjdCA9IG9iamVjdC5lQ29udGFpbmVyKCk7DQotCQl3aGlsZSghKHdlYlByb2plY3QgaW5zdGFuY2VvZiBJV2ViU2VydmljZVByb2plY3QpICYmIHdlYlByb2plY3QhPW51bGwpIHsNCi0JCQl3ZWJQcm9qZWN0ID0gd2ViUHJvamVjdC5lQ29udGFpbmVyKCk7DQotCQl9DQotCQkNCi0JCWlmICh3ZWJQcm9qZWN0PT1udWxsKSB7DQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotDQotCQlmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWUgPSAoKElXZWJTZXJ2aWNlUHJvamVjdCl3ZWJQcm9qZWN0KS5nZXROYW1lKCk7DQotCQlmaW5hbCBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSByZXNvdXJjZS5qYXZhTW9kZWwoKS5nZXRKYXZhUHJvamVjdChwcm9qZWN0TmFtZSk7CQkNCi0JCXJldHVybiBqYXZhUHJvamVjdC5maW5kVHlwZSh0eXBlRlFOYW1lKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFJlYWRzIHRoZSBuZXcgc3RyaW5nIHZhbHVlIGZyb20gPGNvZGU+bXNnPC9jb2RlPi4gDQotCSAqIEBwYXJhbSBtc2cNCi0JICogQHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgdmFsdWUgaXMgZW1wdHkgc3RyaW5nIG9yIDxjb2RlPm51bGw8L2NvZGU+LCBvdGhlcndpc2UgdGhlIHRyaW1tZWQgc3RyaW5nIHZhbHVlLg0KLQkgKi8NCi0JcHJvdGVjdGVkIFN0cmluZyBnZXROZXdTdHJpbmdWYWx1ZShmaW5hbCBOb3RpZmljYXRpb24gbXNnKSANCi0Jew0KLQkJZmluYWwgU3RyaW5nIG5ld1ZhbHVlID0gKG1zZy5nZXROZXdTdHJpbmdWYWx1ZSgpID09IG51bGwpID8gbnVsbCA6IG1zZy5nZXROZXdTdHJpbmdWYWx1ZSgpLnRyaW0oKTsNCi0JCWlmIChuZXdWYWx1ZSAhPSBudWxsICYmIG5ld1ZhbHVlLmxlbmd0aCgpID4gMCkgew0KLQkJCXJldHVybiBuZXdWYWx1ZTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZXZlcnRzIHRoZSBjdXJyZW50IHZhbHVlIGZvciB0aGUgY2hhbmdlZCBmZWF0dXJlIHRvIHRoZSBvbGQgdmFsdWUgYW5kIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+DQotCSAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCB0byBiZSByZXZlcnRlZA0KLQkgKiBAcGFyYW0gbXNnIHRoZSBtZXNzYWdlDQotCSAqIEByZXR1cm4gYWx3YXlzIHJldHVybnMgZmFsc2UNCi0JICovDQotCXByb3RlY3RlZCBib29sZWFuIHJldmVydFZhbHVlKGZpbmFsIEVPYmplY3Qgb2JqLCBmaW5hbCBOb3RpZmljYXRpb24gbXNnKQ0KLQl7DQotCQlwdXRWYWx1ZShvYmosIChFU3RydWN0dXJhbEZlYXR1cmUpbXNnLmdldEZlYXR1cmUoKSwgbXNnLmdldE9sZFZhbHVlKCkpOw0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCQ0KLQkvKioNCi0JICogUHV0cyB0aGUgPGNvZGU+bmV3VmFsdWU8L2NvZGU+IHRvIHRoZSBjaGFuZ2VkIGZlYXR1cmUuDQotCSAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCB0byBiZSB1cGRhdGVkDQotCSAqIEBwYXJhbSBtc2cgdGhlIG5vdGlmaWNhdGlvbiBtZXNzYWdlDQotCSAqIEBwYXJhbSBuZXdWYWx1ZSB0aGUgbmV3IHZhbHVlIHRvIGJlIHB1dA0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgcHV0VmFsdWUoZmluYWwgRU9iamVjdCBvYmosIGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBmaW5hbCBPYmplY3QgbmV3VmFsdWUpDQotCXsNCi0JCXRyeSB7DQotCQkJb2JqLmVTZXREZWxpdmVyKGZhbHNlKTsNCi0JCQlvYmouZVNldChmZWF0dXJlLCBuZXdWYWx1ZSk7DQotCQl9IGZpbmFsbHkgew0KLQkJCW9iai5lU2V0RGVsaXZlcih0cnVlKTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIFRyZWVTZXQ8SVBhcmFtVmFsdWVQYWlyPiBjcmVhdGVQYXJhbVZhbHVlU29ydGVkVHJlZVNldCgpDQotCXsNCi0JCXJldHVybiBuZXcgVHJlZVNldDxJUGFyYW1WYWx1ZVBhaXI+KG5ldyBQYXJhbVZhbHVlQ29tcGFyYXRvcigpKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBJTG9nZ2VyIGxvZ2dlcigpDQotCXsNCi0JCXJldHVybiBuZXcgTG9nZ2VyKCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL01ldGhvZFNlcmlhbGl6ZXJBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvTWV0aG9kU2VyaWFsaXplckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjg3NWY3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvTWV0aG9kU2VyaWFsaXplckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXI7DQotDQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldNQW5ub3RhdGlvbkZlYXR1cmVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklQYXJhbVZhbHVlUGFpcjsNCi0NCi0vKioNCi0gKiBBZGFwdGVyIGZvciB7QGxpbmsgSVdlYk1ldGhvZH0gc2VyaWFsaXphdGlvbi4gTGlzdGVucyBmb3IgcHJvcGVydHkgY2hhbmdlIG5vdGlmaWNhdGlvbnMgYW5kIA0KLSAqIHNlcmlhbGl6ZXMgdGhlIG5ldyBvYmplY3QgY29udGVudCB0byB0aGUgdW5kZXJseWluZyBqYXZhIGNsYXNzLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTWV0aG9kU2VyaWFsaXplckFkYXB0ZXIgZXh0ZW5kcyBBYnN0cmFjdFNlcmlhbGl6ZXJBZGFwdGVyDQotew0KLQkvKioNCi0JICogQ29uc3RydWN0b3INCi0JICogQHBhcmFtIHJlc291cmNlIHRoZSBET00gcmVzb3VyY2UgDQotCSAqLw0KLQlwdWJsaWMgTWV0aG9kU2VyaWFsaXplckFkYXB0ZXIoSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZSkgew0KLQkJc3VwZXIocmVzb3VyY2UpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBbm5vdGF0aW9uUmVxdWlyZWQoKSB7DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBnZXRBbm5vdGF0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiANCi0JewkJDQotCQlhc3NlcnQgZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBJV2ViTWV0aG9kOw0KLQ0KLQkJZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QgPSAoSVdlYk1ldGhvZClnZXRUYXJnZXQoKTsNCi0JCWZpbmFsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Upd2ViTWV0aG9kLmVDb250YWluZXIoKTsNCi0JCWlmIChzZWkgPT0gbnVsbCkgew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQkJZmluYWwgSVR5cGUgc2VpVHlwZSA9IGZpbmRUeXBlKHNlaSwgc2VpLmdldEltcGxlbWVudGF0aW9uKCkpOw0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2QgPSB1dGlsKCkuZmluZE1ldGhvZChzZWlUeXBlLCB3ZWJNZXRob2QpOwkJDQotCQlpZiAobWV0aG9kPT1udWxsKSB7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSU1ldGhvZCBmb3IgRE9NIG1ldGhvZCB3YXMgbm90IGZvdW5kIik7Ly8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJcmV0dXJuIEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oV01Bbm5vdGF0aW9uRmVhdHVyZXMuV01fQU5OT1RBVElPTiwgbWV0aG9kLCBkZWZpbmVQYXJhbVZhbHVlcyh3ZWJNZXRob2QsIG1ldGhvZCkpOwkNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBTZXQ8SVBhcmFtVmFsdWVQYWlyPiBkZWZpbmVQYXJhbVZhbHVlcyhmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCwgZmluYWwgSU1ldGhvZCBtZXRob2QpDQotCXsNCi0JCWZpbmFsIFNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtVmFsdWVQYWlycyA9IGNyZWF0ZVBhcmFtVmFsdWVTb3J0ZWRUcmVlU2V0KCk7DQotCQlpZiAod2ViTWV0aG9kLmdldE5hbWUoKSE9bnVsbCAmJiAhd2ViTWV0aG9kLmdldE5hbWUoKS5lcXVhbHMobWV0aG9kLmdldEVsZW1lbnROYW1lKCkpKSB7DQotCQkJcGFyYW1WYWx1ZVBhaXJzLmFkZChjcmVhdGVQYXJhbVZhbHVlKFdNQW5ub3RhdGlvbkZlYXR1cmVzLldNX05BTUVfQVRUUklCVVRFLCB3ZWJNZXRob2QuZ2V0TmFtZSgpKSk7DQotCQl9DQotCQkNCi0JCWlmICh3ZWJNZXRob2QuaXNFeGNsdWRlZCgpKSB7DQotCQkJcGFyYW1WYWx1ZVBhaXJzLmFkZChjcmVhdGVQYXJhbVZhbHVlKFdNQW5ub3RhdGlvbkZlYXR1cmVzLldNX0VYQ0xVREVEX0FUVFJJQlVURSwgdHJ1ZSkpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gcGFyYW1WYWx1ZVBhaXJzOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tWYWx1ZShmaW5hbCBOb3RpZmljYXRpb24gbXNnKQ0KLQl7DQotCQlmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpbXNnLmdldEZlYXR1cmUoKTsNCi0JCWlmIChmZWF0dXJlLmdldEZlYXR1cmVJRCgpIT1Eb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fTkFNRSkgew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0NCi0JCWlmICghc3VwZXIuY2hlY2tWYWx1ZShtc2cpKSB7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvUGFyYW1ldGVyU2VyaWFsaXplckFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9QYXJhbWV0ZXJTZXJpYWxpemVyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZTdiMWE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9QYXJhbWV0ZXJTZXJpYWxpemVyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXI7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1BBbm5vdGF0aW9uRmVhdHVyZXMuSEVBREVSX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XUEFubm90YXRpb25GZWF0dXJlcy5OQU1FX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XUEFubm90YXRpb25GZWF0dXJlcy5QQVJUX05BTUVfQVRUUklCVVRFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldQQW5ub3RhdGlvbkZlYXR1cmVzLlRBUkdFVF9OQU1FU1BBQ0VfQVRUUklCVVRFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldQQW5ub3RhdGlvbkZlYXR1cmVzLldQX0FOTk9UQVRJT047DQotDQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5XZWJQYXJhbUtpbmQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1BBbm5vdGF0aW9uRmVhdHVyZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9uLkFubm90YXRpb25BZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmFubm90YXRpb24uSUFubm90YXRpb25BZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbC5KZWU1RG9tVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVZhbHVlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZy5Mb2dnZXI7DQotDQotLyoqDQotICogQ2xhc3MgdGhhdCBzZXJpYWxpemVzIHtAbGluayBJV2ViUGFyYW19IG9iamVjdHMgdG8gV2ViUGFyYW0gYW5ub3RhdGlvbiBpbiB1bmRlcmx5aW5nIGphdmENCi0gKiBjbGFzcy4gQ2hlY2tzIHRoZSBhdHRyaWJ1dGUgdmFsdWVzIGFuZCBvbWl0cyB0aGUgZGVmYXVsdHMuDQotICogIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgUGFyYW1ldGVyU2VyaWFsaXplckFkYXB0ZXIgZXh0ZW5kcyBBYnN0cmFjdFNlcmlhbGl6ZXJBZGFwdGVyDQotew0KLQlwcml2YXRlIGZpbmFsIEplZTVEb21VdGlscyBqZWU1VXRpbHMgPSBKZWU1RG9tVXRpbHMuZ2V0SW5zdGFuY2UoKTsNCi0JDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rvcg0KLQkgKiBAcGFyYW0gcmVzb3VyY2UNCi0JICovDQotCXB1YmxpYyBQYXJhbWV0ZXJTZXJpYWxpemVyQWRhcHRlcihKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlKSB7DQotCQlzdXBlcihyZXNvdXJjZSk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKGZpbmFsIE5vdGlmaWNhdGlvbiBtc2cpIA0KLQl7DQotCQlpZiAoIXJlc291cmNlKCkuaXNTYXZlRW5hYmxlZCgpKSB7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpbXNnLmdldEZlYXR1cmUoKTsNCi0JCWlmIChmZWF0dXJlLmdldEZlYXR1cmVJRCgpPT1Eb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fTkFNRSkgDQotCQl7DQotCQkJdHJ5IHsNCi0JCQkJY2hhbmdlUGFydE5hbWUobXNnKTsNCi0JCQl9IA0KLQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgew0KLQkJCQkobmV3IExvZ2dlcigpKS5sb2dFcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7DQotCQkJfQ0KLQkJfQkNCi0JCQ0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChtc2cpOw0KLQl9DQotCQ0KLQlwcml2YXRlIHZvaWQgY2hhbmdlUGFydE5hbWUoZmluYWwgTm90aWZpY2F0aW9uIG1zZykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJV2ViUGFyYW0gd2ViUGFyYW0gPSAoSVdlYlBhcmFtKWdldFRhcmdldCgpOw0KLQkJaWYgKGplZTVVdGlscy5pc1BhcnROYW1lVXNlZCh3ZWJQYXJhbSkpIA0KLQkJew0KLQkJCWZpbmFsIElBbm5vdGF0aW9uQWRhcHRlciBhbm5BZGFwdGVyID0gKElBbm5vdGF0aW9uQWRhcHRlciApQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KHdlYlBhcmFtLCBJQW5ub3RhdGlvbkFkYXB0ZXIuY2xhc3MpOw0KLQkJCWZpbmFsIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGFubiA9IGFubkFkYXB0ZXIuZ2V0QW5ub3RhdGlvbihXUEFubm90YXRpb25GZWF0dXJlcy5XUF9BTk5PVEFUSU9OKTsNCi0JCQlpZiAoYW5uIT1udWxsICYmIGFubi5nZXRQcm9wZXJ0eVZhbHVlKFdQQW5ub3RhdGlvbkZlYXR1cmVzLlBBUlRfTkFNRV9BVFRSSUJVVEUpIT1udWxsKSB7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWlmIChjaGVja1ZhbHVlKG1zZykpIHsNCi0JCQlwdXRWYWx1ZSh3ZWJQYXJhbSwgRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNX19QQVJUX05BTUUsIG1zZy5nZXROZXdWYWx1ZSgpKTsNCi0JCX0NCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBib29sZWFuIGlzQW5ub3RhdGlvblJlcXVpcmVkKCkgew0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGdldEFubm90YXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIA0KLQl7DQotCQlmaW5hbCBJV2ViUGFyYW0gd2ViUGFyYW0gPSAoSVdlYlBhcmFtKWdldFRhcmdldCgpOw0KLQkJZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QgPSAoSVdlYk1ldGhvZCl3ZWJQYXJhbS5lQ29udGFpbmVyKCk7DQotCQlpZiAod2ViTWV0aG9kPT1udWxsIHx8IHdlYk1ldGhvZC5lQ29udGFpbmVyKCk9PW51bGwpIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JCQ0KLQkJZmluYWwgSVR5cGUgc2VpVHlwZSA9IGZpbmRUeXBlKHdlYk1ldGhvZCwgKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKXdlYk1ldGhvZC5lQ29udGFpbmVyKCkpLmdldEltcGxlbWVudGF0aW9uKCkpOw0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2QgPSB1dGlsKCkuZmluZE1ldGhvZChzZWlUeXBlLCB3ZWJNZXRob2QpOw0KLQkJDQotCQlyZXR1cm4gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbihXUF9BTk5PVEFUSU9OLCANCi0JCQkJbWV0aG9kLmdldFR5cGVQYXJhbWV0ZXIod2ViUGFyYW0uZ2V0SW1wbGVtZW50YXRpb24oKSksDQotCQkJCWRlZmluZVBhcmFtVmFsdWVzKHdlYlBhcmFtLCB3ZWJNZXRob2QpKTsJDQotCX0NCi0JDQotCXByb3RlY3RlZCBTZXQ8SVBhcmFtVmFsdWVQYWlyPiBkZWZpbmVQYXJhbVZhbHVlcyhmaW5hbCBJV2ViUGFyYW0gd2ViUGFyYW0sIGZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kKQ0KLQl7DQotCQlmaW5hbCBTZXQ8SVBhcmFtVmFsdWVQYWlyPiB2YWx1ZVBhaXJzID0gY3JlYXRlUGFyYW1WYWx1ZVNvcnRlZFRyZWVTZXQoKTsNCi0JCQ0KLQkJaWYgKHdlYlBhcmFtLmdldEtpbmQoKSE9V2ViUGFyYW1LaW5kLklOKSB7DQotCQkJdmFsdWVQYWlycy5hZGQoY3JlYXRlTW9kZVZhbHVlUGFpcih3ZWJQYXJhbSkpOw0KLQkJfQ0KLQkJDQotCQlpZiAod2ViUGFyYW0uaXNIZWFkZXIoKSkgew0KLQkJCXZhbHVlUGFpcnMuYWRkKGNyZWF0ZVBhcmFtVmFsdWUoSEVBREVSX0FUVFJJQlVURSwgdHJ1ZSkpOw0KLQkJfQ0KLQ0KLQkJZmluYWwgU3RyaW5nIGRlZk5hbWUgPSBkZWZDYWxjKCkuY2FsY1dlYlBhcmFtRGVmYXVsdE5hbWUod2ViUGFyYW0pOw0KLQkJaWYgKGplZTVVdGlscy5pc05hbWVSZXF1aXJlZCh3ZWJQYXJhbSkgfHwgDQotCQkJKCF3ZWJQYXJhbS5nZXROYW1lKCkuZXF1YWxzKGRlZk5hbWUpICYmIGplZTVVdGlscy5pc05hbWVVc2VkKHdlYlBhcmFtKSkpIA0KLQkJew0KLQkJCXZhbHVlUGFpcnMuYWRkKGNyZWF0ZVBhcmFtVmFsdWUoTkFNRV9BVFRSSUJVVEUsIHdlYlBhcmFtLmdldE5hbWUoKSkpOw0KLQkJfQ0KLQkJDQotCQlpZiAoamVlNVV0aWxzLmlzUGFydE5hbWVVc2VkKHdlYlBhcmFtKSAmJiAhd2ViUGFyYW0uZ2V0UGFydE5hbWUoKS5lcXVhbHMoZGVmTmFtZSkpIHsNCi0JCQl2YWx1ZVBhaXJzLmFkZChjcmVhdGVQYXJhbVZhbHVlKFBBUlRfTkFNRV9BVFRSSUJVVEUsIHdlYlBhcmFtLmdldFBhcnROYW1lKCkpKTsNCi0JCX0NCi0NCi0JCWlmICh3ZWJQYXJhbS5nZXRUYXJnZXROYW1lc3BhY2UoKSE9bnVsbCkgDQotCQl7DQotCQkJZmluYWwgU3RyaW5nIGRlZk5zID0gZGVmQ2FsYygpLmNhbGNXZWJQYXJhbURlZmF1bHRUYXJnZXROUyh3ZWJNZXRob2QsIHdlYlBhcmFtKTsNCi0JCQlpZiAod2ViUGFyYW0uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkudHJpbSgpLmxlbmd0aCgpICE9IDAgJiYgIXdlYlBhcmFtLmdldFRhcmdldE5hbWVzcGFjZSgpLmVxdWFscyhkZWZOcykpIHsNCi0JCQkJdmFsdWVQYWlycy5hZGQoY3JlYXRlUGFyYW1WYWx1ZShUQVJHRVRfTkFNRVNQQUNFX0FUVFJJQlVURSwgd2ViUGFyYW0uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiB2YWx1ZVBhaXJzOw0KLQl9CQ0KLQkNCi0JcHJvdGVjdGVkIElQYXJhbVZhbHVlUGFpciBjcmVhdGVNb2RlVmFsdWVQYWlyKGZpbmFsIElXZWJQYXJhbSB3ZWJQYXJhbSkgDQotCXsNCi0JCUlWYWx1ZSB2YWx1ZSA9IG51bGw7DQotCQlzd2l0Y2ggKHdlYlBhcmFtLmdldEtpbmQoKSkgDQotCQl7DQotCQljYXNlIE9VVDoNCi0JCQl2YWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZShXUEFubm90YXRpb25GZWF0dXJlcy5XRUJfUEFSQU1fTU9ERV9PVVQpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSBJTk9VVDoNCi0JCQl2YWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZShXUEFubm90YXRpb25GZWF0dXJlcy5XRUJfUEFSQU1fTU9ERV9JTk9VVCk7DQotCQkJYnJlYWs7DQotCQlkZWZhdWx0Og0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZShXUEFubm90YXRpb25GZWF0dXJlcy5NT0RFX0FUVFJJQlVURSwgdmFsdWUpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNQYXJhbVdpdGhTYW1lTmFtZShmaW5hbCBJV2ViUGFyYW0gcGFyYW0sIGZpbmFsIFN0cmluZyBuZXdOYW1lKQ0KLQl7DQotCQlmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCA9IChJV2ViTWV0aG9kKXBhcmFtLmVDb250YWluZXIoKTsNCi0JCWZvciAoSVdlYlBhcmFtIHdlYlBhcmFtIDogd2ViTWV0aG9kLmdldFBhcmFtZXRlcnMoKSkgDQotCQl7DQotCQkJaWYod2ViUGFyYW09PXBhcmFtKSB7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQkNCi0JCQlpZih3ZWJQYXJhbS5nZXROYW1lKCkuZXF1YWxzKG5ld05hbWUpKSB7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tWYWx1ZShmaW5hbCBOb3RpZmljYXRpb24gbXNnKSANCi0Jew0KLQkJaWYoKChFU3RydWN0dXJhbEZlYXR1cmUpbXNnLmdldEZlYXR1cmUoKSkuZ2V0RmVhdHVyZUlEKCk9PURvbVBhY2thZ2UuSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRSkgew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gc3VwZXIuY2hlY2tWYWx1ZShtc2cpOw0KLQl9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9TZWlTZXJpYWxpemVyQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL1NlaVNlcmlhbGl6ZXJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEzYmJhNDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL1NlaVNlcmlhbGl6ZXJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5KYXhXc1V0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklQYXJhbVZhbHVlUGFpcjsNCi0NCi0vKioNCi0gKiBBZGFwdGVyIHRoYXQgb24ge0BsaW5rIElXZWJTZXJ2aWNlfSBvYmplY3QgY2hhbmdlIHNhdmVzIHRoZSBhbm5vdGF0aW9uIHRvIA0KLSAqIHRoZSB1bmRlcmx5aW5nIGNvbXBpbGF0aW9uIHVuaXQuIFVzZXMge0BsaW5rIEpheFdzV29ya3NwYWNlUmVzb3VyY2V9IHRvIGRlZmluZSANCi0gKiBpZiBzYXZlIG9wZXJhdGlvbiBpcyBlbmFibGVkLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgU2VpU2VyaWFsaXplckFkYXB0ZXIgZXh0ZW5kcyBBYnN0cmFjdFNlcmlhbGl6ZXJBZGFwdGVyDQotew0KLQkvKioNCi0JICogQ29uc3RydWN0b3INCi0JICogQHBhcmFtIHJlc291cmNlDQotCSAqLw0KLQlwdWJsaWMgU2VpU2VyaWFsaXplckFkYXB0ZXIoSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZSkgew0KLQkJc3VwZXIocmVzb3VyY2UpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBbm5vdGF0aW9uUmVxdWlyZWQoKSB7DQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQkNCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBnZXRBbm5vdGF0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiAJDQotCXsNCi0JCWFzc2VydCBnZXRUYXJnZXQoKSBpbnN0YW5jZW9mIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotDQotCQlyZXR1cm4gY3JlYXRlSUFubm90YXRpb24oKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpZ2V0VGFyZ2V0KCksIHJlc291cmNlKCkuamF2YU1vZGVsKCkpOw0KLQl9DQotDQotCXByb3RlY3RlZCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBjcmVhdGVJQW5ub3RhdGlvbihmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSwgZmluYWwgSUphdmFNb2RlbCBqYXZhTW9kZWwpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gDQotCXsNCi0JCW51bGxDaGVja1BhcmFtKHNlaSwgInNlaSIpOy8vJE5PTi1OTFMtMSQNCi0JCW51bGxDaGVja1BhcmFtKGphdmFNb2RlbCwgImphdmFNb2RlbCIpOy8vJE5PTi1OTFMtMSQNCi0JCQ0KLQkJaWYgKHNlaS5pc0ltcGxpY2l0KCkpIA0KLQkJew0KLQkJCWlmIChzZWkuZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKS5zaXplKCkgPT0gMCkgew0KLQkJCQkvLyB0aGUgaW1wbGljaXQgU0VJIGhhcyBhbHJlYWR5IGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBwcm9qZWN0DQotCQkJCXJldHVybiBudWxsOw0KLQkJCX0NCi0JCQkNCi0JCQlyZXR1cm4gbmV3IFdzU2VyaWFsaXplckFkYXB0ZXIocmVzb3VyY2UoKSkuY3JlYXRlSUFubm90YXRpb24oc2VpLmdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkuZ2V0KDApLCBqYXZhTW9kZWwpOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBJVHlwZSB0eXBlID0gZmluZFR5cGUoc2VpLCBzZWkuZ2V0SW1wbGVtZW50YXRpb24oKSk7DQotCQlpZiAodHlwZSA9PSBudWxsKSB7DQotCQkJLy8gdGhlIGV4cGxpY2l0IFNFSSBoYXMgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcHJvamVjdA0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQ0KLQkJZmluYWwgU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZVBhaXJzID0gY3JlYXRlUGFyYW1WYWx1ZVNvcnRlZFRyZWVTZXQoKTsNCi0NCi0JCWlmIChzZWkuZ2V0TmFtZSgpIT1udWxsICYmICFzZWkuZ2V0TmFtZSgpLmVxdWFscyhKYXhXc1V0aWxzLmdldERlZmF1bHRQb3J0dHlwZU5hbWUoc2VpLmdldEltcGxlbWVudGF0aW9uKCkpKSkgew0KLQkJCXBhcmFtVmFsdWVQYWlycy5hZGQoY3JlYXRlUGFyYW1WYWx1ZShXU0Fubm90YXRpb25GZWF0dXJlcy5OQU1FX0FUVFJJQlVURSwgc2VpLmdldE5hbWUoKSkpOw0KLQkJfQ0KLQkJaWYgKHNlaS5nZXRUYXJnZXROYW1lc3BhY2UoKSE9bnVsbCAmJiAhc2VpLmdldFRhcmdldE5hbWVzcGFjZSgpLmVxdWFscyhKYXhXc1V0aWxzLmNvbXBvc2VKYXhXc1RhcmdldE5hbWVzcGFjZUJ5UGFja2FnZSh0eXBlLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldEVsZW1lbnROYW1lKCkpKSkgew0KLQkJCXBhcmFtVmFsdWVQYWlycy5hZGQoY3JlYXRlUGFyYW1WYWx1ZShXU0Fubm90YXRpb25GZWF0dXJlcy5UQVJHRVRfTkFNRVNQQUNFX0FUVFJJQlVURSwgc2VpLmdldFRhcmdldE5hbWVzcGFjZSgpKSk7DQotCQl9DQotCQkNCi0JCXJldHVybiBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKFdTQW5ub3RhdGlvbkZlYXR1cmVzLldTX0FOTk9UQVRJT04sIHR5cGUsIHBhcmFtVmFsdWVQYWlycyk7CQ0KLQl9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9TZXJpYWxpemVyQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9TZXJpYWxpemVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzRmYmIzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvU2VyaWFsaXplckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLklBbm5vdGF0aW9uU2VyaWFsaXplcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsLkRvbUFkYXB0ZXJGYWN0b3J5Ow0KLS8qKg0KLSAqIEZhY3RvcnkgZm9yIHNlcmlhbGl6YXRpb24gYWRhcHRlcnMuIFRoaXMgZmFjdG9yeSBpcyBpbnN0YW50aWF0ZWQgb24gY29uc3RydWN0aW9uIGJ5IA0KLSAqIHtAbGluayBKYXhXc1dvcmtzcGFjZVJlc291cmNlfSBhbmQgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UgdXNlIHRoZSBzYW1lIGluc3RhbmNlDQotICogaW4gY2FzZSB5b3UgbmVlZCB0aGlzIGZhY3RvcnkuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTZXJpYWxpemVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBEb21BZGFwdGVyRmFjdG9yeQ0KLXsNCi0JcHJpdmF0ZSBmaW5hbCBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlOw0KLQkNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIA0KLQkgKiBAcGFyYW0gcmVzb3VyY2UNCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBjYXNlIDxjb2RlPnJlc291cmNlPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKi8NCi0JcHVibGljIFNlcmlhbGl6ZXJBZGFwdGVyRmFjdG9yeShmaW5hbCBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlKSANCi0Jew0KLQkJbnVsbENoZWNrUGFyYW0ocmVzb3VyY2UsICJyZXNvdXJjZSIpOy8vJE5PTi1OTFMtMSQNCi0JCXRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlXZWJTZXJ2aWNlQWRhcHRlcigpIHsNCi0JCXJldHVybiBuZXcgV3NTZXJpYWxpemVyQWRhcHRlcihyZXNvdXJjZSk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlQWRhcHRlcigpIHsNCi0JCXJldHVybiBuZXcgU2VpU2VyaWFsaXplckFkYXB0ZXIocmVzb3VyY2UpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSVdlYk1ldGhvZEFkYXB0ZXIoKSB7DQotCQlyZXR1cm4gbmV3IE1ldGhvZFNlcmlhbGl6ZXJBZGFwdGVyKHJlc291cmNlKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlXZWJQYXJhbUFkYXB0ZXIoKSB7DQotCQlyZXR1cm4gbmV3IFBhcmFtZXRlclNlcmlhbGl6ZXJBZGFwdGVyKHJlc291cmNlKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpDQotCXsNCi0JCXJldHVybiBJQW5ub3RhdGlvblNlcmlhbGl6ZXIuY2xhc3MgPT0gdHlwZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvV3NTZXJpYWxpemVyQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL1dzU2VyaWFsaXplckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGUxZDVjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvV3NTZXJpYWxpemVyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXI7DQotDQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuSmF4V3NVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtOw0KLQ0KLS8qKg0KLSAqIEFkYXB0ZXIgdGhhdCBvbiB7QGxpbmsgSVdlYlNlcnZpY2V9IG9iamVjdCBjaGFuZ2Ugc2F2ZXMgdGhlIGFubm90YXRpb24gdG8gDQotICogdGhlIHVuZGVybHlpbmcgY29tcGlsYXRpb24gdW5pdC4gVXNlcyB7QGxpbmsgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZX0gdG8gZGVmaW5lIA0KLSAqIGlmIHNhdmUgb3BlcmF0aW9uIGlzIGVuYWJsZWQuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBXc1NlcmlhbGl6ZXJBZGFwdGVyIGV4dGVuZHMgQWJzdHJhY3RTZXJpYWxpemVyQWRhcHRlcg0KLXsNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIA0KLQkgKiBAcGFyYW0gcmVzb3VyY2UNCi0JICovDQotCXB1YmxpYyBXc1NlcmlhbGl6ZXJBZGFwdGVyKEpheFdzV29ya3NwYWNlUmVzb3VyY2UgcmVzb3VyY2UpIA0KLQl7DQotCQlzdXBlcihyZXNvdXJjZSk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Fubm90YXRpb25SZXF1aXJlZCgpIHsNCi0JCXJldHVybiB0cnVlOw0KLQl9CQkNCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBnZXRBbm5vdGF0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiANCi0Jew0KLQkJYXNzZXJ0IGdldFRhcmdldCgpIGluc3RhbmNlb2YgSVdlYlNlcnZpY2U7DQotCQkNCi0JCXJldHVybiBjcmVhdGVJQW5ub3RhdGlvbigoSVdlYlNlcnZpY2UpZ2V0VGFyZ2V0KCksIHJlc291cmNlKCkuamF2YU1vZGVsKCkpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gY3JlYXRlSUFubm90YXRpb24oZmluYWwgSVdlYlNlcnZpY2Ugd3MsIGZpbmFsIElKYXZhTW9kZWwgamF2YU1vZGVsKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCW51bGxDaGVja1BhcmFtKHdzLCAid3MiKTsvLyROT04tTkxTLTEkDQotCQludWxsQ2hlY2tQYXJhbShqYXZhTW9kZWwsICJqYXZhTW9kZWwiKTsvLyROT04tTkxTLTEkDQotCQkNCi0JCWZpbmFsIElUeXBlIHR5cGUgPSBmaW5kVHlwZSh3cywgd3MuZ2V0SW1wbGVtZW50YXRpb24oKSk7DQotCQlpZiAodHlwZT09bnVsbCkgew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlUGFpcnMgPSBjcmVhdGVQYXJhbVZhbHVlU29ydGVkVHJlZVNldCgpOw0KLQkJDQotCQlmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IHdzLmdldFNlcnZpY2VFbmRwb2ludCgpOw0KLQkJaWYgKHNlaSE9bnVsbCkgDQotCQl7CQkJDQotCQkJaWYgKHNlaS5pc0ltcGxpY2l0KCkpIA0KLQkJCXsNCi0JCQkJU3RyaW5nIHNlaU5hbWUgPSBzZWkuZ2V0TmFtZSgpOw0KLQkJCQlpZiAoIUpheFdzVXRpbHMuZ2V0RGVmYXVsdFBvcnR0eXBlTmFtZShzZWkuZ2V0SW1wbGVtZW50YXRpb24oKSkuZXF1YWxzKHNlaU5hbWUpKSB7DQotCQkJCQlwYXJhbVZhbHVlUGFpcnMuYWRkKGNyZWF0ZVBhcmFtVmFsdWUoV1NBbm5vdGF0aW9uRmVhdHVyZXMuTkFNRV9BVFRSSUJVVEUsIHdzLmdldFNlcnZpY2VFbmRwb2ludCgpLmdldE5hbWUoKSkpOw0KLQkJCQl9DQotCQkJfSBlbHNlIHsNCi0JCQkJcGFyYW1WYWx1ZVBhaXJzLmFkZChjcmVhdGVQYXJhbVZhbHVlKFdTQW5ub3RhdGlvbkZlYXR1cmVzLkVORFBPSU5UX0lOVEVSRkFDRV9BVFRSSUJVVEUsIHdzLmdldFNlcnZpY2VFbmRwb2ludCgpLmdldEltcGxlbWVudGF0aW9uKCkpKTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWlmICh3cy5nZXROYW1lKCkhPW51bGwgJiYgDQotCQkJIXdzLmdldE5hbWUoKS5lcXVhbHMoSmF4V3NVdGlscy5nZXREZWZhdWx0U2VydmljZU5hbWUod3MuZ2V0SW1wbGVtZW50YXRpb24oKSkpKSANCi0JCXsNCi0JCQlwYXJhbVZhbHVlUGFpcnMuYWRkKGNyZWF0ZVBhcmFtVmFsdWUoV1NBbm5vdGF0aW9uRmVhdHVyZXMuU0VSVklDRV9OQU1FX0FUVFJJQlVURSwgd3MuZ2V0TmFtZSgpKSk7DQotCQl9CQkJCQ0KLQkJaWYgKHdzLmdldFBvcnROYW1lKCkhPW51bGwgJiYgDQotCQkJIXdzLmdldFBvcnROYW1lKCkuZXF1YWxzKEpheFdzVXRpbHMuZ2V0RGVmYXVsdFBvcnROYW1lKHdzLmdldEltcGxlbWVudGF0aW9uKCkpKSkgDQotCQl7DQotCQkJcGFyYW1WYWx1ZVBhaXJzLmFkZChjcmVhdGVQYXJhbVZhbHVlKFdTQW5ub3RhdGlvbkZlYXR1cmVzLlBPUlRfTkFNRV9BVFRSSUJVVEUsIHdzLmdldFBvcnROYW1lKCkpKTsNCi0JCX0NCi0JCWlmICh3cy5nZXRUYXJnZXROYW1lc3BhY2UoKSE9bnVsbCAmJiANCi0JCQkhd3MuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKEpheFdzVXRpbHMuY29tcG9zZUpheFdzVGFyZ2V0TmFtZXNwYWNlQnlQYWNrYWdlKHR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKSkpKSANCi0JCXsNCi0JCQlwYXJhbVZhbHVlUGFpcnMuYWRkKGNyZWF0ZVBhcmFtVmFsdWUoV1NBbm5vdGF0aW9uRmVhdHVyZXMuVEFSR0VUX05BTUVTUEFDRV9BVFRSSUJVVEUsIHdzLmdldFRhcmdldE5hbWVzcGFjZSgpKSk7DQotCQl9DQotCQlpZiAod3MuZ2V0V3NkbExvY2F0aW9uKCkhPW51bGwpIHsNCi0JCQlwYXJhbVZhbHVlUGFpcnMuYWRkKGNyZWF0ZVBhcmFtVmFsdWUoV1NBbm5vdGF0aW9uRmVhdHVyZXMuV1NETF9MT0NBVElPTl9BVFRSSUJVVEUsIHdzLmdldFdzZGxMb2NhdGlvbigpKSk7DQotCQl9DQotCQkNCi0JCXJldHVybiBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKFdTQW5ub3RhdGlvbkZlYXR1cmVzLldTX0FOTk9UQVRJT04sIHR5cGUsIHBhcmFtVmFsdWVQYWlycyk7DQotCX0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zdGF0ZS9NZXRob2RQcm9wZXJ0eVN0YXRlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zdGF0ZS9NZXRob2RQcm9wZXJ0eVN0YXRlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZmE4NTgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3RhdGUvTWV0aG9kUHJvcGVydHlTdGF0ZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN0YXRlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuSVByb3BlcnR5U3RhdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotDQotLyoqDQotICogRGVmaW5lcyB0aGUgc3RhdGUgb2Ygd2ViIG1ldGhvZCBwcm9wZXJ0aWVzLiBJbiBjYXNlIHRoZSBtZXRob2QgaXMgcGFydCBvZg0KLSAqIG91dHNpZGUtaW4gd2ViIHNlcnZpY2UgYWxsIHByb3BlcnRpZXMgYXJlIGltbXV0YWJsZS4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIE1ldGhvZFByb3BlcnR5U3RhdGVBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBJUHJvcGVydHlTdGF0ZSANCi17DQotCXB1YmxpYyBib29sZWFuIGlzQ2hhbmdlYWJsZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgDQotCXsNCi0JCWZpbmFsIElXZWJNZXRob2QgbWV0aG9kID0gKElXZWJNZXRob2QpZ2V0VGFyZ2V0KCk7IA0KLQkJaWYgKGlzT3V0aWRlSW5XcyhtZXRob2QpKSB7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJDQotCQlzd2l0Y2goZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSkNCi0JCXsNCi0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fTkFNRToNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0JCQ0KLQkJDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JDQotCXByaXZhdGUgYm9vbGVhbiBpc091dGlkZUluV3MoZmluYWwgSVdlYk1ldGhvZCBtZXRob2QpDQotCXsNCi0JCWZpbmFsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpbWV0aG9kLmVDb250YWluZXIoKTsNCi0JCWlmIChzZWk9PW51bGwpIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQkNCi0JCWZvciAoSVdlYlNlcnZpY2Ugd2ViU2VydmljZSA6IHNlaS5nZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpKSB7DQotCQkJaWYgKHdlYlNlcnZpY2UuZ2V0V3NkbExvY2F0aW9uKCkhPW51bGwpIHsNCi0JCQkJcmV0dXJuIHRydWU7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7DQotCQlyZXR1cm4gSVByb3BlcnR5U3RhdGUuY2xhc3MgPT0gdHlwZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N0YXRlL1BhcmFtZXRlclByb3BlcnR5U3RhdGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N0YXRlL1BhcmFtZXRlclByb3BlcnR5U3RhdGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIwMmVhNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zdGF0ZS9QYXJhbWV0ZXJQcm9wZXJ0eVN0YXRlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN0YXRlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklQcm9wZXJ0eVN0YXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdVc2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsLkplZTVEb21VdGlsczsNCi0NCi0vKioNCi0gKiBDbGFzcyB0aGF0IGRlZmluZXMgd2hpY2ggcHJvcGVydGllcyBmb3Ige0BsaW5rIElXZWJQYXJhbX0gYXJlIGVkaXRhYmxlDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXJQcm9wZXJ0eVN0YXRlQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgSVByb3BlcnR5U3RhdGUNCi17DQotCXB1YmxpYyBib29sZWFuIGlzQ2hhbmdlYWJsZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgCQ0KLQl7DQotCQlhc3NlcnQgZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBJV2ViUGFyYW07DQotCQkNCi0JCWZpbmFsIElXZWJQYXJhbSB3ZWJQYXJhbSA9IChJV2ViUGFyYW0pZ2V0VGFyZ2V0KCk7DQotCQlpZiAod2ViUGFyYW0uZ2V0SW1wbGVtZW50YXRpb24oKS5lcXVhbHMoInJldHVybiIpKSB7Ly8kTk9OLU5MUy0xJA0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCQ0KLQkJaWYgKGlzT3V0c2lkZUluV2ViU2VydmljZSh3ZWJQYXJhbSkpIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQkNCi0JCXN3aXRjaChmZWF0dXJlLmdldEZlYXR1cmVJRCgpKSANCi0JCXsNCi0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19OQU1FOg0KLQkJCXJldHVybiBpc05hbWVDaGFuZ2VhYmxlKHdlYlBhcmFtKTsNCi0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19QQVJUX05BTUU6DQotCQkJcmV0dXJuIGlzUGFydE5hbWVDaGFuZ2VhYmxlKHdlYlBhcmFtKTsJCQkNCi0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19UQVJHRVRfTkFNRVNQQUNFOg0KLQkJCXJldHVybiBpc1RhcmdldE5TQ2hhbmdlYWJsZSh3ZWJQYXJhbSk7DQotCQl9DQotCQkNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQYXJ0TmFtZUNoYW5nZWFibGUoZmluYWwgSVdlYlBhcmFtIHdlYlBhcmFtKQ0KLQl7DQotCQlmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCA9IChJV2ViTWV0aG9kKXdlYlBhcmFtLmVDb250YWluZXIoKTsJCQ0KLQkJDQotCQlyZXR1cm4gKHdlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1N0eWxlKCk9PVNPQVBCaW5kaW5nU3R5bGUuUlBDICYmDQotCQkJCXdlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1VzZSgpPT1TT0FQQmluZGluZ1VzZS5MSVRFUkFMICYmDQotCQkJCXdlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCk9PVNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuV1JBUFBFRCk7DQotCX0NCi0JDQotCXByb3RlY3RlZCBib29sZWFuIGlzTmFtZUNoYW5nZWFibGUoZmluYWwgSVdlYlBhcmFtIHdlYlBhcmFtKQ0KLQl7DQotCQlmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCA9IChJV2ViTWV0aG9kKXdlYlBhcmFtLmVDb250YWluZXIoKTsJCQ0KLQkJaWYgKGlzRG9jdW1lbnRMaXRlcmFsV3JhcHBlZCh3ZWJNZXRob2QpKSB7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQkNCi0JCWlmIChKZWU1RG9tVXRpbHMuZ2V0SW5zdGFuY2UoKS5pc05hbWVSZXF1aXJlZCh3ZWJQYXJhbSkpIHsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHdlYlBhcmFtLmlzSGVhZGVyKCk7DQotCX0NCi0JDQotCXByb3RlY3RlZCBib29sZWFuIGlzVGFyZ2V0TlNDaGFuZ2VhYmxlKGZpbmFsIElXZWJQYXJhbSB3ZWJQYXJhbSkNCi0Jew0KLQkJZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QgPSAoSVdlYk1ldGhvZCl3ZWJQYXJhbS5lQ29udGFpbmVyKCk7CQkNCi0JCWlmIChpc0RvY3VtZW50TGl0ZXJhbFdyYXBwZWQod2ViTWV0aG9kKSkgew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gd2ViUGFyYW0uaXNIZWFkZXIoKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNEb2N1bWVudExpdGVyYWxXcmFwcGVkKGZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kKQ0KLQl7DQotCQlyZXR1cm4gISh3ZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdTdHlsZSgpPT1TT0FQQmluZGluZ1N0eWxlLlJQQyB8fA0KLQkJCQl3ZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdVc2UoKT09U09BUEJpbmRpbmdVc2UuRU5DT0RFRCB8fA0KLQkJCQl3ZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpPT1TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLkJBUkUpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc091dHNpZGVJbldlYlNlcnZpY2UoZmluYWwgSVdlYlBhcmFtIHdlYlBhcmFtKQ0KLQl7DQotCQlmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKXdlYlBhcmFtLmVDb250YWluZXIoKS5lQ29udGFpbmVyKCk7CQkNCi0JCXJldHVybiBEb21VdGlsLklOU1RBTkNFLmlzT3V0c2lkZUluV2ViU2VydmljZShzZWkpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgew0KLQkJcmV0dXJuIElQcm9wZXJ0eVN0YXRlLmNsYXNzID09IHR5cGU7DQotCX0JDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3RhdGUvUHJvcGVydHlTdGF0ZUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N0YXRlL1Byb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NTc4NWY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3RhdGUvUHJvcGVydHlTdGF0ZUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zdGF0ZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklQcm9wZXJ0eVN0YXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbC5Eb21BZGFwdGVyRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBBZGFwdGVyIGZhY3RvcnkgZm9yIGFkYXB0ZXJzIGltcGxlbWVudGluZyB7QGxpbmsgSVByb3BlcnR5U3RhdGV9IGludGVyZmFjZS4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFByb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeSBleHRlbmRzIERvbUFkYXB0ZXJGYWN0b3J5DQotew0KLQkvKioNCi0JICogU2luZ2xldG9uIGluc3RhbmNlIGZvciB0aGlzIGFkYXB0ZXIgZmFjdG9yeSANCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJvcGVydHlTdGF0ZUFkYXB0ZXJGYWN0b3J5IElOU1RBTkNFID0gbmV3IFByb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeSgpOw0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgew0KLQkJcmV0dXJuIElQcm9wZXJ0eVN0YXRlLmNsYXNzID09IG9iamVjdDsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlXZWJTZXJ2aWNlQWRhcHRlcigpIHsNCi0JCXJldHVybiBuZXcgV3NQcm9wZXJ0eVN0YXRlQWRhcHRlcigpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUFkYXB0ZXIoKSB7DQotCQlyZXR1cm4gbmV3IFNlaVByb3BlcnR5U3RhdGVBZGFwdGVyKCk7DQotCX0JDQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSVdlYk1ldGhvZEFkYXB0ZXIoKSB7DQotCQlyZXR1cm4gbmV3IE1ldGhvZFByb3BlcnR5U3RhdGVBZGFwdGVyKCk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJV2ViUGFyYW1BZGFwdGVyKCl7DQotCQlyZXR1cm4gbmV3IFBhcmFtZXRlclByb3BlcnR5U3RhdGVBZGFwdGVyKCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zdGF0ZS9TZWlQcm9wZXJ0eVN0YXRlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zdGF0ZS9TZWlQcm9wZXJ0eVN0YXRlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YmNjNmM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3RhdGUvU2VpUHJvcGVydHlTdGF0ZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN0YXRlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuSVByb3BlcnR5U3RhdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLQ0KLS8qKg0KLSAqIHtAbGluayBJUHJvcGVydHlTdGF0ZX0gYWRhcHRlciBmb3Ige0BsaW5rIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2V9IG9iamVjdHMuDQotICogIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgU2VpUHJvcGVydHlTdGF0ZUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIElQcm9wZXJ0eVN0YXRlDQotew0KLQlwdWJsaWMgYm9vbGVhbiBpc0NoYW5nZWFibGUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIA0KLQl7DQotCQlpZiAoIShnZXRUYXJnZXQoKSBpbnN0YW5jZW9mIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpKSB7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKWdldFRhcmdldCgpOw0KLQkJaWYgKGlzT3V0c2lkZUluV3Moc2VpKSkgew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCQ0KLQkJc3dpdGNoKGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkpDQotCQl7DQotCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19OQU1FOg0KLQkJCXJldHVybiB0cnVlOw0KLQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fVEFSR0VUX05BTUVTUEFDRToNCi0JCQlyZXR1cm4gIXNlaS5pc0ltcGxpY2l0KCk7DQotCQl9DQotCQkNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc091dHNpZGVJbldzKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpKSANCi0JewkJDQotCQlmb3IgKElXZWJTZXJ2aWNlIHdlYlNlcnZpY2UgOiBzZWkuZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKSkgew0KLQkJCWlmICh3ZWJTZXJ2aWNlLmdldFdzZGxMb2NhdGlvbigpIT1udWxsKSB7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgew0KLQkJcmV0dXJuIElQcm9wZXJ0eVN0YXRlLmNsYXNzID09IHR5cGU7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zdGF0ZS9Xc1Byb3BlcnR5U3RhdGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N0YXRlL1dzUHJvcGVydHlTdGF0ZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzcwM2ViOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N0YXRlL1dzUHJvcGVydHlTdGF0ZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN0YXRlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuSVByb3BlcnR5U3RhdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi0NCi0vKioNCi0gKiB7QGxpbmsgSVByb3BlcnR5U3RhdGV9IGFkYXB0ZXIgZm9yIHtAbGluayBJV2ViU2VydmljZX0gb2JqZWN0cy4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFdzUHJvcGVydHlTdGF0ZUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIElQcm9wZXJ0eVN0YXRlDQotew0KLQlwdWJsaWMgYm9vbGVhbiBpc0NoYW5nZWFibGUoZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIA0KLQl7DQotCQlpZiAoIShnZXRUYXJnZXQoKSBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlKSkgew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0NCi0JCWlmIChpc091dHNpZGVJbldzKChJV2ViU2VydmljZSlnZXRUYXJnZXQoKSkpIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQkNCi0JCXN3aXRjaChmZWF0dXJlLmdldEZlYXR1cmVJRCgpKQ0KLQkJew0KLQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fTkFNRTogDQotCQkJcmV0dXJuIHRydWU7DQotCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19QT1JUX05BTUU6DQotCQkJcmV0dXJuIHRydWU7DQotCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19UQVJHRVRfTkFNRVNQQUNFOg0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JDQotCXByb3RlY3RlZCBib29sZWFuIGlzT3V0c2lkZUluV3MoZmluYWwgSVdlYlNlcnZpY2Ugd3MpIA0KLQl7DQotCQlyZXR1cm4gd3MuZ2V0V3NkbExvY2F0aW9uKCkgIT0gbnVsbDsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsNCi0JCXJldHVybiBJUHJvcGVydHlTdGF0ZS5jbGFzcyA9PSB0eXBlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9BYnN0cmFjdE1ldGhvZFN5bmNocm9uaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL0Fic3RyYWN0TWV0aG9kU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ1ZDNkMmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL0Fic3RyYWN0TWV0aG9kU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYzsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5TQkFubm90YXRpb25GZWF0dXJlcy5TQl9BTk5PVEFUSU9OOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldNQW5ub3RhdGlvbkZlYXR1cmVzLldNX0FOTk9UQVRJT047DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV01Bbm5vdGF0aW9uRmVhdHVyZXMuV01fRVhDTFVERURfQVRUUklCVVRFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldNQW5ub3RhdGlvbkZlYXR1cmVzLldNX05BTUVfQVRUUklCVVRFOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlSGllcmFyY2h5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSUFubm90YXRpb25TZXJpYWxpemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSU1vZGVsRWxlbWVudFN5bmNocm9uaXplcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLlNCQW5ub3RhdGlvbkZlYXR1cmVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbkluc3BlY3RvcjsNCi0NCi0NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNZXRob2RTeW5jaHJvbml6ZXIgZXh0ZW5kcyBFbGVtZW50U3luY2hyb25pemVySW1wbA0KLXsNCi0JcHJpdmF0ZSBQYXJhbWV0ZXJTeW5jaHJvbml6ZXIgcGFyYW1ldGVyU3luY2hyb25pemVyID0gbmV3IFBhcmFtZXRlclN5bmNocm9uaXplcih0aGlzKTsNCi0JDQotCXByb3RlY3RlZCBpbnRlcmZhY2UgSU1ldGhvZFZpc2l0b3INCi0Jew0KLQkJdm9pZCB2aXNpdChJTWV0aG9kIG1ldGhvZCwgSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOw0KLQl9DQotDQotCXB1YmxpYyBBYnN0cmFjdE1ldGhvZFN5bmNocm9uaXplcihJTW9kZWxFbGVtZW50U3luY2hyb25pemVyIHBhcmVudCkNCi0Jew0KLQkJc3VwZXIocGFyZW50KTsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB2aXNpdEV4cG9zYWJsZU1ldGhvZHMoSU1ldGhvZFZpc2l0b3IgdmlzaXRvciwgSVR5cGVIaWVyYXJjaHkgaGllcmFyY2h5LCBJQW5ub3RhdGlvbkluc3BlY3RvciBpbnNwZWN0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247DQotDQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplTWV0aG9kcyhmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSwgZmluYWwgSVR5cGUgc2VpVHlwZSwgZmluYWwgSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIENvbGxlY3Rpb248SVdlYk1ldGhvZD4gbWVyZ2VkTWV0aG9kcyA9IG5ldyBMaW5rZWRMaXN0PElXZWJNZXRob2Q+KCk7DQotCQlmaW5hbCBJVHlwZUhpZXJhcmNoeSBoaWVyYXJjaHkgPSBzZWlUeXBlLm5ld1N1cGVydHlwZUhpZXJhcmNoeShudWxsKTsNCi0JCWZpbmFsIElNZXRob2RWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSU1ldGhvZFZpc2l0b3IoKQ0KLQkJew0KLQkJCXB1YmxpYyB2b2lkIHZpc2l0KElNZXRob2QgbWV0aG9kLCBJQW5ub3RhdGlvbkluc3BlY3RvciBpbnNwZWN0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JCQl7DQotCQkJCWZpbmFsIElXZWJNZXRob2Qgd20gPSBvYnRhaW5JbnN0YW5jZShzZWksIG1ldGhvZCk7DQotCQkJCWlmIChtZXJnZWRNZXRob2RzLmNvbnRhaW5zKHdtKSkNCi0JCQkJew0KLQkJCQkJLyoqDQotCQkJCQkgKiBjaGVjayB3aGV0aGVyIHRoaXMgbWV0aG9kIGhhcyBiZWVuIHByb2Nlc3NlZCBpbiBzb21lIG9mIHRoZSBjaGlsZCBjbGFzc2VzLiBJZiBzbw0KLQkJCQkJICogc2tpcCBpdCBhbmQgY29udGludWUuIE9ubHkgdGhlIG1ldGhvZCBpbiB0aGUgbGFzdCBjaGlsZCBkZWNsYXJpbmcgdGhpcyBtZXRob2QgbmVlZHMNCi0JCQkJCSAqIHRvIGJlIHByb2Nlc3NlZCBiZWNhdXNlIGVhY2ggY2hpbGQgaXMgb3ZlcnJpZGluZyB0aGUgcHJvcGVydGllcyBmb3IgdGhlIGV2ZXJ5IG92ZXJyaWRlbg0KLQkJCQkJICogbWV0aG9kLg0KLQkJCQkJICovDQotCQkJCQlyZXR1cm47DQotCQkJCX0NCi0JCQkJbWVyZ2VNZXRob2Qod20sIG1ldGhvZCwgaW5zcGVjdG9yKTsNCi0JCQkJbWVyZ2VkTWV0aG9kcy5hZGQod20pOw0KLQkJCX0NCi0JCX07DQotCQl2aXNpdEV4cG9zYWJsZU1ldGhvZHModmlzaXRvciwgaGllcmFyY2h5LCBpbnNwZWN0b3IpOw0KLQkJcmVtb3ZlTGVmdE1ldGhvZHMoc2VpLCBtZXJnZWRNZXRob2RzKTsNCi0NCi0JfQ0KLQ0KLQlwcml2YXRlIElXZWJNZXRob2Qgb2J0YWluSW5zdGFuY2UoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWksIElNZXRob2QgbWV0aG9kKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZvciAoSVdlYk1ldGhvZCB3bSA6IHNlaS5nZXRXZWJNZXRob2RzKCkpDQotCQl7DQotCQkJaWYgKHV0aWwoKS5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kKS5lcXVhbHMod20uZ2V0SW1wbGVtZW50YXRpb24oKSkpDQotCQkJew0KLQkJCQlyZXR1cm4gd207DQotCQkJfQ0KLQkJfQ0KLQkJZmluYWwgSVdlYk1ldGhvZCBuZXdXZWJNZXRob2QgPSBkb21GYWN0b3J5KCkuY3JlYXRlSVdlYk1ldGhvZCgpOw0KLQkJc2VpLmdldFdlYk1ldGhvZHMoKS5hZGQobmV3V2ViTWV0aG9kKTsNCi0JCXV0aWwoKS5zZXRGZWF0dXJlVmFsdWUobmV3V2ViTWV0aG9kLCBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19JTVBMRU1FTlRBVElPTiwgdXRpbCgpLmNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2QpKTsNCi0JCXJldHVybiBuZXdXZWJNZXRob2Q7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIG1lcmdlTWV0aG9kKElXZWJNZXRob2Qgd20sIElNZXRob2QgbSwgSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElBbm5vdGF0aW9uPElNZXRob2Q+IHdtQW5ub3RhdGlvbiA9IGluc3BlY3Rvci5pbnNwZWN0TWV0aG9kKG0sIFdNX0FOTk9UQVRJT04pOw0KLQkJZmluYWwgYm9vbGVhbiBleGNsdWRlZDsNCi0JCWZpbmFsIFN0cmluZyBuYW1lOw0KLQkJaWYgKHdtQW5ub3RhdGlvbiA9PSBudWxsKQ0KLQkJew0KLQkJCWV4Y2x1ZGVkID0gZmFsc2U7DQotCQkJbmFtZSA9IG0uZ2V0RWxlbWVudE5hbWUoKTsNCi0JCX0gZWxzZQ0KLQkJew0KLQkJCWV4Y2x1ZGVkID0gd21Bbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoV01fRVhDTFVERURfQVRUUklCVVRFKSA9PSBudWxsID8gZmFsc2UgOiBCb29sZWFuLnBhcnNlQm9vbGVhbih3bUFubm90YXRpb24NCi0JCQkJCQkJCQkJCS5nZXRQcm9wZXJ0eVZhbHVlKFdNX0VYQ0xVREVEX0FUVFJJQlVURSkpOw0KLQkJCW5hbWUgPSB3bUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShXTV9OQU1FX0FUVFJJQlVURSkgPT0gbnVsbCA/IG0uZ2V0RWxlbWVudE5hbWUoKSA6IHdtQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFdNX05BTUVfQVRUUklCVVRFKTsNCi0JCX0NCi0JCWlmICghbmFtZS5lcXVhbHMod20uZ2V0TmFtZSgpKSkNCi0JCXsNCi0JCQl1dGlsKCkuc2V0RmVhdHVyZVZhbHVlKHdtLCBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19OQU1FLCBuYW1lKTsNCi0JCX0NCi0JCWlmIChleGNsdWRlZCAhPSB3bS5pc0V4Y2x1ZGVkKCkpDQotCQl7DQotCQkJdXRpbCgpLnNldEZlYXR1cmVWYWx1ZSh3bSwgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fRVhDTFVERUQsIGV4Y2x1ZGVkKTsNCi0JCX0NCi0JCW1lcmdlU29hcEJpbmRpbmcod20sIG0sIGluc3BlY3Rvcik7DQotCQlwYXJhbWV0ZXJTeW5jaHJvbml6ZXIuc3luY2hyb25pemVQYXJhbWV0ZXJzKHdtLCBtLCBpbnNwZWN0b3IpOw0KLQkJDQotCQlyZXNvdXJjZSgpLmdldFNlcmlhbGl6ZXJGYWN0b3J5KCkuYWRhcHQod20sIElBbm5vdGF0aW9uU2VyaWFsaXplci5jbGFzcyk7DQotCQlhZGFwdFRvTG9jYXRpb25JbnRlcmZhY2Uod20sIFdNX0FOTk9UQVRJT04sIHdtQW5ub3RhdGlvbik7DQotCX0NCi0JDQotCXByaXZhdGUgdm9pZCBtZXJnZVNvYXBCaW5kaW5nKGZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kLCBmaW5hbCBJTWV0aG9kIG1ldGhvZCwgZmluYWwgSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElBbm5vdGF0aW9uPElNZXRob2Q+IHNiQW5ub3RhdGlvbiA9IGluc3BlY3Rvci5pbnNwZWN0TWV0aG9kKG1ldGhvZCwgU0JfQU5OT1RBVElPTik7DQotCQlmaW5hbCBJQW5ub3RhdGlvbjxJVHlwZT4gc2VpU2JBbm5vdGF0aW9uID0gaW5zcGVjdG9yLmluc3BlY3RUeXBlKFNCX0FOTk9UQVRJT04pOw0KLQkJDQotCQlmaW5hbCBTT0FQQmluZGluZ1N0eWxlIHN0eWxlID0gZGVmaW5lU0JTdHlsZShzYkFubm90YXRpb24sIHNlaVNiQW5ub3RhdGlvbik7DQotCQlpZiAod2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nU3R5bGUoKSAhPSBzdHlsZSkgew0KLQkJCXdlYk1ldGhvZC5zZXRTb2FwQmluZGluZ1N0eWxlKHN0eWxlKTsNCi0JCX0NCi0JCQ0KLQkJZmluYWwgU09BUEJpbmRpbmdVc2UgdXNlID0gZGVmaW5lU0JVc2Uoc2JBbm5vdGF0aW9uLCBzZWlTYkFubm90YXRpb24pOw0KLQkJaWYgKHdlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1VzZSgpICE9IHVzZSkgew0KLQkJCXdlYk1ldGhvZC5zZXRTb2FwQmluZGluZ1VzZSh1c2UpOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIHBhcmFtU3R5bGUgPWRlZmluZVNCUGFyYW1ldGVyU3R5bGUoc2JBbm5vdGF0aW9uLCBzZWlTYkFubm90YXRpb24pOw0KLQkJaWYgKHdlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkgIT0gcGFyYW1TdHlsZSkgew0KLQkJCXdlYk1ldGhvZC5zZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKHBhcmFtU3R5bGUpOw0KLQkJfQ0KLQkJDQotCQlhZGFwdFRvTG9jYXRpb25JbnRlcmZhY2Uod2ViTWV0aG9kLCBTQl9BTk5PVEFUSU9OLCBzYkFubm90YXRpb24pOw0KLQl9DQotCQ0KLQlwcml2YXRlIFNPQVBCaW5kaW5nU3R5bGUgZGVmaW5lU0JTdHlsZShmaW5hbCBJQW5ub3RhdGlvbjxJTWV0aG9kPiBtZXRob2RTQkFubm90YXRpb24sIGZpbmFsIElBbm5vdGF0aW9uPElUeXBlPiBzZWlTYkFubm90YXRpb24pDQotCXsNCi0JCWZpbmFsIFN0cmluZyB2YWx1ZSA9IG1ldGhvZFNCQW5ub3RhdGlvbiE9bnVsbCA/IG1ldGhvZFNCQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFNCQW5ub3RhdGlvbkZlYXR1cmVzLlNUWUxFX0FUVFJJQlVURSkgOiBudWxsOw0KLQkJaWYodmFsdWU9PW51bGwpIHsNCi0JCQlyZXR1cm4gZGVmQ2FsYygpLmRlZmluZVNCU3R5bGUoc2VpU2JBbm5vdGF0aW9uKTsNCi0JCX0NCi0JCQ0KLQkJaWYgKFNCQW5ub3RhdGlvbkZlYXR1cmVzLlNCX1NUWUxFX1JQQy5lbmRzV2l0aCh2YWx1ZSkpIHsNCi0JCQlyZXR1cm4gU09BUEJpbmRpbmdTdHlsZS5SUEM7DQotCQl9IA0KLQkJDQotCQlpZihTQkFubm90YXRpb25GZWF0dXJlcy5TQl9TVFlMRV9ET0NVTUVOVC5lbmRzV2l0aCh2YWx1ZSkpIHsNCi0JCQlyZXR1cm4gU09BUEJpbmRpbmdTdHlsZS5ET0NVTUVOVDsNCi0JCX0NCi0JCQkNCi0JCXJldHVybiBkZWZDYWxjKCkuZGVmaW5lU0JTdHlsZShzZWlTYkFubm90YXRpb24pOw0KLQl9DQotCQ0KLQlwcml2YXRlIFNPQVBCaW5kaW5nVXNlIGRlZmluZVNCVXNlKGZpbmFsIElBbm5vdGF0aW9uPElNZXRob2Q+IG1ldGhvZFNCQW5ub3RhdGlvbiwgZmluYWwgSUFubm90YXRpb248SVR5cGU+IHNlaVNiQW5ub3RhdGlvbikgDQotCXsNCi0JCWZpbmFsIFN0cmluZyB2YWx1ZSA9IG1ldGhvZFNCQW5ub3RhdGlvbiE9bnVsbCA/IG1ldGhvZFNCQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFNCQW5ub3RhdGlvbkZlYXR1cmVzLlVTRV9BVFRSSUJVVEUpIDogbnVsbDsNCi0JCWlmICh2YWx1ZT09bnVsbCkgewkJDQotCQkJcmV0dXJuIGRlZkNhbGMoKS5kZWZpbmVTQlVzZShzZWlTYkFubm90YXRpb24pOw0KLQkJfQ0KLQkJDQotCQlpZiAoU0JBbm5vdGF0aW9uRmVhdHVyZXMuU0JfVVNFX0VOQ09ERUQuZW5kc1dpdGgodmFsdWUpKSB7DQotCQkJcmV0dXJuIFNPQVBCaW5kaW5nVXNlLkVOQ09ERUQ7DQotCQl9DQotCQkNCi0JCWlmIChTQkFubm90YXRpb25GZWF0dXJlcy5TQl9VU0VfTElURVJBTC5lbmRzV2l0aCh2YWx1ZSkpIHsNCi0JCQlyZXR1cm4gU09BUEJpbmRpbmdVc2UuTElURVJBTDsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGRlZkNhbGMoKS5kZWZpbmVTQlVzZShzZWlTYkFubm90YXRpb24pOw0KLQl9DQotCQ0KLQlwcml2YXRlIFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgZGVmaW5lU0JQYXJhbWV0ZXJTdHlsZShmaW5hbCBJQW5ub3RhdGlvbjxJTWV0aG9kPiBtZXRob2RTQkFubm90YXRpb24sIGZpbmFsIElBbm5vdGF0aW9uPElUeXBlPiBzZWlTYkFubm90YXRpb24pDQotCXsNCi0JCWZpbmFsIFN0cmluZyB2YWx1ZSA9IG1ldGhvZFNCQW5ub3RhdGlvbiE9bnVsbCA/IG1ldGhvZFNCQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFNCQW5ub3RhdGlvbkZlYXR1cmVzLlBBUkFNRVRFUl9TVFlMRV9BVFRSSUJVVEUpIDogbnVsbDsNCi0JCWlmICh2YWx1ZT09bnVsbCkgew0KLQkJCXJldHVybiBkZWZDYWxjKCkuZGVmaW5lU0JQYXJhbWV0ZXJTdHlsZShzZWlTYkFubm90YXRpb24pOw0KLQkJfQ0KLQkJDQotCQlpZiAoU0JBbm5vdGF0aW9uRmVhdHVyZXMuU0JfUEFSQU1FVEVSX1NUWUxFX0JBUkUuZW5kc1dpdGgodmFsdWUpKSB7DQotCQkJcmV0dXJuIFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuQkFSRTsNCi0JCX0NCi0JCQ0KLQkJaWYgKFNCQW5ub3RhdGlvbkZlYXR1cmVzLlNCX1BBUkFNRVRFUl9TVFlMRV9XUkFQUEVELmVuZHNXaXRoKHZhbHVlKSkgew0KLQkJCXJldHVybiBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLldSQVBQRUQ7DQotCQl9CQkNCi0JCQ0KLQkJcmV0dXJuIGRlZkNhbGMoKS5kZWZpbmVTQlBhcmFtZXRlclN0eWxlKHNlaVNiQW5ub3RhdGlvbik7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUxlZnRNZXRob2RzKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpLCBDb2xsZWN0aW9uPElXZWJNZXRob2Q+IG1lcmdlZE1ldGhvZHMpDQotCXsNCi0JCWZpbmFsIEl0ZXJhdG9yPElXZWJNZXRob2Q+IGl0ZXIgPSBzZWkuZ2V0V2ViTWV0aG9kcygpLml0ZXJhdG9yKCk7DQotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpDQotCQl7DQotCQkJaWYgKCFtZXJnZWRNZXRob2RzLmNvbnRhaW5zKGl0ZXIubmV4dCgpKSkNCi0JCQl7DQotCQkJCWl0ZXIucmVtb3ZlKCk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9BYnN0cmFjdE1vZGVsU3luY2hyb25pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvQWJzdHJhY3RNb2RlbFN5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYzIzMzNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9BYnN0cmFjdE1vZGVsU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYzsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5XU19BTk5PVEFUSU9OOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLklDb21waWxhdGlvblVuaXRIYW5kbGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSU1vZGVsRWxlbWVudFN5bmNocm9uaXplcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlLlNlcnZpY2VNb2RlbERhdGE7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uSW5zcGVjdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZy5JTG9nZ2VyOw0KLQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1vZGVsU3luY2hyb25pemVyIGltcGxlbWVudHMgSU1vZGVsRWxlbWVudFN5bmNocm9uaXplcg0KLXsNCi0JcHJpdmF0ZSBmaW5hbCBTZWlTeW5jaHJvbml6ZXIgc2VpTG9hZGVyOw0KLQ0KLQlwcml2YXRlIGZpbmFsIFdzU3luY2hyb25pemVyIHdzTG9hZGVyOw0KLQ0KLQlwcml2YXRlIGZpbmFsIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgcmVzb3VyY2U7DQotDQotCXByaXZhdGUgSURPTSBkb21CZWluZ0xvYWRlZDsNCi0NCi0JcHJpdmF0ZSBmaW5hbCBTZXJ2aWNlTW9kZWxEYXRhIHNlcnZpY2VEYXRhOw0KLQ0KLQlwcml2YXRlIGZpbmFsIERvbVV0aWwgdXRpbDsNCi0NCi0JcHVibGljIEFic3RyYWN0TW9kZWxTeW5jaHJvbml6ZXIoSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZSwgU2VydmljZU1vZGVsRGF0YSBzZXJ2aWNlRGF0YSkNCi0Jew0KLQkJdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOw0KLQkJdGhpcy51dGlsID0gbmV3IERvbVV0aWwoKTsNCi0JCXRoaXMuc2VydmljZURhdGEgPSBzZXJ2aWNlRGF0YTsNCi0JCXRoaXMuc2VpTG9hZGVyID0gbmV3IFNlaVN5bmNocm9uaXplcih0aGlzKTsNCi0JCXRoaXMud3NMb2FkZXIgPSBuZXcgV3NTeW5jaHJvbml6ZXIodGhpcyk7DQotCX0NCi0NCi0JcHVibGljIERvbUZhY3RvcnkgZG9tRmFjdG9yeSgpDQotCXsNCi0JCXJldHVybiBEb21GYWN0b3J5LmVJTlNUQU5DRTsNCi0JfQ0KLQ0KLQlwdWJsaWMgSURPTSBnZXREb21CZWluZ0xvYWRlZCgpDQotCXsNCi0JCWlmIChkb21CZWluZ0xvYWRlZCA9PSBudWxsKQ0KLQkJew0KLQkJCWRvbUJlaW5nTG9hZGVkID0gZG9tRmFjdG9yeSgpLmNyZWF0ZUlET00oKTsNCi0JCX0NCi0JCXJldHVybiBkb21CZWluZ0xvYWRlZDsNCi0JfQ0KLQ0KLQlwdWJsaWMgSUphdmFNb2RlbCBqYXZhTW9kZWwoKQ0KLQl7DQotCQlyZXR1cm4gcmVzb3VyY2UuamF2YU1vZGVsKCk7DQotCX0NCi0NCi0JcHVibGljIElMb2dnZXIgbG9nZ2VyKCkNCi0Jew0KLQkJcmV0dXJuIHJlc291cmNlLmxvZ2dlcigpOw0KLQl9DQotDQotCXB1YmxpYyBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlKCkNCi0Jew0KLQkJcmV0dXJuIHJlc291cmNlOw0KLQl9DQotDQotCXB1YmxpYyBTZXJ2aWNlTW9kZWxEYXRhIHNlcnZpY2VEYXRhKCkNCi0Jew0KLQkJcmV0dXJuIHNlcnZpY2VEYXRhOw0KLQl9DQotDQotCXB1YmxpYyBEb21VdGlsIHV0aWwoKQ0KLQl7DQotCQlyZXR1cm4gdXRpbDsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQ29tcGlsYXRpb25Vbml0KGZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QsIGZpbmFsIElDb21waWxhdGlvblVuaXQgY3UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJdHJ5IHsNCi0JCQlyZXNvdXJjZS5kaXNhYmxlU2F2aW5nKCk7DQotCQkJDQotCQkJaWYgKGN1LmZpbmRQcmltYXJ5VHlwZSgpID09IG51bGwgfHwgIShjdS5maW5kUHJpbWFyeVR5cGUoKS5pc0ludGVyZmFjZSgpIHx8IGN1LmZpbmRQcmltYXJ5VHlwZSgpLmlzQ2xhc3MoKSkpDQotCQkJew0KLQkJCQlpZiAobG9nZ2VyKCkuaXNEZWJ1ZygpKQ0KLQkJCQl7DQotCQkJCQlsb2dnZXIoKS5sb2dEZWJ1Zygibm8gcHJpbWFyeSB0eXBlIGluIGNvbXBpbGF0aW9uIHVuaXQiICsgY3UuZ2V0UGF0aCgpLnRvT1NTdHJpbmcoKSk7Ly8kTk9OLU5MUy0xJA0KLQkJCQl9DQotCQkJCXJldHVybjsNCi0JCQl9IA0KLQkJCQkJCQ0KLQkJCWZpbmFsIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvciA9IHJlc291cmNlKCkubmV3QW5ub3RhdGlvbkluc3BlY3RvcihjdS5maW5kUHJpbWFyeVR5cGUoKSk7DQotCQkJZmluYWwgSUFubm90YXRpb248SVR5cGU+IHdzQW5ub3RhdGlvbiA9IGluc3BlY3Rvci5pbnNwZWN0VHlwZShXU19BTk5PVEFUSU9OKTsNCi0JCQlpZiAod3NBbm5vdGF0aW9uID09IG51bGwpDQotCQkJew0KLQkJCQlpZiAobG9nZ2VyKCkuaXNEZWJ1ZygpKQ0KLQkJCQl7DQotCQkJCQlsb2dnZXIoKS5sb2dEZWJ1Zygibm8gIiArIFdTX0FOTk9UQVRJT04gKyAiIGFubm90YXRpb24gZm91bmQgb24gdHlwZSAiICsgY3UuZmluZFByaW1hcnlUeXBlKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOy8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkDQotCQkJCX0NCi0JCQkJcmV0dXJuOw0KLQkJCX0NCi0JCQkNCi0JCQlyZWNvcmRIaWVyYXJjaHkoY3UuZmluZFByaW1hcnlUeXBlKCkpOw0KLQkJCQ0KLQkJCWlmICh3c0Fubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKS5pc0ludGVyZmFjZSgpKQ0KLQkJCXsNCi0JCQkJLy8gaGFuZGxlIGNsYXNzIGNoYW5nZWQgdG8gaW50ZXJmYWNlDQotCQkJCXJlbW92ZVdzTW9kZWxFbGVtZW50cyh3c1Byb2plY3QsIHdzQW5ub3RhdGlvbi5nZXRBcHBsaWVkRWxlbWVudCgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLCBmYWxzZSk7DQotCQkJCQ0KLQkJCQlzZWlMb2FkZXIuc3luY2hyb25pemVJbnRlcmZhY2Uod3NQcm9qZWN0LCB3c0Fubm90YXRpb24sIGluc3BlY3Rvcik7DQotCQkJfSBlbHNlIGlmICh3c0Fubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKS5pc0NsYXNzKCkpDQotCQkJew0KLQkJCQkvLyBoYW5kbGUgaW50ZXJmYWNlIGNoYW5nZWQgdG8gY2xhc3MNCi0JCQkJcmVtb3ZlU2VpTW9kZWxFbGVtZW50cyh3c1Byb2plY3QsIHdzQW5ub3RhdGlvbi5nZXRBcHBsaWVkRWxlbWVudCgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLCBmYWxzZSwgdHJ1ZSk7DQotCQkJCQ0KLQkJCQkvLyBpZiB0aGUgYW5ub3RhdGlvbiBoYXMgY2hhbmdlZCBhbmQgZW5kcG9pbnRJbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgdGhlIGV4aXN0aW5nDQotCQkJCS8vIFNFSSBpbiB0aGUgcHJvamVjdCBzaG91bGQgYmUgcmVtb3ZlZA0KLQkJCQlmaW5hbCBJV2ViU2VydmljZSB3cyA9IHdzTG9hZGVyLnN5bmNocm9uaXplV2ViU2VydmljZSh3c1Byb2plY3QsIHdzQW5ub3RhdGlvbiwgaW5zcGVjdG9yKTsNCi0JCQkJaWYgKHdzIT1udWxsICYmICh3cy5nZXRTZXJ2aWNlRW5kcG9pbnQoKT09bnVsbCB8fCAhd3MuZ2V0U2VydmljZUVuZHBvaW50KCkuaXNJbXBsaWNpdCgpKSkgew0KLQkJCQkJcmVtb3ZlU2VpTW9kZWxFbGVtZW50cyh3c1Byb2plY3QsIHdzLmdldEltcGxlbWVudGF0aW9uKCksIGZhbHNlLCBmYWxzZSk7DQotCQkJCX0NCi0JCQl9IGVsc2UNCi0JCQl7DQotCQkJCWlmIChsb2dnZXIoKS5pc0RlYnVnKCkpDQotCQkJCXsNCi0JCQkJCWxvZ2dlcigpLmxvZ0RlYnVnKCJhbm5vdGF0aW9uICIgKyBXU19BTk5PVEFUSU9OICsgIiBpcyBwdXQgb24gdHlwZSAiLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQNCi0JCQkJCQkJCQkrIHdzQW5ub3RhdGlvbi5nZXRBcHBsaWVkRWxlbWVudCgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpDQotCQkJCQkJCQkJKyAid2hpY2ggaXMgbmVpdGhlciBpbnRlcmZhY2UsIG5vciBhIGNsYXNzLiBJZ25vcnJpbmchIik7Ly8kTk9OLU5MUy0xJA0KLQkJCQl9DQotCQkJfQkJCQ0KLQkJfSBmaW5hbGx5IHsNCi0JCQlyZXNvdXJjZS5lbmFibGVTYXZpbmcoKTsNCi0JCX0NCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFJlbW92ZXMgd2ViIHNlcnZpY2VzIGZyb20gdGhlIG1vZGVsLg0KLQkgKiBAcGFyYW0gd3NQcm9qZWN0DQotCSAqIEBwYXJhbSBpbXBsQmFzZU5hbWUNCi0JICovDQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVdzTW9kZWxFbGVtZW50cyhmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0LCBmaW5hbCBTdHJpbmcgaW1wbEJhc2VOYW1lLCBmaW5hbCBib29sZWFuIGlzRm9yUGFja2FnZSkgDQotCXsNCi0JCWZpbmFsIEl0ZXJhdG9yPElXZWJTZXJ2aWNlPiB3c0l0ZXIgPSB3c1Byb2plY3QuZ2V0V2ViU2VydmljZXMoKS5pdGVyYXRvcigpOw0KLQkJd2hpbGUgKHdzSXRlci5oYXNOZXh0KCkpDQotCQl7DQotCQkJZmluYWwgSVdlYlNlcnZpY2Ugd3MgPSB3c0l0ZXIubmV4dCgpOw0KLQkJCWlmICh3cy5nZXRJbXBsZW1lbnRhdGlvbigpLmVxdWFscyhpbXBsQmFzZU5hbWUpIHx8IA0KLQkJCQkoaXNGb3JQYWNrYWdlICYmIHdzLmdldEltcGxlbWVudGF0aW9uKCkuc3RhcnRzV2l0aChpbXBsQmFzZU5hbWUpKSkNCi0JCQl7DQotCQkJCXNlcnZpY2VEYXRhKCkuY2xlYXJIaWVyYXJjaHkod3MuZ2V0SW1wbGVtZW50YXRpb24oKSk7DQotCQkJCXdzSXRlci5yZW1vdmUoKTsNCi0JCQkJaWYgKHdzLmdldFNlcnZpY2VFbmRwb2ludCgpICE9IG51bGwpDQotCQkJCXsNCi0JCQkJCXdzLmdldFNlcnZpY2VFbmRwb2ludCgpLmdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkucmVtb3ZlKHdzKTsNCi0JCQkJfQ0KLQkJCQlzZXJ2aWNlRGF0YSgpLnVubWFwKHdzKTsNCi0JCQl9DQotCQl9DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZW1vdmVzIFNFSSdzIHdpdGggPGNvZGU+aW1wbEJhc2VOYW1lPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBmcm9tIHRoZSBtb2RlbC4NCi0JICogQHBhcmFtIHdzUHJvamVjdA0KLQkgKiBAcGFyYW0gaW1wbEJhc2VOYW1lDQotCSAqIEBwYXJhbSBvbmx5RXhwbGljaXQgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gaW1wbGljaXQgaW50ZXJmYWNlcyBhcmUgbm90IHJlbW92ZWQgZnJvbSBtb2RlbCwgb3RoZXJ3aXNlIGJvdGggYXJlIHJlbW92ZWQuDQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZWlNb2RlbEVsZW1lbnRzKGZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QsIGZpbmFsIFN0cmluZyBpbXBsQmFzZU5hbWUsIGZpbmFsIGJvb2xlYW4gaXNGb3JQYWNrYWdlLCBmaW5hbCBib29sZWFuIG9ubHlFeHBsaWNpdCkgDQotCXsNCi0JCWZpbmFsIEl0ZXJhdG9yPElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U+IHNlaUl0ZXIgPSB3c1Byb2plY3QuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpLml0ZXJhdG9yKCk7DQotCQl3aGlsZSAoc2VpSXRlci5oYXNOZXh0KCkpDQotCQl7DQotCQkJZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSBzZWlJdGVyLm5leHQoKTsNCi0JCQlpZiAoc2VpLmdldEltcGxlbWVudGF0aW9uKCkuZXF1YWxzKGltcGxCYXNlTmFtZSkgfHwNCi0JCQkJKGlzRm9yUGFja2FnZSAmJiBzZWkuZ2V0SW1wbGVtZW50YXRpb24oKS5zdGFydHNXaXRoKGltcGxCYXNlTmFtZSkpKQ0KLQkJCXsNCi0JCQkJaWYgKChvbmx5RXhwbGljaXQgJiYgc2VpLmlzSW1wbGljaXQoKSkpIHsNCi0JCQkJCWNvbnRpbnVlOw0KLQkJCQl9DQotCQkJCXNlcnZpY2VEYXRhKCkuY2xlYXJIaWVyYXJjaHkoc2VpLmdldEltcGxlbWVudGF0aW9uKCkpOw0KLQkJCQlzZWkuZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKS5jbGVhcigpOw0KLQkJCQlzZWlJdGVyLnJlbW92ZSgpOw0KLQkJCX0NCi0JCX0NCi0JfQkNCi0NCi0Jdm9pZCByZWNvcmRIaWVyYXJjaHkoSVR5cGUgdHlwZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBDb2xsZWN0aW9uPElDb21waWxhdGlvblVuaXQ+IGNvbXBpbGF0aW9uVW5pdHMgPSBuZXcgTGlua2VkTGlzdDxJQ29tcGlsYXRpb25Vbml0PigpOw0KLQkJDQotCQlmb3IgKElUeXBlIHN1cGVyVHlwZSA6IHR5cGUubmV3U3VwZXJ0eXBlSGllcmFyY2h5KG51bGwpLmdldEFsbFN1cGVydHlwZXModHlwZSkpIHsNCi0JCQljb21waWxhdGlvblVuaXRzLmFkZChzdXBlclR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCkpOw0KLQkJfQ0KLQkJCQ0KLQkJc2VydmljZURhdGEoKS5yZWNvcmRIaWVyYXJjaHkodHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSwgY29tcGlsYXRpb25Vbml0cyk7DQotCX0NCi0NCi0NCi0JcHJvdGVjdGVkIElXZWJTZXJ2aWNlUHJvamVjdCBjcmVhdGVQcm9qZWN0KGZpbmFsIElKYXZhUHJvamVjdCBqcHJqKQ0KLQl7DQotCQlmaW5hbCBJV2ViU2VydmljZVByb2plY3QgdGhpc1Byb2plY3QgPSBkb21GYWN0b3J5KCkuY3JlYXRlSVdlYlNlcnZpY2VQcm9qZWN0KCk7DQotCQl1dGlsKCkuc2V0RmVhdHVyZVZhbHVlKHRoaXNQcm9qZWN0LCBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9QUk9KRUNUX19OQU1FLCBqcHJqLmdldEVsZW1lbnROYW1lKCkpOw0KLQ0KLQkJdXRpbCgpLmFkZFRvQ29sbGVjdGlvbkZlYXR1cmUoZ2V0RG9tQmVpbmdMb2FkZWQoKSwgRG9tUGFja2FnZS5JRE9NX19XRUJfU0VSVklDRV9QUk9KRUNUUywgdGhpc1Byb2plY3QpOw0KLQkJcmV0dXJuIHRoaXNQcm9qZWN0Ow0KLQl9DQotDQotCXByb3RlY3RlZCBjbGFzcyBMb2FkZXJDb21waWxhdGlvblVuaXRIYW5kbGVyIGltcGxlbWVudHMgSUNvbXBpbGF0aW9uVW5pdEhhbmRsZXINCi0Jew0KLQkJcHVibGljIHZvaWQgc3RhcnRlZCgpDQotCQl7DQotCQl9DQotDQotCQlwdWJsaWMgdm9pZCBmaW5pc2hlZCgpDQotCQl7DQotCQkJcmVzb3VyY2UoKS5nZXRDb250ZW50cygpLmFkZChnZXREb21CZWluZ0xvYWRlZCgpKTsNCi0JCX0NCi0NCi0JCXByb3RlY3RlZCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0Ow0KLQ0KLQkJcHVibGljIHZvaWQgaGFuZGxlKGZpbmFsIElKYXZhUHJvamVjdCBqcHJqKQ0KLQkJew0KLQkJCXdzUHJvamVjdCA9IGNyZWF0ZVByb2plY3QoanByaik7DQotCQl9DQotDQotCQlwdWJsaWMgdm9pZCBoYW5kbGUoZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBjdSkNCi0JCXsNCi0JCQl0cnkNCi0JCQl7DQotCQkJCXByb2Nlc3NDb21waWxhdGlvblVuaXQod3NQcm9qZWN0LCBjdSk7DQotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkNCi0JCQl7DQotCQkJCWxvZ2dlcigpLmxvZ0Vycm9yKCJVbmFibGUgdG8gcGFyc2UgdGhlIGNvbnRlbnQgb2YgY29tcGlsYXRpb24gdW5pdCIgKyBjdS5nZXRQYXRoKCkudG9PU1N0cmluZygpLCBqbWUpOyAvLyROT04tTkxTLTEkDQotCQkJfQ0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9FbGVtZW50U3luY2hyb25pemVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL0VsZW1lbnRTeW5jaHJvbml6ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBmODE5NDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL0VsZW1lbnRTeW5jaHJvbml6ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET007DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JTW9kZWxFbGVtZW50U3luY2hyb25pemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZS5TZXJ2aWNlTW9kZWxEYXRhOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9uLklBbm5vdGF0aW9uQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZy5JTG9nZ2VyOw0KLQ0KLWNsYXNzIEVsZW1lbnRTeW5jaHJvbml6ZXJJbXBsIGltcGxlbWVudHMgSU1vZGVsRWxlbWVudFN5bmNocm9uaXplcg0KLXsNCi0NCi0JcHJpdmF0ZSBmaW5hbCBJTW9kZWxFbGVtZW50U3luY2hyb25pemVyIHBhcmVudDsNCi0JcHJpdmF0ZSBmaW5hbCBEb21VdGlsIHV0aWw7DQotCXByaXZhdGUgZmluYWwgSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3IgZGVmYXVsdHNDYWxjdWxhdG9yOw0KLQkNCi0JRWxlbWVudFN5bmNocm9uaXplckltcGwoSU1vZGVsRWxlbWVudFN5bmNocm9uaXplciBwYXJlbnQpDQotCXsNCi0JCXRoaXMucGFyZW50ID0gcGFyZW50Ow0KLQkJdXRpbCA9IG5ldyBEb21VdGlsKCk7DQotCQlkZWZhdWx0c0NhbGN1bGF0b3IgPSBuZXcgSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3IoKTsNCi0JfQ0KLQkNCi0JcHVibGljIERvbVV0aWwgdXRpbCgpIHsNCi0JCXJldHVybiB1dGlsOw0KLQl9DQotCQ0KLQlwdWJsaWMgSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3IgZGVmQ2FsYygpIHsNCi0JCXJldHVybiBkZWZhdWx0c0NhbGN1bGF0b3I7DQotCX0NCi0JDQotCXB1YmxpYyBTZXJ2aWNlTW9kZWxEYXRhIHNlcnZpY2VEYXRhKCkNCi0Jew0KLQkJcmV0dXJuIHBhcmVudC5zZXJ2aWNlRGF0YSgpOw0KLQl9DQotCQ0KLQlwdWJsaWMgSUxvZ2dlciBsb2dnZXIoKQ0KLQl7DQotCQlyZXR1cm4gcGFyZW50LmxvZ2dlcigpOw0KLQl9DQotCQ0KLQlwdWJsaWMgSURPTSBnZXREb21CZWluZ0xvYWRlZCgpDQotCXsNCi0JCXJldHVybiBwYXJlbnQuZ2V0RG9tQmVpbmdMb2FkZWQoKTsNCi0JfQ0KLQkNCi0JcHVibGljIERvbUZhY3RvcnkgZG9tRmFjdG9yeSgpDQotCXsNCi0JCXJldHVybiBwYXJlbnQuZG9tRmFjdG9yeSgpOw0KLQl9DQotCQ0KLQlwdWJsaWMgSUphdmFNb2RlbCBqYXZhTW9kZWwoKQ0KLQl7DQotCQlyZXR1cm4gcGFyZW50LmphdmFNb2RlbCgpOw0KLQl9DQotCQ0KLQlwdWJsaWMgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZSgpDQotCXsNCi0JCXJldHVybiBwYXJlbnQucmVzb3VyY2UoKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgYWRhcHRUb0xvY2F0aW9uSW50ZXJmYWNlKGZpbmFsIEVPYmplY3Qgb2JqZWN0LCBmaW5hbCBTdHJpbmcgYW5uRlFOYW1lLCBmaW5hbCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm5vdGF0aW9uKQ0KLQl7DQotCQlmaW5hbCBJQW5ub3RhdGlvbkFkYXB0ZXIgbG9jYXRvciA9IChJQW5ub3RhdGlvbkFkYXB0ZXIpQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KG9iamVjdCwgSUFubm90YXRpb25BZGFwdGVyLmNsYXNzKTsNCi0JCWxvY2F0b3IuYWRkQW5ub3RhdGlvbihhbm5GUU5hbWUsIGFubm90YXRpb24pOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9Jbml0aWFsTW9kZWxTeW5jaHJvbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9Jbml0aWFsTW9kZWxTeW5jaHJvbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGJiMDFiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvSW5pdGlhbE1vZGVsU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZS5TZXJ2aWNlTW9kZWxEYXRhOw0KLQ0KLXB1YmxpYyBjbGFzcyBJbml0aWFsTW9kZWxTeW5jaHJvbml6ZXIgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsU3luY2hyb25pemVyDQotew0KLQlwdWJsaWMgSW5pdGlhbE1vZGVsU3luY2hyb25pemVyKEpheFdzV29ya3NwYWNlUmVzb3VyY2UgcmVzb3VyY2UsIFNlcnZpY2VNb2RlbERhdGEgc2VydmljZURhdGEpDQotCXsNCi0JCXN1cGVyKHJlc291cmNlLCBzZXJ2aWNlRGF0YSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgbG9hZChNYXA8Pyw/PiBvcHRpb25zLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbg0KLQl7DQotCQl0cnkgew0KLQkJCXJlc291cmNlKCkuZGlzYWJsZVNhdmluZygpOwkJCQ0KLQkJCXJlc291cmNlKCkubmV3Q29tcGlsYXRpb25Vbml0RmluZGVyKHJlc291cmNlKCkuamF2YU1vZGVsKCksIHJlc291cmNlKCkuZ2V0UHJvamVjdFNlbGVjdG9ycygpKS4NCi0JCQkJZmluZChtb25pdG9yLCBuZXcgTG9hZGVyQ29tcGlsYXRpb25Vbml0SGFuZGxlcigpKTsNCi0JCX0gZmluYWxseSB7DQotCQkJcmVzb3VyY2UoKS5lbmFibGVTYXZpbmcoKTsNCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvT25FdmVudE1vZGVsU3luY2hyb25pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvT25FdmVudE1vZGVsU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcyZWNlMWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL09uRXZlbnRNb2RlbFN5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN5bmM7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuV1NfQU5OT1RBVElPTjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkVsZW1lbnRDaGFuZ2VkRXZlbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklFbGVtZW50Q2hhbmdlZExpc3RlbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudERlbHRhOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET007DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLklDb21waWxhdGlvblVuaXRGaW5kZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JUHJvamVjdFNlbGVjdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldvcmtzcGFjZUNVRmluZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZS5TZXJ2aWNlTW9kZWxEYXRhOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotDQotcHVibGljIGNsYXNzIE9uRXZlbnRNb2RlbFN5bmNocm9uaXplciBleHRlbmRzIEFic3RyYWN0TW9kZWxTeW5jaHJvbml6ZXIgaW1wbGVtZW50cyBJRWxlbWVudENoYW5nZWRMaXN0ZW5lcg0KLXsNCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBJRE9NIGdldERvbUJlaW5nTG9hZGVkKCkNCi0Jew0KLQkJcmV0dXJuIHJlc291cmNlKCkuZ2V0RE9NKCk7DQotCX0NCi0NCi0JcHVibGljIE9uRXZlbnRNb2RlbFN5bmNocm9uaXplcihKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlLCBTZXJ2aWNlTW9kZWxEYXRhIHNlcnZpY2VEYXRhKQ0KLQl7DQotCQlzdXBlcihyZXNvdXJjZSwgc2VydmljZURhdGEpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGVsZW1lbnRDaGFuZ2VkKGZpbmFsIEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXZlbnQpDQotCXsNCi0JCXRyeQ0KLQkJew0KLQkJCWlmIChsb2dnZXIoKS5pc0RlYnVnKCkpDQotCQkJew0KLQkJCQlsb2dnZXIoKS5sb2dEZWJ1ZygiRWxlbWVudENoYW5nZWRFdmVudCBoYXMgYmVlbiBkZWxpdmVyZWQuIEV2ZW50IGRldGFpbHM6ICIgKyBldmVudC50b1N0cmluZygpKTsvLyROT04tTkxTLTEkDQotCQkJfQ0KLQkJCQ0KLQkJCS8vIG5vIHByb2Nlc3NpbmcgaWYgRE9NIGxvYWQgaGFzIGJlZW4gY2FuY2VsZWQNCi0JCQlpZiAocmVzb3VyY2UoKS5pc0xvYWRDbmFjZWxlZCgpKSB7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQkJDQotCQkJcmVzb3VyY2UoKS5kaXNhYmxlU2F2aW5nKCk7DQotCQkJDQotCQkJLy8gaGFuZGxlcyBFbGVtZW50Q2hhbmdlZEV2ZW50LlBPU1RfUkVDT05DSUxFIC0gdGhlIGNhc2Ugd2hlbiB0aGUgZWRpdG9yIHNlbmRzIHJlY29uY2lsZSBldmVudA0KLQkJCWlmIChldmVudC5nZXRUeXBlKCkgPT0gRWxlbWVudENoYW5nZWRFdmVudC5QT1NUX1JFQ09OQ0lMRSkNCi0JCQl7DQotCQkJCWhhbmRsZVJlY29uY2lsZUV2ZW50KGV2ZW50KTsNCi0JCQl9DQotDQotCQkJLy8gaGFuZGxlcyBFbGVtZW50Q2hhbmdlZEV2ZW50LlBPU1RfQ0hBTkdFIC0gdGhlIGNhc2Ugd2hlbiB0aGUgY29tcGlsYXRpb24gdW5pdCBoYXMgYmVlbiBjaGFuZ2VkDQotCQkJaWYgKGV2ZW50LmdldERlbHRhKCkuZ2V0RWxlbWVudCgpICE9IHJlc291cmNlKCkuamF2YU1vZGVsKCkpDQotCQkJew0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQkJCQ0KLQkJCWFzc2VydCAoZXZlbnQuZ2V0RGVsdGEoKS5nZXRGbGFncygpICYgKElKYXZhRWxlbWVudERlbHRhLkZfQ0hJTERSRU4gfCBJSmF2YUVsZW1lbnREZWx0YS5GX0NPTlRFTlQpKSAhPSAwOw0KLQkJCWZvciAoSUphdmFFbGVtZW50RGVsdGEgY2hpbGQgOiBldmVudC5nZXREZWx0YSgpLmdldEFmZmVjdGVkQ2hpbGRyZW4oKSkNCi0JCQl7DQotCQkJCWlmIChjaGlsZC5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBJSmF2YVByb2plY3QpDQotCQkJCXsNCi0JCQkJCWhhbmRsZUNoYW5nZWRQcm9qZWN0KGNoaWxkKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0gDQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgew0KLQkJCWxvZ2dlcigpLmxvZ0Vycm9yKCJVbmFibGUgdG8gc3luY2hyb25pemUgV2ViIFNlcnZpY2UgbW9kZWwgdXBvbiBqYXZhIGVsZW1lbnQgZGVsdGEgIisgZXZlbnQuZ2V0RGVsdGEoKSwgY2UpOyAvLyROT04tTkxTLTEkDQotCQl9IA0KLQkJY2F0Y2ggKFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uIGUpIHsNCi0JCQlsb2dnZXIoKS5sb2dFcnJvcigiVW5hYmxlIHRvIHN5bmNocm9uaXplIFdlYiBTZXJ2aWNlIG1vZGVsIHVwb24gamF2YSBlbGVtZW50IGRlbHRhICIgKyBldmVudC5nZXREZWx0YSgpLCBlKTsgLy8kTk9OLU5MUy0xJA0KLQkJfSANCi0JCWZpbmFsbHkgew0KLQkJCXJlc291cmNlKCkuZW5hYmxlU2F2aW5nKCk7DQotCQl9DQotCX0NCi0JDQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVJlY29uY2lsZUV2ZW50KGZpbmFsIEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXZlbnQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJaWYoIShldmVudC5nZXREZWx0YSgpLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQgKSkgew0KLQkJCXJldHVybjsNCi0JCX0NCi0JCQ0KLQkJaW50IHJlcXVpcmVkRmxhZ3MgPSBJSmF2YUVsZW1lbnREZWx0YS5GX0NPTlRFTlQgfCBJSmF2YUVsZW1lbnREZWx0YS5GX0NISUxEUkVOOw0KLQkJDQotCQlpZiAoKGV2ZW50LmdldERlbHRhKCkuZ2V0RmxhZ3MoKSAmIHJlcXVpcmVkRmxhZ3MpID09IDApIHsNCi0JCQlyZXR1cm47DQotCQl9DQotDQotCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IGN1ID0gKElDb21waWxhdGlvblVuaXQpZXZlbnQuZ2V0RGVsdGEoKS5nZXRFbGVtZW50KCk7DQotCQlpZiAoIXJlc291cmNlKCkuYXBwcm92ZVByb2plY3QoY3UuZ2V0SmF2YVByb2plY3QoKSkpIHsNCi0JCQlyZXR1cm47DQotCQl9DQotDQotCQlpZiAoaXNKYXZhUmVzb3VyY2UoY3UpKSB7DQotCQkJaGFuZGxlQ2hhbmdlZENvbnRlbnRDb21waWxhdGlvblVuaXQoY3UpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwcml2YXRlIGJvb2xlYW4gaXNKYXZhUmVzb3VyY2UoSUNvbXBpbGF0aW9uVW5pdCBjdSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiANCi0Jew0KLQkJSUphdmFFbGVtZW50IGphdmFFbGVtZW50ID0gY3U7DQotCQl3aGlsZSAoKGphdmFFbGVtZW50ID0gamF2YUVsZW1lbnQuZ2V0UGFyZW50KCkpICE9IG51bGwpIA0KLQkJew0KLQkJCWlmICghamF2YUVsZW1lbnQuZXhpc3RzKCkpIHsNCi0JCQkJcmV0dXJuIGZhbHNlOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0JDQotCXZvaWQgaGFuZGxlQ2hhbmdlZFByb2plY3QoSUphdmFFbGVtZW50RGVsdGEgcHJvamVjdERlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24NCi0Jew0KLQkJYXNzZXJ0IChwcm9qZWN0RGVsdGEuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KTsNCi0JDQotCQlpZiAoKCgocHJvamVjdERlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX0NMT1NFRCkgIT0gMCkgfHwgcHJvamVjdERlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5SRU1PVkVEKQ0KLQkJCSYmIG51bGwgIT0gdXRpbCgpLmZpbmRQcm9qZWN0QnlOYW1lKGdldERvbUJlaW5nTG9hZGVkKCksIHByb2plY3REZWx0YS5nZXRFbGVtZW50KCkuZ2V0RWxlbWVudE5hbWUoKSkpDQotCQl7DQotCQkJLy9pZiB0aGUgcHJvamVjdCBoYXMgYmVlbiBjbG9zZWQgdGhlbiBpdCdzIGZhY2V0J3MgY291bGQgbm90IGJlIHJlYWQuIFRodXMgdGhlIGFwcHJvdmUgbWV0aG9kDQotCQkJLy93aWxsIGFsd2F5cyByZXR1cm4gZmFsc2UuIFRoYXQncyB3aHkgd2UgY2hlY2sgaWYgdGhlIHByb2plY3QgaGFzIGFscmVhZHkgYmVlbiBpbiB0aGUgDQotCQkJaGFuZGxlQ2xvc2VkUHJvamVjdChwcm9qZWN0RGVsdGEpOw0KLQkJfQ0KLQkJaWYgKCFyZXNvdXJjZSgpLmFwcHJvdmVQcm9qZWN0KChJSmF2YVByb2plY3QpcHJvamVjdERlbHRhLmdldEVsZW1lbnQoKSkpDQotCQl7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQkJaWYgKCgocHJvamVjdERlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX09QRU5FRCkgIT0gMCkgfHwgcHJvamVjdERlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5BRERFRCkNCi0JCXsNCi0JCQloYW5kbGVPcGVuZWRQcm9qZWN0KHByb2plY3REZWx0YSk7DQotCQl9DQotCQ0KLQkJZm9yIChJSmF2YUVsZW1lbnREZWx0YSBjaGlsZERlbHRhIDogcHJvamVjdERlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKSkNCi0JCXsNCi0JCQlpZiAoIShjaGlsZERlbHRhLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnRSb290KSkNCi0JCQl7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQlpZiAoKGNoaWxkRGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfQURERURfVE9fQ0xBU1NQQVRIKSAhPSAwKQ0KLQkJCXsNCi0JCQkJaGFuZGxlQ2xvc2VkUHJvamVjdChwcm9qZWN0RGVsdGEpOw0KLQkJCQloYW5kbGVPcGVuZWRQcm9qZWN0KHByb2plY3REZWx0YSk7DQotCQkJfQ0KLQkJCWlmICgoY2hpbGREZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9SRU1PVkVEX0ZST01fQ0xBU1NQQVRIKSAhPSAwKQ0KLQkJCXsNCi0JCQkJaGFuZGxlQ2xvc2VkUHJvamVjdChwcm9qZWN0RGVsdGEpOw0KLQkJCQloYW5kbGVPcGVuZWRQcm9qZWN0KHByb2plY3REZWx0YSk7DQotCQkJfQ0KLQkJCWlmICgoY2hpbGREZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9DSElMRFJFTikgIT0gMCkNCi0JCQl7DQotCQkJCXJlY3Vyc2V2aWx5SGFuZGxlUmVtb3ZlZFBhY2thZ2VzKGNoaWxkRGVsdGEpOw0KLQkJCQlyZWN1cnNldmlseUhhbmRsZUFkZGVkUGFja2FnZXMoY2hpbGREZWx0YSk7DQotCQkJCXJlY3Vyc2V2aWx5SGFuZGxlQ29tcGlsYXRpb25Vbml0cyhjaGlsZERlbHRhKTsNCi0JCQl9DQotCQl9DQotCX0NCi0JDQotCXByb3RlY3RlZCB2b2lkIHJlY3Vyc2V2aWx5SGFuZGxlQWRkZWRQYWNrYWdlcyhJSmF2YUVsZW1lbnREZWx0YSByb290RGVsdGEpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJqID0gZmluZFByb2plY3RCeURlbHRhKHJvb3REZWx0YSk7DQotCQlpZiAod3NQcmogPT0gbnVsbCkgew0KLQkJCXJldHVybjsNCi0JCX0NCi0JCQ0KLQkJZm9yIChJSmF2YUVsZW1lbnREZWx0YSBjaGlsZERlbHRhIDogcm9vdERlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKSkNCi0JCXsNCi0JCQlpZiAoY2hpbGREZWx0YS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50ICYmIGNoaWxkRGVsdGEuZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLkFEREVEKQ0KLQkJCXsNCi0JCQkJZm9yIChJQ29tcGlsYXRpb25Vbml0IGN1IDogKChJUGFja2FnZUZyYWdtZW50KWNoaWxkRGVsdGEuZ2V0RWxlbWVudCgpKS5nZXRDb21waWxhdGlvblVuaXRzKCkpDQotCQkJCXsNCi0JCQkJCXByb2Nlc3NDb21waWxhdGlvblVuaXQod3NQcmosIGN1KTsNCi0JCQkJfQ0KLQkJCQlyZWN1cnNldmlseUhhbmRsZUFkZGVkUGFja2FnZXMoY2hpbGREZWx0YSk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCXByb3RlY3RlZCBJV2ViU2VydmljZVByb2plY3QgZmluZFByb2plY3RCeURlbHRhKElKYXZhRWxlbWVudERlbHRhIHJvb3REZWx0YSkgew0KLQkJcmV0dXJuIHV0aWwoKS5maW5kUHJvamVjdEJ5TmFtZShnZXREb21CZWluZ0xvYWRlZCgpLCByb290RGVsdGEuZ2V0RWxlbWVudCgpLmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSk7DQotCX0NCi0JDQotCXByaXZhdGUgdm9pZCByZWN1cnNldmlseUhhbmRsZVJlbW92ZWRQYWNrYWdlcyhJSmF2YUVsZW1lbnREZWx0YSByb290RGVsdGEpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJDQotCQlmb3IgKElKYXZhRWxlbWVudERlbHRhIGNoaWxkRGVsdGEgOiByb290RGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpKQ0KLQkJew0KLQkJCWlmIChjaGlsZERlbHRhLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnQpDQotCQkJew0KLQkJCQlpZiAoY2hpbGREZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuUkVNT1ZFRCkNCi0JCQkJew0KLQkJCQkJZmluYWwgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJqID0gZmluZFByb2plY3RCeURlbHRhKHJvb3REZWx0YSk7DQotCQkJCQlpZiAod3NQcmogIT0gbnVsbCkgew0KLQkJCQkJCXJlbW92ZU1vZGVsRWxlbWVudHMod3NQcmosIGNoaWxkRGVsdGEuZ2V0RWxlbWVudCgpLmdldEVsZW1lbnROYW1lKCksIHRydWUpOw0KLQkJCQkJfQ0KLQkJCQl9IGVsc2UNCi0JCQkJew0KLQkJCQkJcmVjdXJzZXZpbHlIYW5kbGVSZW1vdmVkUGFja2FnZXMoY2hpbGREZWx0YSk7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZU9wZW5lZFByb2plY3QoSUphdmFFbGVtZW50RGVsdGEgcHJvamVjdERlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24NCi0Jew0KLQkJYXNzZXJ0IHByb2plY3REZWx0YS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBJSmF2YVByb2plY3Q7DQotCQlmaW5hbCBJSmF2YVByb2plY3QgY2hhbmdlZFByb2plY3QgPSAoSUphdmFQcm9qZWN0KSBwcm9qZWN0RGVsdGEuZ2V0RWxlbWVudCgpOw0KLQkJbmV3UHJvamVjdENVRmluZGVyKGNoYW5nZWRQcm9qZWN0KS5maW5kKG51bGwsIG5ldyBMb2FkZXJDb21waWxhdGlvblVuaXRIYW5kbGVyKCkpOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBoYW5kbGVDbG9zZWRQcm9qZWN0KElKYXZhRWxlbWVudERlbHRhIHByb2plY3REZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJYXNzZXJ0IHByb2plY3REZWx0YS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBJSmF2YVByb2plY3Q7DQotCQlmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcmogPSB1dGlsKCkuZmluZFByb2plY3RCeU5hbWUoZ2V0RG9tQmVpbmdMb2FkZWQoKSwgcHJvamVjdERlbHRhLmdldEVsZW1lbnQoKS5nZXRFbGVtZW50TmFtZSgpKTsNCi0JCWlmICh3c1Byaj09bnVsbCkgew0KLQkJCXJldHVybjsNCi0JCX0NCi0JCQ0KLQkJZm9yIChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA6IHdzUHJqLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKSkNCi0JCXsNCi0JCQlzZWkuZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKS5jbGVhcigpOw0KLQkJfQ0KLQkJZm9yIChJV2ViU2VydmljZSB3cyA6IHdzUHJqLmdldFdlYlNlcnZpY2VzKCkpDQotCQl7DQotCQkJc2VydmljZURhdGEoKS51bm1hcCh3cyk7DQotCQl9DQotCQlnZXREb21CZWluZ0xvYWRlZCgpLmdldFdlYlNlcnZpY2VQcm9qZWN0cygpLnJlbW92ZSh3c1Byaik7DQotCX0NCi0NCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0RmluZGVyIG5ld1Byb2plY3RDVUZpbmRlcihmaW5hbCBJSmF2YVByb2plY3QgcHJqKQ0KLQl7DQotCQlyZXR1cm4gbmV3IFdvcmtzcGFjZUNVRmluZGVyKHJlc291cmNlKCkuamF2YU1vZGVsKCksIG5ldyBJUHJvamVjdFNlbGVjdG9yW10geyBuZXcgSVByb2plY3RTZWxlY3RvcigpDQotCQl7DQotCQkJcHVibGljIGJvb2xlYW4gYXBwcm92ZShJSmF2YVByb2plY3QgdG9BcHByb3ZlKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHByai5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyh0b0FwcHJvdmUuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQkJfQ0KLQkJfSB9KTsNCi0JfQ0KLQ0KLQkvLyBoYW5kbGVzIGNvbXBpbGF0aW9uIHVuaXRzIC0gc2tpcHMgd29ya2luZyBjb3BpZXMNCi0JcHJpdmF0ZSB2b2lkIHJlY3Vyc2V2aWx5SGFuZGxlQ29tcGlsYXRpb25Vbml0cyhJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkNCi0Jew0KLQkJaWYgKGRlbHRhLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQpDQotCQl7DQotCQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBjdSA9IChJQ29tcGlsYXRpb25Vbml0KSBkZWx0YS5nZXRFbGVtZW50KCk7DQotCQkJaWYgKHV0aWwoKS5maW5kUHJvamVjdEJ5TmFtZShnZXREb21CZWluZ0xvYWRlZCgpLCBjdS5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpPT1udWxsKQ0KLQkJCXsNCi0JCQkJcmV0dXJuOw0KLQkJCX0NCi0JCQkNCi0JCQl0cnkNCi0JCQl7DQotCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuQURERUQgJiYgKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX01PVkVEX0ZST00pID09IDApDQotCQkJCXsNCi0JCQkJCWhhbmRsZUFkZGVkQ29tcGlsYXRpb25Vbml0KGN1KTsNCi0JCQkJfQ0KLQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLlJFTU9WRUQgJiYgKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX01PVkVEX1RPKSA9PSAwKQ0KLQkJCQl7DQotCQkJCQloYW5kbGVSZW1vdmVkQ29tcGlsYXRpb25Vbml0KGN1KTsNCi0JCQkJfQ0KLQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLlJFTU9WRUQgJiYgKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX01PVkVEX1RPKSAhPSAwKQ0KLQkJCQl7DQotCQkJCQloYW5kbGVNb3ZlZFRvQ29tcGlsYXRpb25Vbml0KGN1LCAoSUNvbXBpbGF0aW9uVW5pdCkgZGVsdGEuZ2V0TW92ZWRUb0VsZW1lbnQoKSk7DQotCQkJCX0NCi0JCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5DSEFOR0VEICYmIA0KLQkJCQkJKChkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9QUklNQVJZX1JFU09VUkNFKSAhPSAwKSB8fA0KLQkJCQkJKChkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9QUklNQVJZX1dPUktJTkdfQ09QWSkgIT0gMCkpDQotCQkJCXsNCi0JCQkJCWhhbmRsZUNoYW5nZWRDb250ZW50Q29tcGlsYXRpb25Vbml0KGN1KTsNCi0JCQkJfQ0KLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpDQotCQkJew0KLQkJCQlsb2dnZXIoKS5sb2dFcnJvcigiVW5hYmxlIHRvIHBhcnNlIHRoZSBjb250ZW50IG9mIGNvbXBpbGF0aW9uIHVuaXQiICsgZGVsdGEuZ2V0RWxlbWVudCgpLCBqbWUpOyAvLyROT04tTkxTLTEkDQotCQkJfQ0KLQkJfSBlbHNlDQotCQl7DQotCQkJZm9yIChJSmF2YUVsZW1lbnREZWx0YSBjaGlsZERlbHRhIDogZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpKQ0KLQkJCXsNCi0JCQkJcmVjdXJzZXZpbHlIYW5kbGVDb21waWxhdGlvblVuaXRzKGNoaWxkRGVsdGEpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgaGFuZGxlQ2hhbmdlZENvbnRlbnRDb21waWxhdGlvblVuaXQoSUNvbXBpbGF0aW9uVW5pdCBjdSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJVHlwZSB0eXBlID0gY3UuZmluZFByaW1hcnlUeXBlKCk7CQ0KLQkJZmluYWwgSUFubm90YXRpb248SVR5cGU+IGFubm90YXRpb24gPSB0eXBlPT1udWxsID8gbnVsbCA6IHJlc291cmNlKCkubmV3QW5ub3RhdGlvbkluc3BlY3Rvcih0eXBlKS5pbnNwZWN0VHlwZShXU19BTk5PVEFUSU9OKTsNCi0JCWlmICh0eXBlID09IG51bGwgfHwgYW5ub3RhdGlvbiA9PSBudWxsKQ0KLQkJew0KLQkJCXVwZGF0ZVN1YmNsYXNzaW5nV1NFbGVtZW50cyhjdSk7DQotCQkJaGFuZGxlUmVtb3ZlZENvbXBpbGF0aW9uVW5pdChjdSk7DQotCQl9IGVsc2UNCi0JCXsNCi0JCQlmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0ID0gdXRpbCgpLmZpbmRQcm9qZWN0QnlOYW1lKGdldERvbUJlaW5nTG9hZGVkKCksIGN1LmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQkJYXNzZXJ0IHdzUHJvamVjdCAhPSBudWxsOw0KLQkJCXByb2Nlc3NDb21waWxhdGlvblVuaXQod3NQcm9qZWN0LCBjdSk7DQotCQl9DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVN1YmNsYXNzaW5nV1NFbGVtZW50cyhJQ29tcGlsYXRpb25Vbml0IGN1KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZvciAoSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJqIDogZ2V0RG9tQmVpbmdMb2FkZWQoKS5nZXRXZWJTZXJ2aWNlUHJvamVjdHMoKSkNCi0JCXsNCi0JCQlmaW5hbCBJSmF2YVByb2plY3QgamF2YVByaiA9IGphdmFNb2RlbCgpLmdldEphdmFQcm9qZWN0KHdzUHJqLmdldE5hbWUoKSk7DQotCQkJZm9yIChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA6IHdzUHJqLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKSkNCi0JCQl7DQotCQkJCWlmKHNlcnZpY2VEYXRhKCkuZ2V0SGllcmFyY2h5KHNlaS5nZXRJbXBsZW1lbnRhdGlvbigpKT09bnVsbCkgew0KLQkJCQkJY29udGludWU7DQotCQkJCX0NCi0JCQkJaWYgKHNlcnZpY2VEYXRhKCkuZ2V0SGllcmFyY2h5KHNlaS5nZXRJbXBsZW1lbnRhdGlvbigpKS5jb250YWlucyhjdSkpDQotCQkJCXsNCi0JCQkJCXByb2Nlc3NDb21waWxhdGlvblVuaXQod3NQcmosIGphdmFQcmouZmluZFR5cGUoc2VpLmdldEltcGxlbWVudGF0aW9uKCkpLmdldENvbXBpbGF0aW9uVW5pdCgpKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCQlmb3IgKElXZWJTZXJ2aWNlIHdzIDogd3NQcmouZ2V0V2ViU2VydmljZXMoKSkNCi0JCQl7DQotCQkJCWlmKHNlcnZpY2VEYXRhKCkuZ2V0SGllcmFyY2h5KHdzLmdldEltcGxlbWVudGF0aW9uKCkpPT1udWxsKSB7DQotCQkJCQljb250aW51ZTsNCi0JCQkJfQ0KLQkJCQlpZiAoc2VydmljZURhdGEoKS5nZXRIaWVyYXJjaHkod3MuZ2V0SW1wbGVtZW50YXRpb24oKSkuY29udGFpbnMoY3UpKQ0KLQkJCQl7DQotCQkJCQlwcm9jZXNzQ29tcGlsYXRpb25Vbml0KHdzUHJqLCBqYXZhUHJqLmZpbmRUeXBlKHdzLmdldEltcGxlbWVudGF0aW9uKCkpLmdldENvbXBpbGF0aW9uVW5pdCgpKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgaGFuZGxlQWRkZWRDb21waWxhdGlvblVuaXQoSUNvbXBpbGF0aW9uVW5pdCBhZGRlZENVKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1ByaiA9IHV0aWwoKS5maW5kUHJvamVjdEJ5TmFtZShnZXREb21CZWluZ0xvYWRlZCgpLCBhZGRlZENVLmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQl0aGlzLnByb2Nlc3NDb21waWxhdGlvblVuaXQod3NQcmosIGFkZGVkQ1UpOw0KLQl9DQotDQotCXZvaWQgaGFuZGxlTW92ZWRUb0NvbXBpbGF0aW9uVW5pdChJQ29tcGlsYXRpb25Vbml0IGZyb21DVSwgSUNvbXBpbGF0aW9uVW5pdCB0b0NVKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElKYXZhV2ViU2VydmljZUVsZW1lbnQgd3NFbGVtID0gZ3Vlc3NDb250YWluZWRXU0VsZW1lbnQoZnJvbUNVKTsNCi0JCWlmICh3c0VsZW0gPT0gbnVsbCkNCi0JCXsNCi0JCQlyZXR1cm47DQotCQl9DQotDQotCQlmaW5hbCBib29sZWFuIGZxTmFtZUNoYW5nZWQgPSAhdG9DVS5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhmcm9tQ1UuZ2V0RWxlbWVudE5hbWUoKSkNCi0JCQkJCQkJCQkJfHwgIXRvQ1UuZ2V0UGFyZW50KCkuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoZnJvbUNVLmdldFBhcmVudCgpLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJaWYgKGZxTmFtZUNoYW5nZWQpDQotCQl7DQotCQkJaGFuZGxlUmVtb3ZlZENvbXBpbGF0aW9uVW5pdChmcm9tQ1UpOw0KLQkJCWhhbmRsZUFkZGVkQ29tcGlsYXRpb25Vbml0KHRvQ1UpOw0KLQkJfSBlbHNlDQotCQkvLyB0aGVuIGFzc3VtZSB0aGF0IHRoZSBwcm9qZWN0IG9ubHkgaGFzIGNoYW5nZWQuDQotCQl7DQotCQkJZmluYWwgSVdlYlNlcnZpY2VQcm9qZWN0IHRvUHJqID0gdXRpbCgpLmZpbmRQcm9qZWN0QnlOYW1lKGdldERvbUJlaW5nTG9hZGVkKCksIHRvQ1UuZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKTsNCi0JCQlpZiAod3NFbGVtIGluc3RhbmNlb2YgSVdlYlNlcnZpY2UpDQotCQkJew0KLQkJCQl0b1Byai5nZXRXZWJTZXJ2aWNlcygpLmFkZCgoSVdlYlNlcnZpY2UpIHdzRWxlbSk7DQotCQkJfSBlbHNlDQotCQkJew0KLQkJCQl0b1Byai5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkuYWRkKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSB3c0VsZW0pOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgaGFuZGxlUmVtb3ZlZENvbXBpbGF0aW9uVW5pdChJQ29tcGlsYXRpb25Vbml0IHJlbUNVKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1ByaiA9IHV0aWwoKS5maW5kUHJvamVjdEJ5TmFtZShnZXREb21CZWluZ0xvYWRlZCgpLCByZW1DVS5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJcmVtb3ZlTW9kZWxFbGVtZW50cyh3c1ByaiwgZ3Vlc3NQcmltYXJ5VHlwZU5hbWUocmVtQ1UpLCBmYWxzZSk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU1vZGVsRWxlbWVudHMoSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJqLCBTdHJpbmcgaW1wbEJhc2VOYW1lLCBib29sZWFuIGlzRm9yUGFja2FnZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlpZiAod3NQcmogPT0gbnVsbCkgew0KLQkJCXJldHVybjsNCi0JCX0NCi0JCXJlbW92ZVdzTW9kZWxFbGVtZW50cyh3c1ByaiwgaW1wbEJhc2VOYW1lLCBpc0ZvclBhY2thZ2UpOw0KLQkJcmVtb3ZlU2VpTW9kZWxFbGVtZW50cyh3c1ByaiwgaW1wbEJhc2VOYW1lLCBpc0ZvclBhY2thZ2UsIGZhbHNlKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBJSmF2YVdlYlNlcnZpY2VFbGVtZW50IGd1ZXNzQ29udGFpbmVkV1NFbGVtZW50KElDb21waWxhdGlvblVuaXQgY3UpDQotCXsNCi0JCWZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1ByaiA9IHV0aWwoKS5maW5kUHJvamVjdEJ5TmFtZShnZXREb21CZWluZ0xvYWRlZCgpLCBjdS5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJcmV0dXJuIHV0aWwoKS5maW5kSmF2YVdlYlNlcnZpY2VFbGVtQnlJbXBsTmFtZSh3c1ByaiwgZ3Vlc3NQcmltYXJ5VHlwZU5hbWUoY3UpKTsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgU3RyaW5nIGd1ZXNzUHJpbWFyeVR5cGVOYW1lKElDb21waWxhdGlvblVuaXQgY3UpDQotCXsNCi0JCWZpbmFsIFN0cmluZyBwYXJlbnROYW1lID0gY3UuZ2V0UGFyZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsNCi0JCWZpbmFsIFN0cmluZ0J1aWxkZXIgYXNzdW1lZFByaW1hcnlUeXBlTmFtZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7DQotCQlpZiAocGFyZW50TmFtZS5sZW5ndGgoKSA+IDApIHsNCi0JCQlhc3N1bWVkUHJpbWFyeVR5cGVOYW1lIC5hcHBlbmQocGFyZW50TmFtZSkuYXBwZW5kKCcuJyk7DQotCQl9DQotCQlyZXR1cm4gYXNzdW1lZFByaW1hcnlUeXBlTmFtZS5hcHBlbmQoY3UuZ2V0RWxlbWVudE5hbWUoKSkuDQotCQkJZGVsZXRlKGFzc3VtZWRQcmltYXJ5VHlwZU5hbWUubGFzdEluZGV4T2YoIi5qYXZhIiksIGFzc3VtZWRQcmltYXJ5VHlwZU5hbWUubGVuZ3RoKCkpLnRvU3RyaW5nKCk7Ly8kTk9OLU5MUy0xJA0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9QYXJhbWV0ZXJTeW5jaHJvbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9QYXJhbWV0ZXJTeW5jaHJvbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjU1OTAzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvUGFyYW1ldGVyU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYzsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XUEFubm90YXRpb25GZWF0dXJlcy5IRUFERVJfQVRUUklCVVRFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldQQW5ub3RhdGlvbkZlYXR1cmVzLk1PREVfQVRUUklCVVRFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldQQW5ub3RhdGlvbkZlYXR1cmVzLk5BTUVfQVRUUklCVVRFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldQQW5ub3RhdGlvbkZlYXR1cmVzLlBBUlRfTkFNRV9BVFRSSUJVVEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1BBbm5vdGF0aW9uRmVhdHVyZXMuVEFSR0VUX05BTUVTUEFDRV9BVFRSSUJVVEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1BBbm5vdGF0aW9uRmVhdHVyZXMuV1BfQU5OT1RBVElPTjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZVBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5XZWJQYXJhbUtpbmQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JQW5ub3RhdGlvblNlcmlhbGl6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JTW9kZWxFbGVtZW50U3luY2hyb25pemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1BBbm5vdGF0aW9uRmVhdHVyZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uSW5zcGVjdG9yOw0KLQ0KLS8qKg0KLSAqIENsYXNzIHRoYXQgc3luY2hyb25pemVzIHRoZSBwYXJhbWV0ZXJzIGZvciB7QGxpbmsgSVdlYk1ldGhvZH0gb2JqZWN0Ow0KLSAqIA0KLSAqIEBhdXRob3IgDQotICovDQotcHVibGljIGNsYXNzIFBhcmFtZXRlclN5bmNocm9uaXplciBleHRlbmRzIEVsZW1lbnRTeW5jaHJvbml6ZXJJbXBsDQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVUVVJOX1BBUkFNX05BTUUJPSAicmV0dXJuIjsvLyROT04tTkxTLTEkDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIT0xERVJfQ0xBU1NfTkFNRSA9ICJIb2xkZXIiOyAvLyROT04tTkxTLTEkDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIT0xERVJfQ0xBU1NfRlFOQU1FID0gImphdmF4LnhtbC53cy5Ib2xkZXIiOy8vJE5PTi1OTFMtMSQNCi0JDQotCXB1YmxpYyBQYXJhbWV0ZXJTeW5jaHJvbml6ZXIoSU1vZGVsRWxlbWVudFN5bmNocm9uaXplciBwYXJlbnQpDQotCXsNCi0JCXN1cGVyKHBhcmVudCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVQYXJhbWV0ZXJzKElXZWJNZXRob2Qgd20sIElNZXRob2QgbWV0aG9kLCBJQW5ub3RhdGlvbkluc3BlY3RvciBpbnNwZWN0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgQ29sbGVjdGlvbjxJV2ViUGFyYW0+IG1lcmdlZFBhcmFtcyA9IG5ldyBMaW5rZWRMaXN0PElXZWJQYXJhbT4oKTsNCi0JCWlmICghU2lnbmF0dXJlLlNJR19WT0lELmVxdWFscyhtZXRob2QuZ2V0UmV0dXJuVHlwZSgpKSkNCi0JCXsNCi0JCQlmaW5hbCBJV2ViUGFyYW0gcmV0UGFyYW0gPSBvYnRhaW5JbnN0YW5jZSh3bSwgUkVUVVJOX1BBUkFNX05BTUUpOw0KLQkJCW1lcmdlUGFyYW0ocmV0UGFyYW0sIDAsIHdtLCBtZXRob2QsIG1ldGhvZC5nZXRSZXR1cm5UeXBlKCksIGluc3BlY3Rvcik7DQotCQkJbWVyZ2VkUGFyYW1zLmFkZChyZXRQYXJhbSk7DQotCQl9DQotCQlmaW5hbCBTdHJpbmdbXSBuYW1lcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJOYW1lcygpOw0KLQkJZmluYWwgU3RyaW5nW10gdHlwZVNpZ25hdHVyZXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsgDQotCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKQ0KLQkJew0KLQkJCWZpbmFsIElXZWJQYXJhbSBwYXJhbSA9IG9idGFpbkluc3RhbmNlKHdtLCBuYW1lc1tpXSk7DQotCQkJbWVyZ2VQYXJhbShwYXJhbSwgaSwgd20sIG1ldGhvZCwgdHlwZVNpZ25hdHVyZXNbaV0sIGluc3BlY3Rvcik7DQotCQkJbWVyZ2VkUGFyYW1zLmFkZChwYXJhbSk7DQotCQl9DQotCQl3bS5nZXRQYXJhbWV0ZXJzKCkucmV0YWluQWxsKG1lcmdlZFBhcmFtcyk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIG1lcmdlUGFyYW0oSVdlYlBhcmFtIHdlYlBhcmFtLCBpbnQgcG9zLCBJV2ViTWV0aG9kIHdlYk1ldGhvZCwgSU1ldGhvZCBtZXRob2QsIFN0cmluZyB0eXBlU2lnbiwgSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbSA9IG1ldGhvZC5nZXRUeXBlUGFyYW1ldGVyKHdlYlBhcmFtLmdldEltcGxlbWVudGF0aW9uKCkpOw0KLQkJYXNzZXJ0IHR5cGVQYXJhbSE9IG51bGw7DQotCQkNCi0JCWZpbmFsIElBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPiB3cEFubm90YXRpb24gPSBpc1dlYlJlc3VsdCh3ZWJQYXJhbSkgPyBudWxsIDogaW5zcGVjdG9yLmluc3BlY3RQYXJhbSh0eXBlUGFyYW0sIFdQX0FOTk9UQVRJT04pOw0KLQkJCQkNCi0JCWlmICghIHR5cGVTaWduLmVxdWFscyh3ZWJQYXJhbS5nZXRUeXBlTmFtZSgpKSkgew0KLQkJCXV0aWwoKS5zZXRGZWF0dXJlVmFsdWUod2ViUGFyYW0sIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fVFlQRV9OQU1FLCB0eXBlU2lnbik7DQotCQl9DQotCQkNCi0JCWZpbmFsIFdlYlBhcmFtS2luZCBraW5kID0gaXNXZWJSZXN1bHQod2ViUGFyYW0pID8gV2ViUGFyYW1LaW5kLk9VVCA6IGNhbGNLaW5kKHdwQW5ub3RhdGlvbiwgbWV0aG9kLCB0eXBlU2lnbik7DQotCQlpZiAoIWtpbmQuZXF1YWxzKHdlYlBhcmFtLmdldEtpbmQoKSkpIHsNCi0JCQl3ZWJQYXJhbS5zZXRLaW5kKGtpbmQpOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBib29sZWFuIGlzSGVhZGVyID0gY2FsY0hlYWRlcih3cEFubm90YXRpb24pOw0KLQkJaWYgKHdlYlBhcmFtLmlzSGVhZGVyKCkgXiBpc0hlYWRlcikgew0KLQkJCXdlYlBhcmFtLnNldEhlYWRlcihpc0hlYWRlcik7DQotCQl9DQotCQkNCi0JCWZpbmFsIFN0cmluZyBuYW1lID0gaXNXZWJSZXN1bHQod2ViUGFyYW0pID8gZGVmQ2FsYygpLmNhbGNXZWJSZXN1bHREZWZhdWx0TmFtZSh3ZWJNZXRob2QpIDogY2FsY05hbWUod3BBbm5vdGF0aW9uLCB3ZWJNZXRob2QsIHBvcyk7DQotCQlpZiAoIW5hbWUuZXF1YWxzKHdlYlBhcmFtLmdldE5hbWUoKSkpIHsNCi0JCQl3ZWJQYXJhbS5zZXROYW1lKG5hbWUpOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBTdHJpbmcgcGFydE5hbWUgPSBjYWxjUGFydE5hbWUod3BBbm5vdGF0aW9uLCBuYW1lKTsNCi0JCWlmICghcGFydE5hbWUuZXF1YWxzKHdlYlBhcmFtLmdldFBhcnROYW1lKCkpKSB7DQotCQkJd2ViUGFyYW0uc2V0UGFydE5hbWUocGFydE5hbWUpOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gY2FsY1RhcmdldE5hbWVzcGFjZSh3cEFubm90YXRpb24sIHdlYk1ldGhvZCwgd2ViUGFyYW0pOw0KLQkJaWYgKCF0YXJnZXROYW1lc3BhY2UuZXF1YWxzKHdlYlBhcmFtLmdldFRhcmdldE5hbWVzcGFjZSgpKSkgew0KLQkJCXdlYlBhcmFtLnNldFRhcmdldE5hbWVzcGFjZSh0YXJnZXROYW1lc3BhY2UpOw0KLQkJfQkJDQotCQkNCi0JCXJlc291cmNlKCkuZ2V0U2VyaWFsaXplckZhY3RvcnkoKS5hZGFwdCh3ZWJQYXJhbSwgSUFubm90YXRpb25TZXJpYWxpemVyLmNsYXNzKTsJCQ0KLQkJYWRhcHRUb0xvY2F0aW9uSW50ZXJmYWNlKHdlYlBhcmFtLCBXUF9BTk5PVEFUSU9OLCB3cEFubm90YXRpb24pOw0KLQl9DQotCQ0KLQlwcml2YXRlIGJvb2xlYW4gaXNXZWJSZXN1bHQoZmluYWwgSVdlYlBhcmFtIHBhcmFtKQ0KLQl7DQotCQlyZXR1cm4gcGFyYW0uZ2V0SW1wbGVtZW50YXRpb24oKS5lcXVhbHMoUkVUVVJOX1BBUkFNX05BTUUpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVGdWxseVF1YWxpZmllZE5hbWUoZmluYWwgSU1ldGhvZCBtZXRob2QsIGZpbmFsIFN0cmluZyB0eXBlU2lnbmF0dXJlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24NCi0Jew0KLQkJaWYgKFNpZ25hdHVyZS5nZXRUeXBlU2lnbmF0dXJlS2luZCh0eXBlU2lnbmF0dXJlKSA9PSBTaWduYXR1cmUuQkFTRV9UWVBFX1NJR05BVFVSRSkNCi0JCXsNCi0JCQlyZXR1cm4gU2lnbmF0dXJlLnRvU3RyaW5nKHR5cGVTaWduYXR1cmUpOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBTdHJpbmdbXVtdIHJlc29sdmVkVHlwZXMgPSBtZXRob2QuZ2V0RGVjbGFyaW5nVHlwZSgpLnJlc29sdmVUeXBlKFNpZ25hdHVyZS50b1N0cmluZyh0eXBlU2lnbmF0dXJlKSk7DQotCQlpZiAocmVzb2x2ZWRUeXBlcyA9PSBudWxsKQ0KLQkJew0KLQkJCXJldHVybiAiIjsvLyROT04tTkxTLTEkDQotCQl9DQotCQlmaW5hbCBTdHJpbmcgcGFjayA9IHJlc29sdmVkVHlwZXNbMF1bMF07DQotCQlmaW5hbCBTdHJpbmcgY2xhc3NOYW1lID0gcmVzb2x2ZWRUeXBlc1swXVsxXTsNCi0JCWlmIChwYWNrICE9IG51bGwgJiYgcGFjay5sZW5ndGgoKSAhPSAwKQ0KLQkJew0KLQkJCXJldHVybiBwYWNrICsgIi4iICsgY2xhc3NOYW1lOy8vJE5PTi1OTFMtMSQNCi0JCX0gZWxzZQ0KLQkJew0KLQkJCXJldHVybiBjbGFzc05hbWU7DQotCQl9DQotCX0NCi0JDQotCXByb3RlY3RlZCBXZWJQYXJhbUtpbmQgY2FsY0tpbmQoZmluYWwgSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IHBhcm1Bbm5vdGF0aW9uLCBmaW5hbCBJTWV0aG9kIG1ldGhvZCwgZmluYWwgU3RyaW5nIHR5cGVTaWduYXR1cmUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbg0KLQl7DQotCQlpZiAocGFybUFubm90YXRpb24gIT0gbnVsbCAmJiBwYXJtQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKE1PREVfQVRUUklCVVRFKSAhPSBudWxsKQ0KLQkJew0KLQkJCWZpbmFsIFN0cmluZyBtb2RlID0gcGFybUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShNT0RFX0FUVFJJQlVURSk7DQotCQkJaWYgKFdQQW5ub3RhdGlvbkZlYXR1cmVzLldFQl9QQVJBTV9NT0RFX0lOT1VULmVuZHNXaXRoKG1vZGUpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIFdlYlBhcmFtS2luZC5JTk9VVDsNCi0JCQl9DQotCQkJaWYgKFdQQW5ub3RhdGlvbkZlYXR1cmVzLldFQl9QQVJBTV9NT0RFX0lOLmVuZHNXaXRoKG1vZGUpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIFdlYlBhcmFtS2luZC5JTjsNCi0JCQl9DQotCQkJaWYgKFdQQW5ub3RhdGlvbkZlYXR1cmVzLldFQl9QQVJBTV9NT0RFX09VVC5lbmRzV2l0aChtb2RlKSkNCi0JCQl7DQotCQkJCXJldHVybiBXZWJQYXJhbUtpbmQuT1VUOw0KLQkJCX0NCi0JCX0gDQotCQkNCi0JCWlmIChpc1Bvc3NpYmx5SG9sZGVyQ2xhc3ModHlwZVNpZ25hdHVyZSkpIHsNCi0JCQlmaW5hbCBTdHJpbmcgdHlwZUZRTmFtZSA9IHJlc29sdmVGdWxseVF1YWxpZmllZE5hbWUobWV0aG9kLCB0eXBlU2lnbmF0dXJlKTsNCi0JCQlpZiAodHlwZUZRTmFtZS5zdGFydHNXaXRoKEhPTERFUl9DTEFTU19GUU5BTUUpKSB7DQotCQkJCXJldHVybiBXZWJQYXJhbUtpbmQuSU5PVVQ7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gV2ViUGFyYW1LaW5kLklOOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQWRkZWQgZHVlIHRvIHBlcmZvcm1hbmNlIGlzc3VlcyBDU04gMDEyMDA2MTUzMiAwMDAyMjU2OTI1IDIwMDkuDQotCSAqIFRoZSBpZGVhIGlzIHRoYXQgYmVmb3JlIGNhbGxpbmcge0BsaW5rICNyZXNvbHZlRnVsbHlRdWFsaWZpZWROYW1lKElNZXRob2QsIFN0cmluZyl9DQotCSAqIHdlIGNoZWNrIGlmIHRoZSBjbGFzcyBpcyBwb3RlbnRpYWxseSBIb2xkZXIuDQotCSAqLw0KLQlwcml2YXRlIGJvb2xlYW4gaXNQb3NzaWJseUhvbGRlckNsYXNzKGZpbmFsIFN0cmluZyB0eXBlU2lnbmF0dXJlKSB7CQ0KLQkJZmluYWwgU3RyaW5nIGVyYXN1dGVUeXBlTmFtZSA9IFNpZ25hdHVyZS5nZXRTaWduYXR1cmVTaW1wbGVOYW1lKFNpZ25hdHVyZS5nZXRUeXBlRXJhc3VyZSh0eXBlU2lnbmF0dXJlKSk7DQotCQlpZiAoSE9MREVSX0NMQVNTX05BTUUuZXF1YWxzKGVyYXN1dGVUeXBlTmFtZSkpIHsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCQ0KLQlwcml2YXRlIFN0cmluZyBjYWxjTmFtZShJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4gcGFybUFubm90YXRpb24sIElXZWJNZXRob2Qgd2ViTWV0aG9kLCBpbnQgcGFyYW1Qb3NpdGlvbikNCi0Jew0KLQkJaWYgKHBhcm1Bbm5vdGF0aW9uICE9IG51bGwgJiYgcGFybUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShOQU1FX0FUVFJJQlVURSkgIT0gbnVsbCkgew0KLQkJCXJldHVybiBwYXJtQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKE5BTUVfQVRUUklCVVRFKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGRlZkNhbGMoKS5jYWxjV2ViUGFyYW1EZWZhdWx0TmFtZSh3ZWJNZXRob2QsIHBhcmFtUG9zaXRpb24pOw0KLQl9DQotCQ0KLQlwcml2YXRlIFN0cmluZyBjYWxjUGFydE5hbWUoZmluYWwgSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IHdwQW5ub3RhdGlvbiwgZmluYWwgU3RyaW5nIG5hbWUpIA0KLQl7DQotCQlpZiAod3BBbm5vdGF0aW9uIT1udWxsICYmIHdwQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFBBUlRfTkFNRV9BVFRSSUJVVEUpIT1udWxsKSB7DQotCQkJcmV0dXJuIHdwQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFBBUlRfTkFNRV9BVFRSSUJVVEUpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbmFtZTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBib29sZWFuIGNhbGNIZWFkZXIoZmluYWwgSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IHdwQW5ub3RhdGlvbikNCi0Jew0KLQkJaWYgKHdwQW5ub3RhdGlvbiE9bnVsbCAmJiB3cEFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShIRUFERVJfQVRUUklCVVRFKSE9bnVsbCkgew0KLQkJCXJldHVybiBCb29sZWFuLnBhcnNlQm9vbGVhbih3cEFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShIRUFERVJfQVRUUklCVVRFKSk7DQotCQl9DQotCQkNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBTdHJpbmcgY2FsY1RhcmdldE5hbWVzcGFjZShmaW5hbCBJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4gd3BBbm5vdGF0aW9uLCBmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCwgZmluYWwgSVdlYlBhcmFtIHdlYlBhcmFtKQ0KLQl7DQotCQlpZiAod3BBbm5vdGF0aW9uIT1udWxsICYmIHdwQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFRBUkdFVF9OQU1FU1BBQ0VfQVRUUklCVVRFKSE9bnVsbCkgew0KLQkJCXJldHVybiB3cEFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShUQVJHRVRfTkFNRVNQQUNFX0FUVFJJQlVURSk7DQotCQl9DQotCQkNCi0JCXJldHVybiBkZWZDYWxjKCkuY2FsY1dlYlBhcmFtRGVmYXVsdFRhcmdldE5TKHdlYk1ldGhvZCwgd2ViUGFyYW0pOw0KLQl9DQotCQ0KLQlwcml2YXRlIElXZWJQYXJhbSBvYnRhaW5JbnN0YW5jZShJV2ViTWV0aG9kIHdtLCBTdHJpbmcgaW1wbCkNCi0Jew0KLQkJZmluYWwgSVdlYlBhcmFtIGV4aXN0aW5nID0gZmluZFdlYlBhcmFtQnlJbXBsTmFtZSh3bSwgaW1wbCk7DQotCQlpZiAoZXhpc3RpbmcgIT0gbnVsbCkNCi0JCXsNCi0JCQlyZXR1cm4gZXhpc3Rpbmc7DQotCQl9DQotCQlmaW5hbCBJV2ViUGFyYW0gbmV3UGFyYW0gPSBkb21GYWN0b3J5KCkuY3JlYXRlSVdlYlBhcmFtKCk7DQotCQl1dGlsKCkuc2V0RmVhdHVyZVZhbHVlKG5ld1BhcmFtLCBEb21QYWNrYWdlLklXRUJfUEFSQU1fX0lNUExFTUVOVEFUSU9OLCBpbXBsKTsNCi0JCXdtLmdldFBhcmFtZXRlcnMoKS5hZGQobmV3UGFyYW0pOw0KLQkJcmV0dXJuIG5ld1BhcmFtOw0KLQl9DQotCQ0KLQlwcml2YXRlIElXZWJQYXJhbSBmaW5kV2ViUGFyYW1CeUltcGxOYW1lKGZpbmFsIElXZWJNZXRob2Qgd20sIGZpbmFsIFN0cmluZyBpbXBsKQ0KLQl7DQotCQlmb3IgKElXZWJQYXJhbSBwYXJhbSA6IHdtLmdldFBhcmFtZXRlcnMoKSkNCi0JCXsNCi0JCQlpZiAoaW1wbC5lcXVhbHMocGFyYW0uZ2V0SW1wbGVtZW50YXRpb24oKSkpDQotCQkJew0KLQkJCQlyZXR1cm4gcGFyYW07DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL1NlaU1lcmdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL1NlaU1lcmdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMGNlODIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9TZWlNZXJnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLlNCQW5ub3RhdGlvbkZlYXR1cmVzLlNCX0FOTk9UQVRJT047DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuTkFNRV9BVFRSSUJVVEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuVEFSR0VUX05BTUVTUEFDRV9BVFRSSUJVVEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuV1NfQU5OT1RBVElPTjsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5Db250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW07DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLklNb2RlbEVsZW1lbnRTeW5jaHJvbml6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5KYXhXc1V0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbkluc3BlY3RvcjsNCi0NCi0vKioNCi0gKiBTeW5jaHJvbml6ZXIgdGhhdCBtZXJnZXMgY29udGVudCBvZiB7QGxpbmsgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZX0gd2l0aCB0aGUgY3VycmVudCBjb250ZW50IG9mIA0KLSAqIHRoZSBjbGFzcyBpbXBsZW1lbnRpbmcgaXQuICANCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFNlaU1lcmdlciBleHRlbmRzIEVsZW1lbnRTeW5jaHJvbml6ZXJJbXBsDQotew0KLQlwcml2YXRlIEFic3RyYWN0TWV0aG9kU3luY2hyb25pemVyIG1ldGhvZFN5bmNocm9uaXplcjsNCi0JDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rvcg0KLQkgKiBAcGFyYW0gcGFyZW50DQotCSAqIEBwYXJhbSBtZXRob2RTeW5jIHRoZSBzeW5jaHJvbml6ZXIgdGhhdCB0YWtlcyBjYXJlIGZvciB0aGUgU0VJIG1ldGhvZHMNCi0JICovDQotCXB1YmxpYyBTZWlNZXJnZXIoSU1vZGVsRWxlbWVudFN5bmNocm9uaXplciBwYXJlbnQsIEFic3RyYWN0TWV0aG9kU3luY2hyb25pemVyIG1ldGhvZFN5bmMpIA0KLQl7DQotCQlzdXBlcihwYXJlbnQpOw0KLQkJbnVsbENoZWNrUGFyYW0obWV0aG9kU3luYyk7DQotCQl0aGlzLm1ldGhvZFN5bmNocm9uaXplciA9IG1ldGhvZFN5bmM7DQotCX0NCi0JCQ0KLQlwcm90ZWN0ZWQgdm9pZCBtZXJnZShJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSwgSUFubm90YXRpb248SVR5cGU+IHdzQW5ub3RhdGlvbiwgSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIFN0cmluZyBzZWlOYW1lID0gd3NBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoTkFNRV9BVFRSSUJVVEUpID09IG51bGwgPyANCi0JCQkJSmF4V3NVdGlscy5nZXREZWZhdWx0UG9ydHR5cGVOYW1lKHdzQW5ub3RhdGlvbi5nZXRBcHBsaWVkRWxlbWVudCgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKSA6IHdzQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKE5BTUVfQVRUUklCVVRFKTsNCi0JCQkJDQotCQlpZiAoIXNlaU5hbWUuZXF1YWxzKHNlaS5nZXROYW1lKCkpKSB7DQotCQkJdXRpbCgpLnNldEZlYXR1cmVWYWx1ZShzZWksIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19OQU1FLCBzZWlOYW1lKTsNCi0JCX0NCi0JCQkJDQotCQkvLyBhZGQgdGFyZ2V0TmFtZXNwYWNlDQotCQlmaW5hbCBTdHJpbmcgdGFyZ2V0TnMgPSBleHRyYWN0VGFyZ2V0TmFtZXNwYWNlKHdzQW5ub3RhdGlvbik7DQotCQlpZiAoIXRhcmdldE5zLmVxdWFscyhzZWkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKSB7DQotCQkJdXRpbCgpLnNldEZlYXR1cmVWYWx1ZShzZWksIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19UQVJHRVRfTkFNRVNQQUNFLCB0YXJnZXROcyk7DQotCQl9DQotCQkNCi0JCW1lcmdlU29hcEJpbmRpbmcoc2VpLCBpbnNwZWN0b3IpOw0KLQkJbWV0aG9kU3luY2hyb25pemVyLnN5bmNocm9uaXplTWV0aG9kcyhzZWksIHdzQW5ub3RhdGlvbi5nZXRBcHBsaWVkRWxlbWVudCgpLCBpbnNwZWN0b3IpOw0KLQkJDQotCQlhZGFwdFRvTG9jYXRpb25JbnRlcmZhY2Uoc2VpLCBXU19BTk5PVEFUSU9OLCB3c0Fubm90YXRpb24pOw0KLQl9DQotCQ0KLQlwcml2YXRlIFN0cmluZyBleHRyYWN0VGFyZ2V0TmFtZXNwYWNlKGZpbmFsIElBbm5vdGF0aW9uPElUeXBlPiB3c0Fubm90YXRpb24pDQotCXsNCi0JCS8vIGFkZCB0YXJnZXROYW1lc3BhY2UNCi0JCWZpbmFsIFN0cmluZyB0YXJnZXROcyA9IHdzQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFRBUkdFVF9OQU1FU1BBQ0VfQVRUUklCVVRFKTsNCi0JCWlmICh0YXJnZXROcz09bnVsbCkgew0KLQkJCXJldHVybiBKYXhXc1V0aWxzLmNvbXBvc2VKYXhXc1RhcmdldE5hbWVzcGFjZUJ5UGFja2FnZSh3c0Fubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpKTsNCi0JCX0JDQotCQkNCi0JCXJldHVybiB0YXJnZXROczsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIG1lcmdlU29hcEJpbmRpbmcoZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWksIGZpbmFsIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJQW5ub3RhdGlvbjxJVHlwZT4gc2JBbm5vdGF0aW9uID0gaW5zcGVjdG9yLmluc3BlY3RUeXBlKFNCX0FOTk9UQVRJT04pOw0KLQkJDQotCQlmaW5hbCBTT0FQQmluZGluZ1N0eWxlIHN0eWxlID0gZGVmQ2FsYygpLmRlZmluZVNCU3R5bGUoc2JBbm5vdGF0aW9uKTsNCi0JCWlmIChzZWkuZ2V0U29hcEJpbmRpbmdTdHlsZSgpICE9IHN0eWxlKSB7DQotCQkJc2VpLnNldFNvYXBCaW5kaW5nU3R5bGUoc3R5bGUpOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBTT0FQQmluZGluZ1VzZSB1c2UgPSBkZWZDYWxjKCkuZGVmaW5lU0JVc2Uoc2JBbm5vdGF0aW9uKTsNCi0JCWlmIChzZWkuZ2V0U29hcEJpbmRpbmdVc2UoKSAhPSB1c2UpIHsNCi0JCQlzZWkuc2V0U29hcEJpbmRpbmdVc2UodXNlKTsNCi0JCX0NCi0JCQ0KLQkJZmluYWwgU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSBwYXJhbVN0eWxlID0gZGVmQ2FsYygpLmRlZmluZVNCUGFyYW1ldGVyU3R5bGUoc2JBbm5vdGF0aW9uKTsNCi0JCWlmIChzZWkuZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpICE9IHBhcmFtU3R5bGUpIHsNCi0JCQlzZWkuc2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZShwYXJhbVN0eWxlKTsNCi0JCX0NCi0JCQ0KLQkJYWRhcHRUb0xvY2F0aW9uSW50ZXJmYWNlKHNlaSwgU0JfQU5OT1RBVElPTiwgc2JBbm5vdGF0aW9uKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvU2VpTWV0aG9kU3luY2hyb25pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvU2VpTWV0aG9kU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMzNTRmNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL1NlaU1ldGhvZFN5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYzsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlSGllcmFyY2h5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JTW9kZWxFbGVtZW50U3luY2hyb25pemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb25JbnNwZWN0b3I7DQotDQotY2xhc3MgU2VpTWV0aG9kU3luY2hyb25pemVyIGV4dGVuZHMgQWJzdHJhY3RNZXRob2RTeW5jaHJvbml6ZXINCi17DQotDQotCXB1YmxpYyBTZWlNZXRob2RTeW5jaHJvbml6ZXIoSU1vZGVsRWxlbWVudFN5bmNocm9uaXplciBwYXJlbnQpDQotCXsNCi0JCXN1cGVyKHBhcmVudCk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCB2b2lkIHZpc2l0RXhwb3NhYmxlTWV0aG9kcyhJTWV0aG9kVmlzaXRvciB2aXNpdG9yLCBJVHlwZUhpZXJhcmNoeSBoaWVyYXJjaHksIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQl2aXNpdFJlY3Vyc2l2ZWx5KHZpc2l0b3IsIGhpZXJhcmNoeS5nZXRUeXBlKCksIGhpZXJhcmNoeSwgaW5zcGVjdG9yKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgdmlzaXRSZWN1cnNpdmVseShJTWV0aG9kVmlzaXRvciB2aXNpdG9yLCBJVHlwZSB0eXBlLCBJVHlwZUhpZXJhcmNoeSBoaWVyYXJjaHksIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmb3IgKElNZXRob2QgbWV0aG9kIDogdHlwZS5nZXRNZXRob2RzKCkpDQotCQl7DQotCQkJdmlzaXRvci52aXNpdChtZXRob2QsIGluc3BlY3Rvcik7DQotCQl9DQotDQotCQlmb3IgKElUeXBlIHN1cGVySW50ZiA6IGhpZXJhcmNoeS5nZXRTdXBlckludGVyZmFjZXModHlwZSkpDQotCQl7CQkJDQotCQkJdmlzaXRSZWN1cnNpdmVseSh2aXNpdG9yLCBzdXBlckludGYsIGhpZXJhcmNoeSwgcmVzb3VyY2UoKS5uZXdBbm5vdGF0aW9uSW5zcGVjdG9yKHN1cGVySW50ZikpOw0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9TZWlTeW5jaHJvbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9TZWlTeW5jaHJvbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOThlZmE3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvU2VpU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JQW5ub3RhdGlvblNlcmlhbGl6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JTW9kZWxFbGVtZW50U3luY2hyb25pemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbkluc3BlY3RvcjsNCi0NCi0vKioNCi0gKiBTeW5jaHJvbml6ZXIgZm9yIGV4cGxpY2l0IHtAbGluayBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlfSBpbnN0YW5jZS4gVXBkYXRlcyB0aGUgRE9NIGluc3RhbmNlIHRvIHRoZSBjdXJyZW50DQotICogU0VJIGltcGxlbWVudGF0aW9uIGNsYXNzIGJ5IHJlYWRpbmcgcmVsZXZhbnQgYW5ub3RhdGlvbnMgYW5kIA0KLSAqIA0KLSAqIEBhdXRob3IgDQotICovDQotcHVibGljIGNsYXNzIFNlaVN5bmNocm9uaXplciBleHRlbmRzIEVsZW1lbnRTeW5jaHJvbml6ZXJJbXBsDQotew0KLQlwcml2YXRlIGZpbmFsIFNlaU1lcmdlciBzZWlNZXJnZXI7IA0KLQ0KLQlTZWlTeW5jaHJvbml6ZXIoSU1vZGVsRWxlbWVudFN5bmNocm9uaXplciBwYXJlbnQpDQotCXsNCi0JCXN1cGVyKHBhcmVudCk7DQotCQlzZWlNZXJnZXIgPSBuZXcgU2VpTWVyZ2VyKHRoaXMsIG5ldyBTZWlNZXRob2RTeW5jaHJvbml6ZXIodGhpcykpOw0KLQl9DQotDQotCS8qIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgKi8NCi0Jdm9pZCBzeW5jaHJvbml6ZUludGVyZmFjZShJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0LCBJQW5ub3RhdGlvbjxJVHlwZT4gd3NBbm5vdGF0aW9uLCBJQW5ub3RhdGlvbkluc3BlY3RvciBpbnNwZWN0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSBvYnRhaW5JbnN0YW5jZSh3c1Byb2plY3QsIHdzQW5ub3RhdGlvbi5nZXRBcHBsaWVkRWxlbWVudCgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsNCi0JCXNlaU1lcmdlci5tZXJnZShzZWksIHdzQW5ub3RhdGlvbiwgaW5zcGVjdG9yKTsNCi0JCXJlc29sdmVXc1JlZnNUb1RoaXNTZWkoc2VpKTsNCi0JCXJlc291cmNlKCkuZ2V0U2VyaWFsaXplckZhY3RvcnkoKS5hZGFwdChzZWksIElBbm5vdGF0aW9uU2VyaWFsaXplci5jbGFzcyk7CQkNCi0JfQ0KLQ0KLQlwcml2YXRlIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugb2J0YWluSW5zdGFuY2UoSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdCwgU3RyaW5nIGltcGxOYW1lKQ0KLQl7DQotCQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IG51bGw7DQotCQlmb3IgKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgZXhpc3RpbmcgOiB3c1Byb2plY3QuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpKQ0KLQkJew0KLQkJCWlmIChleGlzdGluZy5nZXRJbXBsZW1lbnRhdGlvbigpLmVxdWFscyhpbXBsTmFtZSkpIHsNCi0JCQkJc2VpID0gZXhpc3Rpbmc7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlpZiAoc2VpPT1udWxsKQ0KLQkJew0KLQkJCXNlaSA9IGRvbUZhY3RvcnkoKS5jcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7DQotCQkJdXRpbCgpLnNldEZlYXR1cmVWYWx1ZShzZWksIERvbVBhY2thZ2UuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT04sIGltcGxOYW1lKTsNCi0JCQl3c1Byb2plY3QuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpLmFkZChzZWkpOw0KLQkJfQ0KLQkJDQotCQl1dGlsKCkuc2V0RmVhdHVyZVZhbHVlKHNlaSwgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExJQ0lULCBmYWxzZSk7DQotCQkNCi0JCXJldHVybiBzZWk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHJlc29sdmVXc1JlZnNUb1RoaXNTZWkoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkpDQotCXsNCi0JCWZvciAoSVdlYlNlcnZpY2Ugd3MgOiBzZXJ2aWNlRGF0YSgpLmdldEltcGxlbWVudGluZ1dzKHNlaS5nZXRJbXBsZW1lbnRhdGlvbigpKSkNCi0JCXsNCi0JCQlpZiAod3MuZ2V0U2VydmljZUVuZHBvaW50KCkgIT0gc2VpKQ0KLQkJCXsNCi0JCQkJdXRpbCgpLnNldEZlYXR1cmVWYWx1ZSh3cywgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQsIHNlaSk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9XU01ldGhvZFN5bmNocm9uaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL1dTTWV0aG9kU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkwOTM0ZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL1dTTWV0aG9kU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldNQW5ub3RhdGlvbkZlYXR1cmVzLldNX0FOTk9UQVRJT047DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuV1NfQU5OT1RBVElPTjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlSGllcmFyY2h5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Nb2RpZmllcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLklNb2RlbEVsZW1lbnRTeW5jaHJvbml6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XTUFubm90YXRpb25GZWF0dXJlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb25JbnNwZWN0b3I7DQotDQotcHVibGljIGNsYXNzIFdTTWV0aG9kU3luY2hyb25pemVyIGV4dGVuZHMgQWJzdHJhY3RNZXRob2RTeW5jaHJvbml6ZXINCi17DQotDQotCXB1YmxpYyBXU01ldGhvZFN5bmNocm9uaXplcihJTW9kZWxFbGVtZW50U3luY2hyb25pemVyIHBhcmVudCkNCi0Jew0KLQkJc3VwZXIocGFyZW50KTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXRFeHBvc2FibGVNZXRob2RzKElNZXRob2RWaXNpdG9yIHZpc2l0b3IsIElUeXBlSGllcmFyY2h5IGhpZXJhcmNoeSwgSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXZpc2l0UmVjdXJzaXZlbHkodmlzaXRvciwgaGllcmFyY2h5LmdldFR5cGUoKSwgaGllcmFyY2h5LCBpbnNwZWN0b3IpOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCB2aXNpdFJlY3Vyc2l2ZWx5KElNZXRob2RWaXNpdG9yIHZpc2l0b3IsIElUeXBlIHR5cGUsIElUeXBlSGllcmFyY2h5IGhpZXJhcmNoeSwgSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWlmICh0eXBlID09IG51bGwpDQotCQl7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQkNCi0JCWFzc2VydCB0eXBlLmlzQ2xhc3MoKTsNCi0JCWZpbmFsIGJvb2xlYW4gaXNXZWJTZXJ2aWNlID0gaW5zcGVjdG9yLmluc3BlY3RUeXBlKFdTX0FOTk9UQVRJT04pICE9IG51bGw7DQotCQlmb3IgKElNZXRob2QgbWV0aG9kIDogdHlwZS5nZXRNZXRob2RzKCkpDQotCQl7DQotCQkJaWYobWV0aG9kLmlzQ29uc3RydWN0b3IoKSkNCi0JCQl7DQotCQkJCS8vIENvbnN0cnVjdG9ycyBjYW4gbmV2ZXIgdGFrZSBwYXJ0IGluIHRoZSBwb3J0dHlwZQ0KLQkJCQljb250aW51ZTsNCi0JCQl9DQotCQkJDQotCQkJZmluYWwgSUFubm90YXRpb248SU1ldGhvZD4gd21Bbm5vdGF0aW9uID0gaW5zcGVjdG9yLmluc3BlY3RNZXRob2QobWV0aG9kLCBXTV9BTk5PVEFUSU9OKTsNCi0JCQlmaW5hbCBib29sZWFuIGlzRXhjbHVkZWRXaXRoQW5ub3RhdGlvbiA9IHdtQW5ub3RhdGlvbiA9PSBudWxsID8gZmFsc2UgOiAidHJ1ZSIuZXF1YWxzKHdtQW5ub3RhdGlvbi8vJE5PTi1OTFMtMSQNCi0JCQkJCQkJCQkJCS5nZXRQcm9wZXJ0eVZhbHVlKFdNQW5ub3RhdGlvbkZlYXR1cmVzLldNX0VYQ0xVREVEX0FUVFJJQlVURSkpOw0KLQkJCWlmIChNb2RpZmllci5pc1B1YmxpYyhtZXRob2QuZ2V0RmxhZ3MoKSkgJiYgIWlzRXhjbHVkZWRXaXRoQW5ub3RhdGlvbiAmJiAoaXNXZWJTZXJ2aWNlIHx8IHdtQW5ub3RhdGlvbiAhPSBudWxsKSkNCi0JCQl7DQotCQkJCXZpc2l0b3IudmlzaXQobWV0aG9kLCBpbnNwZWN0b3IpOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJZmluYWwgSVR5cGUgc3VwZXJUeXBlID0gaGllcmFyY2h5LmdldFN1cGVyY2xhc3ModHlwZSk7DQotCQlpZiAoc3VwZXJUeXBlIT1udWxsKSB7DQotCQkJdmlzaXRSZWN1cnNpdmVseSh2aXNpdG9yLCBzdXBlclR5cGUsIGhpZXJhcmNoeSwgcmVzb3VyY2UoKS5uZXdBbm5vdGF0aW9uSW5zcGVjdG9yKHN1cGVyVHlwZSkpOw0KLQkJfQ0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9Xc1N5bmNocm9uaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL1dzU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQyNGZlODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL1dzU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5FTkRQT0lOVF9JTlRFUkZBQ0VfQVRUUklCVVRFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuUE9SVF9OQU1FX0FUVFJJQlVURTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzLlNFUlZJQ0VfTkFNRV9BVFRSSUJVVEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5UQVJHRVRfTkFNRVNQQUNFX0FUVFJJQlVURTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzLldTRExfTE9DQVRJT05fQVRUUklCVVRFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuV1NfQU5OT1RBVElPTjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JQW5ub3RhdGlvblNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLklNb2RlbEVsZW1lbnRTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkpheFdzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbkluc3BlY3RvcjsKLQotcHVibGljIGNsYXNzIFdzU3luY2hyb25pemVyIGV4dGVuZHMgRWxlbWVudFN5bmNocm9uaXplckltcGwKLXsKLQlwcml2YXRlIGZpbmFsIFNlaU1lcmdlciBzZWlNZXJnZXI7Ci0KLQlwdWJsaWMgV3NTeW5jaHJvbml6ZXIoSU1vZGVsRWxlbWVudFN5bmNocm9uaXplciBwYXJlbnQpCi0JewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnNlaU1lcmdlciA9IG5ldyBTZWlNZXJnZXIodGhpcywgbmV3IFdTTWV0aG9kU3luY2hyb25pemVyKHRoaXMpKTsKLQl9Ci0KLQlwcml2YXRlIElXZWJTZXJ2aWNlIG9idGFpbkluc3RhbmNlKElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QsIFN0cmluZyBpbXBsTmFtZSkKLQl7Ci0JCWZvciAoSVdlYlNlcnZpY2Ugd3MgOiB3c1Byb2plY3QuZ2V0V2ViU2VydmljZXMoKSkKLQkJewotCQkJaWYgKHdzLmdldEltcGxlbWVudGF0aW9uKCkhPSBudWxsICYmIHdzLmdldEltcGxlbWVudGF0aW9uKCkuZXF1YWxzKGltcGxOYW1lKSkKLQkJCXsKLQkJCQlyZXR1cm4gd3M7Ci0JCQl9Ci0JCX0KLQkJZmluYWwgSVdlYlNlcnZpY2UgbmV3V3MgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViU2VydmljZSgpOwotCQl1dGlsKCkuc2V0RmVhdHVyZVZhbHVlKG5ld1dzLCBEb21QYWNrYWdlLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OLCBpbXBsTmFtZSk7Ci0JCXV0aWwoKS5hZGRUb0NvbGxlY3Rpb25GZWF0dXJlKHdzUHJvamVjdCwgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fV0VCX1NFUlZJQ0VTLCBuZXdXcyk7Ci0JCQotCQlyZXR1cm4gbmV3V3M7Ci0JfQotCi0JcHVibGljIElXZWJTZXJ2aWNlIHN5bmNocm9uaXplV2ViU2VydmljZShJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0LCBJQW5ub3RhdGlvbjxJVHlwZT4gd3NBbm5vdGF0aW9uLCBJQW5ub3RhdGlvbkluc3BlY3RvciBpbnNwZWN0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQl7Ci0JCWZpbmFsIElXZWJTZXJ2aWNlIHdzID0gb2J0YWluSW5zdGFuY2Uod3NQcm9qZWN0LCB3c0Fubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCW1lcmdlV2ViU2VydmljZSh3cywgd3NQcm9qZWN0LCB3c0Fubm90YXRpb24sIGluc3BlY3Rvcik7Ci0JCQotCQlyZXNvdXJjZSgpLmdldFNlcmlhbGl6ZXJGYWN0b3J5KCkuYWRhcHQod3MsIElBbm5vdGF0aW9uU2VyaWFsaXplci5jbGFzcyk7Ci0JCWFkYXB0VG9Mb2NhdGlvbkludGVyZmFjZSh3cywgV1NfQU5OT1RBVElPTiwgd3NBbm5vdGF0aW9uKTsKLQkJCi0JCXJldHVybiB3czsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbWVyZ2VXZWJTZXJ2aWNlKElXZWJTZXJ2aWNlIHRvTWVyZ2UsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QsIElBbm5vdGF0aW9uPElUeXBlPiB3c0Fubm90YXRpb24sIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCXsKLQkJLy8gYWRkIHNlcnZpY2VOYW1lIG5hbWUKLQkJZmluYWwgU3RyaW5nIHdzTmFtZSA9IHdzQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFNFUlZJQ0VfTkFNRV9BVFRSSUJVVEUpID09IG51bGwgPwotCQkJCUpheFdzVXRpbHMuZ2V0RGVmYXVsdFNlcnZpY2VOYW1lKHdzQW5ub3RhdGlvbi5nZXRBcHBsaWVkRWxlbWVudCgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKSA6IAotCQkJCXdzQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFNFUlZJQ0VfTkFNRV9BVFRSSUJVVEUpOwotCQkJCQotCQlpZiAoIXdzTmFtZS5lcXVhbHModG9NZXJnZS5nZXROYW1lKCkpKQotCQl7Ci0JCQl1dGlsKCkuc2V0RmVhdHVyZVZhbHVlKHRvTWVyZ2UsIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19OQU1FLCB3c05hbWUpOwotCQl9Ci0JCQotCQkvLyBhZGQgdGFyZ2V0TmFtZXNwYWNlCi0JCWZpbmFsIFN0cmluZyB0YXJnZXROcyA9IGV4dHJhY3RUYXJnZXROYW1lc3BhY2Uod3NBbm5vdGF0aW9uKTsKLQkJaWYgKCF0YXJnZXROcy5lcXVhbHModG9NZXJnZS5nZXRUYXJnZXROYW1lc3BhY2UoKSkpIHsKLQkJCXV0aWwoKS5zZXRGZWF0dXJlVmFsdWUodG9NZXJnZSwgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1RBUkdFVF9OQU1FU1BBQ0UsIHRhcmdldE5zKTsKLQkJfQotCQkKLQkJLy8gYWRkIHBvcnROYW1lCi0JCWZpbmFsIFN0cmluZyBwb3J0TmFtZSA9IHdzQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFBPUlRfTkFNRV9BVFRSSUJVVEUpPT1udWxsID8KLQkJCQlKYXhXc1V0aWxzLmdldERlZmF1bHRQb3J0TmFtZSh3c0Fubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSkgOgotCQkJCXdzQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFBPUlRfTkFNRV9BVFRSSUJVVEUpOwotCQkJCQotCQlpZiAoIXBvcnROYW1lLmVxdWFscyh0b01lcmdlLmdldFBvcnROYW1lKCkpKSB7Ci0JCQl0b01lcmdlLnNldFBvcnROYW1lKHBvcnROYW1lKTsKLQkJfQotCQkKLQkJLy8gYWRkIHdzZGxMb2NhdGlvbgotCQl0b01lcmdlLnNldFdzZGxMb2NhdGlvbih3c0Fubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShXU0RMX0xPQ0FUSU9OX0FUVFJJQlVURSkpOwotCQkKLQkJLy8gYWRkIGVuZHBvaW50SW50ZXJmYWNlCi0JCWZpbmFsIFN0cmluZyBuZXdTZWlJbXBsID0gd3NBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoRU5EUE9JTlRfSU5URVJGQUNFX0FUVFJJQlVURSk7Ci0JCWlmIChuZXdTZWlJbXBsID09IG51bGwpCi0JCXsKLQkJCW1lcmdlSW1wbGljaXRJbnRlcmZhY2Uob2J0YWluSW1wbGljaXRJbnRlcmZhY2VJbnN0YW5jZSh3c1Byb2plY3QsIHRvTWVyZ2UsIHdzQW5ub3RhdGlvbiksIHdzQW5ub3RhdGlvbiwgaW5zcGVjdG9yKTsKLQkJfSBlbHNlCi0JCXsKLQkJCWlmICh0b01lcmdlLmdldFNlcnZpY2VFbmRwb2ludCgpID09IG51bGwgfHwgIXRvTWVyZ2UuZ2V0U2VydmljZUVuZHBvaW50KCkuZ2V0SW1wbGVtZW50YXRpb24oKS5lcXVhbHMobmV3U2VpSW1wbCkpCi0JCQl7Ci0JCQkJc2VydmljZURhdGEoKS5tYXAodG9NZXJnZSwgbmV3U2VpSW1wbCk7Ci0JCQkJcmVzb2x2ZUludGVyZmFjZSh0b01lcmdlLCB3c1Byb2plY3QsIHdzQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKEVORFBPSU5UX0lOVEVSRkFDRV9BVFRSSUJVVEUpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBvYnRhaW5JbXBsaWNpdEludGVyZmFjZUluc3RhbmNlKElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QsIElXZWJTZXJ2aWNlIHdzLCBJQW5ub3RhdGlvbjxJVHlwZT4gd3NBbm5vdGF0aW9uKQotCXsKLQkJaWYgKHdzLmdldFNlcnZpY2VFbmRwb2ludCgpICE9IG51bGwgJiYgd3MuZ2V0U2VydmljZUVuZHBvaW50KCkuaXNJbXBsaWNpdCgpKQotCQl7Ci0JCQlyZXR1cm4gd3MuZ2V0U2VydmljZUVuZHBvaW50KCk7Ci0JCX0KLQotCQlmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsKLQkJdXRpbCgpLnNldEZlYXR1cmVWYWx1ZShzZWksIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVCwgdHJ1ZSk7Ci0JCXV0aWwoKS5zZXRGZWF0dXJlVmFsdWUoc2VpLCBEb21QYWNrYWdlLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OLCB3c0Fubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCXV0aWwoKS5zZXRGZWF0dXJlVmFsdWUod3MsIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19TRVJWSUNFX0VORFBPSU5ULCBzZWkpOwotCQkKLQkJd3NQcm9qZWN0LmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKS5hZGQoc2VpKTsKLQkJCi0JCXJldHVybiBzZWk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG1lcmdlSW1wbGljaXRJbnRlcmZhY2UoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWksIElBbm5vdGF0aW9uPElUeXBlPiB3c0Fubm90YXRpb24sIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCXsKLQkJc2VpTWVyZ2VyLm1lcmdlKHNlaSwgd3NBbm5vdGF0aW9uLCBpbnNwZWN0b3IpOwotCQlyZXNvdXJjZSgpLmdldFNlcmlhbGl6ZXJGYWN0b3J5KCkuYWRhcHQoc2VpLCBJQW5ub3RhdGlvblNlcmlhbGl6ZXIuY2xhc3MpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBleHRyYWN0VGFyZ2V0TmFtZXNwYWNlKGZpbmFsIElBbm5vdGF0aW9uPElUeXBlPiB3c0Fubm90YXRpb24pCi0JewotCQkvLyBhZGQgdGFyZ2V0TmFtZXNwYWNlCi0JCWZpbmFsIFN0cmluZyB0YXJnZXROcyA9IHdzQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFRBUkdFVF9OQU1FU1BBQ0VfQVRUUklCVVRFKTsKLQkJaWYgKHRhcmdldE5zPT1udWxsKSB7Ci0JCQlyZXR1cm4gSmF4V3NVdGlscy5jb21wb3NlSmF4V3NUYXJnZXROYW1lc3BhY2VCeVBhY2thZ2Uod3NBbm5vdGF0aW9uLmdldEFwcGxpZWRFbGVtZW50KCkuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCX0JCi0JCQotCQlyZXR1cm4gdGFyZ2V0TnM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlc29sdmVJbnRlcmZhY2UoSVdlYlNlcnZpY2Ugd3MsIElXZWJTZXJ2aWNlUHJvamVjdCBwcmVmZmVyZWQsIFN0cmluZyBpbXBsZW1lbnRhdGlvbikKLQl7Ci0JCUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgcmVzb2x2ZWQgPSBudWxsOwotCQlmb3IgKElXZWJTZXJ2aWNlUHJvamVjdCBwcmogOiBnZXREb21CZWluZ0xvYWRlZCgpLmdldFdlYlNlcnZpY2VQcm9qZWN0cygpKQotCQl7Ci0JCQlmb3IgKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpIDogcHJqLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKSkKLQkJCXsKLQkJCQlpZiAoc2VpLmdldEltcGxlbWVudGF0aW9uKCkuZXF1YWxzKGltcGxlbWVudGF0aW9uKSkKLQkJCQl7Ci0JCQkJCXJlc29sdmVkID0gc2VpOwotCQkJCQlpZiAocHJlZmZlcmVkLmVxdWFscyhwcmopKQotCQkJCQl7Ci0JCQkJCQlicmVhazsKLQkJCQkJfSBlbHNlCi0JCQkJCXsKLQkJCQkJCXJlc29sdmVkID0gc2VpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJdXRpbCgpLnNldEZlYXR1cmVWYWx1ZSh3cywgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQsIHJlc29sdmVkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3JlZ2lzdHJ5L0lXc0RPTVJ1bnRpbWVJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3JlZ2lzdHJ5L0lXc0RPTVJ1bnRpbWVJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFmOGNiMDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9yZWdpc3RyeS9JV3NET01SdW50aW1lSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucmVnaXN0cnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5JTmFtZWRFeHRlbnNpb25JbmZvOw0KLQ0KLS8qKg0KLSAqIERlZmluZXMgdGhlIGluZm9ybWF0aW9uIHN0cnVjdHVyZSB3aGljaCBzaG91bGQgYmUgaW5zdGFudGlhdGVkIHVwb24gcmVhZGluZyBjb250cmlidXRvcnMNCi0gKiB0byB0aGUgU3VwcG9ydGVkIFJ1bnRpbWUgZXh0ZW5zaW9uIHBvaW50Lg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIEhyaXN0b3YgSTAzNjIwMQ0KLSAqDQotICovDQotcHVibGljIGludGVyZmFjZSBJV3NET01SdW50aW1lSW5mbyBleHRlbmRzIElOYW1lZEV4dGVuc2lvbkluZm8NCi17DQotCS8qKg0KLQkgKiANCi0JICogQHJldHVybiB0aGUgbWFwIG9mIHByb2plY3QgZmFjZXRzIHJlbGV2YW50IGZvciBhIHBhcnRpY3VsYXIgcnVudGltZSB3aGVyZSB0aGUga2V5IGlzIA0KLQkgKiB0aGUgcHJvamVjdCBmYWNldCBpZCBhbmQgdGhlIHZhbHVlIGlzIHRoZSB2ZXJzaW9uIG9mIHRoZSBwcm9qZWN0IGZhY2V0IGlmIHNwZWNpZmllZC4NCi0JICovDQotCXB1YmxpYyBhYnN0cmFjdCBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFByb2plY3RGYWNldHMoKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9yZWdpc3RyeS9Xc0RPTVJ1bnRpbWVSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9yZWdpc3RyeS9Xc0RPTVJ1bnRpbWVSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MmE4MmZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcmVnaXN0cnkvV3NET01SdW50aW1lUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5yZWdpc3RyeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXc0RPTVJ1bnRpbWVFeHRlbnNpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5wbHVnaW4uSmF4V3NEb21SdW50aW1lUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwudXRpbC5OYW1lZEV4dGVuc2lvbkluZm87DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLklMb2dnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLkxvZ2dlcjsNCi0NCi0vKioNCi0gKiANCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBIcmlzdG92IEkwMzYyMDENCi0gKg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBXc0RPTVJ1bnRpbWVSZWdpc3RyeSANCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJ1bnRpbWVJbmZvIGV4dGVuZHMgTmFtZWRFeHRlbnNpb25JbmZvIGltcGxlbWVudHMgSVdzRE9NUnVudGltZUluZm8NCi0Jew0KLQkJcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb2plY3RGYWNldHM7DQotCQkNCi0JCVJ1bnRpbWVJbmZvKGZpbmFsIFN0cmluZyBwSWQsIGZpbmFsIFN0cmluZyBwTGFiZWwsIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvamVjdEZhY2V0cykNCi0JCXsNCi0JCQlzdXBlcihwSWQsIHBMYWJlbCk7DQotCQkJDQotCQkJdGhpcy5wcm9qZWN0RmFjZXRzID0gcHJvamVjdEZhY2V0czsNCi0JCX0NCi0JCQ0KLQkJcHVibGljIE1hcDxTdHJpbmcsU3RyaW5nPiBnZXRQcm9qZWN0RmFjZXRzKCkNCi0JCXsNCi0JCQlyZXR1cm4gdGhpcy5wcm9qZWN0RmFjZXRzOw0KLQkJfQ0KLSAJfQ0KLQkNCi0JLyoqIFRoZSBJRCBvZiB0aGUgZXh0ZW5zaW9uIHBvaW50IGZvciBhIHN1cHBvcnRlZCBydW50aW1lICovDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5USU1FX1hQID0gSmF4V3NEb21SdW50aW1lUGx1Z2luLlBMVUdJTl9JRCArICIuZG9tcnVudGltZXMiOyAvLyROT04tTkxTLTEkDQotDQotCS8qKgkgRXJyb3IgbWVzc2FnZSBkaXNwbGF5ZWQgd2hlbiBleHRlbnNpb24gcG9pbnQgbm90IHByb3Blcmx5IGRlZmluZWQgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX05PVF9QUk9QRVJMWV9SRUdJU1RFUkVEID0gIlJlZ2lzdGVyZWQgcnVudGltZSBleHRlbnNpb24gbm90IHByb3Blcmx5IHJlZ2lzdGVyZWQgKGVycm9yIGluIHBsdWdpbi54bWwpIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFBfSU1QTEVNRU5UQVRJT05fRUxFTUVOVCA9ICJpbXBsZW1lbnRhdGlvbiI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhQX1BST0pFQ1RfRkFDRVRfRUxFTUVOVCA9ICJwcm9qZWN0X2ZhY2V0IjsgLy8kTk9OLU5MUy0xJA0KLQkNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhQX1BST0pFQ1RfRkFDRVRfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkDQotCQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFBfUFJPSkVDVF9GQUNFVF9WRVJTSU9OID0gInZlcnNpb24iOyAvLyROT04tTkxTLTEkDQotCQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFBfSU1QTEVNRU5UQVRJT05fRUxFTUVOVF9DTEFTU19BVFRSID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgZXhlY3V0YWJsZSBleHRlbnNpb24uDQotCSAqIA0KLQkgKiBAcGFyYW0gaW5mbyB0aGUgZGVzY3JpcHRvciBvYmplY3QgYnVpbHQgZHVyaW5nIGV4dGVuc2lvbiBwb2ludCBsb2FkDQotCSAqIEByZXR1cm4gaW5zdGFuY2Ugb2YgcnVudGltZSBleHRlbnNpb24gaW1wbGVtZW50YXRpb24NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVdzRE9NUnVudGltZUV4dGVuc2lvbiBpbnN0YW50aWF0ZVJ1bnRpbWUoZmluYWwgSVdzRE9NUnVudGltZUluZm8gaW5mbykNCi0Jew0KLQkJZmluYWwgSUV4dGVuc2lvbiBleHQgPSBmaW5kRXh0ZW5zaW9uKGluZm8pOw0KLQkJDQotCQlpZihleHQ9PW51bGwpDQotCQl7DQotCQkJbG9nZ2VyKCkubG9nRXJyb3IoRVhURU5TSU9OX05PVF9QUk9QRVJMWV9SRUdJU1RFUkVEKTsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JCQkNCi0JCWZvciAoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsIDogZXh0LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpKQ0KLQkJew0KLQkJCWlmIChlbC5nZXROYW1lKCkuZXF1YWxzKFhQX0lNUExFTUVOVEFUSU9OX0VMRU1FTlQpKQ0KLQkJCXsNCi0JCQkJdHJ5DQotCQkJCXsNCi0JCQkJCS8vRklYTUUgQ2xhc3NDYXN0RXhjZXB0aW9uIHNob3dpbmcgdXAgaW4gdGhlIGxvZ3MgaW4gdGhlIFdUUCBidWlsZA0KLQkJCQkJT2JqZWN0IGltcGwgPSBlbC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKFhQX0lNUExFTUVOVEFUSU9OX0VMRU1FTlRfQ0xBU1NfQVRUUik7DQotCQkJCQlpZiAoaW1wbCBpbnN0YW5jZW9mIElXc0RPTVJ1bnRpbWVFeHRlbnNpb24pIHsNCi0JCQkJCQlyZXR1cm4gKElXc0RPTVJ1bnRpbWVFeHRlbnNpb24pIGltcGw7DQotCQkJCQl9IGVsc2Ugew0KLQkJCQkJCXJldHVybiBudWxsOw0KLQkJCQkJfQ0KLS8vCQkJCQlyZXR1cm4gKElXc0RPTVJ1bnRpbWVFeHRlbnNpb24pIGVsLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oWFBfSU1QTEVNRU5UQVRJT05fRUxFTUVOVF9DTEFTU19BVFRSKTsNCi0JCQkJfSANCi0JCQkJY2F0Y2ggKGZpbmFsIENvcmVFeGNlcHRpb24gZSkNCi0JCQkJew0KLQkJCQkJbG9nZ2VyKCkubG9nRXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgZXh0ZW5zaW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJCXJldHVybiBudWxsOw0KLQkJCQkJDQotCQkJCX0NCi0vLwkJCQljYXRjaCAoZmluYWwgQ2xhc3NDYXN0RXhjZXB0aW9uIGUpDQotLy8JCQkJew0KLS8vCQkJCQlsb2dnZXIoKS5sb2dFcnJvcigiSW1wbGVtZW50YXRpb24gY2xhc3MgZG9lcyBub3QgaW1wbGVtZW50IHByb3BlciBpbnRlcmZhY2UiLCBlKTsgLy8kTk9OLU5MUy0xJA0KLS8vCQkJCQlyZXR1cm4gbnVsbDsNCi0vLwkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlsb2dnZXIoKS5sb2dFcnJvcihFWFRFTlNJT05fTk9UX1BST1BFUkxZX1JFR0lTVEVSRUQpOw0KLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oRVhURU5TSU9OX05PVF9QUk9QRVJMWV9SRUdJU1RFUkVEKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIExvY2F0ZXMgdGhlIGV4dGVuc2lvbiBwb2ludCBjb250cmlidXRpb24gZGVmaW5pdGlvbiBmb3IgdGhpcyBwYXJ0aWN1bGFyIHJ1bnRpbWUuDQotCSAqIA0KLQkgKiBAcGFyYW0gaW5mbyB0aGUgZGVzY3JpcHRvciBvYmplY3QgYnVpbHQgZHVyaW5nIGV4dGVuc2lvbiBwb2ludCBsb2FkDQotCSAqIEByZXR1cm4gaW5zdGFuY2Ugb2YgY29udHJpYnV0aW9uIGRlZmluaXRpb24NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSUV4dGVuc2lvbiBmaW5kRXh0ZW5zaW9uKGZpbmFsIElXc0RPTVJ1bnRpbWVJbmZvIGluZm8pDQotCXsNCi0JCWlmKGluZm8hPW51bGwpDQotCQl7DQotCQkJZmluYWwgSUV4dGVuc2lvbltdIGV4dHMgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KFJVTlRJTUVfWFApLmdldEV4dGVuc2lvbnMoKTsNCi0JCQ0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0cy5sZW5ndGg7IGkrKykNCi0JCQl7DQotCQkJCWlmIChleHRzW2ldLmdldFNpbXBsZUlkZW50aWZpZXIoKS5lcXVhbHMoaW5mby5nZXRJZCgpKSkNCi0JCQkJew0KLQkJCQkJcmV0dXJuIGV4dHNbaV07DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBydW50aW1lcy4NCi0JICogDQotCSAqIEByZXR1cm4gc2V0IG9mIGluZm9ybWF0aW9uIHJlY29yZHMgZm9yIHRoZSByZWdpc3RlcmVkIHJ1bnRpbWVzDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248SVdzRE9NUnVudGltZUluZm8+IGdldFJlZ2lzdGVyZWRSdW50aW1lc0luZm8oKQ0KLQl7DQotCQlmaW5hbCBJRXh0ZW5zaW9uW10gZXh0cyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoUlVOVElNRV9YUCkuZ2V0RXh0ZW5zaW9ucygpOw0KLQkJZmluYWwgQ29sbGVjdGlvbjxJV3NET01SdW50aW1lSW5mbz4gcnVudGltZURlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxJV3NET01SdW50aW1lSW5mbz4oZXh0cy5sZW5ndGgpOw0KLQkJDQotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dHMubGVuZ3RoOyBpKyspDQotCQl7DQotCQkJSGFzaE1hcDxTdHJpbmcsU3RyaW5nPiBwcm9qZWN0RmFjZXRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLFN0cmluZz4oKTsNCi0JCQkNCi0JCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBlbCA6IGV4dHNbaV0uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCkpDQotCQkJew0KLQkJCQlpZiAoZWwuZ2V0TmFtZSgpLmVxdWFscyhYUF9QUk9KRUNUX0ZBQ0VUX0VMRU1FTlQpKQ0KLQkJCQl7DQotCQkJCQlwcm9qZWN0RmFjZXRzLnB1dChlbC5nZXRBdHRyaWJ1dGUoWFBfUFJPSkVDVF9GQUNFVF9JRCksZWwuZ2V0QXR0cmlidXRlKFhQX1BST0pFQ1RfRkFDRVRfVkVSU0lPTikpOw0KLQkJCQl9DQotCQkJfQ0KLQkJCQ0KLQkJCQ0KLQkJCXJ1bnRpbWVEZXNjcmlwdG9ycy5hZGQobmV3IFJ1bnRpbWVJbmZvKGV4dHNbaV0uZ2V0U2ltcGxlSWRlbnRpZmllcigpLCBleHRzW2ldLmdldExhYmVsKCksIHByb2plY3RGYWNldHMpKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHJ1bnRpbWVEZXNjcmlwdG9yczsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHJ1bnRpbWUgZGVzY3JpcHRvciBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGlzIHJ1bnRpbWUgaWQuDQotCSAqIA0KLQkgKiBAcGFyYW0gcnVudGltZUlkIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBydW50aW1lDQotCSAqIEByZXR1cm4gZGVzY3JpcHRvciBvYmplY3QgZm9yIHRoZSBuZWVkZWQgcnVudGltZQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJV3NET01SdW50aW1lSW5mbyBnZXRSdW50aW1lSW5mbyhmaW5hbCBTdHJpbmcgcnVudGltZUlkKQ0KLQl7DQotCQlJdGVyYXRvcjxJV3NET01SdW50aW1lSW5mbz4gcmVnaXN0ZXJlZFJ1bnRpbWUgPSBnZXRSZWdpc3RlcmVkUnVudGltZXNJbmZvKCkuaXRlcmF0b3IoKTsNCi0JCQ0KLQkJd2hpbGUocmVnaXN0ZXJlZFJ1bnRpbWUuaGFzTmV4dCgpKQ0KLQkJew0KLQkJCUlXc0RPTVJ1bnRpbWVJbmZvIHJ1bnRpbWVJbmZvID0gcmVnaXN0ZXJlZFJ1bnRpbWUubmV4dCgpOw0KLQkJCQ0KLQkJCWlmKHJ1bnRpbWVJbmZvLmdldElkKCkuZXF1YWxzKHJ1bnRpbWVJZCkpDQotCQkJew0KLQkJCQlyZXR1cm4gcnVudGltZUluZm87DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBzdGF0aWMgSUxvZ2dlciBsb2dnZXIoKQ0KLQl7DQotCQlyZXR1cm4gbmV3IExvZ2dlcigpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdXRpbC9Eb20yUmVzb3VyY2VNYXBwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdXRpbC9Eb20yUmVzb3VyY2VNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmVmMjUyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvRG9tMlJlc291cmNlTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLkRvbVV0aWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlcjsNCi0NCi0NCi0vKioNCi0gKiBDbGFzcyB0aGF0IHRha2VzIGNhcmUgZm9yIG1hcHBpbmcgRE9NIG9iamVjdHMgdG8gRWNsaXBzZSByZXNvdXJjZXMuIA0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRG9tMlJlc291cmNlTWFwcGVyDQotew0KLQkvKiogdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERvbTJSZXNvdXJjZU1hcHBlciBJTlNUQU5DRSA9IG5ldyBEb20yUmVzb3VyY2VNYXBwZXIoKTsNCi0JDQotCXByaXZhdGUgRG9tU3dpdGNoPFN0cmluZz4gaW1wbENsYXNzRmluZGVyU3dpdGNoOw0KLQkNCi0JLyoqDQotCSAqIFNpbmdsZXRvbiBDb25zdHJ1Y3RvciANCi0JICovDQotCXByaXZhdGUgRG9tMlJlc291cmNlTWFwcGVyKCkgewkNCi0JCXRoaXMuaW1wbENsYXNzRmluZGVyU3dpdGNoID0gY3JlYXRlSW1wbEZpbmRlclN3aXRjaCgpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogRmluZHMgdW5kZXJseWluZyB7QGxpbmsgSVJlc291cmNlfSBmb3IgdGhpcyBET00gb2JqZWN0DQotCSAqIEBwYXJhbSBlT2JqZWN0IHRoZSBET00gb2JqZWN0DQotCSAqIEByZXR1cm4gZm91bmQgcmVzb3VyY2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4NCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBJUmVzb3VyY2UgZmluZFJlc291cmNlKGZpbmFsIEVPYmplY3QgZU9iamVjdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0oZU9iamVjdCk7DQotCQlzd2l0Y2ggKGVPYmplY3QuZUNsYXNzKCkuZ2V0Q2xhc3NpZmllcklEKCkpIA0KLQkJew0KLQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRToNCi0JCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0U6IA0KLQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EOiANCi0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNOgkNCi0JCQlmaW5hbCBJVHlwZSB0eXBlID0gZmluZFR5cGUoZU9iamVjdCk7IA0KLQkJCXJldHVybiB0eXBlPT1udWxsID8gbnVsbCA6IHR5cGUuZ2V0UmVzb3VyY2UoKTsNCi0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVDoNCi0JCQlyZXR1cm4gZmluZFByb2plY3QoKElXZWJTZXJ2aWNlUHJvamVjdCllT2JqZWN0KTsNCi0JCX0NCi0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQkvKioNCi0JICogRmluZHMgSVByb2plY3QgaW5zdGFuY2UgZm9yIHRoZSB3ZWIgc2VydmljZSBwcm9qZWN0IHJlcHJlc2VudGVkIGJ5IDxjb2RlPndzUHJvamVjdDwvY29kZT4NCi0JICogQHBhcmFtIHdzUHJvamVjdCB0aGUgcHJvamVjdCBET00gb2JqZWN0DQotCSAqIEByZXR1cm4gZm91bmQgcmVzb3VyY2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4NCi0JICovDQotCXB1YmxpYyBJUHJvamVjdCBmaW5kUHJvamVjdChmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0KQ0KLQl7DQotCQlpZiAod3NQcm9qZWN0ID09IG51bGwpIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0NCi0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3Qod3NQcm9qZWN0LmdldE5hbWUoKSk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBGaW5kcyB1bmRlcmx5aW5nIHtAbGluayBJVHlwZX0gaW5zdGFuY2UgZm9yIHRoaXMgPGNvZGU+ZU9iamVjdDwvY29kZT4gDQotCSAqIEBwYXJhbSBlT2JqZWN0IHRoZSBET00gb2JqZWN0DQotCSAqIEByZXR1cm4gdGhlIElUeXBlIGNvbnRhaW5pbmcgdGhpcyA8Y29kZT5lT2JqZWN0PC9jb2RlPiBvciA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIElUeXBlIGZpbmRUeXBlKGZpbmFsIEVPYmplY3QgZU9iamVjdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiANCi0Jew0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKGVPYmplY3QpOw0KLQkJDQotCQlmaW5hbCBJUHJvamVjdCBwcm9qZWN0ID0gZmluZFByb2plY3QoRG9tVXRpbC5JTlNUQU5DRS5maW5kV3NQcm9qZWN0KGVPYmplY3QpKTsNCi0JCWZpbmFsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsNCi0JCWZpbmFsIFN0cmluZyBmcU5hbWUgPSBpbXBsQ2xhc3NGaW5kZXJTd2l0Y2guZG9Td2l0Y2goZU9iamVjdCk7DQotCQlpZiAoamF2YVByb2plY3Q9PW51bGwgfHwgZnFOYW1lID09IG51bGwpIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGphdmFQcm9qZWN0LmZpbmRUeXBlKGZxTmFtZSk7DQotCX0NCi0NCi0JcHJpdmF0ZSBEb21Td2l0Y2g8U3RyaW5nPiBjcmVhdGVJbXBsRmluZGVyU3dpdGNoKCkNCi0Jew0KLQkJcmV0dXJuIG5ldyBEb21Td2l0Y2g8U3RyaW5nPigpDQotCQl7DQotCQkJQE92ZXJyaWRlDQotCQkJcHVibGljIFN0cmluZyBjYXNlSVdlYlNlcnZpY2UoSVdlYlNlcnZpY2Ugd3MpIHsNCi0JCQkJcmV0dXJuIHdzLmdldEltcGxlbWVudGF0aW9uKCk7DQotCQkJfQ0KLQkJCQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBTdHJpbmcgY2FzZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkpIHsNCi0JCQkJcmV0dXJuIHNlaSA9PSBudWxsID8gbnVsbCA6IHNlaS5nZXRJbXBsZW1lbnRhdGlvbigpOw0KLQkJCX0NCi0JCQkNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgU3RyaW5nIGNhc2VJV2ViTWV0aG9kKElXZWJNZXRob2Qgd20pIHsNCi0JCQkJcmV0dXJuIHdtID09IG51bGwgPyBudWxsIDogY2FzZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpIHdtLmVDb250YWluZXIoKSk7DQotCQkJfQkNCi0JCQkNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgU3RyaW5nIGNhc2VJV2ViUGFyYW0oSVdlYlBhcmFtIHdwKSB7DQotCQkJCXJldHVybiBjYXNlSVdlYk1ldGhvZCgoSVdlYk1ldGhvZCl3cC5lQ29udGFpbmVyKCkpOw0KLQkJCX0NCi0JCX07DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS91dGlsL0RvbUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvRG9tQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWZiNTNjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvRG9tQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJUeXBlOw0KLQ0KLQ0KLS8qKg0KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4NCi0gKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4NCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZQ0KLSAqIEBnZW5lcmF0ZWQNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRG9tQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgew0KLQkvKioNCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIHN0YXRpYyBEb21QYWNrYWdlIG1vZGVsUGFja2FnZTsNCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBEb21BZGFwdGVyRmFjdG9yeSgpIHsNCi0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkNCi0JCXsNCi0JCQltb2RlbFBhY2thZ2UgPSBEb21QYWNrYWdlLmVJTlNUQU5DRTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0Lg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7DQotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkNCi0JCXsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KQ0KLQkJew0KLQkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsNCi0JCX0NCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhlIHN3aXRjaCB0aGF0IGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIERvbVN3aXRjaDxBZGFwdGVyPiBtb2RlbFN3aXRjaCA9DQotCQluZXcgRG9tU3dpdGNoPEFkYXB0ZXI+KCkNCi0JCXsNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlSURPTShJRE9NIG9iamVjdCkNCi0JCQl7DQotCQkJCXJldHVybiBjcmVhdGVJRE9NQWRhcHRlcigpOw0KLQkJCX0NCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlSUphdmFXZWJTZXJ2aWNlRWxlbWVudChJSmF2YVdlYlNlcnZpY2VFbGVtZW50IG9iamVjdCkNCi0JCQl7DQotCQkJCXJldHVybiBjcmVhdGVJSmF2YVdlYlNlcnZpY2VFbGVtZW50QWRhcHRlcigpOw0KLQkJCX0NCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZShJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIG9iamVjdCkNCi0JCQl7DQotCQkJCXJldHVybiBjcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlQWRhcHRlcigpOw0KLQkJCX0NCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlSVdlYk1ldGhvZChJV2ViTWV0aG9kIG9iamVjdCkNCi0JCQl7DQotCQkJCXJldHVybiBjcmVhdGVJV2ViTWV0aG9kQWRhcHRlcigpOw0KLQkJCX0NCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlSVdlYlBhcmFtKElXZWJQYXJhbSBvYmplY3QpDQotCQkJew0KLQkJCQlyZXR1cm4gY3JlYXRlSVdlYlBhcmFtQWRhcHRlcigpOw0KLQkJCX0NCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlSVdlYlNlcnZpY2UoSVdlYlNlcnZpY2Ugb2JqZWN0KQ0KLQkJCXsNCi0JCQkJcmV0dXJuIGNyZWF0ZUlXZWJTZXJ2aWNlQWRhcHRlcigpOw0KLQkJCX0NCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlSVdlYlNlcnZpY2VQcm9qZWN0KElXZWJTZXJ2aWNlUHJvamVjdCBvYmplY3QpDQotCQkJew0KLQkJCQlyZXR1cm4gY3JlYXRlSVdlYlNlcnZpY2VQcm9qZWN0QWRhcHRlcigpOw0KLQkJCX0NCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlSVdlYlR5cGUoSVdlYlR5cGUgb2JqZWN0KQ0KLQkJCXsNCi0JCQkJcmV0dXJuIGNyZWF0ZUlXZWJUeXBlQWRhcHRlcigpOw0KLQkJCX0NCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgQWRhcHRlciBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkNCi0JCQl7DQotCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOw0KLQkJCX0NCi0JCX07DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0Lg0KLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7DQotCQlyZXR1cm4gbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsNCi0JfQ0KLQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET00gPGVtPklET008L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlET01BZGFwdGVyKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50IDxlbT5JSmF2YSBXZWIgU2VydmljZSBFbGVtZW50PC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudA0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJSmF2YVdlYlNlcnZpY2VFbGVtZW50QWRhcHRlcigpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA8ZW0+SVNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlQWRhcHRlcigpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCA8ZW0+SVdlYiBNZXRob2Q8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlXZWJNZXRob2RBZGFwdGVyKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0gPGVtPklXZWIgUGFyYW08L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSVdlYlBhcmFtQWRhcHRlcigpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2UgPGVtPklXZWIgU2VydmljZTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCi0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlXZWJTZXJ2aWNlQWRhcHRlcigpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0IDxlbT5JV2ViIFNlcnZpY2UgUHJvamVjdDwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCi0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdA0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJV2ViU2VydmljZVByb2plY3RBZGFwdGVyKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViVHlwZSA8ZW0+SVdlYiBUeXBlPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlR5cGUNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSVdlYlR5cGVBZGFwdGVyKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciB0YXJnZXQsIE9iamVjdCB0eXBlKSANCi0Jew0KLQkJc3luY2hyb25pemVkICh0YXJnZXQpIHsNCi0JCQlyZXR1cm4gc3VwZXIuYWRhcHQodGFyZ2V0LCB0eXBlKTsNCi0JCX0NCi0JfQ0KLQkNCi19IC8vRG9tQWRhcHRlckZhY3RvcnkNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvRG9tU3dpdGNoLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvRG9tU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg5NTIxNDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS91dGlsL0RvbVN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWw7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET007DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViVHlwZTsNCi0NCi0NCi0vKioNCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuDQotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaChFT2JqZWN0KSBkb1N3aXRjaChvYmplY3QpfQ0KLSAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwNCi0gKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdA0KLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkNCi0gKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwNCi0gKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guDQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UNCi0gKiBAZ2VuZXJhdGVkDQotICovDQotcHVibGljIGNsYXNzIERvbVN3aXRjaDxUPiB7DQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByb3RlY3RlZCBzdGF0aWMgRG9tUGFja2FnZSBtb2RlbFBhY2thZ2U7DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRG9tU3dpdGNoKCkgew0KLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKQ0KLQkJew0KLQkJCW1vZGVsUGFja2FnZSA9IERvbVBhY2thZ2UuZUlOU1RBTkNFOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBUIGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgew0KLQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByb3RlY3RlZCBUIGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgew0KLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKQ0KLQkJew0KLQkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOw0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCUxpc3Q8RUNsYXNzPiBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOw0KLQkJCXJldHVybg0KLQkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPw0KLQkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOg0KLQkJCQkJZG9Td2l0Y2goZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgVCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsNCi0JCXN3aXRjaCAoY2xhc3NpZmllcklEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JRE9NOg0KLQkJCXsNCi0JCQkJSURPTSBpZG9tID0gKElET00pdGhlRU9iamVjdDsNCi0JCQkJVCByZXN1bHQgPSBjYXNlSURPTShpZG9tKTsNCi0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsNCi0JCQkJcmV0dXJuIHJlc3VsdDsNCi0JCQl9DQotCQkJY2FzZSBEb21QYWNrYWdlLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlQ6DQotCQkJew0KLQkJCQlJSmF2YVdlYlNlcnZpY2VFbGVtZW50IGlKYXZhV2ViU2VydmljZUVsZW1lbnQgPSAoSUphdmFXZWJTZXJ2aWNlRWxlbWVudCl0aGVFT2JqZWN0Ow0KLQkJCQlUIHJlc3VsdCA9IGNhc2VJSmF2YVdlYlNlcnZpY2VFbGVtZW50KGlKYXZhV2ViU2VydmljZUVsZW1lbnQpOw0KLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KLQkJCQlyZXR1cm4gcmVzdWx0Ow0KLQkJCX0NCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFOg0KLQkJCXsNCi0JCQkJSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlID0gKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpdGhlRU9iamVjdDsNCi0JCQkJVCByZXN1bHQgPSBjYXNlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZShpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKTsNCi0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUphdmFXZWJTZXJ2aWNlRWxlbWVudChpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKTsNCi0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsNCi0JCQkJcmV0dXJuIHJlc3VsdDsNCi0JCQl9DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EOg0KLQkJCXsNCi0JCQkJSVdlYk1ldGhvZCBpV2ViTWV0aG9kID0gKElXZWJNZXRob2QpdGhlRU9iamVjdDsNCi0JCQkJVCByZXN1bHQgPSBjYXNlSVdlYk1ldGhvZChpV2ViTWV0aG9kKTsNCi0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUphdmFXZWJTZXJ2aWNlRWxlbWVudChpV2ViTWV0aG9kKTsNCi0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsNCi0JCQkJcmV0dXJuIHJlc3VsdDsNCi0JCQl9DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU06DQotCQkJew0KLQkJCQlJV2ViUGFyYW0gaVdlYlBhcmFtID0gKElXZWJQYXJhbSl0aGVFT2JqZWN0Ow0KLQkJCQlUIHJlc3VsdCA9IGNhc2VJV2ViUGFyYW0oaVdlYlBhcmFtKTsNCi0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUphdmFXZWJTZXJ2aWNlRWxlbWVudChpV2ViUGFyYW0pOw0KLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KLQkJCQlyZXR1cm4gcmVzdWx0Ow0KLQkJCX0NCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFOg0KLQkJCXsNCi0JCQkJSVdlYlNlcnZpY2UgaVdlYlNlcnZpY2UgPSAoSVdlYlNlcnZpY2UpdGhlRU9iamVjdDsNCi0JCQkJVCByZXN1bHQgPSBjYXNlSVdlYlNlcnZpY2UoaVdlYlNlcnZpY2UpOw0KLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJSmF2YVdlYlNlcnZpY2VFbGVtZW50KGlXZWJTZXJ2aWNlKTsNCi0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsNCi0JCQkJcmV0dXJuIHJlc3VsdDsNCi0JCQl9DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9QUk9KRUNUOg0KLQkJCXsNCi0JCQkJSVdlYlNlcnZpY2VQcm9qZWN0IGlXZWJTZXJ2aWNlUHJvamVjdCA9IChJV2ViU2VydmljZVByb2plY3QpdGhlRU9iamVjdDsNCi0JCQkJVCByZXN1bHQgPSBjYXNlSVdlYlNlcnZpY2VQcm9qZWN0KGlXZWJTZXJ2aWNlUHJvamVjdCk7DQotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7DQotCQkJCXJldHVybiByZXN1bHQ7DQotCQkJfQ0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1RZUEU6DQotCQkJew0KLQkJCQlJV2ViVHlwZSBpV2ViVHlwZSA9IChJV2ViVHlwZSl0aGVFT2JqZWN0Ow0KLQkJCQlUIHJlc3VsdCA9IGNhc2VJV2ViVHlwZShpV2ViVHlwZSk7DQotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlKYXZhV2ViU2VydmljZUVsZW1lbnQoaVdlYlR5cGUpOw0KLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KLQkJCQlyZXR1cm4gcmVzdWx0Ow0KLQkJCX0NCi0JCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklET008L2VtPicuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JRE9NPC9lbT4nLg0KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFQgY2FzZUlET00oSURPTSBvYmplY3QpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JSmF2YSBXZWIgU2VydmljZSBFbGVtZW50PC9lbT4nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCi0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUphdmEgV2ViIFNlcnZpY2UgRWxlbWVudDwvZW0+Jy4NCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBUIGNhc2VJSmF2YVdlYlNlcnZpY2VFbGVtZW50KElKYXZhV2ViU2VydmljZUVsZW1lbnQgb2JqZWN0KSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT4nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCi0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT4nLg0KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFQgY2FzZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBvYmplY3QpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JV2ViIE1ldGhvZDwvZW0+Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklXZWIgTWV0aG9kPC9lbT4nLg0KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFQgY2FzZUlXZWJNZXRob2QoSVdlYk1ldGhvZCBvYmplY3QpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JV2ViIFBhcmFtPC9lbT4nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCi0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVdlYiBQYXJhbTwvZW0+Jy4NCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBUIGNhc2VJV2ViUGFyYW0oSVdlYlBhcmFtIG9iamVjdCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklXZWIgU2VydmljZTwvZW0+Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklXZWIgU2VydmljZTwvZW0+Jy4NCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBUIGNhc2VJV2ViU2VydmljZShJV2ViU2VydmljZSBvYmplY3QpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JV2ViIFNlcnZpY2UgUHJvamVjdDwvZW0+Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklXZWIgU2VydmljZSBQcm9qZWN0PC9lbT4nLg0KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFQgY2FzZUlXZWJTZXJ2aWNlUHJvamVjdChJV2ViU2VydmljZVByb2plY3Qgb2JqZWN0KSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVdlYiBUeXBlPC9lbT4nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCi0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVdlYiBUeXBlPC9lbT4nLg0KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFQgY2FzZUlXZWJUeXBlKElXZWJUeXBlIG9iamVjdCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuDQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4NCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBUIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLX0gLy9Eb21Td2l0Y2gNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvSmVlNURvbVV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvSmVlNURvbVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc0NTVkNzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS91dGlsL0plZTVEb21VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWw7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1BBbm5vdGF0aW9uRmVhdHVyZXMuV1BfQU5OT1RBVElPTjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV2ViUGFyYW1LaW5kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1BBbm5vdGF0aW9uRmVhdHVyZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9uLkFubm90YXRpb25BZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmFubm90YXRpb24uSUFubm90YXRpb25BZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotDQotLyoqDQotICogVXRpbGl0eSBmb3Igc29tZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmljIGxvZ2ljcyB0aGF0IGFyZSBmcmVxdWVudGx5IHVzZWQNCi0gKiB3aGlsZSBkZWFsaW5nIHdpdGggRE9NIG9iamVjdHMuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBKZWU1RG9tVXRpbHMgDQotew0KLQkvKiogdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSAqLw0KLQlwcml2YXRlIHN0YXRpYyBKZWU1RG9tVXRpbHMgaW5zdGFuY2U7DQotCQ0KLQlwcml2YXRlIEplZTVEb21VdGlscygpIHsNCi0JCS8vIHNpbmdsZXRvbg0KLQl9DQotCQ0KLQkvKioNCi0JICogTWV0aG9kIHRoYXQgZGVjaWRlcyBpZiB0aGUgYXR0cmlidXRlICdwYXJ0TmFtZScgaXMgdXNlZCBhdCBhbGwgYWNjb3JkaW5nIA0KLQkgKiB0byBKU1ItMTgxIHNlY3Rpb24gNC40LjEgLSBhdHRyaWJ1dGUgJ3BhcnROYW1lJyBjb2x1bW4gJ21lYW5pbmcnLg0KLQkgKiBAcGFyYW0gd2ViUGFyYW0gdGhlIHdlYlBhcmFtIHRvIGJlIGNoZWNrZWQNCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbiBjYXNlIHBhcnROYW1lIGlzIHVzZWQNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzUGFydE5hbWVVc2VkKGZpbmFsIElXZWJQYXJhbSB3ZWJQYXJhbSkNCi0Jew0KLQkJZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QgPSAoSVdlYk1ldGhvZCl3ZWJQYXJhbS5lQ29udGFpbmVyKCk7DQotCQkNCi0JCXJldHVybiB3ZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdTdHlsZSgpPT1TT0FQQmluZGluZ1N0eWxlLlJQQyB8fCANCi0JCQl3ZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpPT1TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLkJBUkU7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBNZXRob2QgdGhhdCBkZWNpZGVzIGlzIHRoZSBhdHRyaWJ1dGUgJ25hbWUnIGlzIHVzZWQgYXQgYWxsDQotCSAqIGFjY29yZGluZyB0byBKU1ItMTgxIHNlY3Rpb24gNC40LjEgLSBhdHRyaWJ1dGUgJ25hbWUnIGNvbHVtbiAnbWVhbmluZycNCi0JICogQHBhcmFtIHdlYlBhcmFtDQotCSAqIEByZXR1cm4gcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGluIGNhc2UgbmFtZSBpcyB1c2VkDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBpc05hbWVVc2VkKGZpbmFsIElXZWJQYXJhbSB3ZWJQYXJhbSkNCi0Jew0KLQkJZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QgPSAoSVdlYk1ldGhvZCl3ZWJQYXJhbS5lQ29udGFpbmVyKCk7DQotCQlpZiggd2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nU3R5bGUoKT09U09BUEJpbmRpbmdTdHlsZS5ET0NVTUVOVCB8fCB3ZWJQYXJhbS5pc0hlYWRlcigpICkgew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm5vdGF0aW9uID0gIGZpbmRBbm5vdGF0aW9uKHdlYlBhcmFtLCBXUF9BTk5PVEFUSU9OKTsNCi0JCWlmIChhbm5vdGF0aW9uPT1udWxsKSB7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFdQQW5ub3RhdGlvbkZlYXR1cmVzLlBBUlRfTkFNRV9BVFRSSUJVVEUpPT1udWxsOw0KLQl9DQotCQ0KLQkvKioNCi0JICogSGVscGVyIG1ldGhvZCB0byBleHRyYWN0IGFubm90YXRpb24gd2l0aCBmdWxseSBxdWFsaWZpZWQgbmFtZSA8Y29kZT5hbm5GUU5hbWU8L2NvZGU+DQotCSAqIEBwYXJhbSBlT2JqZWN0IHRoZSBvYmplY3QgdG8gc2VhcmNoIGluDQotCSAqIEBwYXJhbSBhbm5GUU5hbWUgdGhlIEZRIG5hbWUgb2Ygc2VhcmNoZWQgYW5ub3RhdGlvbiANCi0JICogQHJldHVybiBmb3VuZCBhbm5vdGF0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqLw0KLQlwdWJsaWMgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gZmluZEFubm90YXRpb24oZmluYWwgRU9iamVjdCBlT2JqZWN0LCBmaW5hbCBTdHJpbmcgYW5uRlFOYW1lKSANCi0Jew0KLQkJZmluYWwgSUFubm90YXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoSUFubm90YXRpb25BZGFwdGVyKUFubm90YXRpb25BZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdChlT2JqZWN0LCBJQW5ub3RhdGlvbkFkYXB0ZXIuY2xhc3MpOw0KLQkJaWYgKGFkYXB0ZXIhPW51bGwpIHsNCi0JCQlyZXR1cm4gYWRhcHRlci5nZXRBbm5vdGF0aW9uKGFubkZRTmFtZSk7DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQkvKioNCi0JICogTWV0aG9kIHRoYXQgZGVjaWRlcyBpZiB0aGUgcGFyYW0gbmFtZSBpcyByZXF1aXJlZCB0byBiZSBwdXQgaW4gdGhlIGFubm90YXRpb24gYWNjb3JkaW5nIA0KLQkgKiB0byBKU1ItMTgxIHNlY3Rpb24gNC40LjEgLSBhdHRyaWJ1dGUgJ25hbWUnIGNvbHVtbiAnbWVhbmluZycuDQotCSAqIEBwYXJhbSB3ZWJQYXJhbQ0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBuYW1lIGF0dHJpYnV0ZSBzaG91bGQgYmUgcHV0IG9uIGFubm90YXRpb24NCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzTmFtZVJlcXVpcmVkKGZpbmFsIElXZWJQYXJhbSB3ZWJQYXJhbSkNCi0Jew0KLQkJZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QgPSAoSVdlYk1ldGhvZCl3ZWJQYXJhbS5lQ29udGFpbmVyKCk7DQotCQkNCi0JCWlmICh3ZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdTdHlsZSgpPT1TT0FQQmluZGluZ1N0eWxlLkRPQ1VNRU5UICYmDQotCQkJd2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKT09U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5CQVJFICYmDQotCQkJKHdlYlBhcmFtLmdldEtpbmQoKT09V2ViUGFyYW1LaW5kLklOT1VUIHx8IHdlYlBhcmFtLmdldEtpbmQoKT09V2ViUGFyYW1LaW5kLk9VVCkpIHsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9CQ0KLQkNCi0JLyoqDQotCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBKZWU1RG9tVXRpbHMgZ2V0SW5zdGFuY2UoKQ0KLQl7DQotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgew0KLQkJCWluc3RhbmNlID0gbmV3IEplZTVEb21VdGlscygpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gaW5zdGFuY2U7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS91dGlsL1BhcmFtVmFsdWVDb21wYXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvUGFyYW1WYWx1ZUNvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGU3NzI0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvUGFyYW1WYWx1ZUNvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWw7DQotDQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklQYXJhbVZhbHVlUGFpcjsNCi0NCi0vKioNCi0gKiBDbGFzcyB0aGF0IGNvbXBhcmVzIHtAbGluayBJUGFyYW1WYWx1ZVBhaXJ9IGJ5IHByb3BlcnR5IG5hbWUuIEludGVuZGVkIHRvIGJlIHVzZWQgd2hlbiANCi0gKiBjcmVhdGluZyBhIHtAbGluayBUcmVlU2V0fSBmb3IgYW5ub3RhdGlvbiBwcm9wZXJ0aWVzLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgUGFyYW1WYWx1ZUNvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yPElQYXJhbVZhbHVlUGFpcj4NCi17CQkNCi0JcHVibGljIGVudW0gT3JkZXIge05vcm1hbCwgUmV2ZXJzZWR9Ow0KLQ0KLQlwcml2YXRlIGZpbmFsIE9yZGVyIG9yZGVyOw0KLQkNCi0JcHVibGljIFBhcmFtVmFsdWVDb21wYXJhdG9yKCkgew0KLQkJb3JkZXIgPSBPcmRlci5Ob3JtYWw7DQotCX0NCi0JDQotCXB1YmxpYyBQYXJhbVZhbHVlQ29tcGFyYXRvcihmaW5hbCBPcmRlciBvcmRlcikgew0KLQkJdGhpcy5vcmRlciA9IG9yZGVyOw0KLQl9DQotDQotCQ0KLQlwdWJsaWMgaW50IGNvbXBhcmUoSVBhcmFtVmFsdWVQYWlyIG8xLCBJUGFyYW1WYWx1ZVBhaXIgbzIpIA0KLQl7DQotCQlpZihvcmRlcj09T3JkZXIuTm9ybWFsKSB7DQotCQkJcmV0dXJuIG8xLmdldFBhcmFtKCkuY29tcGFyZVRvKG8yLmdldFBhcmFtKCkpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbzIuZ2V0UGFyYW0oKS5jb21wYXJlVG8obzEuZ2V0UGFyYW0oKSk7DQotCX0JCQ0KLX0JClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmQxYTQzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5Nzg0YWM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMwYmIyYjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI1R1ZSBKdW4gMjMgMTA6Mzg6MjIgRUVTVCAyMDA5DQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEyZjliYmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWk7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuaW50ZXJuYWwucGx1Z2luLkRvbVVpJEltcGxlbWVudGF0aW9uCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24sb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cyxvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLmludGVybmFsLmltcGw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cyIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVtZi5lZGl0O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscywKLSBvcmcuZWNsaXBzZS5qZmFjZQotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MTBhZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+QXVndXN0IDE1LCAyMDA5PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmQxODRlZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi1iaW4uaW5jbHVkZXMgPSAuLFwNCi0gICAgICAgICAgICAgICBpY29ucy8sXA0KLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcDQotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwNCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuDQotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL1NFSS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvU0VJLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjEzMjVjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvU0VJLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9TRUlfR3JvdXAuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL1NFSV9Hcm91cC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlhZmNjMDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL1NFSV9Hcm91cC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvV2ViX01ldGhvZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvV2ViX01ldGhvZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU4MThhMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL1dlYl9NZXRob2QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL1dlYl9QYXJhbV9Jbi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvV2ViX1BhcmFtX0luLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmU2YjM0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvV2ViX1BhcmFtX0luLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9XZWJfUGFyYW1fT3V0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9XZWJfUGFyYW1fT3V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmQwOTE4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvV2ViX1BhcmFtX091dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvV2ViX1NlcnZpY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL1dlYl9TZXJ2aWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTIxNmIzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvV2ViX1NlcnZpY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL1dlYl9TZXJ2aWNlX0dyb3VwLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9XZWJfU2VydmljZV9Hcm91cC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhiNDgxNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL1dlYl9TZXJ2aWNlX0dyb3VwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9XZWJfU2VydmljZV9JdGVtX1Byb3ZpZGVyLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9XZWJfU2VydmljZV9JdGVtX1Byb3ZpZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGZiODQ0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvV2ViX1NlcnZpY2VfSXRlbV9Qcm92aWRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZXJyb3Jfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9lcnJvcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYmM2MDY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9lcnJvcl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVJRE9NX3dlYlNlcnZpY2VQcm9qZWN0c19JV2ViU2VydmljZVByb2plY3QuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVJRE9NX3dlYlNlcnZpY2VQcm9qZWN0c19JV2ViU2VydmljZVByb2plY3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0Yzc2Njc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSURPTV93ZWJTZXJ2aWNlUHJvamVjdHNfSVdlYlNlcnZpY2VQcm9qZWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV93ZWJNZXRob2RzX0lXZWJNZXRob2QuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX3dlYk1ldGhvZHNfSVdlYk1ldGhvZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk1ZjVhOGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX3dlYk1ldGhvZHNfSVdlYk1ldGhvZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUlXZWJNZXRob2RfcGFyYW1ldGVyc19JV2ViUGFyYW0uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVJV2ViTWV0aG9kX3BhcmFtZXRlcnNfSVdlYlBhcmFtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDNkNjNjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUlXZWJNZXRob2RfcGFyYW1ldGVyc19JV2ViUGFyYW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVJV2ViU2VydmljZVByb2plY3Rfc2VydmljZUVuZHBvaW50SW50ZXJmYWNlc19JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSVdlYlNlcnZpY2VQcm9qZWN0X3NlcnZpY2VFbmRwb2ludEludGVyZmFjZXNfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM2MWIxODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVJV2ViU2VydmljZVByb2plY3Rfc2VydmljZUVuZHBvaW50SW50ZXJmYWNlc19JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSVdlYlNlcnZpY2VQcm9qZWN0X3dlYlNlcnZpY2VzX0lXZWJTZXJ2aWNlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSVdlYlNlcnZpY2VQcm9qZWN0X3dlYlNlcnZpY2VzX0lXZWJTZXJ2aWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTEyMGQxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUlXZWJTZXJ2aWNlUHJvamVjdF93ZWJTZXJ2aWNlc19JV2ViU2VydmljZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9vYmoxNi9JRE9NLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL29iajE2L0lET00uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MjBlZWUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL29iajE2L0lET00uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvb2JqMTYvSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9vYmoxNi9JSmF2YVdlYlNlcnZpY2VFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWE1OGE2NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9vYmoxNi9JSmF2YVdlYlNlcnZpY2VFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL29iajE2L0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvb2JqMTYvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMzYTk5N2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvb2JqMTYvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9vYmoxNi9JV2ViTWV0aG9kLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL29iajE2L0lXZWJNZXRob2QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMTdkYzdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL29iajE2L0lXZWJNZXRob2QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvb2JqMTYvSVdlYlBhcmFtLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL29iajE2L0lXZWJQYXJhbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhhNWM3MGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvb2JqMTYvSVdlYlBhcmFtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL29iajE2L0lXZWJTZXJ2aWNlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL29iajE2L0lXZWJTZXJ2aWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTM1MDBkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9vYmoxNi9JV2ViU2VydmljZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9vYmoxNi9JV2ViU2VydmljZVByb2plY3QuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvb2JqMTYvSVdlYlNlcnZpY2VQcm9qZWN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDk4MzY0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9vYmoxNi9JV2ViU2VydmljZVByb2plY3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvb2JqMTYvSVdlYlR5cGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvb2JqMTYvSVdlYlR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMDBhZWRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL29iajE2L0lXZWJUeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy93YXJuaW5nX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvd2FybmluZ19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYjJlNTBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy93YXJuaW5nX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI4YjhlNzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIFRvIGNvZGUgZGV2ZWxvcGVyOg0KLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUNCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4NCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlDQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5Lg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUNCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotQnVuZGxlLU5hbWUuMD1KQVgtV1MgRE9NIFVJDQotQnVuZGxlLVZlbmRvci4wPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtDQotDQotX1VJX0NyZWF0ZUNoaWxkX3RleHQgPSB7MH0NCi1fVUlfQ3JlYXRlQ2hpbGRfdGV4dDIgPSB7MX0gezB9DQotX1VJX0NyZWF0ZUNoaWxkX3RleHQzID0gezF9DQotX1VJX0NyZWF0ZUNoaWxkX3Rvb2x0aXAgPSBDcmVhdGUgTmV3IHswfSBVbmRlciB7MX0gRmVhdHVyZQ0KLV9VSV9DcmVhdGVDaGlsZF9kZXNjcmlwdGlvbiA9IENyZWF0ZSBhIG5ldyBjaGlsZCBvZiB0eXBlIHswfSBmb3IgdGhlIHsxfSBmZWF0dXJlIG9mIHRoZSBzZWxlY3RlZCB7Mn0uDQotX1VJX0NyZWF0ZVNpYmxpbmdfZGVzY3JpcHRpb24gPSBDcmVhdGUgYSBuZXcgc2libGluZyBvZiB0eXBlIHswfSBmb3IgdGhlIHNlbGVjdGVkIHsyfSwgdW5kZXIgdGhlIHsxfSBmZWF0dXJlIG9mIHRoZWlyIHBhcmVudC4NCi0NCi1fVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uID0gVGhlIHswfSBvZiB0aGUgezF9DQotDQotX1VJX0lET01fdHlwZSA9IElET00NCi1fVUlfSUphdmFXZWJTZXJ2aWNlRWxlbWVudF90eXBlID0gSmF2YSBXZWIgU2VydmljZSBFbGVtZW50DQotX1VJX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfdHlwZSA9IFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlDQotX1VJX0lXZWJTZXJ2aWNlX3R5cGUgPSBXZWIgU2VydmljZQ0KLV9VSV9JV2ViU2VydmljZVByb2plY3RfdHlwZSA9IFdlYiBTZXJ2aWNlIFByb2plY3QNCi1fVUlfVW5rbm93bl90eXBlID0gT2JqZWN0DQotDQotX1VJX1Vua25vd25fZGF0YXR5cGU9IFZhbHVlDQotDQotX1VJX0lET01fd2ViU2VydmljZVByb2plY3RzX2ZlYXR1cmUgPSBXZWIgU2VydmljZSBQcm9qZWN0cw0KLV9VSV9JSmF2YVdlYlNlcnZpY2VFbGVtZW50X2phdmFJbXBsZW1lbnRhdGlvbl9mZWF0dXJlID0gSmF2YSBJbXBsZW1lbnRhdGlvbg0KLV9VSV9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX25hbWVfZmVhdHVyZSA9IE5hbWUNCi1fVUlfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9pbXBsaWNpdF9mZWF0dXJlID0gSW1wbGljaXQNCi1fVUlfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9pbXBsZW1lbnRpbmdXZWJTZXJ2aWNlc19mZWF0dXJlID0gSW1wbGVtZW50aW5nIFdlYiBTZXJ2aWNlcw0KLV9VSV9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX3RhcmdldE5hbWVzcGFjZV9mZWF0dXJlID0gVGFyZ2V0IE5hbWVzcGFjZQ0KLV9VSV9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX3NvYXBCaW5kaW5nID0gU09BUCBCaW5kaW5nDQotX1VJX0lXZWJTZXJ2aWNlX25hbWVfZmVhdHVyZSA9IE5hbWUNCi1fVUlfSVdlYlNlcnZpY2Vfc2VydmljZUVuZHBvaW50X2ZlYXR1cmUgPSBTZXJ2aWNlIEVuZHBvaW50DQotX1VJX0lXZWJTZXJ2aWNlX3RhcmdldE5hbWVzcGFjZV9mZWF0dXJlID0gVGFyZ2V0IE5hbWVzcGFjZQ0KLV9VSV9JV2ViU2VydmljZV9wb3J0TmFtZV9mZWF0dXJlCQk9IFBvcnQgTmFtZQ0KLV9VSV9JV2ViU2VydmljZV93c2RsTG9jYXRpb25fZmVhdHVyZQk9IFdTREwgTG9jYXRpb24NCi1fVUlfSVdlYlNlcnZpY2VQcm9qZWN0X3dlYlNlcnZpY2VzX2ZlYXR1cmUgPSBXZWIgU2VydmljZXMNCi1fVUlfSVdlYlNlcnZpY2VQcm9qZWN0X3NlcnZpY2VFbmRwb2ludEludGVyZmFjZXNfZmVhdHVyZSA9IFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlcw0KLV9VSV9JV2ViU2VydmljZVByb2plY3RfbmFtZV9mZWF0dXJlID0gTmFtZQ0KLV9VSV9Vbmtub3duX2ZlYXR1cmUgPSBVbnNwZWNpZmllZA0KLQ0KLV9VSV9XZWJTZXJ2aWNlQW5ub3RhdGlvbkNhdGVnb3J5ID0gR2VuZXJhbCAoV2ViU2VydmljZSBhbm5vdGF0aW9uKQ0KLV9VSV9XZWJNZXRob2RBbm5vdGF0aW9uQ2F0ZWdvcnkgPSBHZW5lcmFsIChXZWJNZXRob2QgYW5ub3RhdGlvbikNCi1fVUlfV2ViUGFyYW1Bbm5vdGF0aW9uQ2F0ZWdvcnkgPSBHZW5lcmFsIChXZWJQYXJhbSBhbm5vdGF0aW9uKQ0KLQ0KLV9VSV9JSmF2YVdlYlNlcnZpY2VFbGVtZW50X2ltcGxlbWVudGF0aW9uX2ZlYXR1cmUgPSBKYXZhIHJlcHJlc2VudGF0aW9uDQotX1VJX0lXZWJNZXRob2RfdHlwZSA9IFdlYiBNZXRob2QNCi1fVUlfSVdlYlBhcmFtX3R5cGUgPSBXZWIgUGFyYW0NCi1fVUlfSVdlYlR5cGVfdHlwZSA9IFdlYiBUeXBlDQotX1VJX0lKYXZhV2ViU2VydmljZUVsZW1lbnRfbmFtZV9mZWF0dXJlID0gTmFtZQ0KLV9VSV9JV2ViTWV0aG9kX2V4Y2x1ZGVkX2ZlYXR1cmUgPSBFeGNsdWRlZA0KLV9VSV9JV2ViUGFyYW1fa2luZF9mZWF0dXJlID0gTW9kZQ0KLV9VSV9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX3dlYk1ldGhvZHNfZmVhdHVyZSA9IFdlYiBNZXRob2RzDQotX1VJX0lXZWJNZXRob2RfcGFyYW1ldGVyc19mZWF0dXJlID0gUGFyYW1ldGVycw0KLV9VSV9JV2ViUGFyYW1fdHlwZU5hbWVfZmVhdHVyZSA9IFR5cGUgTmFtZQ0KLV9VSV9JV2ViUGFyYW1fcGFydE5hbWVfZmVhdHVyZSA9IFBhcnQgTmFtZQ0KLV9VSV9JV2ViUGFyYW1fdGFyZ2V0TmFtZXNwYWNlX2ZlYXR1cmUgPSBUYXJnZXQgTmFtZXNwYWNlDQotX1VJX0lXZWJQYXJhbV9oZWFkZXJfZmVhdHVyZSA9IEhlYWRlcg0KLV9VSV9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX3NvYXBCaW5kaW5nU3R5bGVfZmVhdHVyZSA9IFN0eWxlDQotX1VJX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Vfc29hcEJpbmRpbmdVc2VfZmVhdHVyZSA9IFVzZQ0KLV9VSV9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX3NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGVfZmVhdHVyZSA9IFBhcmFtZXRlciBTdHlsZQ0KLV9VSV9JV2ViTWV0aG9kX3NvYXBCaW5kaW5nU3R5bGVfZmVhdHVyZSA9IFN0eWxlDQotX1VJX0lXZWJNZXRob2Rfc29hcEJpbmRpbmdVc2VfZmVhdHVyZSA9IFVzZQ0KLV9VSV9JV2ViTWV0aG9kX3NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGVfZmVhdHVyZSA9IFBhcmFtZXRlciBTdHlsZQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY5NGQ2OGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/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+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFlMDQ4NGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jTW9uIEp1bCAyMCAxNToyNTozMSBFRVNUIDIwMDkNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUwNzgzYjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyDQotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wDQotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMA0KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscztzaW5nbGV0b246PXRydWUNCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyDQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luDQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41DQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwNCi0gb3JnLmVjbGlwc2UuamR0LmNvcmUsDQotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLA0KLSBvcmcuZWNsaXBzZS50ZXh0LA0KLSBvcmcuZWNsaXBzZS51aSwNCi0gb3JnLmVjbGlwc2UudWkuaWRlLA0KLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZQ0KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHM7DQotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLA0KLSAgIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSwNCi0gICBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMsDQotICAgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscywNCi0gICBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMiLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnM7DQotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLA0KLSAgIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMsDQotICAgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLA0KLSAgIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cywNCi0gICBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMiLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuY2xheno7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzIiwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmV4Y2VwdGlvbjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzIiwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmZhY2V0czt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSIsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cyxvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMiLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZzsNCi0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24sDQotICAgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLA0KLSAgIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cywNCi0gICBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLA0KLSAgIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMiLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMucmVzb3VyY2VzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24sb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cyINCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwucGx1Z2luLkpheHdzVXRpbHNQbHVnaW4NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQxMGFmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkF1Z3VzdCAxNSwgMjAwOTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYWFlMjQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwNCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcw0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI2ZTMyZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotQnVuZGxlLU5hbWUuMD1KQVgtV1MgVXRpbHMNCi1CdW5kbGUtVmVuZG9yLjA9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAyOTMwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08P2VjbGlwc2UgdmVyc2lvbj0iMy40Ij8+DQotPCEtLQ0KLSAgICBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICAgDQotICAgIENvbnRyaWJ1dG9yczoNCi0gICAgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAtLT4NCi0NCi08cGx1Z2luPg0KLSAgIDxleHRlbnNpb24NCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuc3RhcnR1cCI+DQotICAgICAgPHN0YXJ0dXA+PC9zdGFydHVwPg0KLSAgIDwvZXh0ZW5zaW9uPg0KLQ0KLTwvcGx1Z2luPg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvQ29udHJhY3RDaGVja2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL0NvbnRyYWN0Q2hlY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZjEzYjhlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvQ29udHJhY3RDaGVja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHM7DQotDQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0Ow0KLQ0KLS8qKg0KLSAqIENvbnRhaW5zIGNoZWNrcyBmcmVxdWVudGx5IGFwcGxpZWQgb24gcGFyYW1ldGVycy4NCi0gKiANCi0gKiBAYXV0aG9yIEpvZXJnIERlaG1lbA0KLSAqLw0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250cmFjdENoZWNrZXINCi17DQotCXByaXZhdGUgQ29udHJhY3RDaGVja2VyKCkNCi0Jew0KLQkJLy8gcHJldmVudCBpbnN0YW50aWF0aW9uIGZyb20gb3V0c2lkZQ0KLQl9DQotCQ0KLQkvKiogQ2hlY2tzIGlmIHRoZSBnaXZlbiBwYXJhbWV0ZXIgdmFsdWUgaXMgbnVsbCBhbmQgcmVwb3J0cyBhbiA8Y29kZT5OdWxsUG9pbnRlckV4Y2VwdGlvbjwvY29kZT4NCi0JICogaW4gdGhpcyBjYXNlLg0KLQkgKiBAcGFyYW0gcGFyYW1WYWx1ZSB0aGUgdmFsdWUgdG8gYmUgY2hlY2tlZA0KLQkgKiBAcGFyYW0gcGFyYW1OYW1lIG5hbWUgb2YgdGhlIHBhcmFtZXRlciwgdXNlZCB0byByZXBvcnQgdGhlIHByb2JsZW0gdG8gdGhlIHVzZXINCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB0aHJvd24gZWl0aGVyIHRoZSBwYXJhbVZhbHVlIG9yIHBhcmFtTmFtZSBpcyBudWxsICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBudWxsQ2hlY2tQYXJhbShmaW5hbCBPYmplY3QgcGFyYW1WYWx1ZSwgZmluYWwgU3RyaW5nIHBhcmFtTmFtZSkNCi0Jew0KLQkJaWYgKHBhcmFtTmFtZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicGFyYW1OYW1lIG11c3Qgbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJCANCi0JCX0NCi0JCWlmIChwYXJhbVZhbHVlID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKHBhcmFtTmFtZSArICIgbXVzdCBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkIA0KLQkJfQ0KLQl9DQotCQ0KLQkvKiogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHBhcmFtZXRlciB2YWx1ZSBpcyBudWxsIGFuZCByZXBvcnRzIGFuIDxjb2RlPk51bGxQb2ludGVyRXhjZXB0aW9uPC9jb2RlPg0KLQkgKiBpbiB0aGlzIGNhc2UuDQotCSAqIEBwYXJhbSBwYXJhbVZhbHVlIHRoZSB2YWx1ZSB0byBiZSBjaGVja2VkDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gdGhyb3duIGlmIHRoZSBwYXJhbVZhbHVlIGlzIG51bGwgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIG51bGxDaGVja1BhcmFtKGZpbmFsIE9iamVjdCBwYXJhbVZhbHVlKQ0KLQl7DQotCQlpZiAocGFyYW1WYWx1ZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicGFyYW1WYWx1ZSBtdXN0IG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JfQ0KLQkNCi0JLyoqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gZmllbGQgdmFsdWUgaXMgbnVsbCBhbmQgcmVwb3J0cyBhbiA8Y29kZT5JbGxlZ2FsU3RhdGVFeGNlcHRpb248L2NvZGU+DQotCSAqIGluIHRoaXMgY2FzZS4NCi0JICogQHBhcmFtIGZpZWxkVmFsdWUgdGhlIHZhbHVlIHRvIGJlIGNoZWNrZWQNCi0JICogQHBhcmFtIGZpZWxkTmFtZSBuYW1lIG9mIHRoZSBmaWVsZCwgdXNlZCB0byByZXBvcnQgdGhlIHByb2JsZW0gdG8gdGhlIHVzZXINCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIGZpZWxkTmFtZSBpcyBudWxsDQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHRocm93biBpZiB0aGUgZmllbGRWYWx1ZSBpcyBudWxsICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBudWxsQ2hlY2tGaWVsZChmaW5hbCBPYmplY3QgZmllbGRWYWx1ZSwgZmluYWwgU3RyaW5nIGZpZWxkTmFtZSkNCi0Jew0KLQkJaWYgKGZpZWxkTmFtZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiZmllbGROYW1lIG11c3Qgbm90IGJlIG51bGwiKTsgIC8vJE5PTi1OTFMtMSQgIA0KLQkJfQ0KLQkJaWYgKGZpZWxkVmFsdWUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGZpZWxkTmFtZSArICIgbXVzdCBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkIA0KLQkJfQ0KLQl9DQotCQ0KLQkvKiogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGZpZWxkIHZhbHVlIGlzIG51bGwgYW5kIHJlcG9ydHMgYW4gPGNvZGU+SWxsZWdhbFN0YXRlRXhjZXB0aW9uPC9jb2RlPg0KLQkgKiBpbiB0aGlzIGNhc2UuDQotCSAqIEBwYXJhbSBmaWVsZFZhbHVlIHRoZSB2YWx1ZSB0byBiZSBjaGVja2VkDQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHRocm93biBpZiB0aGUgZmllbGRWYWx1ZSBpcyBudWxsICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBudWxsQ2hlY2tGaWVsZChmaW5hbCBPYmplY3QgZmllbGRWYWx1ZSkNCi0Jew0KLQkJaWYgKGZpZWxkVmFsdWUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJmaWVsZFZhbHVlIG11c3Qgbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQl9DQotCQ0KLQkvKiogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIG9mIGEgbG9jYWwgdmFyaWFibGUgaXMgbnVsbCBhbmQgcmVwb3J0cyBhbiA8Y29kZT5JbGxlZ2FsU3RhdGVFeGNlcHRpb248L2NvZGU+DQotCSAqIGluIHRoaXMgY2FzZS4NCi0JICogQHBhcmFtIHZhclZhbHVlIHRoZSB2YWx1ZSB0byBiZSBjaGVja2VkDQotCSAqIEBwYXJhbSB2YXJOYW1lIG5hbWUgb2YgdGhlIGxvY2FsIHZhcmlhYmxlLCB1c2VkIHRvIHJlcG9ydCB0aGUgcHJvYmxlbSB0byB0aGUgdXNlcg0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHRocm93biBpZiB0aGUgdmFyTmFtZSBpcyBudWxsDQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHRocm93biBpZiB0aGUgdmFyVmFsdWUgaXMgbnVsbCAqLw0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbnVsbENoZWNrVmFyaWFibGUoZmluYWwgT2JqZWN0IHZhclZhbHVlLCBmaW5hbCBTdHJpbmcgdmFyTmFtZSkNCi0Jew0KLQkJaWYgKHZhck5hbWUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInZhck5hbWUgbXVzdCBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkIA0KLQkJfQ0KLQkJaWYgKHZhclZhbHVlID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbih2YXJOYW1lICsgIiBtdXN0IG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JfQ0KLQkNCi0JLyoqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBvZiBhIGxvY2FsIHZhcmlhYmxlIGlzIG51bGwgYW5kIHJlcG9ydHMgYW4gPGNvZGU+SWxsZWdhbFN0YXRlRXhjZXB0aW9uPC9jb2RlPg0KLQkgKiBpbiB0aGlzIGNhc2UuDQotCSAqIEBwYXJhbSB2YXJWYWx1ZSB0aGUgdmFsdWUgdG8gYmUgY2hlY2tlZA0KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIHZhclZhbHVlIGlzIG51bGwgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIG51bGxDaGVja1ZhcmlhYmxlKGZpbmFsIE9iamVjdCB2YXJWYWx1ZSkNCi0Jew0KLQkJaWYgKHZhclZhbHVlID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidmFyVmFsdWUgbXVzdCBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCX0NCi0JDQotCS8qKg0KLQkgKiBUaGlzIG1ldGhvZCBjaGVja3MgaWYgPGNvZGU+cGFyYW08L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+IG9yIGVtcHR5IHN0cmluZy4NCi0JICogQHBhcmFtIHBhcmFtDQotCSAqIEBwYXJhbSB2YXJOYW1lDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT5wYXJhbTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4NCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT5wYXJhbTwvY29kZT4gaXMgZW1wdHkgc3RyaW5nIG9yIGNvbnRhaW5zIG9ubHkNCi0JICogd2hpdGUgc3BhY2UgY2hhcmFjdGVycw0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIGVtcHR5U3RyaW5nQ2hlY2tQYXJhbShmaW5hbCBTdHJpbmcgcGFyYW0sIGZpbmFsIFN0cmluZyB2YXJOYW1lKSANCi0Jew0KLQkJbnVsbENoZWNrUGFyYW0ocGFyYW0sIHZhck5hbWUpOw0KLQkJDQotCQlpZiAocGFyYW0udHJpbSgpLmxlbmd0aCgpID09IDApIHsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCJQYXJhbWV0ZXIgezB9IGlzIGVtcHR5IHN0cmluZyBvciBjb250YWlucyBvbmx5IHdoaXRlIHNwYWNlcyIsIHZhck5hbWUpKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvSmF4V3NVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9KYXhXc1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVlZGRlN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9KYXhXc1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHM7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLQ0KLS8qKg0KLSAqIFV0aWxpdHkgdGhhdCBjb250YWlucyBKQVgtV1MgcmVsZWF0ZWQgZnVuY3Rpb25hbGl0eQ0KLSAqIA0KLSAqIEBhdXRob3IgRGFuYWlsIEJyYW5la292DQotICogDQotICovDQotcHVibGljIGNsYXNzIEpheFdzVXRpbHMNCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRUFOX1NVRkZJWCA9ICJCZWFuIjsgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9SVF9TVUZGSVggPSAiUG9ydCI7IC8vJE5PTi1OTFMtMSQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfU1VGRklYID0gIlNlcnZpY2UiOyAvLyROT04tTkxTLTEkDQotCQ0KLQlwcml2YXRlIEpheFdzVXRpbHMoKQ0KLQl7DQotCQkvLyBoaWRlIGRlZmF1bHQgY29uc3RydWN0b3INCi0JfQ0KLQ0KLQkvKioNCi0JICogQW4gdXRpbGl0eSBtZXRob2QgZm9yIGNvbXBvc2luZyBhIGRlZmF1bHQgdGFyZ2V0IG5hbWVzcGFjZSBmb3IgSmF4V3MgY3VzdG9taXphdGlvbg0KLQkgKiBvdXQgb2YgYSBwYWNrYWdlIG5hbWUuDQotCSAqIEFsZ29yaXRobToNCi0JICogPGxpPkluIGNhc2UgdGhlIHBhY2thZ2UgaGFzIDAgZnJhZ21lbnQgKGRlZmF1bHQgcGFja2FnZSkgdGhlIHJlc3VsdCB3b3VsZCBiZSBodHRwOi8vLzwvbGk+DQotCSAqIDxsaT5JbiBjYXNlIHRoZSBwYWNrYWdlIGhhcyAxIGZyYWdtZW50IHRoZSByZXN1bHQgd291bGQgYmUgaHR0cDovL2ZyYWdtZW50MS88L2xpPg0KLQkgKiA8bGk+SW4gY2FzZSB0aGUgcGFja2FnZSBoYXMgMiBmcmFnbWVudHMgdGhlIHJlc3VsdCB3b3VsZCBiZSBodHRwOi8vZnJhZ21lbnQyLmZyYWdtZW50MS88L2xpPg0KLQkgKiA8bGk+SW4gY2FzZSB0aGUgcGFja2FnZSBoYXMgbW9yZSB0aGFuIDIgZnJhZ21lbnRzIHRoZSByZXN1bHQgd291bGQgYmUgaHR0cDovL2ZyYWdtZW50Mi5mcmFnbWVudDEvZnJhZ21lbnQzL2ZyYWdtZW50NC8uLi4vZnJhZ21lbnRuLzwvbGk+DQotCSAqIEBwYXJhbSBwYWNrYWdlTmFtZSBOYW1lIG9mIHRoZSBwYWNrYWdlDQotCSAqIEByZXR1cm4gdGhlIGNvbXBvc2VkIG5hbWVzcGFjZQ0KLQkgKiBAdGhvcndzIE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gcGFja2FnZSBuYW1lIHNwZWNpZmllZCBpcyBudWxsDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb21wb3NlSmF4V3NUYXJnZXROYW1lc3BhY2VCeVBhY2thZ2UoU3RyaW5nIHBhY2thZ2VOYW1lKQ0KLQl7DQotCQlpZihwYWNrYWdlTmFtZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiUGFja2FnZSBuYW1lIGNhbm5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCQ0KLQkJU3RyaW5nW10gcGtnRnJhZ21lbnRzID0gcGFja2FnZU5hbWUuc3BsaXQoIlxcLiIpOyAvLyROT04tTkxTLTEkDQotCQkNCi0JCWlmKHBrZ0ZyYWdtZW50cy5sZW5ndGggPiAxKQ0KLQkJew0KLQkJCS8vIHJldmVyc2UgdGhlIGZpcnN0IHR3byBmcmFnbWVudHMgaW4gY2FzZSB0aGVyZSBhcmUgYXQgbGVhc3QgdHdvIGZyYWdtZW50cyBhdmFpbGFibGUNCi0JCQlTdHJpbmcgZnJhZzAgPSBwa2dGcmFnbWVudHNbMF07DQotCQkJcGtnRnJhZ21lbnRzWzBdID0gcGtnRnJhZ21lbnRzWzFdOw0KLQkJCXBrZ0ZyYWdtZW50c1sxXSA9IGZyYWcwOw0KLQkJfQ0KLQkJDQotCQlTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCJodHRwOi8vIik7IC8vJE5PTi1OTFMtMSQNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGtnRnJhZ21lbnRzLmxlbmd0aDsgaSsrKQ0KLQkJew0KLQkJCXJlc3VsdC5hcHBlbmQocGtnRnJhZ21lbnRzW2ldKTsNCi0JCQlyZXN1bHQuYXBwZW5kKGk9PTAgJiYgcGtnRnJhZ21lbnRzLmxlbmd0aD4xID8gIi4iIDogIi8iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQl9DQotCQkNCi0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFNhbWUgYXMgY29tcG9zZUpheFdzVGFyZ2V0TmFtZXNwYWNlQnlQYWNrYWdlKCkgYnV0IGZpcnN0IGV4dHJhY3RzIHRoZSBwYWNrYWdlIG91dCBvZiBjbGFzcw0KLQkgKiBmdWxseSBxdWFsaWZpZWQgbmFtZQ0KLQkgKiBAcGFyYW0gZnFOYW1lIHRoZSBjbGFzcyBmdWxseSBxdWFsaWZpZWQgbmFtZQ0KLQkgKiBAcmV0dXJuIGNhbGN1bGF0ZWQgdGFyZ2V0IG5hbWVzcGFjZQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcG9zZUpheFdzVGFyZ2V0TmFtZXNwYWNlQnlGUU5hbWUoU3RyaW5nIGZxTmFtZSkNCi0Jew0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKGZxTmFtZSwgImZxTmFtZSIpOyAvLyROT04tTkxTLTEkDQotCQlyZXR1cm4gY29tcG9zZUpheFdzVGFyZ2V0TmFtZXNwYWNlQnlQYWNrYWdlKGV4dHJhY3RQYWNrYWdlKGZxTmFtZSkpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgUG9ydFR5cGUgbmFtZSBmcm9tIHRoZSA8Y29kZT5lbmRwb2ludFR5cGU8L2NvZGU+IGFuZCA8Y29kZT5zZWlOYW1lPC9jb2RlPi4NCi0JICogQHBhcmFtIGVuZHBvaW50IGNsYXNzLg0KLQkgKiBAcGFyYW0gc2VpTmFtZQ0KLQkgKiBAcmV0dXJuIFBvcnRUeXBlIG5hbWUgZm9yIHRoZSBAV2ViU2VydmljZSBhbm5vdGF0aW9uLCB0aGUgbmFtZSBvZiB0aGUgPGNvZGU+ZW5kcG9pbnRUeXBlPC9jb2RlPiB3aXRoIHRoZSAiUG9ydCIgc3VmZml4Lg0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gPGNvZGU+ZW5kcG9pbnRUeXBlPC9jb2RlPiBzcGVjaWZpZWQgaXMgbnVsbC4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBvcnR0eXBlTmFtZShJVHlwZSBlbmRwb2ludFR5cGUsIFN0cmluZyBzZWlOYW1lKQ0KLQl7DQotCQlpZihlbmRwb2ludFR5cGUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImVuZHBvaW50VHlwZSBjb3VsZCBub3QgYmUgbnVsbCEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJaWYoc2VpTmFtZSAhPSBudWxsICYmIHNlaU5hbWUubGVuZ3RoKCkgPiAwKQ0KLQkJew0KLQkJCXJldHVybiBzZWlOYW1lOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gcmVtb3ZlQmVhblN1ZmZpeElmUmVxdWlyZWQoZW5kcG9pbnRUeXBlLmdldEVsZW1lbnROYW1lKCkpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogUmVtb3ZlcyB0aGUgIkJlYW4iIHN1ZmZpeCBmcm9tIHRoZSA8Y29kZT5lbmRwb2ludFR5cGU8L2NvZGU+IGluIGNhc2UgaXQgaXMgcHJlc2VudCBhbmQgZ2VuZXJhdGVzIFNlcnZpY2UgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBJVHlwZS4NCi0JICogQHBhcmFtIGVuZHBvaW50IGNsYXNzLg0KLQkgKiBAcmV0dXJuIFNlcnZpY2UgbmFtZSBmb3IgdGhlIEBXZWJTZXJ2aWNlIGFubm90YXRpb24sIHRoZSBuYW1lIG9mIHRoZSA8Y29kZT5lbmRwb2ludFR5cGU8L2NvZGU+IHdpdGhvdXQgdGhlICJCZWFuIiBzdWZmaXggYW5kIDxjb2RlPiJTZXJ2aWNlIjwvY29kZT4gYXQgdGhlIGVuZC4NCi0JICogSW4gY2FzZSB0aGUgbmFtZSBvZiB0aGUgPGNvZGU+ZW5kcG9pbnRUeXBlPC9jb2RlPiBlcXVhbHMgIkJlYW4iIHRoZW4gdGhlIG9yaWdpbmFsIG5hbWUgaXMgcmV0dXJuZWQgd2l0aCA8Y29kZT4iU2VydmljZSI8L2NvZGU+IGF0ZSB0aGUgZW5kLg0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gPGNvZGU+ZW5kcG9pbnRUeXBlPC9jb2RlPiBzcGVjaWZpZWQgaXMgbnVsbA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2VydmljZU5hbWUoZmluYWwgSVR5cGUgZW5kcG9pbnRUeXBlKQ0KLQl7DQotCQlpZihlbmRwb2ludFR5cGUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImVuZHBvaW50VHlwZSBjb3VsZCBub3QgYmUgbnVsbCEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gcmVtb3ZlQmVhblN1ZmZpeElmUmVxdWlyZWQoZW5kcG9pbnRUeXBlLmdldEVsZW1lbnROYW1lKCkpICsgU0VSVklDRV9TVUZGSVg7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJlbW92ZXMgdGhlICJCZWFuIiBzdWZmaXggZnJvbSB0aGUgZW5kcG9pbnQgbmFtZSBpbiBjYXNlIGl0IGlzIHByZXNlbnQuICANCi0JICogQHBhcmFtIGVuZHBvaW50TmFtZSB0aGUgbmFtZSBvZiB0aGUgZW5kcG9pbnQNCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgZW5kcG9pbnQgd2l0aG91dCB0aGUgIkJlYW4iIHN1ZmZpeC4gSW4gY2FzZSB0aGUgbmFtZSBvZiB0aGUgZW5kcG9pbnQgZXF1YWxzICJCZWFuIiB0aGVuIHRoZSBvcmlnaW5hbCBuYW1lIGlzIHJldHVybmVkDQotCSAqLw0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVtb3ZlQmVhblN1ZmZpeElmUmVxdWlyZWQoZmluYWwgU3RyaW5nIGVuZHBvaW50TmFtZSkNCi0Jew0KLQkJYXNzZXJ0IGVuZHBvaW50TmFtZSAhPSBudWxsICYmIGVuZHBvaW50TmFtZS5sZW5ndGgoKSA+IDA7DQotCQkNCi0JCWlmKGVuZHBvaW50TmFtZS5lcXVhbHMoQkVBTl9TVUZGSVgpKQ0KLQkJew0KLQkJCXJldHVybiBlbmRwb2ludE5hbWU7DQotCQl9DQotCQkNCi0JCWlmKGVuZHBvaW50TmFtZS5lbmRzV2l0aChCRUFOX1NVRkZJWCkpDQotCQl7DQotCQkJcmV0dXJuIGVuZHBvaW50TmFtZS5zdWJzdHJpbmcoMCwgZW5kcG9pbnROYW1lLmxhc3RJbmRleE9mKEJFQU5fU1VGRklYKSk7DQotCQl9DQotCQkNCi0JCXJldHVybiBlbmRwb2ludE5hbWU7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIFBvcnQgbmFtZSBmcm9tIHRoZSA8Y29kZT5lbmRwb2ludFR5cGU8L2NvZGU+Lg0KLQkgKiBAcGFyYW0gZW5kcG9pbnQgY2xhc3MuDQotCSAqIEByZXR1cm4gUG9ydCBuYW1lIGZvciB0aGUgQFdlYlNlcnZpY2UgYW5ub3RhdGlvbiwgdGhlIG5hbWUgb2YgdGhlIDxjb2RlPmVuZHBvaW50VHlwZTwvY29kZT4gd2l0aCB0aGUgIlBvcnQiIHN1ZmZpeC4NCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIDxjb2RlPmVuZHBvaW50VHlwZTwvY29kZT4gc3BlY2lmaWVkIGlzIG51bGwuDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQb3J0TmFtZShmaW5hbCBJVHlwZSBlbmRwb2ludFR5cGUpDQotCXsNCi0JCXJldHVybiBnZXREZWZhdWx0UG9ydE5hbWUoZW5kcG9pbnRUeXBlLmdldEVsZW1lbnROYW1lKCkpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCBzZXJ2aWNlIG5hbWUgY2FsY3VsYXRlZCBhcyB0aGUgc3BlY2lmaWNhdGlvbiBzdGF0ZXMuDQotCSAqIEBwYXJhbSBmcU5hbWUNCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBzZXJ2aWNlIG5hbWUNCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBjYXNlIDxjb2RlPmVuZHBvaW50VHlwZTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRTZXJ2aWNlTmFtZShmaW5hbCBTdHJpbmcgZnFOYW1lKQ0KLQl7DQotCQlpZihmcU5hbWUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImVuZHBvaW50VHlwZSBjb3VsZCBub3QgYmUgbnVsbCEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZXh0cmFjdFNob3J0TmFtZShmcU5hbWUpICsgU0VSVklDRV9TVUZGSVg7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHdzZGw6cG9ydFR5cGUgbmFtZSBkZWZpbmVkIGFzIEpBWC1XUyBzcGVjaWZpY2F0aW9uIHN0YXRlcy4gDQotCSAqIEBwYXJhbSBmcU5hbWUNCi0JICogQHJldHVybg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdFBvcnR0eXBlTmFtZShmaW5hbCBTdHJpbmcgZnFOYW1lKQ0KLQl7DQotCQlpZihmcU5hbWUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImZxTmFtZSBjb3VsZCBub3QgYmUgbnVsbCEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZXh0cmFjdFNob3J0TmFtZShmcU5hbWUpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IG5hbWUgZm9yIGEgd3NkbDpwb3J0IGRlZmluZWQgYXMgSkFYLVdTIHNwZWNpZmljYXRpb24gc3RhdGVzIA0KLQkgKiBAcGFyYW0gZnFOYW1lDQotCSAqIEByZXR1cm4gdGhlIGNhbGN1bGF0ZWQgbmFtZQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdFBvcnROYW1lKGZpbmFsIFN0cmluZyBmcU5hbWUpDQotCXsNCi0JCWlmKGZxTmFtZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiZnFOYW1lIGNvdWxkIG5vdCBiZSBudWxsISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlyZXR1cm4gZXh0cmFjdFNob3J0TmFtZShmcU5hbWUpICsgUE9SVF9TVUZGSVg7DQotCX0JDQotCQ0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXh0cmFjdFNob3J0TmFtZShTdHJpbmcgZnFOYW1lKSANCi0Jew0KLQkJaW50IHBvcyA9IGZxTmFtZS5sYXN0SW5kZXhPZignLicpOw0KLQkJaWYgKHBvcyA9PS0xICkgew0KLQkJCXJldHVybiBmcU5hbWU7DQotCQl9DQotCQkNCi0JCXJldHVybiBmcU5hbWUuc3Vic3RyaW5nKHBvcysxKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGV4dHJhY3RQYWNrYWdlKGZpbmFsIFN0cmluZyBmcU5hbWUpIA0KLQl7DQotCQlpbnQgcG9zID0gZnFOYW1lLmxhc3RJbmRleE9mKCcuJyk7DQotCQlpZiAocG9zID09LTEgKSB7DQotCQkJcmV0dXJuIGZxTmFtZTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGZxTmFtZS5zdWJzdHJpbmcoMCwgcG9zKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL1N0YXR1c1V0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL1N0YXR1c1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUzNzc5YTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9TdGF0dXNVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOw0KLQ0KLQ0KLS8qKg0KLSAqIENvbnZlbmllbmNlIG1ldGhvZHMgdG8gbWFuYWdlIHN0YXR1cyBvYmplY3RzLg0KLSAqIA0KLSAqIEBhdXRob3IgSm9lcmcgRGVobWVsDQotICovDQotcHVibGljIGZpbmFsIGNsYXNzIFN0YXR1c1V0aWxzDQotew0KLQlwcml2YXRlIFN0YXR1c1V0aWxzKCkNCi0Jew0KLQkJLy8gbm8gaW5zdGFudGlhdGlvbg0KLQl9DQotCQ0KLQkvKioNCi0JICogRmluZHMgdGhlIG1vc3Qgc2V2ZXJlIHN0YXR1cyBmcm9tIGEgYXJyYXkgb2Ygc3RhdGkuDQotCSAqIEFuIGVycm9yIGlzIG1vcmUgc2V2ZXJlIHRoYW4gYSB3YXJuaW5nLCBhbmQgYSB3YXJuaW5nIGlzIG1vcmUgc2V2ZXJlDQotCSAqIHRoYW4gb2suDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgZ2V0TW9zdFNldmVyZShJU3RhdHVzW10gc3RhdHVzKSB7DQotCQlJU3RhdHVzIG1heD0gbnVsbDsNCi0JCWZvciAoaW50IGk9IDA7IGkgPCBzdGF0dXMubGVuZ3RoOyBpKyspIHsNCi0JCQlJU3RhdHVzIGN1cnI9IHN0YXR1c1tpXTsNCi0JCQlpZiAoY3Vyci5tYXRjaGVzKElTdGF0dXMuRVJST1IpKSB7DQotCQkJCXJldHVybiBjdXJyOw0KLQkJCX0NCi0JCQlpZiAobWF4ID09IG51bGwgfHwgY3Vyci5nZXRTZXZlcml0eSgpID4gbWF4LmdldFNldmVyaXR5KCkpIHsNCi0JCQkJbWF4PSBjdXJyOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBtYXg7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBQcm92aWRlcyBhIG5ldyBzdGF0dXMgb2JqZWN0IHdpdGggc2V2ZXJpdHkgSVN0YXR1cy5DQU5DRUwuDQotCSAqIA0KLQkgKiBAcGFyYW0gbWVzc2FnZQ0KLQkgKiAgICAgICAgICAgIHN0YXR1cyBtZXNzYWdlDQotCSAqIEByZXR1cm4gdGhlIGNhbmNlbCBzdGF0dXMNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBzdGF0dXNDYW5jZWwoZmluYWwgU3RyaW5nIG1lc3NhZ2UpDQotCXsNCi0JCXJldHVybiBjcmVhdGVTdGF0dXMoSVN0YXR1cy5DQU5DRUwsIG1lc3NhZ2UpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBQcm92aWRlcyBhIG5ldyBzdGF0dXMgb2JqZWN0IHdpdGggc2V2ZXJpdHkgSVN0YXR1cy5FUlJPUi4NCi0JICogDQotCSAqIEBwYXJhbSBtZXNzYWdlDQotCSAqICAgICAgICAgICAgc3RhdHVzIG1lc3NhZ2UNCi0JICogQHJldHVybiB0aGUgZXJyb3Igc3RhdHVzDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgc3RhdHVzRXJyb3IoZmluYWwgU3RyaW5nIG1lc3NhZ2UpDQotCXsNCi0JCXJldHVybiBjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUiwgbWVzc2FnZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFByb3ZpZGVzIGEgbmV3IHN0YXR1cyBvYmplY3Qgd2l0aCBzZXZlcml0eSBJU3RhdHVzLkVSUk9SLg0KLQkgKiANCi0JICogQHBhcmFtIG1lc3NhZ2UNCi0JICogICAgICAgICAgICBzdGF0dXMgbWVzc2FnZQ0KLQkgKiBAcGFyYW0gZXgNCi0JICogICAgICAgICAgICBleGNlcHRpb24gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgc3RhdHVzDQotCSAqIEByZXR1cm4gdGhlIGVycm9yIHN0YXR1cw0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIHN0YXR1c0Vycm9yKGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBUaHJvd2FibGUgZXgpDQotCXsNCi0JCXJldHVybiBjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUiwgbWVzc2FnZSwgZXgpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBQcm92aWRlcyBhIG5ldyBzdGF0dXMgb2JqZWN0IHdpdGggc2V2ZXJpdHkgSVN0YXR1cy5XQVJOSU5HLg0KLQkgKiANCi0JICogQHBhcmFtIG1lc3NhZ2UNCi0JICogICAgICAgICAgICBzdGF0dXMgbWVzc2FnZQ0KLQkgKiBAcmV0dXJuIHRoZSB3YXJuaW5nIHN0YXR1cw0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIHN0YXR1c1dhcm5pbmcoZmluYWwgU3RyaW5nIG1lc3NhZ2UpDQotCXsNCi0JCXJldHVybiBjcmVhdGVTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBtZXNzYWdlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUHJvdmlkZXMgYSBuZXcgc3RhdHVzIG9iamVjdCB3aXRoIHNldmVyaXR5IElTdGF0dXMuV0FSTklORy4NCi0JICogDQotCSAqIEBwYXJhbSBtZXNzYWdlDQotCSAqICAgICAgICAgICAgc3RhdHVzIG1lc3NhZ2UNCi0JICogQHBhcmFtIGV4DQotCSAqICAgICAgICAgICAgZXhjZXB0aW9uIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHN0YXR1cw0KLQkgKiBAcmV0dXJuIHRoZSB3YXJuaW5nIHN0YXR1cw0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIHN0YXR1c1dhcm5pbmcoZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIFRocm93YWJsZSBleCkNCi0Jew0KLQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIG1lc3NhZ2UsIGV4KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUHJvdmlkZXMgYSBuZXcgc3RhdHVzIG9iamVjdCB3aXRoIHNldmVyaXR5IElTdGF0dXMuSU5GTy4NCi0JICogDQotCSAqIEBwYXJhbSBtZXNzYWdlDQotCSAqICAgICAgICAgICAgc3RhdHVzIG1lc3NhZ2UNCi0JICogQHJldHVybiB0aGUgaW5mbyBzdGF0dXMNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBzdGF0dXNJbmZvKGZpbmFsIFN0cmluZyBtZXNzYWdlKQ0KLQl7DQotCQlyZXR1cm4gY3JlYXRlU3RhdHVzKElTdGF0dXMuSU5GTywgbWVzc2FnZSk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBQcm92aWRlcyBhIG5ldyBzdGF0dXMgb2JqZWN0IHdpdGggc2V2ZXJpdHkgSVN0YXR1cy5JTkZPLg0KLQkgKiANCi0JICogQHBhcmFtIG1lc3NhZ2UNCi0JICogICAgICAgICAgICBzdGF0dXMgbWVzc2FnZQ0KLQkgKiBAcmV0dXJuIHRoZSBpbmZvIHN0YXR1cw0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIHN0YXR1c0luZm8oZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIFRocm93YWJsZSBjYXVzZSkNCi0Jew0KLQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLklORk8sIG1lc3NhZ2UsIGNhdXNlKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFByb3ZpZGVzIGEgbmV3IHN0YXR1cyBvYmplY3Qgd2l0aCBzZXZlcml0eSBJU3RhdHVzLk9LLg0KLQkgKiANCi0JICogQHBhcmFtIG1lc3NhZ2UNCi0JICogICAgICAgICAgICBzdGF0dXMgbWVzc2FnZQ0KLQkgKiBAcmV0dXJuIHRoZSBvayBzdGF0dXMNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBzdGF0dXNPayhmaW5hbCBTdHJpbmcgbWVzc2FnZSkNCi0Jew0KLQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLk9LLCBtZXNzYWdlKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZVN0YXR1cyhmaW5hbCBpbnQgc2V2ZXJpdHksIGZpbmFsIFN0cmluZyBtZXNzYWdlKQ0KLQl7DQotCQlyZXR1cm4gbmV3IFN0YXR1cyhzZXZlcml0eSwgImlkIiwgMCwgbWVzc2FnZSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQNCi0JfQ0KLQ0KLQlwcml2YXRlIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZVN0YXR1cyhmaW5hbCBpbnQgc2V2ZXJpdHksIGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBUaHJvd2FibGUgZXgpDQotCXsNCi0JCXJldHVybiBuZXcgU3RhdHVzKHNldmVyaXR5LCAiaWQiLCAwLCBtZXNzYWdlLCBleCk7IC8vJE5PTi1OTFMtMSQNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFByb3ZpZGVzIGEgbmV3IG11bHRpc3RhdHVzIG9iamVjdA0KLQkgKiANCi0JICogQHBhcmFtIG1lc3NhZ2UNCi0JICogICAgICAgICAgICBzdGF0dXMgbWVzc2FnZQ0KLQkgKiBAcmV0dXJuIG11bHRpc3RhdHVzDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIE11bHRpU3RhdHVzIGNyZWF0ZU11bHRpU3RhdHVzKFN0cmluZyBtZXNzYWdlKQ0KLQl7DQotCQlyZXR1cm4gbmV3IE11bHRpU3RhdHVzKCJpZCIsIDAsIG1lc3NhZ2UsIG51bGwpOyAvLyROT04tTkxTLTEkDQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZjJmZDM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvQW5ub3RhdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5Db250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW07DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZVBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5Bbm5vdGF0aW9uSW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuQW5ub3RhdGlvbkluc3BlY3RvckltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLkFubm90YXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuQXJyYXlWYWx1ZUltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLkJvb2xlYW5WYWx1ZUltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLkNsYXNzVmFsdWVJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5JbnRlZ2VyVmFsdWVJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5QYXJhbVZhbHVlUGFpckltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLlF1YWxpZmllZE5hbWVWYWx1ZUltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLlN0cmluZ1ZhbHVlSW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLnRleHQuSmF4V3NVdGlsTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbjsNCi0NCi0NCi0vKioNCi0gKiBGYWN0b3J5IGNsYXNzIGNvbnRhaW5pbmcgY29tbW9uIGZhY3RvcnkgYW5kIHV0aWxpdHkgbWV0aG9kcyBBbm5vdGF0aW9uIHByb2Nlc3NpbmcuDQotICogDQotICogQGF1dGhvciBQbGFtZW4gUGF2bG92DQotICovDQotcHVibGljIGNsYXNzIEFubm90YXRpb25GYWN0b3J5DQotew0KLQkvKioNCi0JICogQ3JlYXRlcyBjb21wbGV4IEFubm90YXRpb24sIGUuZy4gQW5ub3RhdGlvbiBvZiBraW5kIFxAV2ViU2VydmljZShwYXJhbTE9InZhbHVlMSIsIHBhcmFtMj0idmFsdWUyIikuDQotCSAqIA0KLQkgKiBAcGFyYW0gYW5ub3RhdGlvblFOYW1lDQotCSAqIEBwYXJhbSBwYXJhbVZhbHVlUGFpcnMNCi0JICogDQotCSAqIEByZXR1cm4gSW5zdGFudGlhdGVkIEFubm90YXRpb24gb2YgdHlwZSBJQ29tcGxleEFubm90YXRpb24uDQotCSAqIA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIGNhc2UgPHR0PmFubm90YXRpb25RTmFtZTwvdHQ+IG9yIDx0dD5wYXJhbVZhbHVlUGFpcnM8L3R0PiBhcmUgbnVsbC4NCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gY2FzZSA8dHQ+YW5ub3RhdGlvblFOYW1lPC90dD4gaXMgZW1wdHkgU3RyaW5nLg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gSUFubm90YXRpb248VD4gY3JlYXRlQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvblFOYW1lLCBTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlUGFpcnMsIGZpbmFsIFQgYXBwbGllZEVsZW1lbnQpDQotCXsNCi0JCWlmIChhbm5vdGF0aW9uUU5hbWUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImFubm90YXRpb25RTmFtZSBzaG91bGQgbm90IGJlIG51bGwhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCWlmIChhbm5vdGF0aW9uUU5hbWUudHJpbSgpLmxlbmd0aCgpID09IDApDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYW5ub3RhdGlvblFOYW1lIHNob3VsZCBub3QgYmUgZW1wdHkgU3RyaW5nISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlpZiAocGFyYW1WYWx1ZVBhaXJzID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJwYXJhbVZhbHVlUGFpcnMgc2hvdWxkIG5vdCBiZSBudWxsISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlmaW5hbCBBbm5vdGF0aW9uSW1wbDxUPiBpbXBsID0gbmV3IEFubm90YXRpb25JbXBsPFQ+KGFubm90YXRpb25RTmFtZSwgcGFyYW1WYWx1ZVBhaXJzKTsNCi0JCWltcGwuc2V0SmF2YUVsZW1lbnQoYXBwbGllZEVsZW1lbnQpOw0KLQkJDQotCQlyZXR1cm4gaW1wbDsNCi0JfQ0KLQkNCi0JDQotCS8qKg0KLQkgKiBDcmVhdGVzIHtAbGluayBJQW5ub3RhdGlvbn0gaW5zdGFuY2UgdGhhdCByZWZlcmVuY2VzIDxjb2RlPmFwcGxpZWRFbGVtZW50PC9jb2RlPiBqYXZhIGVsZW1lbnQgDQotCSAqIEBwYXJhbSBhbm5vdGF0aW9uUU5hbWUgdGhlIGFubm90YXRpb24gbmFtZQ0KLQkgKiBAcGFyYW0gYXBwbGllZEVsZW1lbnQgdGhlIGphdmEgZWxlbWVudCB0aGF0IHRoaXMgYW5ub3RhdGlvbiBpcyBhcHBsaWVkIG9uDQotCSAqIEBwYXJhbSBwYXJhbVZhbHVlUGFpcnMgdGhlIGFubm90YXRpb24gYXR0cmlidXRlcw0KLQkgKiBAcmV0dXJuIHtAbGluayBJQW5ub3RhdGlvbn0gaW5zdGFuY2UNCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBjYXNlIHNvbWUgb2YgcGFyYW1zIGlzIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIGNhc2UgPGNvZGU+YW5ub3RhdGlvblFOYW1lPC9jb2RlPiBpcyBlbXB0eSBzdHJpbmcNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gY3JlYXRlQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvblFOYW1lLCBJSmF2YUVsZW1lbnQgYXBwbGllZEVsZW1lbnQsIFNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtVmFsdWVQYWlycykNCi0Jew0KLQkJbnVsbENoZWNrUGFyYW0oYW5ub3RhdGlvblFOYW1lLCAiYW5ub3RhdGlvblFOYW1lIik7CSAvLyROT04tTkxTLTEkCQ0KLQkJaWYgKGFubm90YXRpb25RTmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFubm90YXRpb25RTmFtZSBzaG91bGQgbm90IGJlIGVtcHR5IFN0cmluZyEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJbnVsbENoZWNrUGFyYW0ocGFyYW1WYWx1ZVBhaXJzLCAicGFyYW1WYWx1ZVBhaXJzIik7IC8vJE5PTi1OTFMtMSQNCi0JCW51bGxDaGVja1BhcmFtKGFwcGxpZWRFbGVtZW50LCAiYXBwbGllZEVsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJZmluYWwgQW5ub3RhdGlvbkltcGw8SUphdmFFbGVtZW50PiBhbm5vdGF0aW9uID0gbmV3IEFubm90YXRpb25JbXBsPElKYXZhRWxlbWVudD4oYW5ub3RhdGlvblFOYW1lLCBwYXJhbVZhbHVlUGFpcnMpOw0KLQkJYW5ub3RhdGlvbi5zZXRBcHBsaWVkRWxlbWVudFdpdGhvdXRTYXZlKGFwcGxpZWRFbGVtZW50KTsNCi0JCQ0KLQkJcmV0dXJuIGFubm90YXRpb247DQotCX0JDQotCQ0KLQkvKioNCi0JKiBDcmVhdGVzIHBhcmFtLXZhbHVlIHBhaXIgbmVlZGVkIGluIGNvbXBsZXggQW5ub3RhdGlvbnMuDQotCSAqIA0KLQkgKiBAcGFyYW0gcGFyYW0NCi0JICogQHBhcmFtIHZhbHVlDQotCSAqIA0KLQkgKiBAcmV0dXJuIGluc3RhbmNlIG9mIElQYXJhbVZhbHVlUGFpcg0KLQkgKiANCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBjYXNlIDxjb2RlPnBhcmFtPC9jb2RlPiBvciA8Y29kZT52YWx1ZTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIGNhc2UgPGNvZGU+cGFyYW08L2NvZGU+IHBhcmFtZXRlciBpcyBlbXB0eSBTdHJpbmcuDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElQYXJhbVZhbHVlUGFpciBjcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKFN0cmluZyBwYXJhbSwgSVZhbHVlIHZhbHVlKQ0KLQl7DQotCQlpZiAocGFyYW0gPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInBhcmFtIHNob3VsZCBub3QgYmUgbnVsbCEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJaWYgKHBhcmFtLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhcmFtIHNob3VsZCBub3QgYmUgZW1wdHkgU3RyaW5nISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlpZiAodmFsdWUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInZhbHVlIHNob3VsZCBub3QgYmUgbnVsbCEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJcmV0dXJuIG5ldyBQYXJhbVZhbHVlUGFpckltcGwocGFyYW0sIHZhbHVlKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENyZWF0ZXMge0BsaW5rIElWYWx1ZX0gaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgPGNvZGU+dmFsdWVzPC9jb2RlPi4NCi0JICogDQotCSAqIEBwYXJhbSB2YWx1ZXMNCi0JICogDQotCSAqIEByZXR1cm4gaW5zdGFuY2Ugb2Yge0BsaW5rIElWYWx1ZX0NCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT52YWx1ZXM8L2NvZGU+IGlzIG51bGwuDQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIGNhc2UgPGNvZGU+dmFsdWVzPC9jb2RlPiBpcyBlbXB0eSBTZXQuDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElWYWx1ZSBjcmVhdGVBcnJheVZhbHVlKFNldDxJVmFsdWU+IHZhbHVlcykNCi0Jew0KLQkJaWYgKHZhbHVlcyA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigidmFsdWVzIHNob3VsZCBub3QgYmUgbnVsbCEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJaWYgKHZhbHVlcy5zaXplKCkgPCAxKQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInZhbHVlcyBzaG91bGQgbm90IGJlIGVtcHR5IFNldCEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJcmV0dXJuIG5ldyBBcnJheVZhbHVlSW1wbCh2YWx1ZXMpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQ3JlYXRlcyB7QGxpbmsgSVZhbHVlfSBpbnN0YW5jZSBvdXQgb2YgPGNvZGU+dmFsdWU8L2NvZGU+Lg0KLQkgKiANCi0JICogQHBhcmFtIHZhbHVlDQotCSAqIA0KLQkgKiBAcmV0dXJuIGluc3RhbmNlIG9mIHtAbGluayBJVmFsdWV9DQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElWYWx1ZSBjcmVhdGVCb29sZWFuVmFsdWUoYm9vbGVhbiB2YWx1ZSkNCi0Jew0KLQkJcmV0dXJuIG5ldyBCb29sZWFuVmFsdWVJbXBsKHZhbHVlKTsNCi0JfQ0KLQkJDQotCS8qKg0KLQkgKiBDcmVhdGVzIHtAbGluayBJVmFsdWV9IGluc3RhbmNlIG91dCBvZiA8Y29kZT52YWx1ZTwvY29kZT4uDQotCSAqIA0KLQkgKiBAcGFyYW0gdmFsdWUNCi0JICogDQotCSAqIEByZXR1cm4gaW5zdGFuY2Ugb2Yge0BsaW5rIFN0cmluZ30NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVZhbHVlIGNyZWF0ZUNsYXNzVmFsdWUoU3RyaW5nIHZhbHVlKQ0KLQl7DQotCQlpZiAodmFsdWUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInZhbHVlIHNob3VsZCBub3QgYmUgbnVsbCEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJaWYodmFsdWUuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJA0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInZhbHVlIHNob3VsZCBub3QgYmUgZW1wdHkgU3RyaW5nIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG5ldyBDbGFzc1ZhbHVlSW1wbCh2YWx1ZSk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBDcmVhdGVzIHtAbGluayBJVmFsdWV9IGluc3RhbmNlIG91dCBvZiA8Y29kZT52YWx1ZTwvY29kZT4uDQotCSAqIA0KLQkgKiBAcGFyYW0gdmFsdWUNCi0JICogDQotCSAqIEByZXR1cm4gaW5zdGFuY2Ugb2Yge0BsaW5rIElWYWx1ZX0NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVZhbHVlIGNyZWF0ZUludGVnZXJWYWx1ZShTdHJpbmcgdmFsdWUpDQotCXsNCi0JCXJldHVybiBuZXcgSW50ZWdlclZhbHVlSW1wbCh2YWx1ZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMge0BsaW5rIElWYWx1ZX0gaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgPGNvZGU+cXVhbGlmaWVkTmFtZTwvY29kZT4gZnVsbHkgcXVhbGlmaWVkIG5hbWUuDQotCSAqIA0KLQkgKiBAcGFyYW0gcXVhbGlmaWVkTmFtZQ0KLQkgKg0KLQkgKiBAcmV0dXJuIGluc3RhbmNlIG9mIHtAbGluayBJVmFsdWV9DQotCSAqIA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIGNhc2UgPHR0PnF1YWxpZmllZE5hbWU8L3R0PiBpcyBudWxsLg0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbiBjYXNlIDxjb2RlPnF1YWxpZmllZE5hbWU8L2NvZGU+IGlzIG5vdCBpbiBjb3JyZWN0IGZvcm0gZS5nLiBjb3VsZCBub3QgYmUgZW1wdHkgU3RyaW5nLCBzaG9sZCBiZSBxdWFsaWZpZWQuDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElWYWx1ZSBjcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoU3RyaW5nIHF1YWxpZmllZE5hbWUpDQotCXsNCi0JCWlmIChxdWFsaWZpZWROYW1lID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJxdWFsaWZpZWROYW1lIHNob3VsZCBub3QgYmUgbnVsbCEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJaWYgKHF1YWxpZmllZE5hbWUudHJpbSgpLmxlbmd0aCgpID09IDAgfHwgcXVhbGlmaWVkTmFtZS5pbmRleE9mKCcuJykgPT0gLTEpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicXVhbGlmaWVkTmFtZSBpcyBub3QgaW4gY29ycmVjdCBmb3JtISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlyZXR1cm4gbmV3IFF1YWxpZmllZE5hbWVWYWx1ZUltcGwocXVhbGlmaWVkTmFtZSk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBDcmVhdGVzIHtAbGluayBJVmFsdWV9IGluc3RhbmNlIG91dCBvZiA8Y29kZT52YWx1ZTwvY29kZT4gY29udGVudC4NCi0JICogDQotCSAqIEBwYXJhbSB2YWx1ZQ0KLQkgKg0KLQkgKiBAcmV0dXJuIGluc3RhbmNlIG9mIHtAbGluayBJVmFsdWV9DQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gY2FzZSA8dHQ+dmFsdWU8L3R0PiBpcyBudWxsLg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJVmFsdWUgY3JlYXRlU3RyaW5nVmFsdWUoU3RyaW5nIHZhbHVlKQ0KLQl7DQotCQlpZiAodmFsdWUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInZhbHVlIHNob3VsZCBub3QgYmUgbnVsbCEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJcmV0dXJuIG5ldyBTdHJpbmdWYWx1ZUltcGwodmFsdWUpOw0KLQl9DQotCQ0KLQkNCi0vLwkvKioNCi0vLwkgKiBSZXRyaWV2ZXMgYWxsIEFubm90YXRpb25zIGZyb20gY2xhc3MuDQotLy8JICogDQotLy8JICogQHBhcmFtIGphdmFFbGVtZW50DQotLy8JICoNCi0vLwkgKiBAcmV0dXJuIGNvbnRhaW5lZCBhbm5vdGF0aW9ucyBpbiA8Y29kZT5qYXZhRWxlbWVudDwvY29kZT4NCi0vLwkgKiANCi0vLwkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiBleGNlcHRpb24gb2NjdXJzDQotLy8JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8dHQ+amF2YUVsZW1lbnQ8L3R0PiBpcyBudWxsLg0KLS8vCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIGNhc2UgPGNvZGU+amF2YUVsZW1lbnQ8L2NvZGU+IGlzIG5vdCBvZiB0aGUgY29ycmVjdCB0eXBlLiBTdXBwb3J0ZWQgdHlwZXMgYXJlOiBJdHlwZSwgSU1ldGhvZCwgSUZpZWxkLCBJVHlwZVBhcmFtZXRlcg0KLS8vCSAqLw0KLS8vCXB1YmxpYyBzdGF0aWMgU2V0PElBbm5vdGF0aW9uPiBnZXRBbm5vdGF0aW9uc0Zyb21KYXZhRWxlbWVudChJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0vLwl7DQotLy8JCWlmIChqYXZhRWxlbWVudCA9PSBudWxsKQ0KLS8vCQl7DQotLy8JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImphdmFFbGVtZW50IHNob3VsZCBub3QgYmUgbnVsbCEiKTsNCi0vLwkJfQ0KLS8vCQlpZighKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSVR5cGUpIHx8ICEoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJTWV0aG9kKSB8fCAhKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSUZpZWxkKSB8fCAhKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSVR5cGVQYXJhbWV0ZXIpKQ0KLS8vCQl7DQotLy8JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJqYXZhRWxlbWVudCBpcyBub3Qgb2YgY29ycmVjdCB0eXBlISIpOw0KLS8vCQl9DQotLy8JCXBwcHBwcA0KLS8vCX0NCi0JDQotCS8qKg0KLQkgKiBSZW1vdmVzIGFsbCBBbm5vdGF0aW9ucyBmcm9tIDxjb2RlPmphdmFFbGVtZW50PC9jb2RlPi4NCi0JICogDQotCSAqIEBwYXJhbSBqYXZhRWxlbWVudA0KLQkgKg0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDx0dD5qYXZhRWxlbWVudDwvdHQ+IGlzIG51bGwuDQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIGNhc2UgPGNvZGU+amF2YUVsZW1lbnQ8L2NvZGU+IGlzIG5vdCBvZiB0aGUgY29ycmVjdCB0eXBlLiBTdXBwb3J0ZWQgdHlwZXMgYXJlOiBJdHlwZSwgSU1ldGhvZCwgSUZpZWxkLCBJVHlwZVBhcmFtZXRlcg0KLQkgKiBAdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbm5vdGF0aW9uc0Zyb21KYXZhRWxlbWVudChJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQpIHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCWlmIChqYXZhRWxlbWVudCA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiamF2YUVsZW1lbnQgc2hvdWxkIG5vdCBiZSBudWxsISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlpZighKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSVR5cGUpICYmICEoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kKSAmJiAhKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSUZpZWxkKSAmJiAhKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSVR5cGVQYXJhbWV0ZXIpKQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImphdmFFbGVtZW50IGlzIG5vdCBvZiBjb3JyZWN0IHR5cGUhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCXJlbW92ZUFubm90YXRpb25zKGphdmFFbGVtZW50LCBudWxsKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFJlbW92ZXMgQW5ub3RhdGlvbnMgd2l0aCBuYW1lcyBjb250YWluZWQgaW4gPGNvZGU+YW5ub3RhdGlvbnM8L2NvZGU+IGZyb20gPGNvZGU+amF2YUVsZW1lbnQ8L2NvZGU+IGFuZCBpdHMgY2hpbGRyZW4sIGlmIHN1Y2ggZXhpc3QuDQotCSAqIA0KLQkgKiBAcGFyYW0gamF2YUVsZW1lbnQNCi0JICogQHBhcmFtIGFubm90YXRpb25zDQotCSAqIA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDx0dD5qYXZhRWxlbWVudDwvdHQ+IG9yIDx0dD5hbm5vdGF0aW9uczwvdHQ+IGlzIG51bGwuDQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIGNhc2UgPGNvZGU+amF2YUVsZW1lbnQ8L2NvZGU+IGlzIG5vdCBvZiB0aGUgY29ycmVjdCB0eXBlLiBTdXBwb3J0ZWQgdHlwZXMgYXJlOiBJdHlwZSwgSU1ldGhvZCwgSUZpZWxkLCBJVHlwZVBhcmFtZXRlcg0KLQkgKiBAdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbm5vdGF0aW9ucyhJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsIFNldDxTdHJpbmc+IGFubm90YXRpb25zKSB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQlpZiAoamF2YUVsZW1lbnQgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImphdmFFbGVtZW50IHNob3VsZCBub3QgYmUgbnVsbCEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJaWYoIShqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElUeXBlKSAmJiAhKGphdmFFbGVtZW50IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZCkgJiYgIShqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElGaWVsZCkgJiYgIShqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElUeXBlUGFyYW1ldGVyKSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJqYXZhRWxlbWVudCBpcyBub3Qgb2YgY29ycmVjdCB0eXBlISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQl0cnkgDQotCQl7DQotCQkJQW5ub3RhdGlvblV0aWxzLmdldEluc3RhbmNlKCkucmVtb3ZlQW5ub3RhdGlvbnMoamF2YUVsZW1lbnQsIGFubm90YXRpb25zLCB0cnVlKTsNCi0JCX0gDQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIA0KLQkJew0KLQkJCXRocm93IG5ldyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlLmdldFN0YXR1cygpLmdldE1lc3NhZ2UoKSwgZSk7DQotCQl9IA0KLQkJY2F0Y2ggKE1hbGZvcm1lZFRyZWVFeGNlcHRpb24gZSkgDQotCQl7DQotCQkJdGhyb3cgbmV3IEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIEpheFdzVXRpbE1lc3NhZ2VzLkludmFsaWRUcmVlU3RhdGVNc2csIGUpOw0KLQkJfSANCi0JCWNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgDQotCQl7DQotCQkJdGhyb3cgbmV3IEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIEpheFdzVXRpbE1lc3NhZ2VzLkNvbXBVbml0TWlzc2luZ01zZywgZSk7DQotCQl9IA0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgDQotCQl7DQotCQkJdGhyb3cgbmV3IEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUuZ2V0U3RhdHVzKCkuZ2V0TWVzc2FnZSgpLCBlKTsNCi0JCX0NCi0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCXRocm93IG5ldyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBKYXhXc1V0aWxNZXNzYWdlcy5DYW5ub3RQZXJmb3JtRWRpdE1zZywgZSk7DQotCQl9DQotCX0NCi0JDQotCS8qKg0KLQkgKiBDcmVhdGUgaW5zdGFuY2Ugb2YgSUFubm90YXRpb25JbnNwZWN0b3IgZm9yIGEgc3BlY2lmaWMgSVR5cGUuDQotCSAqIA0KLQkgKiBAcGFyYW0gdHlwZSAtIElUeXBlLCB3aGljaCB3aWxsIGJlIGluc3BlY3RlZC4NCi0JICogIA0KLQkgKiBAcmV0dXJuIElBbm5vdGF0aW9uSW5zcGVjdG9yDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElBbm5vdGF0aW9uSW5zcGVjdG9yIGNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoSVR5cGUgdHlwZSkNCi0Jew0KLQkJcmV0dXJuIG5ldyBBbm5vdGF0aW9uSW5zcGVjdG9ySW1wbCh0eXBlKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0Fubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NTU4YTk0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnM7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5leGNlcHRpb24uTG9jYWxpemVkRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEV4Y2VwdGlvbiB0aHJvd24gYnkgYW5ub3RhdGlvbiBnZW5lcmF0b3IgaW4gY2FzZSB3aGVuIHVuZXhwZWN0ZWQgY29uZGl0aW9uIGlzIG1ldA0KLSAqIA0KLSAqIEBhdXRob3IgUGxhbWVuIFBhdmxvdg0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uIGV4dGVuZHMgTG9jYWxpemVkRXhjZXB0aW9uDQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIGdldHRpbmcgZXJyb3IgbWVzc2FnZSwgbG9jYWxpemVkIG1lc3NhZ2UgYW5kIHtAbGluayBUaHJvd2FibGV9IHRvIGJlIHdyYXBwZWQNCi0JICogDQotCSAqIEBwYXJhbSBtZXNzYWdlDQotCSAqIEBwYXJhbSBsb2NhbGl6ZWRNZXNzYWdlIA0KLQkgKiBAcGFyYW0gdA0KLQkgKi8NCi0JcHVibGljIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIFN0cmluZyBsb2NhbGl6ZWRNZXNzYWdlLCBmaW5hbCBUaHJvd2FibGUgdCkNCi0Jew0KLQkJc3VwZXIobWVzc2FnZSwgbG9jYWxpemVkTWVzc2FnZSwgdCk7CQ0KLQl9DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciB3aXRoIGVycm9yIG1lc3NhZ2UgYW5kIGEgbG9jYWxpemVkIG1lc3NhZ2UuDQotCSAqIA0KLQkgKiBAcGFyYW0gbWVzc2FnZQ0KLQkgKiBAcGFyYW0gbG9jYWxpemVkTWVzc2FnZQ0KLQkgKi8NCi0JcHVibGljIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIFN0cmluZyBsb2NhbGl6ZWRNZXNzYWdlKQ0KLQl7DQotCQlzdXBlcihtZXNzYWdlLCBsb2NhbGl6ZWRNZXNzYWdlKTsJCQ0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvQW5ub3RhdGlvbldyaXRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmMDczMmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnM7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZW1iZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZVBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQm9keURlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkZpZWxkRGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JRXh0ZW5kZWRNb2RpZmllcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZERlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVEZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5jbGF6ei5BU1RVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuQW5ub3RhdGlvbkltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLkFubm90YXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLnRleHQuSmF4V3NVdGlsTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5yZXNvdXJjZXMuRWRpdFJlc291cmNlc01hbmFnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5yZXNvdXJjZXMuRmlsZVV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMucmVzb3VyY2VzLklGaWxlVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsNCi0NCi0vKioNCi0gKiBDbGFzcywgd2hpY2ggaXMgdXNlZCB0byBzYXZlIHRoZSBhbm5vdGF0aW9ucy4NCi0gKiANCi0gKiBAYXV0aG9yIFBsYW1lbiBQYXZsb3YNCi0gKg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uV3JpdGVyDQotew0KLQlwcml2YXRlIHN0YXRpYyBBbm5vdGF0aW9uV3JpdGVyIHdyaXRlciA9IG51bGw7DQotCXByaXZhdGUgZmluYWwgSUZpbGVVdGlscyBmaWxlVXRpbHMgPSBGaWxlVXRpbHMuZ2V0SW5zdGFuY2UoKTsNCi0NCi0JLyoqDQotCSAqIFRoZSBmYWN0b3J5IG1ldGhvZC4NCi0JICogDQotCSAqIEByZXR1cm4gYSBBbm5vdGF0aW9uV3JpdGVyIGluc3RhbmNlLg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYzxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiBBbm5vdGF0aW9uV3JpdGVyIGdldEluc3RhbmNlKCkNCi0Jew0KLQkJaWYgKHdyaXRlciA9PSBudWxsKQ0KLQkJew0KLQkJCXdyaXRlciA9IG5ldyBBbm5vdGF0aW9uV3JpdGVyKCk7DQotCQl9DQotCQlyZXR1cm4gd3JpdGVyOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQWRkcyBBbm5vdGF0aW9uIHRvIHNwZWNpZmljIElKYXZhRWxlbWVudC4NCi0JICogDQotCSAqIEBwYXJhbSBqYXZhRWxlbWVudA0KLQkgKiANCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8dHQ+amF2YUVsZW1lbnQ8L3R0PiBpcyBudWxsLg0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbiBjYXNlIDxjb2RlPmphdmFFbGVtZW50PC9jb2RlPiBpcyBub3Qgb2YgdGhlIGNvcnJlY3QgdHlwZS4gU3VwcG9ydGVkIHR5cGVzIGFyZTogSVR5cGUsIElNZXRob2QsIElGaWVsZCwgSVR5cGVQYXJhbWV0ZXIuDQotCSAqIEB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbi4NCi0JICovDQotCXB1YmxpYyA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gdm9pZCBzZXRBcHBsaWVkRWxlbWVudChmaW5hbCBJQW5ub3RhdGlvbjxUPiBhbm5vdGF0aW9uLCBmaW5hbCBUIGphdmFFbGVtZW50KSB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQlBbm5vdGF0aW9uSW1wbDxUPiBhbm5vdGF0aW9uSW1wbCA9IChBbm5vdGF0aW9uSW1wbDxUPilhbm5vdGF0aW9uOw0KLQkJYW5ub3RhdGlvbkltcGwuc2V0SmF2YUVsZW1lbnQoamF2YUVsZW1lbnQpOw0KLQkJDQotCQlzZXRBbm5vdGF0YXRpb25TdHJpbmdWYWxsdWUoYW5ub3RhdGlvbkltcGwsIHRydWUsIGphdmFFbGVtZW50KTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gdm9pZCBzZXRBbm5vdGF0YXRpb25TdHJpbmdWYWxsdWUoQW5ub3RhdGlvbkltcGw8VD4gYW5ub3RhdGlvbkltcGwsIGJvb2xlYW4gbmVlZFNhdmUsIGZpbmFsIFQgamF2YUVsZW1lbnQpIHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCWlmICghbmVlZFNhdmUpIHsNCi0JCQlyZXR1cm47DQotCQl9DQotCQkNCi0JCWlmKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSVR5cGUpDQotCQl7DQotCQkJYWRkVG9DbGFzcyhhbm5vdGF0aW9uSW1wbCwgKElUeXBlKWphdmFFbGVtZW50KTsJCQkJDQotCQl9DQotCQlpZihqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElGaWVsZCkNCi0JCXsNCi0JCQlhZGRUb0ZpZWxkKGFubm90YXRpb25JbXBsLCAoSUZpZWxkKWphdmFFbGVtZW50KTsNCi0JCX0NCi0JCWlmKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSU1ldGhvZCkNCi0JCXsNCi0JCQlhZGRUb01ldGhvZChhbm5vdGF0aW9uSW1wbCwgKElNZXRob2QpamF2YUVsZW1lbnQpOw0KLQkJfQ0KLQkJaWYoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZVBhcmFtZXRlcikNCi0JCXsNCi0JCQlhZGRUb1BhcmFtKGFubm90YXRpb25JbXBsLCAoSVR5cGVQYXJhbWV0ZXIpamF2YUVsZW1lbnQpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwcml2YXRlIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiB2b2lkIGFkZFRvQ2xhc3MoQW5ub3RhdGlvbkltcGw8VD4gYW5ub3RhdGlvbkltcGwsIElUeXBlIGNsYXNzVHlwZSkgdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNsYXNzVHlwZS5nZXRFbGVtZW50TmFtZSgpOw0KLQ0KLQkJYWRkVG9NZW1iZXIoYW5ub3RhdGlvbkltcGwsIGNsYXNzVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgY2xhc3NUeXBlLCBjbGFzc05hbWUpOw0KLQl9DQotDQotCXByaXZhdGUgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IHZvaWQgYWRkVG9GaWVsZChBbm5vdGF0aW9uSW1wbDxUPiBhbm5vdGF0aW9uSW1wbCwgSUZpZWxkIGZpZWxkVHlwZSkgdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGZpZWxkVHlwZS5nZXRQYXJlbnQoKS5nZXRFbGVtZW50TmFtZSgpOw0KLQ0KLQkJYWRkVG9NZW1iZXIoYW5ub3RhdGlvbkltcGwsIGZpZWxkVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgZmllbGRUeXBlLCBjbGFzc05hbWUpOw0KLQl9DQotDQotCXByaXZhdGUgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IHZvaWQgYWRkVG9NZXRob2QoQW5ub3RhdGlvbkltcGw8VD4gYW5ub3RhdGlvbkltcGwsIElNZXRob2QgbWV0aG9kVHlwZSkgdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9IG1ldGhvZFR5cGUuZ2V0UGFyZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsNCi0NCi0JCWFkZFRvTWVtYmVyKGFubm90YXRpb25JbXBsLCBtZXRob2RUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCBtZXRob2RUeXBlLCBjbGFzc05hbWUpOw0KLQl9DQotDQotCXByaXZhdGUgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IHZvaWQgYWRkVG9QYXJhbShBbm5vdGF0aW9uSW1wbDxUPiBhbm5vdGF0aW9uSW1wbCwgSVR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtKSB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQlJTWVtYmVyIG1lbWJlciA9IHR5cGVQYXJhbS5nZXREZWNsYXJpbmdNZW1iZXIoKTsNCi0JCVN0cmluZyBjbGFzc05hbWUgPSBudWxsOw0KLQkJaWYgKG1lbWJlci5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5NRVRIT0QpDQotCQl7DQotCQkJY2xhc3NOYW1lID0gbWVtYmVyLmdldERlY2xhcmluZ1R5cGUoKS5nZXRFbGVtZW50TmFtZSgpOw0KLQkJfSBlbHNlDQotCQl7DQotCQkJY2xhc3NOYW1lID0gbWVtYmVyLmdldEVsZW1lbnROYW1lKCk7DQotCQl9DQotDQotCQlhZGRUb01lbWJlcihhbm5vdGF0aW9uSW1wbCwgbWVtYmVyLmdldENvbXBpbGF0aW9uVW5pdCgpLCB0eXBlUGFyYW0sIGNsYXNzTmFtZSk7DQotCX0NCi0NCi0JcHJpdmF0ZSA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gdm9pZCBhZGRUb01lbWJlcihBbm5vdGF0aW9uSW1wbDxUPiBhbm5vdGF0aW9uSW1wbCwgSUNvbXBpbGF0aW9uVW5pdCBjVW5pdCwgSUphdmFFbGVtZW50IHR5cGUsIFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCXRyeQ0KLQkJew0KLQkJCWlmIChjVW5pdCA9PSBudWxsKQ0KLQkJCXsNCi0JCQkJcmV0dXJuOw0KLQkJCX0NCi0NCi0JCQlDb21waWxhdGlvblVuaXQgdW5pdCA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuY3JlYXRlQ29tcGlsYXRpb25Vbml0KGNVbml0LCBudWxsKTsNCi0JCQlBU1QgYXN0ID0gdW5pdC5nZXRBU1QoKTsNCi0NCi0JCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gKFR5cGVEZWNsYXJhdGlvbilBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldFR5cGVEZWNsYXJhdGlvbihjbGFzc05hbWUsIHVuaXQpOw0KLQkJCWlmICh0eXBlRGVjbGFyYXRpb24gIT0gbnVsbCkNCi0JCQl7DQotCQkJCXN3aXRjaCAodHlwZS5nZXRFbGVtZW50VHlwZSgpKQ0KLQkJCQl7DQotCQkJCWNhc2UgSUphdmFFbGVtZW50LlRZUEU6DQotCQkJCQlhZGRBbm5vdGF0aW9uKGFubm90YXRpb25JbXBsLCBjVW5pdCwgdW5pdCwgYXN0LCB0eXBlRGVjbGFyYXRpb24pOw0KLQkJCQkJYnJlYWs7DQotCQkJCWNhc2UgSUphdmFFbGVtZW50Lk1FVEhPRDoNCi0JCQkJCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRNZXRob2REZWNsYXJhdGlvbigoSU1ldGhvZCkgdHlwZSwgdHlwZURlY2xhcmF0aW9uKTsNCi0JCQkJCWFkZEFubm90YXRpb24oYW5ub3RhdGlvbkltcGwsIGNVbml0LCB1bml0LCBhc3QsIG1ldGhvZERlY2xhcmF0aW9uKTsNCi0JCQkJCWJyZWFrOw0KLQkJCQljYXNlIElKYXZhRWxlbWVudC5GSUVMRDoNCi0JCQkJCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0RmllbGREZWNsYXJhdGlvbigoSUZpZWxkKSB0eXBlLCB0eXBlRGVjbGFyYXRpb24pOw0KLQkJCQkJYWRkQW5ub3RhdGlvbihhbm5vdGF0aW9uSW1wbCwgY1VuaXQsIHVuaXQsIGFzdCwgZmllbGREZWNsYXJhdGlvbik7DQotCQkJCQlicmVhazsNCi0JCQkJY2FzZSBJSmF2YUVsZW1lbnQuVFlQRV9QQVJBTUVURVI6DQotCQkJCQlJVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyID0gKElUeXBlUGFyYW1ldGVyKSB0eXBlOw0KLQkJCQkJaWYgKHR5cGVQYXJhbWV0ZXIuZ2V0RGVjbGFyaW5nTWVtYmVyKCkuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuTUVUSE9EKQ0KLQkJCQkJew0KLQkJCQkJCW1ldGhvZERlY2xhcmF0aW9uID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRNZXRob2REZWNsYXJhdGlvbigoSU1ldGhvZCkgdHlwZVBhcmFtZXRlci5nZXREZWNsYXJpbmdNZW1iZXIoKSwgdHlwZURlY2xhcmF0aW9uKTsNCi0JCQkJCQlTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtRGVjbGFyYXRpb24gPSBnZXRQYXJhbURlY2xhcmF0aW9uKHR5cGVQYXJhbWV0ZXIsIG1ldGhvZERlY2xhcmF0aW9uKTsNCi0JCQkJCQlhZGRBbm5vdGF0aW9uKGFubm90YXRpb25JbXBsLCBjVW5pdCwgdW5pdCwgYXN0LCBwYXJhbURlY2xhcmF0aW9uKTsNCi0JCQkJCX0NCi0JCQkJCWJyZWFrOw0KLQkJCQlkZWZhdWx0Og0KLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5zdXBwb3J0ZWQgdHlwZSBmb3IgYW5ub3RhdGlvbiIpOyAvLyROT04tTkxTLTEkDQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQljYXRjaCAoTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCXRocm93IG5ldyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBKYXhXc1V0aWxNZXNzYWdlcy5JbnZhbGlkVHJlZVN0YXRlTXNnLCBlKTsNCi0JCX0NCi0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJdGhyb3cgbmV3IEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUuZ2V0U3RhdHVzKCkuZ2V0TWVzc2FnZSgpLCBlKTsNCi0JCX0NCi0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCXRocm93IG5ldyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBKYXhXc1V0aWxNZXNzYWdlcy5DYW5ub3RQZXJmb3JtRWRpdE1zZywgZSk7DQotCQl9DQotCQljYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJdGhyb3cgbmV3IEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIEpheFdzVXRpbE1lc3NhZ2VzLkNvbXBVbml0TWlzc2luZ01zZywgZSk7DQotCQl9DQotCX0NCi0NCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCXByaXZhdGUgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IHZvaWQgYWRkQW5ub3RhdGlvbihBbm5vdGF0aW9uSW1wbDxUPiBhbm5vdGF0aW9uSW1wbCwgSUNvbXBpbGF0aW9uVW5pdCBjVW5pdCwgQ29tcGlsYXRpb25Vbml0IHVuaXQsIEFTVCBhc3QsIEFTVE5vZGUgZGVjbGFyYXRpb24pIA0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb24sIE1hbGZvcm1lZFRyZWVFeGNlcHRpb24sIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJZWRpdFJlc01hbmFnZXIoKS5zZXRGaWxlRWRpdGFibGUoKElGaWxlKSBjVW5pdC5nZXRSZXNvdXJjZSgpKTsNCi0NCi0JCXVuaXQucmVjb3JkTW9kaWZpY2F0aW9ucygpOw0KLQkJRXhwcmVzc2lvbiBhbm5vdCA9IGFubm90YXRpb25JbXBsLmdldEV4cHJlc3Npb24odW5pdCwgYXN0KTsNCi0NCi0JCUxpc3QgbW9kaWZpZXJzID0gbnVsbDsNCi0NCi0JCXN3aXRjaCAoZGVjbGFyYXRpb24uZ2V0Tm9kZVR5cGUoKSkNCi0JCXsNCi0JCWNhc2UgQVNUTm9kZS5NRVRIT0RfREVDTEFSQVRJT046DQotCQljYXNlIEFTVE5vZGUuRklFTERfREVDTEFSQVRJT046DQotCQljYXNlIEFTVE5vZGUuVFlQRV9ERUNMQVJBVElPTjoNCi0JCQltb2RpZmllcnMgPSAoKEJvZHlEZWNsYXJhdGlvbikgZGVjbGFyYXRpb24pLm1vZGlmaWVycygpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSBBU1ROb2RlLlNJTkdMRV9WQVJJQUJMRV9ERUNMQVJBVElPTjoNCi0JCQltb2RpZmllcnMgPSAoKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uKS5tb2RpZmllcnMoKTsNCi0JCQlicmVhazsNCi0JCWRlZmF1bHQ6DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYWRkQW5ub3RhdGlvbigpIGlsbGVnYWwgZGVjbGF0YWlvbiB0eXBlIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCW1vZGlmaWVycy5hZGQoMCwgYW5ub3QpOw0KLQ0KLQkJSURvY3VtZW50IGRvYyA9IEFubm90YXRpb25VdGlscy5nZXRJbnN0YW5jZSgpLmdldERvY3VtZW50KGNVbml0KTsNCi0NCi0JCVRleHRFZGl0IGVkaXQgPSB1bml0LnJld3JpdGUoZG9jLCBudWxsKTsNCi0JCWVkaXQuYXBwbHkoZG9jKTsNCi0NCi0JCUlTdGF0dXMgc3RhdHVzID0gZWRpdFJlc01hbmFnZXIoKS5zZXRGaWxlRWRpdGFibGUoKElGaWxlKSBjVW5pdC5nZXRSZXNvdXJjZSgpKTsNCi0JCWlmKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0spDQotCQl7DQotCQkJZmlsZVV0aWxzLnNldENvbXBpbGF0aW9uVW5pdENvbnRlbnRBbmRTYXZlRGlydHlFZGl0b3JzKGNVbml0LCBkb2MuZ2V0KCksIHRydWUsIG51bGwpOw0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCXRocm93IG5ldyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uKCJBbm5vdGF0dGlvbiBjb3VsZCBub3QgYmUgc3RvcmVkLCB0aGUgZmlsZSBpcyBub3Qgd3JpdGFibGUiLCAvLyROT04tTkxTLTEkDQotCQkJCQkJCQkJCQlKYXhXc1V0aWxNZXNzYWdlcy5Bbm5vdGF0aW9uQ2Fubm90QmVTdG9yZWRNc2cpOyANCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIHN0YXRpYyBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIGdldFBhcmFtRGVjbGFyYXRpb24oSVR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciwgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pDQotCXsNCi0JCS8vVE9ETyBjaGVjayB0aGlzIG1ldGhvZA0KLQkJZmluYWwgU3RyaW5nIHBhcmFtTmFtZSA9IHR5cGVQYXJhbWV0ZXIuZ2V0RWxlbWVudE5hbWUoKTsNCi0NCi0JCWZvciAoT2JqZWN0IGRlY2wgOiBtZXRob2REZWNsYXJhdGlvbi5wYXJhbWV0ZXJzKCkpDQotCQl7DQotCQkJaWYgKCEoZGVjbCBpbnN0YW5jZW9mIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pKQ0KLQkJCXsNCi0JCQkJY29udGludWU7DQotCQkJfQ0KLQ0KLQkJCWlmIChwYXJhbU5hbWUuZXF1YWxzKCgoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikgZGVjbCkuZ2V0TmFtZSgpLnRvU3RyaW5nKCkpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKSBkZWNsOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQkvKioNCi0JICogVXBkYXRlcyB0aGUgUGFyYW1ldGVyLVZhbHVlIFBhaXJzIG9mIHNwZWNpZmljIEFubm90YXRpb24uDQotCSAqIA0KLQkgKiBAcGFyYW0gYW5ub3RhdGlvbiAtIEFubm90YXRpb24sIHdoaWNoIHdpbGwgYmUgdXBkYXRlZC4NCi0JICogQHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiANCi0JICovDQotCXB1YmxpYyA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gdm9pZCB1cGRhdGUoZmluYWwgSUFubm90YXRpb248VD4gYW5ub3RhdGlvbikgdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24sIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJQW5ub3RhdGlvbkltcGw8VD4gYW5ub3RhdHRpb25JbXBsID0gbmV3IEFubm90YXRpb25JbXBsPFQ+KGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSwgYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKSk7DQotCQl0cnkNCi0JCXsNCi0JCQl1cGRhdGVUaGVBbm5vdGF0aW9uKGFubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKSwgYW5ub3RhdHRpb25JbXBsKTsNCi0JCX0gDQotCQljYXRjaChNYWxmb3JtZWRUcmVlRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBuZXcgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgSmF4V3NVdGlsTWVzc2FnZXMuSW52YWxpZFRyZWVTdGF0ZU1zZywgZSk7DQotCQl9IA0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBuZXcgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgSmF4V3NVdGlsTWVzc2FnZXMuQ2Fubm90UGVyZm9ybUVkaXRNc2csIGUpOw0KLQkJfSANCi0JCWNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgew0KLQkJCXRocm93IG5ldyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBKYXhXc1V0aWxNZXNzYWdlcy5Db21wVW5pdE1pc3NpbmdNc2csIGUpOw0KLQkJfQ0KLQl9DQotCQ0KLQkvKioNCi0JICogVXBkYXRlcyB0aGUgUGFyYW0tVmFsdWUgUGFpcnMgb2Ygc3BlY2lmaWMgQW5ub3RhdGlvbi4NCi0JICogDQotCSAqIEBwYXJhbSBhbm5vdGF0aW9uIC0gQW5ub3RhdGlvbiwgd2hpY2ggd2lsbCBiZSB1cGRhdGVkLg0KLQkgKiBAcGFyYW0gcGFyYW1WYWx1ZVBhaXJzIHdoaWNoIHdpbGwgYmUgdXBkYXRlZC4gT2xkIHBhaXJzIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgbmV3IG9uY2UuDQotCSAqIEBwYXJhbSByZXBsYWNlUHJldmlvdXNQYWlycyBib29sZWFuIHZhbHVlIHdoaWNoIHNwZWNpZmllcyB0aGUgd2F5LCBob3cgbmV3IElQYXJhbVZhbHVlUGFpcnMgd2lsbCBiZSB1cGRhdGVkLiBJZiB0aGUgdmFsdWUgaXMgPHR0PnRydWU8L3R0PiwNCi0JICogdGhlIFNldCB3aXRoIHRoZSBvbGQgSVBhcmFtVmFsdWVQYWlycyB3aWxsIGJlIGNsZWFyZWQgYW5kIHRoZSBuZXcgdmFsdWVzIHdpbGwgYmUgYXBwbGllZC4gSWYgdGhlIHZhbHVlIGlzIDx0dD5mYWxzZTwvdHQ+IHRoZSBvbGQgcGFpcnMgd2lsbCBiZSBrZXB0DQotCSAqIGFuZCB3aWxsIGJlIHVwZGF0ZWQgd2l0aCB0aGUgIHZhbHVlcyBmcm9tIHRoZSBuZXcgU2V0LCBpZiB0aGVyZSBhcmUgcGFyYW1zIHdoaWNoIGRvIG5vdCBleGlzdCBpbiB0aGUgb2xkIG9uZSwgdGhleSB3aWxsIGJlIGFkZGVkLg0KLQkgKiANCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIA0KLQkgKiBAdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0JICogDQotCSAqIEBkZXByZWNhdGVkIC0gdXNlIHB1YmxpYyA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gdm9pZCB1cGRhdGUoZmluYWwgSUFubm90YXRpb248VD4gYW5ub3RhdGlvbikgaW5zdGVhZC4NCi0JICovDQotCUBEZXByZWNhdGVkDQotCXB1YmxpYyA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gdm9pZCB1cGRhdGUoZmluYWwgSUFubm90YXRpb248VD4gYW5ub3RhdGlvbiwgU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZVBhaXJzLCBib29sZWFuIHJlcGxhY2VQcmV2aW91c1BhaXJzKSB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbg0KLQl7CQ0KLQkJdXBkYXRlQW5ub3RhdGlvbihhbm5vdGF0aW9uLCBhbm5vdGF0aW9uLmdldEFwcGxpZWRFbGVtZW50KCksIHBhcmFtVmFsdWVQYWlycywgcmVwbGFjZVByZXZpb3VzUGFpcnMpOw0KLQl9DQotDQotCS8qKg0KLQkgKiANCi0JICogQHBhcmFtIDxUPg0KLQkgKiBAcGFyYW0gYW5ub3RhdGlvbg0KLQkgKiBAcGFyYW0gamF2YUVsZW1lbnQNCi0JICogQHBhcmFtIHBhcmFtVmFsdWVQYWlycw0KLQkgKiBAcGFyYW0gcmVwbGFjZVByZXZpb3VzUGFpcnMNCi0JICogQHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQkgKiANCi0JICovDQotCXByaXZhdGUgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IHZvaWQgdXBkYXRlQW5ub3RhdGlvbihmaW5hbCBJQW5ub3RhdGlvbjxUPiBhbm5vdGF0aW9uLCBmaW5hbCBUIGphdmFFbGVtZW50LCBTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlUGFpcnMsIGJvb2xlYW4gcmVwbGFjZVByZXZpb3VzUGFpcnMpIHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCUFubm90YXRpb25JbXBsPFQ+IGFubm90YXRpb25JbXBsID0gKEFubm90YXRpb25JbXBsPFQ+KWFubm90YXRpb247DQotCQl0cnkNCi0JCXsNCi0JCQlpZihyZXBsYWNlUHJldmlvdXNQYWlycykNCi0JCQl7DQotCQkJCWFubm90YXRpb25JbXBsLnNldFBhcmFtVmFsdWVQYWlycyhwYXJhbVZhbHVlUGFpcnMpOw0KLQkJCX0NCi0JCQllbHNlDQotCQkJew0KLQkJCQlmb3IgKElQYXJhbVZhbHVlUGFpciBwYWlyIDogcGFyYW1WYWx1ZVBhaXJzKQ0KLQkJCQl7DQotCQkJCQlib29sZWFuIGlzVXBkYXRlZCA9IGZhbHNlOw0KLQkJCQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gdG1wUGFyYW1WYWx1ZVBhaXJzID0gYW5ub3RhdGlvbkltcGwuZ2V0UGFyYW1WYWx1ZVBhaXJzKCk7DQotCQkJCQlmb3IgKElQYXJhbVZhbHVlUGFpciB0aGlzUGFpciA6IHRtcFBhcmFtVmFsdWVQYWlycykNCi0JCQkJCXsNCi0JCQkJCQlpZih0aGlzUGFpci5nZXRQYXJhbSgpLmVxdWFscyhwYWlyLmdldFBhcmFtKCkpKQ0KLQkJCQkJCXsNCi0JCQkJCQkJdG1wUGFyYW1WYWx1ZVBhaXJzLnJlbW92ZSh0aGlzUGFpcik7DQotCQkJCQkJCXRtcFBhcmFtVmFsdWVQYWlycy5hZGQocGFpcik7DQotCQkJCQkJCWlzVXBkYXRlZCA9IHRydWU7DQotCQkJCQkJCWJyZWFrOw0KLQkJCQkJCX0NCi0JCQkJCX0NCi0JCQkJCWlmKCFpc1VwZGF0ZWQpDQotCQkJCQl7DQotCQkJCQkJdG1wUGFyYW1WYWx1ZVBhaXJzLmFkZChwYWlyKTsNCi0JCQkJCX0NCi0JCQkJCWFubm90YXRpb25JbXBsLnNldFBhcmFtVmFsdWVQYWlycyh0bXBQYXJhbVZhbHVlUGFpcnMpOw0KLQkJCQl9DQotCQkJfQ0KLQkJCXVwZGF0ZVRoZUFubm90YXRpb24oamF2YUVsZW1lbnQsIGFubm90YXRpb25JbXBsKTsNCi0JCQkNCi0JCQkvL3JlbW92ZShhbm5vdGF0aW9uKTsNCi0JCQkvL3NldEFwcGxpZWRFbGVtZW50KGFubm90YXRpb24sIGphdmFFbGVtZW50KTsNCi0JCX0gDQotCQljYXRjaChNYWxmb3JtZWRUcmVlRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBuZXcgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgSmF4V3NVdGlsTWVzc2FnZXMuSW52YWxpZFRyZWVTdGF0ZU1zZywgZSk7DQotCQl9IA0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBuZXcgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgSmF4V3NVdGlsTWVzc2FnZXMuQ2Fubm90UGVyZm9ybUVkaXRNc2csIGUpOw0KLQkJfSANCi0JCWNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgew0KLQkJCXRocm93IG5ldyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBKYXhXc1V0aWxNZXNzYWdlcy5Db21wVW5pdE1pc3NpbmdNc2csIGUpOw0KLQkJfQ0KLQl9DQotDQotDQotCS8qKg0KLQkgKiBSZW1vdmVzIEFubm90YXRpb24uDQotCSAqIA0KLQkgKiBAcGFyYW0gYW5ub3RhdGlvbiAtIEFubm90YXRpb24sIHdoaWNoIHdpbGwgYmUgcmVtb3ZlZC4NCi0JICogDQotCSAqIEB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gDQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiANCi0JICogQHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uIA0KLQkgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiANCi0JICovDQotCXB1YmxpYyA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gdm9pZCByZW1vdmUoZmluYWwgSUFubm90YXRpb248VD4gYW5ub3RhdGlvbikgdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24sIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJcmVtb3ZlQW5ub3RhdGlvbihhbm5vdGF0aW9uLCBhbm5vdGF0aW9uLmdldEFwcGxpZWRFbGVtZW50KCkpOw0KLQl9DQotDQotCXByaXZhdGUgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IHZvaWQgcmVtb3ZlQW5ub3RhdGlvbihmaW5hbCBJQW5ub3RhdGlvbjxUPiBhbm5vdGF0aW9uLCBmaW5hbCBUIGphdmFFbGVtZW50KSB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlBbm5vdGF0aW9uSW1wbDxUPiBhbm5vdGF0aW9uSW1wbCA9IChBbm5vdGF0aW9uSW1wbDxUPilhbm5vdGF0aW9uOw0KLQkJdHJ5DQotCQl7DQotLy8JCQlpZihhbm5vdGF0aW9uSW1wbC5nZXRBbm5vdGF0aW9uU3RyaW5nVmFsdWUoKSA9PSBudWxsIHx8IGFubm90YXRpb25JbXBsLmdldEFubm90YXRpb25TdHJpbmdWYWx1ZSgpLnRyaW0oKS5lcXVhbHMoIiIpKQ0KLS8vCQkJew0KLS8vCQkJCWFubm90YXRpb25JbXBsLnNldEFubm90YXRpb25TdHJpbmdWYWx1ZShjcmVhdGVBbm5vdGF0YXRpb25TdHJpbmdWYWxsdWUoYW5ub3RhdGlvbkltcGwsIGphdmFFbGVtZW50KSk7DQotLy8JCQkJQW5ub3RhdGlvblV0aWxzLmdldEluc3RhbmNlKCkucmVtb3ZlQW5ub3RhdGlvbihqYXZhRWxlbWVudCwgYW5ub3RhdGlvbkltcGwuZ2V0QW5ub3RhdGlvblN0cmluZ1ZhbHVlKCkpOw0KLS8vCQkJfQ0KLS8vCQkJZWxzZQ0KLS8vCQkJew0KLQkJCQlBbm5vdGF0aW9uVXRpbHMuZ2V0SW5zdGFuY2UoKS5yZW1vdmVBbm5vdGF0aW9uKGphdmFFbGVtZW50LCBhbm5vdGF0aW9uSW1wbC5nZXRTaW1wbGVBbm5vdGF0aW9uTmFtZSgpKTsNCi0vLwkJCX0NCi0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGJsZSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbihibGUuZ2V0TWVzc2FnZSgpLCBKYXhXc1V0aWxNZXNzYWdlcy5DYW5ub3RQZXJmb3JtRWRpdE1zZywgYmxlKTsNCi0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmbmZlKQ0KLQkJew0KLQkJCXRocm93IG5ldyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uKGZuZmUuZ2V0TWVzc2FnZSgpLCBKYXhXc1V0aWxNZXNzYWdlcy5Db21wVW5pdE1pc3NpbmdNc2csIGZuZmUpOw0KLQkJfQkNCi0JfQ0KLQ0KLQkvLyBpMDM2NTA5IGFkZGVkDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlwcml2YXRlIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiB2b2lkIHVwZGF0ZVRoZUFubm90YXRpb24oZmluYWwgVCBqYXZhRWxlbWVudCwgZmluYWwgQW5ub3RhdGlvbkltcGw8VD4gYW5ub3RhdGlvbkltcGwpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uDQotCXsJCQ0KLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBpQ3UgPSBnZXRDdShqYXZhRWxlbWVudCk7DQotCQlmaW5hbCBDb21waWxhdGlvblVuaXQgdW5pdCA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuY3JlYXRlQ29tcGlsYXRpb25Vbml0KGlDdSwgbnVsbCk7DQotCQkNCi0JCUJvZHlEZWNsYXJhdGlvbiBiZCA9IG51bGw7DQotCQlBbm5vdGF0aW9uIGZvdW5kID0gbnVsbDsNCi0JCWlmKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSVR5cGUpDQotCQl7DQotCQkJYmQgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldFR5cGVEZWNsYXJhdGlvbihqYXZhRWxlbWVudC5nZXRFbGVtZW50TmFtZSgpLCB1bml0KTsNCi0JCQlmb3VuZCA9IGZpbmRBbm5vdGF0aW9uKGJkLCBhbm5vdGF0aW9uSW1wbCk7DQotDQotCQkJdW5pdC5yZWNvcmRNb2RpZmljYXRpb25zKCk7DQotCQkJaWYgKGZvdW5kIT1udWxsKSB7DQotCQkJCWJkLm1vZGlmaWVycygpLnJlbW92ZShmb3VuZCk7DQotCQkJfQ0KLQkJCQ0KLQkJCWZpbmFsIEV4cHJlc3Npb24gYW5ub3QgPSBhbm5vdGF0aW9uSW1wbC5nZXRFeHByZXNzaW9uKHVuaXQsIHVuaXQuZ2V0QVNUKCkpOw0KLQkJCWJkLm1vZGlmaWVycygpLmFkZCgwLCBhbm5vdCk7DQotCQl9DQotCQlpZihqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElNZXRob2QpDQotCQl7DQotCQkJVHlwZURlY2xhcmF0aW9uIHRkID0gKFR5cGVEZWNsYXJhdGlvbilBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldFR5cGVEZWNsYXJhdGlvbigoKElNZXRob2QpamF2YUVsZW1lbnQpLmdldERlY2xhcmluZ1R5cGUoKS5nZXRFbGVtZW50TmFtZSgpLCB1bml0KTsNCi0JCQliZCA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0TWV0aG9kRGVjbGFyYXRpb24oKChJTWV0aG9kKWphdmFFbGVtZW50KSwgdGQpOw0KLQkJCWZvdW5kID0gZmluZEFubm90YXRpb24oYmQsIGFubm90YXRpb25JbXBsKTsNCi0JCQ0KLQkJCXVuaXQucmVjb3JkTW9kaWZpY2F0aW9ucygpOw0KLQkJCWlmIChmb3VuZCE9bnVsbCkgew0KLQkJCQliZC5tb2RpZmllcnMoKS5yZW1vdmUoZm91bmQpOw0KLQkJCX0NCi0JCQkNCi0JCQlmaW5hbCBFeHByZXNzaW9uIGFubm90ID0gYW5ub3RhdGlvbkltcGwuZ2V0RXhwcmVzc2lvbih1bml0LCB1bml0LmdldEFTVCgpKTsNCi0JCQliZC5tb2RpZmllcnMoKS5hZGQoMCwgYW5ub3QpOw0KLQkJfQ0KLQkJaWYoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJRmllbGQpDQotCQl7DQotCQkJVHlwZURlY2xhcmF0aW9uIHRkID0gKFR5cGVEZWNsYXJhdGlvbilBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldFR5cGVEZWNsYXJhdGlvbigoKElGaWVsZClqYXZhRWxlbWVudCkuZ2V0RGVjbGFyaW5nVHlwZSgpLmdldEVsZW1lbnROYW1lKCksIHVuaXQpOw0KLQkJCWJkID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRGaWVsZERlY2xhcmF0aW9uKCgoSUZpZWxkKWphdmFFbGVtZW50KSwgdGQpOw0KLQkJCWZvdW5kID0gZmluZEFubm90YXRpb24oYmQsIGFubm90YXRpb25JbXBsKTsNCi0JCQ0KLQkJCXVuaXQucmVjb3JkTW9kaWZpY2F0aW9ucygpOw0KLQkJCWlmIChmb3VuZCE9bnVsbCkgew0KLQkJCQliZC5tb2RpZmllcnMoKS5yZW1vdmUoZm91bmQpOw0KLQkJCX0NCi0JCQkNCi0JCQlmaW5hbCBFeHByZXNzaW9uIGFubm90ID0gYW5ub3RhdGlvbkltcGwuZ2V0RXhwcmVzc2lvbih1bml0LCB1bml0LmdldEFTVCgpKTsNCi0JCQliZC5tb2RpZmllcnMoKS5hZGQoMCwgYW5ub3QpOw0KLQkJfQ0KLQkJaWYoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZVBhcmFtZXRlcikNCi0JCXsNCi0JCQlpZigoKElUeXBlUGFyYW1ldGVyKWphdmFFbGVtZW50KS5nZXREZWNsYXJpbmdNZW1iZXIoKSBpbnN0YW5jZW9mIElUeXBlKQ0KLQkJCXsNCi0JCQkJYmQgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldFR5cGVEZWNsYXJhdGlvbigoKElUeXBlUGFyYW1ldGVyKWphdmFFbGVtZW50KS5nZXREZWNsYXJpbmdNZW1iZXIoKS5nZXRFbGVtZW50TmFtZSgpLCB1bml0KTsNCi0JCQkJU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbSA9IGZpbmRQYXJhbWV0ZXIoYmQsIGphdmFFbGVtZW50KTsNCi0JCQkJaWYocGFyYW0gIT0gbnVsbCkNCi0JCQkJew0KLQkJCQkJZm91bmQgPSBmaW5kUGFyYW1Bbm5vdGF0aW9uKHBhcmFtLCBhbm5vdGF0aW9uSW1wbCwgamF2YUVsZW1lbnQpOw0KLQkJCQl9DQotDQotCQkJCXVuaXQucmVjb3JkTW9kaWZpY2F0aW9ucygpOw0KLQkJCQlpZiAoZm91bmQhPW51bGwpIHsNCi0JCQkJCXBhcmFtLm1vZGlmaWVycygpLnJlbW92ZShmb3VuZCk7DQotCQkJCX0NCi0JCQkJDQotCQkJCWZpbmFsIEV4cHJlc3Npb24gYW5ub3QgPSBhbm5vdGF0aW9uSW1wbC5nZXRFeHByZXNzaW9uKHVuaXQsIHVuaXQuZ2V0QVNUKCkpOw0KLQkJCQlwYXJhbS5tb2RpZmllcnMoKS5hZGQoMCwgYW5ub3QpOw0KLQkJCX0NCi0JCQllbHNlDQotCQkJew0KLQkJCQlUeXBlRGVjbGFyYXRpb24gdGQgPSAoVHlwZURlY2xhcmF0aW9uKUFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKCgoSU1ldGhvZCkoKElUeXBlUGFyYW1ldGVyKWphdmFFbGVtZW50KS5nZXRQYXJlbnQoKSkuZ2V0RGVjbGFyaW5nVHlwZSgpLiBnZXRFbGVtZW50TmFtZSgpLCB1bml0KTsNCi0JCQkJYmQgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldE1ldGhvZERlY2xhcmF0aW9uKCgoSU1ldGhvZCkoKElUeXBlUGFyYW1ldGVyKWphdmFFbGVtZW50KS5nZXRQYXJlbnQoKSksIHRkKTsNCi0JCQkJU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbSA9IGZpbmRQYXJhbWV0ZXIoYmQsIGphdmFFbGVtZW50KTsNCi0JCQkJaWYocGFyYW0gIT0gbnVsbCkNCi0JCQkJew0KLQkJCQkJZm91bmQgPSBmaW5kUGFyYW1Bbm5vdGF0aW9uKHBhcmFtLCBhbm5vdGF0aW9uSW1wbCwgamF2YUVsZW1lbnQpOw0KLQkJCQl9DQotDQotCQkJCXVuaXQucmVjb3JkTW9kaWZpY2F0aW9ucygpOw0KLQkJCQlpZiAoZm91bmQhPW51bGwpIHsNCi0JCQkJCXBhcmFtLm1vZGlmaWVycygpLnJlbW92ZShmb3VuZCk7DQotCQkJCX0NCi0JCQkJDQotCQkJCWZpbmFsIEV4cHJlc3Npb24gYW5ub3QgPSBhbm5vdGF0aW9uSW1wbC5nZXRFeHByZXNzaW9uKHVuaXQsIHVuaXQuZ2V0QVNUKCkpOw0KLQkJCQlwYXJhbS5tb2RpZmllcnMoKS5hZGQoMCwgYW5ub3QpOw0KLQkJCX0NCi0JCX0NCi0JCQkJDQotCQlzZXRBbm5vdGF0YXRpb25TdHJpbmdWYWxsdWUoYW5ub3RhdGlvbkltcGwsIGZhbHNlLCBqYXZhRWxlbWVudCk7DQotCQlmaW5hbCBJRG9jdW1lbnQgZG9jID0gQW5ub3RhdGlvblV0aWxzLmdldEluc3RhbmNlKCkuZ2V0RG9jdW1lbnQoaUN1KTsJDQotCQlmaW5hbCBUZXh0RWRpdCBlZGl0ID0gdW5pdC5yZXdyaXRlKGRvYywgamF2YUVsZW1lbnQuZ2V0SmF2YVByb2plY3QoKS5nZXRPcHRpb25zKHRydWUpKTsNCi0JCWVkaXQuYXBwbHkoZG9jKTsNCi0NCi0JCUlTdGF0dXMgc3RhdHVzID0gZWRpdFJlc01hbmFnZXIoKS5zZXRGaWxlRWRpdGFibGUoKElGaWxlKSBpQ3UuZ2V0UmVzb3VyY2UoKSk7DQotCQlpZihzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLk9LKQ0KLQkJew0KLQkJCWZpbGVVdGlscy5zZXRDb21waWxhdGlvblVuaXRDb250ZW50QW5kU2F2ZURpcnR5RWRpdG9ycyhpQ3UsIGRvYy5nZXQoKSwgdHJ1ZSwgbnVsbCk7DQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJdGhyb3cgbmV3IEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oIkFubm90YXR0aW9uIGNvdWxkIG5vdCBiZSBzdG9yZWQsIHRoZSBmaWxlIGlzIG5vdCB3cml0YWJsZSIsIC8vJE5PTi1OTFMtMSQNCi0JCQkJCQkJCQkJCUpheFdzVXRpbE1lc3NhZ2VzLkFubm90YXRpb25DYW5ub3RCZVN0b3JlZE1zZyk7IA0KLQkJfQ0KLQl9DQotCQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHJpdmF0ZSBBbm5vdGF0aW9uIGZpbmRBbm5vdGF0aW9uKGZpbmFsIEJvZHlEZWNsYXJhdGlvbiB0ZCwgZmluYWwgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gYW5ub3RhdGlvbikNCi0Jew0KLQkJQW5ub3RhdGlvbiBhbm47DQotCQlmb3IgKElFeHRlbmRlZE1vZGlmaWVyIG1vZGlmaWVyIDogKExpc3Q8SUV4dGVuZGVkTW9kaWZpZXI+KXRkLm1vZGlmaWVycygpKSANCi0JCXsNCi0JCQlpZighbW9kaWZpZXIuaXNBbm5vdGF0aW9uKCkpIHsNCi0JCQkJY29udGludWU7DQotCQkJfQ0KLQkJCQ0KLQkJCWFubiA9IChBbm5vdGF0aW9uKW1vZGlmaWVyOw0KLQkJCWlmIChhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZW5kc1dpdGgoYW5uLmdldFR5cGVOYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpKSB7DQotCQkJCXJldHVybiBhbm47DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBmaW5kUGFyYW1ldGVyKGZpbmFsIEJvZHlEZWNsYXJhdGlvbiB0ZCwgVCBqYXZhRWxlbWVudCkNCi0Jew0KLQkJaWYgKHRkICE9IG51bGwpDQotCQl7DQotCQkJZm9yIChPYmplY3QgcGFyYW0gOiAoKE1ldGhvZERlY2xhcmF0aW9uKXRkKS5wYXJhbWV0ZXJzKCkpDQotCQkJew0KLQkJCQlpZiAocGFyYW0gaW5zdGFuY2VvZiBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uICYmDQotCQkJCQkJKChJVHlwZVBhcmFtZXRlcilqYXZhRWxlbWVudCkuZ2V0RWxlbWVudE5hbWUoKS50b1N0cmluZygpLmVxdWFscygoKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pcGFyYW0pLmdldE5hbWUoKS50b1N0cmluZygpKSkNCi0JCQkJew0KLQkJCQkJcmV0dXJuIChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKXBhcmFtOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlwcml2YXRlIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiBBbm5vdGF0aW9uIGZpbmRQYXJhbUFubm90YXRpb24oZmluYWwgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbSwgZmluYWwgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gYW5ub3RhdGlvbiwgVCBqYXZhRWxlbWVudCkNCi0Jew0KLQkJQW5ub3RhdGlvbiBhbm47DQotCQlmb3IgKElFeHRlbmRlZE1vZGlmaWVyIG1vZGlmaWVyIDogKExpc3Q8SUV4dGVuZGVkTW9kaWZpZXI+KShwYXJhbS5tb2RpZmllcnMoKSkpIA0KLQkJew0KLQkJCWlmKCFtb2RpZmllci5pc0Fubm90YXRpb24oKSkgew0KLQkJCQljb250aW51ZTsNCi0JCQl9DQotCQkJDQotCQkJYW5uID0gKEFubm90YXRpb24pbW9kaWZpZXI7DQotCQkJaWYgKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lbmRzV2l0aChhbm4uZ2V0VHlwZU5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSkpIHsNCi0JCQkJcmV0dXJuIGFubjsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGdldEN1KGZpbmFsIElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCkNCi0Jew0KLQkJc3dpdGNoIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSANCi0JCXsNCi0JCWNhc2UgSUphdmFFbGVtZW50LlRZUEU6DQotCQkJcmV0dXJuICgoSVR5cGUpIGphdmFFbGVtZW50KS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCWNhc2UgSUphdmFFbGVtZW50LkZJRUxEOg0KLQkJCXJldHVybiAoKElGaWVsZCkgamF2YUVsZW1lbnQpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJY2FzZSBJSmF2YUVsZW1lbnQuTUVUSE9EOg0KLQkJCXJldHVybiAoKElNZXRob2QpIGphdmFFbGVtZW50KS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCWNhc2UgSUphdmFFbGVtZW50LlRZUEVfUEFSQU1FVEVSOg0KLQkJCXJldHVybiAoKElUeXBlUGFyYW1ldGVyKSBqYXZhRWxlbWVudCkuZ2V0RGVjbGFyaW5nTWVtYmVyKCkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcml2YXRlIEVkaXRSZXNvdXJjZXNNYW5hZ2VyIGVkaXRSZXNNYW5hZ2VyKCkNCi0Jew0KLQkJcmV0dXJuIG5ldyBFZGl0UmVzb3VyY2VzTWFuYWdlcigpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSUFubm90YXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGQ4ZDgzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0lBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSByZXByZXNlbnRpbmcgQ29tcGxleCBBbm5vdGF0aW9uIGNvbnNpc3Rpbmcgb2YgcGFyYW0tdmFsdWUgcGFpcnMuDQotICogDQotICogQGF1dGhvciBQbGFtZW4gUGF2bG92DQotICovDQotcHVibGljIGludGVyZmFjZSBJQW5ub3RhdGlvbjxUIGV4dGVuZHMgSUphdmFFbGVtZW50Pg0KLXsNCi0JLyoqDQotCSAqIFJldHVybiB0aGUgcGFyYW0tdmFsdWUgcGFpcnMgd2hpY2ggdGhpcyBBbm5vdGF0aW9uIGhhcy4NCi0JICogDQotCSAqIEByZXR1cm4gU2V0IG9mIHBhcmFtLXZhbHVlcyBwYWlycy4NCi0JICovDQotCXB1YmxpYyBTZXQ8SVBhcmFtVmFsdWVQYWlyPiBnZXRQYXJhbVZhbHVlUGFpcnMoKTsNCi0JDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyIHdpdGggbmFtZSBwYXJhbS4gDQotCSAqIEBwYXJhbSBwYXJhbSAtIHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgd2hvJ3MgdmFsdWUgaXMgcmVxdWVzdGVkDQotCSAqIEByZXR1cm4gLSB0aGUgdmFsdWUgcmVwcmVzZW50ZWQgYXMgYSBzdHJpbmcuIE51bGwgaWYgc3VjaCBwYXJhbWV0ZXIgY2Fubm90IGJlIGZvdW5kIG9yIGhhcyBhIHZhbHVlIG9mIG51bGwuDQotCSAqIEB0aHJvd3MgLSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBwYXJhbSBpcyBudWxsDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5VmFsdWUoU3RyaW5nIHBhcmFtKTsNCi0JCQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgVCwgdG8gd2hpY2ggdGhpcyBhbm5vdGF0dGlvbiBpcyBhc3NvY2lhdGVkLg0KLQkgKi8NCi0gICAgcHVibGljIFQgZ2V0QXBwbGllZEVsZW1lbnQoKTsNCi0gICAgICAgIA0KLSAgICANCi0vL0Zyb20gSUFubm90YXR0aW9uQmFzZSAgICANCi0JLyoqDQotCSAqIEByZXR1cm4gLSBhbm5vdGF0aW9uIG5hbWUNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKTsNCi0JDQotCS8qKg0KLQkgKiBHZXRzIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBsb2NhdGlvbiBpbiB0aGUgc291cmNlIGNvZGUuDQotCSAqIA0KLQkgKiBAcmV0dXJuIElMb2NhdG9yDQotCSAqLw0KLQlwdWJsaWMgSUxvY2F0b3IgZ2V0TG9jYXRvcigpOw0KLQkNCi0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JQW5ub3RhdGlvbkJhc2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSUFubm90YXRpb25CYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJmOTAwZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JQW5ub3RhdGlvbkJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NYWxmb3JtZWRUcmVlRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEJhc2UgaW50ZXJmYWNlIHJlcHJlc2VudGluZyBBbm5vdGF0aW9uIGFuZCB0aGUgZnVuY3Rpb25hbGl0eSwgcmVxdWlyZWQgYnkgaXQuDQotICoNCi0gKiBAYXV0aG9yIFBsYW1lbiBQYXZsb3YNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElBbm5vdGF0aW9uQmFzZTxUIGV4dGVuZHMgSUphdmFFbGVtZW50Pg0KLXsNCi0JLyoqIHNpbXBsZSBhbm5vdGF0aW9uIHR5cGUgSUQgKi8NCi0JcHVibGljIGZpbmFsIGludCBTSU1QTEVfQU5OT1RBVElPTiA9IDE7DQotDQotCS8qKiBzaW5nbGUgZWxlbWVudCBhbm5vdGF0aW9uIHR5cGUgSUQgKi8NCi0JcHVibGljIGZpbmFsIGludCBTSU5HTEVfRUxFTUVOVF9BTk5PVEFUSU9OID0gMjsNCi0NCi0JLyoqIGNvbXBsZXggYW5ub3RhdGlvbiB0eXBlIElEICovDQotCXB1YmxpYyBmaW5hbCBpbnQgQ09NUExFWF9BTk5PVEFUSU9OID0gNDsNCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gLSBhbm5vdGF0aW9uIG5hbWUNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKTsNCi0NCi0JLyoqDQotCSAqIEdldHRpbmcgdGhlIFR5cGVJRCBvZiBjdXJyZW50IEFubm90YXRpb24NCi0JICogDQotCSAqIEByZXR1cm4gSW50ZWdlciB2YWx1ZSwgd2hpY2ggcmVwcmVzZW50cyB0aGUgQW5ub3RhdGlvbiBUeXBlSUQNCi0JICovDQotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpOw0KLQkNCi0JLyoqDQotCSAqIEFkZHMgY3VycmVudCBBbm5vdGF0aW9uIHRvIHNwZWNpZmljIElKYXZhRWxlbWVudC4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGhhdmUgSU1lbWJlciBhcyBwYXJhbWV0ZXIgYmVjYXVzZSB0aGVyZSBpcyBJVHlwZVBhcmFtZXRlciBhcyBwYXJhbWV0ZXIgd2hlbiBhZGQgdG8gVHlwUGFyYW1ldGVyIGlzIGV4ZWN1dGVkLg0KLQkgKiANCi0JICogQHBhcmFtIGphdmFFbGVtZW50DQotCSAqIA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDx0dD5qYXZhRWxlbWVudDwvdHQ+IGlzIG51bGwuDQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIGNhc2UgPGNvZGU+amF2YUVsZW1lbnQ8L2NvZGU+IGlzIG5vdCBvZiB0aGUgY29ycmVjdCB0eXBlLiBTdXBwb3J0ZWQgdHlwZXMgYXJlOiBJVHlwZSwgSU1ldGhvZCwgSUZpZWxkLCBJVHlwZVBhcmFtZXRlci4NCi0JICogQHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uLg0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0QXBwbGllZEVsZW1lbnQoVCBqYXZhRWxlbWVudCkgdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb247DQotCQ0KLQkvKioNCi0JICogUmVtb3ZlIHRoZSBjdXJyZW50IEFubm90YXRpb24gZnJvbSB0aGUgYXNzb2NpYXRlZCBKYXZhRWxlbWVudC4NCi0JICogDQotCSAqIEB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gDQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiANCi0JICogQHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uIA0KLQkgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiANCi0JICogQHRocm93cyBNYWxmb3JtZWRUcmVlRXhjZXB0aW9uIA0KLQkgKi8NCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgdGhyb3dzIE1hbGZvcm1lZFRyZWVFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgQmFkTG9jYXRpb25FeGNlcHRpb247DQotCQ0KLQkvKioNCi0JICogR2V0cyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgbG9jYXRpb24gaW4gdGhlIHNvdXJjZSBjb2RlLg0KLQkgKiANCi0JICogQHJldHVybiBJTG9jYXRvcg0KLQkgKi8NCi0JcHVibGljIElMb2NhdG9yIGdldExvY2F0b3IoKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JQW5ub3RhdGlvbkluc3BlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JQW5ub3RhdGlvbkluc3BlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjM2YwNWY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSUFubm90YXRpb25JbnNwZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotDQotcHVibGljIGludGVyZmFjZSBJQW5ub3RhdGlvbkluc3BlY3Rvcg0KLXsNCi0JLyoqDQotCSAqIFJldHJpZXZlcyBhbGwgVHlwZSBsZXZlbCBBbm5vdGF0aW9ucyBmcm9tIDxjb2RlPnR5cGU8L2NvZGU+LCB3aGljaCBpcyB1c2VkIHRvIGluc3RhbnRpYXRlIHRoZSBJQW5ub3RhdGlvbkluc3BlY3Rvci4NCi0JICogDQotCSAqIEByZXR1cm4gY29udGFpbmVkIFR5cGUgbGV2ZWwgQW5ub3RhdGlvbnMgaW4gPGNvZGU+dHlwZTwvY29kZT4gb3IgZW1wdHkgQ29sbGVjdGlvbiBpZiBub3QgcHJlc2VudC4NCi0JICoNCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICovDQotCUNvbGxlY3Rpb248SUFubm90YXRpb248SVR5cGU+PiBpbnNwZWN0VHlwZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBSZXRyaWV2ZXMgYSBUeXBlIGxldmVsIEFubm90YXRpb24gd2l0aCBzcGVjaWZpYyBRTmFtZSBmcm9tIDxjb2RlPnR5cGU8L2NvZGU+LCB3aGljaCBpcyB1c2VkIHRvIGluc3RhbnRpYXRlIHRoZSBJQW5ub3RhdGlvbkluc3BlY3Rvci4NCi0JICogDQotCSAqIEBwYXJhbSBhbm5vdGF0aW9uUU5hbWUgLSBzcGVjaWZpZWQgUU5hbWUgZm9yIHRoZSBBbm5vdGF0aW9uLg0KLQkgKiANCi0JICogQHJldHVybiBUeXBlIGxldmVsIEFubm90YXRpb24gaW4gPGNvZGU+dHlwZTwvY29kZT4gb3IgPGNvZGU+bnVsbDwvY29kZT4sIGlmIHN1Y2ggQW5ub3RhdGlvbiBkbyBub3QgcHJlc2VudC4NCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+YW5ub3RhdGlvblFOYW1lPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+YW5ub3RhdGlvblFOYW1lPC9jb2RlPiBpcyBlbXB0eSBTdHJpbmcuDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLQlJQW5ub3RhdGlvbjxJVHlwZT4gaW5zcGVjdFR5cGUoZmluYWwgU3RyaW5nIGFubm90YXRpb25RTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIFJldHJpZXZlcyBhbGwgTWV0aG9kIGxldmVsIEFubm90YXRpb25zIGZyb20gPGNvZGU+bWV0aG9kPC9jb2RlPi4NCi0JICogDQotCSAqIEBwYXJhbSBtZXRob2QNCi0JICogDQotCSAqIEByZXR1cm4gY29udGFpbmVkIE1ldGhvZCBsZXZlbCBBbm5vdGF0aW9ucyBpbiA8Y29kZT5tZXRob2Q8L2NvZGU+IG9yIGVtcHR5IENvbGxlY3Rpb24gaWYgbm90IHByZXNlbnQuDQotCSAqIA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDx0dD5tZXRob2Q8L3R0PiBpcyBudWxsLg0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0gICBDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElNZXRob2Q+PiBpbnNwZWN0TWV0aG9kKElNZXRob2QgbWV0aG9kKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogUmV0cmlldmVzIGEgTWV0aG9kIGxldmVsIEFubm90YXRpb24gd2l0aCBzcGVjaWZpYyBRTmFtZSBmcm9tIDxjb2RlPm1ldGhvZDwvY29kZT4uDQotCSAqIA0KLQkgKiBAcGFyYW0gbWV0aG9kDQotCSAqIEBwYXJhbSBhbm5vdGF0aW9uUU5hbWUgLSBzcGVjaWZpZWQgUU5hbWUgZm9yIHRoZSBBbm5vdGF0aW9uLg0KLQkgKiANCi0JICogQHJldHVybiBjb250YWluZWQgTWV0aG9kIGxldmVsIEFubm90YXRpb24gaW4gPGNvZGU+bWV0aG9kPC9jb2RlPiBvciA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPHR0Pm1ldGhvZDwvdHQ+IG9yIDxjb2RlPmFubm90YXRpb25RTmFtZTwvY29kZT4gYXJlIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT5hbm5vdGF0aW9uUU5hbWU8L2NvZGU+IGlzIGVtcHR5IFN0cmluZy4NCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICovDQotICBJQW5ub3RhdGlvbjxJTWV0aG9kPiBpbnNwZWN0TWV0aG9kKElNZXRob2QgbWV0aG9kLCBmaW5hbCBTdHJpbmcgYW5ub3RhdGlvblFOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOw0KLQ0KLSAgICAvKioNCi0JICogUmV0cmlldmVzIGFsbCBGaWVsZCBsZXZlbCBBbm5vdGF0aW9ucyBmcm9tIDxjb2RlPmZpZWxkPC9jb2RlPi4NCi0JICogDQotCSAqIEBwYXJhbSBmaWVsZA0KLQkgKiANCi0JICogQHJldHVybiBjb250YWluZWQgRmlsZWQgbGV2ZWwgQW5ub3RhdGlvbnMgaW4gPGNvZGU+ZmllbGQ8L2NvZGU+IG9yIGVtcHR5IENvbGxlY3Rpb24gaWYgbm90IHByZXNlbnQuDQotCSAqIA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPmZpZWxkPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICovDQotICBDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElGaWVsZD4+IGluc3BlY3RGaWVsZChJRmllbGQgZmllbGQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247DQotICAgDQotICAgIC8qKg0KLQkgKiBSZXRyaWV2ZXMgYSBGaWVsZCBsZXZlbCBBbm5vdGF0aW9uIHdpdGggc3BlY2lmaWMgUU5hbWUgZnJvbSA8Y29kZT5maWVsZDwvY29kZT4uDQotCSAqIA0KLQkgKiBAcGFyYW0gZmllbGQNCi0JICogQHBhcmFtIGFubm90YXRpb25RTmFtZSAtIHNwZWNpZmllZCBRTmFtZSBmb3IgdGhlIEFubm90YXRpb24uDQotCSAqIA0KLQkgKiBAcmV0dXJuIGNvbnRhaW5lZCBGaWxlZCBsZXZlbCBBbm5vdGF0aW9ucyBpbiA8Y29kZT5maWVsZDwvY29kZT4gb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPmZpZWxkPC9jb2RlPiBvciA8Y29kZT5hbm5vdGF0aW9uUU5hbWU8L2NvZGU+IGFyZSA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+YW5ub3RhdGlvblFOYW1lPC9jb2RlPiBpcyBlbXB0eSBTdHJpbmcuDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLSAgSUFubm90YXRpb248SUZpZWxkPiBpbnNwZWN0RmllbGQoSUZpZWxkIGZpZWxkLCBmaW5hbCBTdHJpbmcgYW5ub3RhdGlvblFOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOw0KLQ0KLSAgICAvKioNCi0JICogUmV0cmlldmVzIGFsbCBUeXBlUGFyYW1ldGVyIGxldmVsIEFubm90YXRpb25zIGZyb20gPGNvZGU+cGFyYW08L2NvZGU+Lg0KLQkgKiANCi0JICogQHBhcmFtIHBhcmFtDQotCSAqIA0KLQkgKiBAcmV0dXJuIGNvbnRhaW5lZCBUeXBlUGFyYW1ldGVyIGxldmVsIEFubm90YXRpb25zIGluIDxjb2RlPnBhcmFtPC9jb2RlPiBvciBlbXB0eSBDb2xsZWN0aW9uIGlmIG5vdCBwcmVzZW50Lg0KLQkgKiANCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5wYXJhbTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLSAgQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4+IGluc3BlY3RQYXJhbShJVHlwZVBhcmFtZXRlciBwYXJhbSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsNCi0gICANCi0gICAgLyoqDQotCSAqIFJldHJpZXZlcyBhIFR5cGVQYXJhbWV0ZXIgbGV2ZWwgQW5ub3RhdGlvbiB3aXRoIHNwZWNpZmljIFFOYW1lIGZyb20gPGNvZGU+cGFyYW08L2NvZGU+Lg0KLQkgKiANCi0JICogQHBhcmFtIHBhcmFtDQotCSAqIEBwYXJhbSBhbm5vdGF0aW9uUU5hbWUgLSBzcGVjaWZpZWQgUU5hbWUgZm9yIHRoZSBBbm5vdGF0aW9uLg0KLQkgKiANCi0JICogQHJldHVybiBjb250YWluZWQgVHlwZVBhcmFtZXRlciBsZXZlbCBBbm5vdGF0aW9ucyBpbiA8Y29kZT5wYXJhbTwvY29kZT4gb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPnBhcmFtPC9jb2RlPiBvciA8Y29kZT5hbm5vdGF0aW9uUU5hbWU8L2NvZGU+IGFyZSA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+YW5ub3RhdGlvblFOYW1lPC9jb2RlPiBpcyBlbXB0eSBTdHJpbmcuDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLSAgSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IGluc3BlY3RQYXJhbShJVHlwZVBhcmFtZXRlciBwYXJhbSwgZmluYWwgU3RyaW5nIGFubm90YXRpb25RTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsNCi0gICANCi0gICANCi0gICANCi0JDQotLy8JLyoqDQotLy8JICogUmV0cmlldmVzIGFsbCBhbm5vdGF0aW9ucyBmcm9tIDxjb2RlPmphdmFFbGVtZW50PC9jb2RlPi4NCi0vLwkgKiANCi0vLwkgKiBAcGFyYW0gamF2YUVsZW1lbnQNCi0vLwkgKiANCi0vLwkgKiBAcmV0dXJuIGNvbnRhaW5lZCBhbm5vdGF0aW9ucyBpbiA8Y29kZT5qYXZhRWxlbWVudDwvY29kZT4gb3IgZW1wdHkgQ29sbGVhY3Rpb24gaWYgbm90IHByZXNlbnQuDQotLy8JICogDQotLy8JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8dHQ+amF2YUVsZW1lbnQ8L3R0PiBpcyBudWxsLg0KLS8vCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIGNhc2UgPGNvZGU+amF2YUVsZW1lbnQ8L2NvZGU+IGlzIG5vdCBvZiB0aGUgY29ycmVjdCB0eXBlLiBTdXBwb3J0ZWQgdHlwZXMgYXJlOiBJdHlwZSwgSU1ldGhvZCwgSUZpZWxkLg0KLS8vCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotLy8JICovDQotLy8JcHVibGljIENvbGxlY3Rpb248SUFubm90YXRpb24+IGluc3BlY3QoSUphdmFFbGVtZW50IGphdmFFbGVtZW50KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0lBbm5vdGF0aW9uUHJvcGVydHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSUFubm90YXRpb25Qcm9wZXJ0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYjkwYmNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSUFubm90YXRpb25Qcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnM7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLkF0dHJpYnV0ZVR5cGVFbnVtOw0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgSUFubm90YXRpb25Qcm9wZXJ0eQ0KLXsNCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpOw0KLQ0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKTsNCi0JDQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKTsNCi0JDQotCXB1YmxpYyBBdHRyaWJ1dGVUeXBlRW51bSBnZXRBdHRyaWJ1dGVUeXBlKCk7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSUFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNjYzc2OTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZVBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuQW5ub3RhdGlvblByb3BlcnR5Ow0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSBmb3IgYW5ub3RhdGlvbnMgY29udGFpbmVyLg0KLSAqIA0KLSAqIEBhdXRob3IgUGxhbWVuIFBhdmxvdg0KLSAqDQotICovDQotcHVibGljIGludGVyZmFjZSBJQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyDQotew0KLQlwdWJsaWMgdm9pZCBhZGRBbm5vdGF0aW9uUHJvcGVydHkoZmluYWwgQW5ub3RhdGlvblByb3BlcnR5IGFubm90YXRpb25Qcm9wZXJ0eSwgZmluYWwgRWxlbWVudFR5cGUgdGFyZ2V0KTsNCi0JDQotCXB1YmxpYyBTZXQ8SUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+PiBnZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucyhJVHlwZVBhcmFtZXRlciB0UGFyYW0pOw0KLQ0KLQlwdWJsaWMgU2V0PElBbm5vdGF0aW9uPElUeXBlPj4gZ2V0VHlwZUFubm90YXRpb25zKElUeXBlIHR5cGUpOw0KLQ0KLQlwdWJsaWMgU2V0PElBbm5vdGF0aW9uPElNZXRob2Q+PiBnZXRNZXRob2RBbm5vdGF0aW9ucyhJTWV0aG9kIG1ldGhvZCk7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSUxvY2F0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSUxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzQ3NjM2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0lMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9uczsNCi0NCi0vKioNCi0gKiBDbGFzcyB0aGF0IGhvbGRzIGluZm9ybWF0aW9uIHRvIGxvY2F0ZSBzcGVjaWZpYyByZWdpb24gaW4gdGhlIHNvdXJjZSBjb2RlIA0KLSAqDQotICovDQotcHVibGljIGludGVyZmFjZSBJTG9jYXRvcg0KLXsNCi0JLyoqDQotCSAqIEByZXR1cm4gdGhlIGxpbmUgbnVtYmVyIGluIHRoZSBzb3VyY2Ugd2hlcmUgdGhlIHJlZ2lvbiBwb2ludGVkIGJ5IHRoaXMgbG9jYXRvciBzdGFydHMgIA0KLQkgKi8NCi0JcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCk7DQotCQ0KLQ0KLQkvKioNCi0JICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGlzIHJlZ2lvbiBpbiBzb3VyY2UgY29kZQ0KLQkgKi8NCi0JcHVibGljIGludCBnZXRTdGFydFBvc2l0aW9uKCk7DQotCQ0KLQkvKioNCi0JICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSByZWdpb24NCi0JICovDQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCk7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSVBhcmFtVmFsdWVQYWlyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0lQYXJhbVZhbHVlUGFpci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZmU2ZTVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSVBhcmFtVmFsdWVQYWlyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9uczsNCi0NCi0vKioNCi0gKiBJbnRlcmZhY2UgcmVwcmVzZW50aW5nIHBhcmFtIHZhbHVlIHBhaXIgaW4gYW5ub3RhdGlvbi4gUGFyYW0gdmFsdWUgcGFpciBoYXMgdGhlIGZvbGxvd2luZyBmb3JtOiBwYXJhbT12YWx1ZQ0KLSAqIA0KLSAqIEBhdXRob3IgUGxhbWVuIFBhdmxvdg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSVBhcmFtVmFsdWVQYWlyDQotew0KLQkvKioNCi0JICogQHJldHVybiBwYXJhbSBuYW1lDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFBhcmFtKCk7DQotDQotCS8qKg0KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZQ0KLQkgKi8NCi0JcHVibGljIElWYWx1ZSBnZXRWYWx1ZSgpOw0KLQkNCi0JLyoqDQotCSAqIEdldHMgdGhlIGluZm9ybWF0aW9uIGFib3V0IGxvY2F0aW9uIGluIHRoZSBzb3VyY2UgY29kZS4NCi0JICogDQotCSAqIEByZXR1cm4gSUxvY2F0b3INCi0JICovDQotCXB1YmxpYyBJTG9jYXRvciBnZXRMb2NhdG9yKCk7DQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSVZhbHVlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0lWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMmM0YTRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSVZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9uczsNCi0NCi0vKioNCi0gKiBJbnRlcmZhY2UgcmVwcmVzZW50aW5nIGFydGlmYWN0IHZhbHVlIGluIGFubm90YXRpb24uDQotICogDQotICogQGF1dGhvciBQbGFtZW4gUGF2bG92DQotICovDQotcHVibGljIGludGVyZmFjZSBJVmFsdWUNCi17DQotCS8qKg0KLQkgKiBPYnRhaW5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB2YWx1ZS4gVGhlIG9idGFpbmVkIHN0cmluZyByZXByZXNlbnRhdGlvbiBjYW4gbGF0ZXIgb24gYmUgdXNlZCB0byBpbnN0YW50aWF0ZQ0KLQkgKiBhbiBpbnN0YW5jZSBvZiB0aGUgdHlwZSBvZiB0aGUgdmFsdWUgdGhhdCB3aWxsIGJlIGNvbnNpZGVkZXJlZCBlcXVhbCB0byB0aGUgcmV0dXJuZWQgdmFsdWUuDQotCSAqIDxwPg0KLQkgKiAJPGM+QEFubm90YXRpb25FeGFtcGxlKDEpPC9jPiAvL2Fubm9hdGlvbiB3aXRoIG9uZSBhdHRyaWJ1dGUvcGFyYW1ldGVyIGNhbGxlZCAidmFsdWUiIHdpdGggdmFsdWUgb2YgIjEiLiANCi0JICogPC9wPg0KLQkgKiBUaGUgdG9TdHJpbmcgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBzdHJpbmcgIjEiLCB3aGljaCBjYW4gbGF0ZXIgb24gYmUgdXNlZCBieSBJbnRlZ2VyLnBhcnNlKFN0cmluZykgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIEludGVnZXINCi0JICogZXF1YWwgdG8gdGhlIHZhbHVlIHJlcHJlc2VudGVkIGJ5IHRoZSBpbnRlZ2VyIGxpdGVyYWwgMQ0KLQkgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB2YWx1ZQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpOw0KLQkNCi0JLyoqDQotCSAqIEdldHMgdGhlIGluZm9ybWF0aW9uIGFib3V0IGxvY2F0aW9uIGluIHRoZSBzb3VyY2UgY29kZS4NCi0JICogDQotCSAqIEByZXR1cm4gSUxvY2F0b3INCi0JICovDQotCXB1YmxpYyBJTG9jYXRvciBnZXRMb2NhdG9yKCk7DQotCQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2NsYXp6L0FTVFV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2NsYXp6L0FTVFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDExOTk3ZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9jbGF6ei9BU1RVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmNsYXp6Ow0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbTsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RQYXJzZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BYnN0cmFjdFR5cGVEZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkZpZWxkRGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2REZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlRGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5yZXNvdXJjZXMuRmlsZVV0aWxzOw0KLQ0KLS8qKg0KLSAqIFV0aWxpdHkgY2xhc3MgdGhhdCBwcm92aWRlcyBoZWxwZXIgbWV0aG9kcyBmb3Ige0BsaW5rIEFTVH0gcHJvY2Vzc2luZy4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIEFTVFV0aWxzIA0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgQVNUVXRpbHMgaW5zdGFuY2U7DQotCQ0KLQlwcml2YXRlIEFTVFV0aWxzKCkgew0KLQkJLy8gZGlzYWJsZSBjb25zdHJ1Y3Rpb24NCi0JfQ0KLQkNCi0JLyoqDQotCSAqIEByZXR1cm4gY3JlYXRlIG5ldyBpbnN0YW5jZSBmb3IgdGhpcyB1dGlsaXR5DQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIEFTVFV0aWxzIGdldEluc3RhbmNlKCkgew0KLQkJaWYoaW5zdGFuY2U9PW51bGwpIHsNCi0JCQlpbnN0YW5jZSA9IG5ldyBBU1RVdGlscygpOyANCi0JCX0NCi0JCXJldHVybiBpbnN0YW5jZTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENyZWF0ZXMgQVNUIHRyZWUgb3V0IG9mIHtAbGluayBGaWxlfSBpbnN0YW5jZS4NCi0JICogQHBhcmFtIHNvdXJjZUZpbGUgamF2YSBjbGFzcyBmaWxlICANCi0JICogQHBhcmFtIG1vbml0b3IgcHJvZ3Jlc3MgbW9uaXRvcg0KLQkgKiBAcmV0dXJuIGNyZWF0ZWQge0BsaW5rIEFTVE5vZGV9DQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBBU1ROb2RlIGNyZWF0ZUFTVChmaW5hbCBGaWxlIHNvdXJjZUZpbGUsIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIA0KLQl7DQotCQludWxsQ2hlY2tQYXJhbShzb3VyY2VGaWxlLCAic291cmNlRmlsZSIpOyAvLyROT04tTkxTLTEkDQotCQkNCi0JCWZpbmFsIEFTVFBhcnNlciBwYXJzZXIgPSBBU1RQYXJzZXIubmV3UGFyc2VyKEFTVC5KTFMzKTsNCi0JCXBhcnNlci5zZXRTb3VyY2UoRmlsZVV0aWxzLmdldEluc3RhbmNlKCkuZ2V0RmlsZUNvbnRlbnQoc291cmNlRmlsZSkudG9DaGFyQXJyYXkoKSk7DQotCQlyZXR1cm4gcGFyc2VyLmNyZWF0ZUFTVChtb25pdG9yKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyB7QGxpbmsgQVNUfSB0cmVlIG91dCBvZiB7QGxpbmsgSVR5cGV9IGluc3RhbmNlLg0KLQkgKiBAcGFyYW0gc291cmNlVHlwZSBqYXZhIGNsYXNzDQotCSAqIEBwYXJhbSBtb25pdG9yIHByb2dyZXNzIG1vbml0b3INCi0JICogQHJldHVybiBjcmVhdGVkIHtAbGluayBBU1ROb2RlfSBpbnN0YW5jZQ0KLQkgKi8NCi0JcHVibGljIENvbXBpbGF0aW9uVW5pdCBjcmVhdGVDb21waWxhdGlvblVuaXQoZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VDdSwgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQ0KLQl7DQotCQludWxsQ2hlY2tQYXJhbShzb3VyY2VDdSwgInNvdXJjZUN1Iik7IC8vJE5PTi1OTFMtMSQNCi0JCWZpbmFsIEFTVFBhcnNlciBwYXJzZXIgPSBBU1RQYXJzZXIubmV3UGFyc2VyKEFTVC5KTFMzKTsNCi0JCXBhcnNlci5zZXRTb3VyY2Uoc291cmNlQ3UpOw0KLQkJcGFyc2VyLnNldEJpbmRpbmdzUmVjb3ZlcnkoZmFsc2UpOw0KLQkJcmV0dXJuIChDb21waWxhdGlvblVuaXQpcGFyc2VyLmNyZWF0ZUFTVChtb25pdG9yKTsNCi0JfQkJDQotCQ0KLQkvKioNCi0JICogRmluZHMge0BsaW5rIEZpZWxkRGVjbGFyYXRpb259IGluIHtAbGluayBUeXBlRGVjbGFyYXRpb259IHdpdGggbmFtZSA8Y29kZT5maWVsZFR5cGUuZ2V0RWxlbWVudE5hbWUoKTwvY29kZT4uDQotCSAqIA0KLQkgKiBAcGFyYW0gZmllbGRUeXBlDQotCSAqIEBwYXJhbSB0eXBlRGVjbGFyYXRpb24NCi0JICogQHJldHVybiBmb3VuZCBvYmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4NCi0JICovDQotCXB1YmxpYyBGaWVsZERlY2xhcmF0aW9uIGdldEZpZWxkRGVjbGFyYXRpb24oZmluYWwgSUZpZWxkIGZpZWxkVHlwZSwgZmluYWwgVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbikNCi0Jew0KLQkJZm9yIChGaWVsZERlY2xhcmF0aW9uIGZkIDogdHlwZURlY2xhcmF0aW9uLmdldEZpZWxkcygpKQ0KLQkJew0KLQkJCWZvciAoT2JqZWN0IGZyIDogZmQuZnJhZ21lbnRzKCkpDQotCQkJew0KLQkJCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgdmRmID0gKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCkgZnI7DQotCQkJCWlmICh2ZGYuZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhmaWVsZFR5cGUuZ2V0RWxlbWVudE5hbWUoKSkpDQotCQkJCXsNCi0JCQkJCXJldHVybiBmZDsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHJpdmF0ZSBib29sZWFuIGNvbXBhcmVNZXRob2RQYXJhbXMoZmluYWwgSU1ldGhvZCBtZXRob2RUeXBlLCBmaW5hbCBNZXRob2REZWNsYXJhdGlvbiBtZCkNCi0Jew0KLQkJTGlzdDxTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPiBsaXN0ID0gbWQucGFyYW1ldGVycygpOw0KLQkJaWYgKGxpc3Quc2l6ZSgpID09IG1ldGhvZFR5cGUuZ2V0TnVtYmVyT2ZQYXJhbWV0ZXJzKCkpDQotCQl7DQotCQkJU3RyaW5nW10gcGFyYW1ldGVyVHlwZXMgPSBtZXRob2RUeXBlLmdldFBhcmFtZXRlclR5cGVzKCk7DQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKQ0KLQkJCXsNCi0JCQkJaWYgKCFpc1NhbWVQYXJhbShwYXJhbWV0ZXJUeXBlc1tpXSwgKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pIGxpc3QuZ2V0KGkpKSkNCi0JCQkJew0KLQkJCQkJcmV0dXJuIGZhbHNlOw0KLQkJCQl9DQotCQkJfQ0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCQ0KLQlwcml2YXRlIGJvb2xlYW4gaXNTYW1lUGFyYW0oZmluYWwgU3RyaW5nIHR5cGUsIGZpbmFsIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gc3ZEZWNsKQ0KLQl7DQotCQlyZXR1cm4gdHlwZS5lcXVhbHMoZ2V0VHlwZVNpZ25hdHVyZShzdkRlY2wpKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFJldHJpZXZlcyB0eXBlIHNpZ25hdHVyZSBmcm9tIHtAbGluayBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9ufS4gQXMge0BsaW5rIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb259IHJldHVybnMgb25seSB0aGUgY2xlYW4gdHlwZSBpbiBjYXNlDQotCSAqIGRlY2xhcmF0aW9uIG9mIHR5cGUgPHR0PmludCBwYXJhQXJyW11bXTwvdHQ+IGlzIGluIGNvZGUgdGhlIG1ldGhvZCBhZGRzIGFycmF5IGlkZW50aWZpZXJzIGZvciB0eXBlIGRlY2xhcmF0aW9uIGludCB0aGlzIGNhc2UuDQotCSAqIA0KLQkgKiBAcGFyYW0gc3ZEZWNsDQotCSAqIEByZXR1cm4gdGhlIHNpZ25hdHlyZSBmb3IgdGhlIHR5cGUNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZVNpZ25hdHVyZShmaW5hbCBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHN2RGVjbCkNCi0Jew0KLQkJU3RyaW5nIHR5cGVOYW1lID0gY3JlYXRlRGltZW5zaW9uZWRUeXBlTmFtZShTaWduYXR1cmUuY3JlYXRlVHlwZVNpZ25hdHVyZShzdkRlY2wuZ2V0VHlwZSgpLnRvU3RyaW5nKCksIGZhbHNlKSwgc3ZEZWNsLmdldEV4dHJhRGltZW5zaW9ucygpKTsNCi0NCi0JCS8vIFZhcmFyZ3MgYXBwZW5kIGFub3RoZXIgZGltZW5zaW9uDQotCQlpZiAoc3ZEZWNsLmlzVmFyYXJncygpKQ0KLQkJew0KLQkJCXR5cGVOYW1lID0gU2lnbmF0dXJlLkNfQVJSQVkgKyB0eXBlTmFtZTsNCi0JCX0NCi0NCi0JCXJldHVybiB0eXBlTmFtZTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBTdHJpbmcgY3JlYXRlRGltZW5zaW9uZWRUeXBlTmFtZShmaW5hbCBTdHJpbmcgdHlwZU5hbWUsIGZpbmFsIGludCBkaW1lbnNpb25zKQ0KLQl7DQotCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKHR5cGVOYW1lKTsNCi0JCWZpbmFsIFN0cmluZyBkaW1lbnNpb25TdHJpbmcgPSBjcmVhdGVEaW1lbnNpb25TdHJpbmcoZGltZW5zaW9ucyk7DQotCQl3aGlsZSghcmVzdWx0LnRvU3RyaW5nKCkuc3RhcnRzV2l0aChkaW1lbnNpb25TdHJpbmcpKQ0KLQkJew0KLQkJCXJlc3VsdC5pbnNlcnQoMCwgU2lnbmF0dXJlLkNfQVJSQVkpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7DQotCX0NCi0JDQotCXByaXZhdGUgU3RyaW5nIGNyZWF0ZURpbWVuc2lvblN0cmluZyhmaW5hbCBpbnQgZGltZW5zaW9ucykNCi0Jew0KLQkJZmluYWwgY2hhcltdIGRpbWVuc2lvbkNoYXJzID0gbmV3IGNoYXJbZGltZW5zaW9uc107DQotCQlBcnJheXMuZmlsbChkaW1lbnNpb25DaGFycywgU2lnbmF0dXJlLkNfQVJSQVkpOw0KLQkJcmV0dXJuIG5ldyBTdHJpbmcoZGltZW5zaW9uQ2hhcnMpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogRmluZHMge0BsaW5rIE1ldGhvZERlY2xhcmF0aW9ufSBpbiB7QGxpbmsgVHlwZURlY2xhcmF0aW9ufSBoYXZpbmcgbmFtZSA8Y29kZT5tZXRob2RUeXBlLmdldEVsZW1lbnROYW1lKCk8L2NvZGU+Lg0KLQkgKiANCi0JICogQHBhcmFtIG1ldGhvZFR5cGUNCi0JICogQHBhcmFtIHR5cGVEZWNsYXJhdGlvbg0KLQkgKiBAcmV0dXJuIGZvdW5kIG9iamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKi8NCi0JcHVibGljICBNZXRob2REZWNsYXJhdGlvbiBnZXRNZXRob2REZWNsYXJhdGlvbihmaW5hbCBJTWV0aG9kIG1ldGhvZFR5cGUsIGZpbmFsIFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24pDQotCXsNCi0JCWZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWQgOiB0eXBlRGVjbGFyYXRpb24uZ2V0TWV0aG9kcygpKQ0KLQkJew0KLQkJCWlmIChtZC5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKG1ldGhvZFR5cGUuZ2V0RWxlbWVudE5hbWUoKSkpDQotCQkJew0KLQkJCQlpZiAoY29tcGFyZU1ldGhvZFBhcmFtcyhtZXRob2RUeXBlLCBtZCkpDQotCQkJCXsNCi0JCQkJCXJldHVybiBtZDsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQkvKioNCi0JICogUmV0cmlldmVzIHtAbGluayBUeXBlRGVjbGFyYXRpb259IGZyb20ge0BsaW5rIENvbXBpbGF0aW9uVW5pdH0gd2l0aCBuYW1lIDx0dD5jbGFzc05hbWU8L3R0Pg0KLQkgKiANCi0JICogQHBhcmFtIGNsYXNzTmFtZQ0KLQkgKiBAcGFyYW0gdW5pdA0KLQkgKiBAcmV0dXJuIGZvdW5kIHtAbGluayBUeXBlRGVjbGFyYXRpb259IG9yIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqLw0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHVibGljIEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIGdldFR5cGVEZWNsYXJhdGlvbihmaW5hbCBTdHJpbmcgY2xhc3NOYW1lLCBmaW5hbCBDb21waWxhdGlvblVuaXQgdW5pdCkNCi0Jew0KLQkJQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gbnVsbDsNCi0JCS8vIGxvb2tpbmcgdXAgdGhlIHNlbGVjdGVkIHR5cGUNCi0JCWZvciAoT2JqZWN0IHR5cGVPYmplY3QgOiB1bml0LnR5cGVzKCkpDQotCQl7DQotCQkJQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gdG1wVHlwZURlY2xhcmF0aW9uID0gKEFic3RyYWN0VHlwZURlY2xhcmF0aW9uKSB0eXBlT2JqZWN0Ow0KLQkJCWlmICh0bXBUeXBlRGVjbGFyYXRpb24uZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhjbGFzc05hbWUpKQ0KLQkJCXsNCi0JCQkJdHlwZURlY2xhcmF0aW9uID0gdG1wVHlwZURlY2xhcmF0aW9uOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWlmICh0eXBlRGVjbGFyYXRpb24gPT0gbnVsbCkNCi0JCXsNCi0JCQlMaXN0PEFic3RyYWN0VHlwZURlY2xhcmF0aW9uPiBsaXN0ID0gdW5pdC50eXBlcygpOw0KLQkJCXR5cGVEZWNsYXJhdGlvbiA9IGdldElubmVyQ2xhc3MobGlzdC50b0FycmF5KG5ldyBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbltsaXN0LnNpemUoKV0pLCBjbGFzc05hbWUpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gdHlwZURlY2xhcmF0aW9uOw0KLQl9DQotCQ0KLQlwcml2YXRlIEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIGdldElubmVyQ2xhc3MoZmluYWwgQWJzdHJhY3RUeXBlRGVjbGFyYXRpb25bXSB0eXBlcywgZmluYWwgU3RyaW5nIGNsYXNzTmFtZSkNCi0Jew0KLQkJQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gcmVzdWx0ID0gbnVsbDsNCi0JCWZvciAoQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gYWJzdHJhY3RUeXBlIDogdHlwZXMpDQotCQl7DQotCQkJaWYgKGFic3RyYWN0VHlwZS5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKGNsYXNzTmFtZSkpIHsNCi0JCQkJcmV0dXJuIGFic3RyYWN0VHlwZTsNCi0JCQl9DQotDQotCQkJaWYgKCEoYWJzdHJhY3RUeXBlIGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKSkgew0KLQkJCQljb250aW51ZTsNCi0JCQl9DQotCQkJDQotCQkJcmVzdWx0ID0gZ2V0SW5uZXJDbGFzcygoQWJzdHJhY3RUeXBlRGVjbGFyYXRpb25bXSkgKChUeXBlRGVjbGFyYXRpb24pIGFic3RyYWN0VHlwZSkuZ2V0VHlwZXMoKSwgY2xhc3NOYW1lKTsNCi0JCQlpZiAocmVzdWx0ICE9IG51bGwpIHsNCi0JCQkJcmV0dXJuIHJlc3VsdDsNCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gbnVsbDsNCi0JfQkNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9leGNlcHRpb24vTG9jYWxpemVkRXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2V4Y2VwdGlvbi9Mb2NhbGl6ZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWNlMDg0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2V4Y2VwdGlvbi9Mb2NhbGl6ZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmV4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlcjsNCi0NCi0NCi0NCi0vKioNCi0gKiBUaGlzIGlzIGJhc2UgY2xhc3MgZm9yIGFsbCBDSEVDS0VEIGV4Y2VwdGlvbnMgZm9yIHRoZSBXUyBUb29scw0KLSAqIHRvb2xzZXQuIFRoaXMgZXhjZXB0aW9uIGNvcnJlY3RseSBvdmVycmlkZXMgZ2V0TG9jYWxpemVkTWVzc2FnZSgpDQotICogb2YgRXhjZXB0aW9uIGNsYXNzIGFuZCBwcm92aWRlIHByb3BlciBsb2NhbGl6ZWQgbWVzc2FnZS4NCi0gKiBUbyBhY2hpZXZlIHRoYXQgdGhlcmUgaXMgYSBsaW1pdGF0aW9uIC0gaXQgd2lsbCBiZSBpbXBvc3NpYmxlIHRvIHJldHVybiBsb2NhbGl6ZWQNCi0gKiBtZXNzYWdlIGlmIGl0IGhhdmVuJ3QgYmVlbiBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yIG9mIGV4Y2VwdGlvbiwgc28gdGhlcmUgaXMgbm8NCi0gKiBjb25zdHJ1Y3RvciB3aXRob3V0IGxvY2FsaXplZCBtZXNzYWdlLg0KLSAqIA0KLSAqIEBhdXRob3IgTWxhZGVuIFRvbW92DQotICoqLw0KLQ0KLXB1YmxpYyBjbGFzcyBMb2NhbGl6ZWRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gew0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsNCi0JDQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGxvY2FsaXplZE1lc3NhZ2U7DQotCQ0KLQkvKioNCi0JICogQ29uc3RydWN0cyBleGNlcHRpb24gd2l0aCBhYmlsaXR5IHRvIHByb3ZpZGUgbG9jYWxpemVkIG1lc3NhZ2UNCi0JICogQHBhcmFtIG1lc3NhZ2UgLSB0aGUgZGV0YWlsIG1lc3NhZ2UgKHdoaWNoIGlzIHNhdmVkIGZvciBsYXRlciByZXRyaWV2YWwNCi0gICAgICogICAgICAgICBieSB0aGUge0BsaW5rICNnZXRNZXNzYWdlKCl9IG1ldGhvZCkNCi0JICogQHBhcmFtIGxvY2FsaXplZE1lc3NhZ2UgLSB0aGUgbG9jYWxpemVkIG1lc3NhZ2UgKHdoaWNoIGlzIHNhdmVkIGZvciBsYXRlciByZXRyaWV2YWwNCi0gICAgICogICAgICAgICBieSB0aGUge0BsaW5rICNnZXRMb2NhbGl6ZWRNZXNzYWdlKCl9IG1ldGhvZCkNCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gIC0gaW4gY2FzZSBsb2NhbGl6ZWQgbWVzc2FnZSBpcyBudWxsDQotCSAqICovDQotCXB1YmxpYyBMb2NhbGl6ZWRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBsb2NhbGl6ZWRNZXNzYWdlKSB7DQotCQlzdXBlcihtZXNzYWdlKTsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShsb2NhbGl6ZWRNZXNzYWdlLCAibG9jYWxpemVkTWVzc2FnZSIpOyAvLyROT04tTkxTLTEkDQotCQl0aGlzLmxvY2FsaXplZE1lc3NhZ2UgPSBsb2NhbGl6ZWRNZXNzYWdlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RzIGV4Y2VwdGlvbiB3aXRoIGFiaWxpdHkgdG8gcHJvdmlkZSBsb2NhbGl6ZWQgbWVzc2FnZQ0KLQkgKiBAcGFyYW0gbWVzc2FnZSAtIHRoZSBkZXRhaWwgbWVzc2FnZSAod2hpY2ggaXMgc2F2ZWQgZm9yIGxhdGVyIHJldHJpZXZhbA0KLSAgICAgKiAgICAgICAgIGJ5IHRoZSB7QGxpbmsgI2dldE1lc3NhZ2UoKX0gbWV0aG9kKQ0KLQkgKiBAcGFyYW0gbG9jYWxpemVkTWVzc2FnZSAtIHRoZSBsb2NhbGl6ZWQgbWVzc2FnZSAod2hpY2ggaXMgc2F2ZWQgZm9yIGxhdGVyIHJldHJpZXZhbA0KLSAgICAgKiAgICAgICAgIGJ5IHRoZSB7QGxpbmsgI2dldExvY2FsaXplZE1lc3NhZ2UoKX0gbWV0aG9kKQ0KLQkgKiBAcGFyYW0gY2F1c2UgLSAgY2F1c2UgdGhlIGNhdXNlICh3aGljaCBpcyBzYXZlZCBmb3IgbGF0ZXIgcmV0cmlldmFsIGJ5IHRoZQ0KLSAgICAgKiAgICAgICAgIHtAbGluayAjZ2V0Q2F1c2UoKX0gbWV0aG9kKS4NCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gIC0gaW4gY2FzZSBsb2NhbGl6ZWQgbWVzc2FnZSBpcyBudWxsDQotCSAqICovDQotCQ0KLQlwdWJsaWMgTG9jYWxpemVkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgbG9jYWxpemVkTWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7DQotCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0obG9jYWxpemVkTWVzc2FnZSwgImxvY2FsaXplZE1lc3NhZ2UiKTsgLy8kTk9OLU5MUy0xJA0KLQkJdGhpcy5sb2NhbGl6ZWRNZXNzYWdlID0gbG9jYWxpemVkTWVzc2FnZTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFJldHVybnMgbG9jYWxpemVkIG1lc3NhZ2Ugd2l0aCB3aGljaCB0aGUgZXhjZXB0aW9uIHdhcyBjb25zdHJ1Y3RlZC4qLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyBnZXRMb2NhbGl6ZWRNZXNzYWdlKCkgew0KLQkJcmV0dXJuIGxvY2FsaXplZE1lc3NhZ2U7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9leGNlcHRpb24vTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2V4Y2VwdGlvbi9NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGEyMTI5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2V4Y2VwdGlvbi9NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmV4Y2VwdGlvbjsNCi0NCi0NCi0vKioNCi0gKiBJbmRpY2F0ZXMgdGhhdCBhIHJlc291cmNlIG9mIGFueSBraW5kIGNvdWxkbid0IGJlIGZvdW5kIGJ1dCB0aGlzIHdhcyBleHBlY3RlZC4NCi0gKiANCi0gKiBAYXV0aG9yIEpvZXJnIERlaG1lbA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZXh0ZW5kcyBMb2NhbGl6ZWRFeGNlcHRpb24NCi17DQotDQotCS8qKg0KLQkgKiANCi0JICovDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOw0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSB3aXRoIGEgbWVzc2FnZSBhbmQgYSBsb2NhbGl6ZWQgbWVzc2FnZS4NCi0JICogDQotCSAqIEBwYXJhbSBtZXNzYWdlDQotCSAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQ0KLQkgKiBAcGFyYW0gbG9jYWxpemVkTWVzc2FnZQ0KLQkgKiAgICAgICAgICAgIGxvY2FsaXplZCBtZXNzYWdlDQotCSAqLw0KLQlwdWJsaWMgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBTdHJpbmcgbG9jYWxpemVkTWVzc2FnZSkNCi0Jew0KLQkJc3VwZXIobWVzc2FnZSwgbG9jYWxpemVkTWVzc2FnZSk7CQkNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSB3aXRoIG1lc3NhZ2UsIGxvY2FsaXplZCBtZXNzYWdlIGFuZCBjYXVzaW5nIGV4Y2VwdGlvbi4NCi0JICogDQotCSAqIEBwYXJhbSBtZXNzYWdlDQotCSAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQ0KLQkgKiBAcGFyYW0gbG9jYWxpemVkTWVzc2FnZQ0KLQkgKiAgICAgICAgICAgIGxvY2FsaXplZCBtZXNzYWdlDQotCSAqIEBwYXJhbSBjYXVzZQ0KLQkgKiAgICAgICAgICAgIGNhdXNpbmcgZXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBTdHJpbmcgbG9jYWxpemVkTWVzc2FnZSwgZmluYWwgVGhyb3dhYmxlIGNhdXNlKQ0KLQl7DQotCQlzdXBlcihtZXNzYWdlLCBsb2NhbGl6ZWRNZXNzYWdlLCBjYXVzZSk7CQkNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ZhY2V0cy9GYWNldFV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ZhY2V0cy9GYWNldFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU4OGRhN2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9mYWNldHMvRmFjZXRVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmZhY2V0czsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsNCi0NCi0NCi1wdWJsaWMgY2xhc3MgRmFjZXRVdGlscyBpbXBsZW1lbnRzIElGYWNldFV0aWxzDQotew0KLQkvKioNCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICBpZiA8Yz5wcm9qZWN0PC9jPiBvciA8Yz5mYWNldElkczwvYz4gaXMgbnVsbA0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaGFzQW55RmFjZXQoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nLi4uIGZhY2V0SWRzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0ocHJvamVjdCk7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0oZmFjZXRJZHMpOw0KLQ0KLQkJaWYgKCFpc0ZhY2V0ZWRQcm9qZWN0KHByb2plY3QpKQ0KLQkJew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0NCi0JCWZpbmFsIElGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCA9IGdldEZhY2V0ZWRQcm9qZWN0KHByb2plY3QpOw0KLQkJZm9yIChTdHJpbmcgZmFjZXRJZCA6IGZhY2V0SWRzKQ0KLQkJew0KLQkJCWZpbmFsIElQcm9qZWN0RmFjZXQgZmFjZXQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoZmFjZXRJZCk7DQotCQkJaWYgKGZhY2V0ZWRQcm9qZWN0Lmhhc1Byb2plY3RGYWNldChmYWNldCkpDQotCQkJew0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JcHVibGljIGJvb2xlYW4gaGFzRmFjZXRXaXRoVmVyc2lvbihJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgZmFjZXRWZXJzaW9uLCBTdHJpbmcgZmFjZXRJZCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJcmV0dXJuIGhhc0ZhY2V0V2l0aFZlcnNpb24ocHJvamVjdCwgZmFjZXRWZXJzaW9uLCBmYWNldElkLCB0cnVlKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY2V0ZWRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCVNldDxJRmFjZXRlZFByb2plY3Q+IGZhY2V0ZWRQcm9qZWN0cyA9IGdldEFsbFdvcmtzcGFjZUZhY2V0ZWRQcm9qZWN0cygpOw0KLQkJZmluYWwgSXRlcmF0b3I8SUZhY2V0ZWRQcm9qZWN0PiBpID0gZmFjZXRlZFByb2plY3RzLml0ZXJhdG9yKCk7DQotCQl3aGlsZSAoaS5oYXNOZXh0KCkpDQotCQl7DQotCQkJZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZwID0gKElGYWNldGVkUHJvamVjdCkgaS5uZXh0KCk7DQotCQkJaWYgKHByb2plY3QuZXF1YWxzKGZwLmdldFByb2plY3QoKSkpDQotCQkJew0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JcHVibGljIGJvb2xlYW4gaGFzRmFjZXRXaXRoVmVyc2lvbihJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgZmFjZXRWZXJzaW9uLCBTdHJpbmcgZmFjZXRJZCwgYm9vbGVhbiBhY2NlcHRIaWdoZXJGYWNldFZlcnNpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShwcm9qZWN0KTsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShmYWNldFZlcnNpb24pOw0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKGZhY2V0SWQpOw0KLQ0KLQkJaWYgKCFpc0ZhY2V0ZWRQcm9qZWN0KHByb2plY3QpKQ0KLQkJew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0NCi0JCVNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gYWxsRmFjZXRzVmVyc2lvbnMgPSBnZXRQcm9qZWN0RmFjZXRzKHByb2plY3QpOw0KLQkJZm9yIChJUHJvamVjdEZhY2V0VmVyc2lvbiB2ZXIgOiBhbGxGYWNldHNWZXJzaW9ucykNCi0JCXsNCi0JCQlpZiAodmVyLmdldFByb2plY3RGYWNldCgpLmdldElkKCkuZXF1YWxzKGZhY2V0SWQpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIGlzRmFjZXRBY2NlcHRhYmxlKHZlciwgZmFjZXRWZXJzaW9uLCBhY2NlcHRIaWdoZXJGYWNldFZlcnNpb24pOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQlwcml2YXRlIGJvb2xlYW4gaXNGYWNldEFjY2VwdGFibGUoSVByb2plY3RGYWNldFZlcnNpb24gZmFjZXRWZXJzaW9uLCBTdHJpbmcgZmFjZXRWZXJzaW9uSWQsIGJvb2xlYW4gYWNjZXB0SGlnaGVyRmFjZXRWZXJzaW9uKQ0KLQkJCQkJCQkJCXRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCWFzc2VydCBmYWNldFZlcnNpb24gIT0gbnVsbDsNCi0NCi0JCS8vIENoZWNrIGZvciBleGFjdCB2ZXJzaW9uDQotCQlpZiAoIWFjY2VwdEhpZ2hlckZhY2V0VmVyc2lvbikNCi0JCXsNCi0JCQlyZXR1cm4gZmFjZXRWZXJzaW9uLmdldFZlcnNpb25TdHJpbmcoKS5lcXVhbHMoZmFjZXRWZXJzaW9uSWQpOw0KLQkJfQ0KLQ0KLQkJQ29tcGFyYXRvcjxTdHJpbmc+IGNvbXBhcmF0b3IgPSBmYWNldFZlcnNpb24uZ2V0UHJvamVjdEZhY2V0KCkuZ2V0VmVyc2lvbkNvbXBhcmF0b3IoKTsNCi0JCVN0cmluZyBjdXJyZW50RmFjZXRWZXJzaW9uID0gZmFjZXRWZXJzaW9uLmdldFZlcnNpb25TdHJpbmcoKTsNCi0JCXJldHVybiBjb21wYXJhdG9yLmNvbXBhcmUoY3VycmVudEZhY2V0VmVyc2lvbiwgZmFjZXRWZXJzaW9uSWQpID49IDA7DQotCX0NCi0NCi0JcHJpdmF0ZSBJRmFjZXRlZFByb2plY3QgZ2V0RmFjZXRlZFByb2plY3QoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJcmV0dXJuIFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsNCi0JfQ0KLQ0KLQlwcml2YXRlIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZ2V0UHJvamVjdEZhY2V0cyhJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlhc3NlcnQgaXNGYWNldGVkUHJvamVjdChwcm9qZWN0KTsNCi0NCi0JCXJldHVybiBnZXRGYWNldGVkUHJvamVjdChwcm9qZWN0KS5nZXRQcm9qZWN0RmFjZXRzKCk7DQotCX0NCi0NCi0JcHJpdmF0ZSBTZXQ8SUZhY2V0ZWRQcm9qZWN0PiBnZXRBbGxXb3Jrc3BhY2VGYWNldGVkUHJvamVjdHMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlyZXR1cm4gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0RmFjZXRlZFByb2plY3RzKCk7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9mYWNldHMvSUZhY2V0VXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvZmFjZXRzL0lGYWNldFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg3Mjc3NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9mYWNldHMvSUZhY2V0VXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmZhY2V0czsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLQkNCi1wdWJsaWMgaW50ZXJmYWNlIElGYWNldFV0aWxzDQotew0KLQkvKioNCi0JICogQ29uc3RhbnQgZm9yIEVKQjMwIGZhY2V0IElEDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfMzBfRkFDRVRfSUQgPSAianN0LmVqYiI7IC8vJE5PTi1OTFMtMSQNCi0JDQotCS8qKg0KLQkgKiBDb25zdGFudCBmb3IgRUpCMzAgZmFjZXQgdmVyc2lvbiAzLjANCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl8zMF9GQUNFVF9WRVJTSU9OID0gIjMuMCI7IC8vJE5PTi1OTFMtMSQNCi0JDQotCS8qKg0KLQkgKiBDb25zdGFudCBmb3IgV2ViIDIuNSBmYWNldCBJRA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCXzI1X0ZBQ0VUX0lEID0gImpzdC53ZWIiOyAvLyROT04tTkxTLTEkDQotCQ0KLQkvKioNCi0JICogQ29uc3RhbnQgZm9yIFdlYiBmYWNldCB2ZXJzaW9uIDIuNQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCXzI1X0ZBQ0VUX1ZFUlNJT04gPSAiMi41IjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKioNCi0JICogQ29uc3RhbnQgZm9yIEFwcGxpY2F0aW9uIGNsaWVudCBmYWNldCBJRA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQQ0xJRU5UXzI1X0ZBQ0VUX0lEID0gImpzdC5hcHBjbGllbnQiOyAvLyROT04tTkxTLTEkDQotDQotCS8qKg0KLQkgKiBDb25zdGFudCBmb3IgQXBwbGljYXRpb24gY2xpZW50IGZhY2V0IHZlcnNpb24gMi41DQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBDTElFTlRfMjVfRkFDRVRfVkVSU0lPTgk9ICI1LjAiOyAvLyROT04tTkxTLTEkDQotDQotCS8qKg0KLQkgKiBDaGVja3Mgd2hldGhlciA8Y29kZT5wcm9qZWN0PC9jb2RlPiBoYXMgYSBmYWNldCB3aXRoIGlkIDxjb2RlPmZhY2V0SWQ8L2NvZGU+IHdpdGggdmVyc2lvbiA8Y29kZT5mYWNldFZlcnNpb248L2NvZGU+DQotCSAqIEluIGNhc2UgdGhlIHByb2plY3Qgc3BlY2lmaWVkIGlzIG5vdCBhIGZhY2V0ZWQgcHJvamVjdCwgZmFsc2UgaXMgcmV0dXJuZWQgDQotCSAqIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdGhhdCBpcyBlcXVpdmFsZW50IHRvIGludm9raW5nIGhhc0ZhY2V0V2l0aFZlcnNpb24ocHJvamVjdCwgZmFjZXRWZXJzaW9uLCBmYWNldElkLCBmYWxzZSkNCi0JICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QNCi0JICogQHBhcmFtIGZhY2V0VmVyc2lvbiB0aGUgZmFjZXQgdmVyc2lvbg0KLQkgKiBAcGFyYW0gZmFjZXRJZCB0aGUgZmFjZXQgaWQNCi0JICogQHJldHVybiB0cnVlIGluIGNhc2UgdGhlIHByb2plY3Qgc3BlY2lmaWVkIGlzIGEgZmFjZXRlZCBwcm9qZWN0IGFuZCBoYXMgdGhlIGZhY2V0IHdpdGggdGhlIHZlcnNpb24gc3BlY2lmaWVkOyBmYWxzZSBvdGhlcndpc2UNCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiBhbnkgb2YgdGhlIGlucHV0IHBhcmFtZXRlcnMgaXMgbnVsbA0KLQkgKiBAc2VlIElGYWNldFV0aWxzI2hhc0ZhY2V0V2l0aFZlcnNpb24oSVByb2plY3QsIFN0cmluZywgU3RyaW5nLCBib29sZWFuKQ0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaGFzRmFjZXRXaXRoVmVyc2lvbihJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgZmFjZXRWZXJzaW9uLCBTdHJpbmcgZmFjZXRJZCkgdGhyb3dzIENvcmVFeGNlcHRpb247DQotCQ0KLQkvKioNCi0JICogQ2hlY2tzIHdoZXRoZXIgPGNvZGU+cHJvamVjdDwvY29kZT4gaGFzIGEgZmFjZXQgd2l0aCBpZCA8Y29kZT5mYWNldElkPC9jb2RlPiB3aXRoIHZlcnNpb24gPGNvZGU+ZmFjZXRWZXJzaW9uPC9jb2RlPg0KLQkgKiBJbiBjYXNlIHRoZSBwcm9qZWN0IHNwZWNpZmllZCBpcyBub3QgYSBmYWNldGVkIHByb2plY3QsIGZhbHNlIGlzIHJldHVybmVkIA0KLQkgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdA0KLQkgKiBAcGFyYW0gZmFjZXRWZXJzaW9uIHRoZSBmYWNldCB2ZXJzaW9uDQotCSAqIEBwYXJhbSBmYWNldElkIHRoZSBmYWNldCBpZA0KLQkgKiBAcGFyYW0gYWNjZXB0SGlnaGVyRmFjZXRWZXJzaW9uIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgaGlnaGVyIGZhY2V0IHZlcnNpb25zIGFyZSBhY2NlcHRhYmxlDQotCSAqIEByZXR1cm4gdHJ1ZSBpbiBjYXNlIHRoZSBwcm9qZWN0IHNwZWNpZmllZCBpcyBhIGZhY2V0ZWQgcHJvamVjdCBhbmQgaGFzIHRoZSBmYWNldCB3aXRoIHRoZSB2ZXJzaW9uIHNwZWNpZmllZDsgZmFsc2Ugb3RoZXJ3aXNlDQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gYW55IG9mIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGlzIG51bGwNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGhhc0ZhY2V0V2l0aFZlcnNpb24oSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGZhY2V0VmVyc2lvbiwgU3RyaW5nIGZhY2V0SWQsIGJvb2xlYW4gYWNjZXB0SGlnaGVyRmFjZXRWZXJzaW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBwcm9qZWN0IHNwZWNpZmllZCBpcyBhIGZhY2V0ZWQgcHJvamVjdA0KLQkgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdA0KLQkgKiBAcmV0dXJuDQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPnByb2plY3Q8L2NvZGU+IGlzIG51bGwNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzRmFjZXRlZFByb2plY3QoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb247DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9Bbm5vdGF0aW9uQmFzZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9Bbm5vdGF0aW9uQmFzZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzJlZGEyYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQW5ub3RhdGlvbkJhc2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZVBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uQmFzZTsNCi0NCi0vKioNCi0gKiBCYXNlIHtAbGluayBJQW5ub3RhdGlvbkJhc2V9IGltcGxlbWVudGF0aW9uDQotICogDQotICogQGF1dGhvciBQbGFtZW4gUGF2bG92DQotICovDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFubm90YXRpb25CYXNlSW1wbDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiBleHRlbmRzIFZhbHVlSW1wbA0KLXsNCi0JcHJpdmF0ZSBTdHJpbmcgYW5ub3RhdGlvbk5hbWU7Ly8gQ29udGFpbmVyIGZvciBBbm5vdGF0aW9uIE5hbWU7DQotCXByb3RlY3RlZCBUIGphdmFFbGVtZW50OyAvLyBDb25hdGluZXIgZm9yIHRoZSBwYXJlbnQgSUphdmFFbGVtZW50Ow0KLQkvL3ByaXZhdGUgU3RyaW5nIGFubm90YXRpb25TdHJpbmdWYWx1ZTsvL0NvbmF0aW5lciB0byBjdXJyZW50IFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGFubm90YXRpb24NCi0JDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBET1QgPSAiLiI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yLg0KLQkgKiANCi0JICogQHBhcmFtIGFubm90YXRpb25OYW1lDQotCSAqIA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIGNhc2UgPGNvZGU+YW5ub3RhdGlvbk5hbWU8L2NvZGU+IGlzIG51bGwuDQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIGNhc2UgPGNvZGU+YW5ub3RhdGlvbk5hbWU8L2NvZGU+IGlzIGVtcHR5IFN0cmluZy4NCi0JICovDQotCXB1YmxpYyBBbm5vdGF0aW9uQmFzZUltcGwoU3RyaW5nIGFubm90YXRpb25OYW1lKQ0KLQl7DQotCQl0aGlzLmFubm90YXRpb25OYW1lID0gYW5ub3RhdGlvbk5hbWU7DQotCX0NCi0NCi0JLyoqDQotCSAqIEV4dHJhY3RzIG9ubHkgdGhlIEFubm90YXRpb24gbmFtZSBpbiBjYXNlIGl0IGlzIGluIGZ1bGx5IHF1YWxpZmllZCBmb3JtLg0KLQkgKiANCi0JICogQHJldHVybiB0aGUgc2ltcGxlIEFubm90YXRpb24gbmFtZS4NCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0U2ltcGxlQW5ub3RhdGlvbk5hbWUoKQ0KLQl7DQotCQlpbnQgbGFzdERvdEluZGV4ID0gYW5ub3RhdGlvbk5hbWUubGFzdEluZGV4T2YoRE9UKTsNCi0NCi0JCWlmIChsYXN0RG90SW5kZXggPT0gLTEpDQotCQl7DQotCQkJcmV0dXJuIGFubm90YXRpb25OYW1lOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGFubm90YXRpb25OYW1lLnN1YnN0cmluZyhsYXN0RG90SW5kZXggKyAxKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkNCi0Jew0KLQkJcmV0dXJuIGFubm90YXRpb25OYW1lOw0KLQl9DQotDQotCS8qKg0KLQkgKiBBZGRzIEFubm90YXRpb24gdG8gc3BlY2lmaWMgSUphdmFFbGVtZW50Lg0KLQkgKiANCi0JICogQHBhcmFtIGphdmFFbGVtZW50DQotCSAqIA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDx0dD5qYXZhRWxlbWVudDwvdHQ+IGlzIG51bGwuDQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIGNhc2UgPGNvZGU+amF2YUVsZW1lbnQ8L2NvZGU+IGlzIG5vdCBvZiB0aGUgY29ycmVjdCB0eXBlLiBTdXBwb3J0ZWQgdHlwZXMgYXJlOiBJVHlwZSwgSU1ldGhvZCwgSUZpZWxkLCBJVHlwZVBhcmFtZXRlci4NCi0JICovDQotCXB1YmxpYyB2b2lkIHNldEFwcGxpZWRFbGVtZW50V2l0aG91dFNhdmUoVCBqYXZhRWxlbWVudCkNCi0Jew0KLQkJc2V0SmF2YUVsZW1lbnQoamF2YUVsZW1lbnQpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldEphdmFFbGVtZW50KFQgamF2YUVsZW1lbnQpDQotCXsNCi0JCWlmIChqYXZhRWxlbWVudCA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiamF2YUVsZW1lbnQgc2hvdWxkIG5vdCBiZSBudWxsISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlpZighKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSVR5cGUpICYmICEoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJTWV0aG9kKSAmJiAhKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSUZpZWxkKSAmJiAhKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSVR5cGVQYXJhbWV0ZXIpKQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImphdmFFbGVtZW50IGlzIG5vdCBvZiBjb3JyZWN0IHR5cGUhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCXRoaXMuamF2YUVsZW1lbnQgPSBqYXZhRWxlbWVudDsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGludCBoYXNoQ29kZSgpDQotCXsNCi0JCXJldHVybiBhbm5vdGF0aW9uTmFtZS5oYXNoQ29kZSgpOw0KLQl9DQotCQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKQ0KLQl7DQotCQlpZiAodGhpcyA9PSBvYmopDQotCQl7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQlpZiAob2JqID09IG51bGwpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJZmluYWwgQW5ub3RhdGlvbkJhc2VJbXBsPFQ+IG90aGVyID0gIChBbm5vdGF0aW9uQmFzZUltcGw8VD4pb2JqOw0KLQkJcmV0dXJuIGFubm90YXRpb25OYW1lLmVxdWFscyhvdGhlci5hbm5vdGF0aW9uTmFtZSk7DQotCX0JDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9Bbm5vdGF0aW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0Fubm90YXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVkM2I1YTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0Fubm90YXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5hbWU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2ltcGxlTmFtZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLQ0KLS8qKg0KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJQW5ub3RhdGlvbn0NCi0gKiANCi0gKiBAYXV0aG9yIFBsYW1lbiBQYXZsb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkltcGw8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gZXh0ZW5kcyBBbm5vdGF0aW9uQmFzZUltcGw8VD4gaW1wbGVtZW50cyBJQW5ub3RhdGlvbjxUPg0KLXsNCi0NCi0JLyoqDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uI2dldFByb3BlcnR5VmFsdWUoamF2YS5sYW5nLlN0cmluZykNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlWYWx1ZShTdHJpbmcgcGFyYW0pDQotCXsNCi0JCWZvciAoSVBhcmFtVmFsdWVQYWlyIHBhaXIgOiBnZXRQYXJhbVZhbHVlUGFpcnMoKSkNCi0JCXsNCi0JCQlpZiAocGFyYW0uZXF1YWxzKHBhaXIuZ2V0UGFyYW0oKSkpDQotCQkJew0KLQkJCQlyZXR1cm4gcGFpci5nZXRWYWx1ZSgpIT1udWxsID8gcGFpci5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkgOiBudWxsOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCXByaXZhdGUgU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZVBhaXJzOw0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3INCi0JICogDQotCSAqIEBwYXJhbSBhbm5vdGF0aW9uTmFtZSAtDQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgYW5ub3RhdGlvbg0KLQkgKiBAcGFyYW0gcGFyYW1WYWx1ZVBhaXJzIC0NCi0JICogICAgICAgICAgICB0aGUgcGFyYW09dmFsdWUgcGFyaXMNCi0JICovDQotCXB1YmxpYyBBbm5vdGF0aW9uSW1wbChTdHJpbmcgYW5ub3RhdGlvbk5hbWUsIFNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtVmFsdWVQYWlycykNCi0Jew0KLQkJc3VwZXIoYW5ub3RhdGlvbk5hbWUpOw0KLQkJdGhpcy5wYXJhbVZhbHVlUGFpcnMgPSBwYXJhbVZhbHVlUGFpcnM7DQotCX0NCi0NCi0JcHVibGljIFNldDxJUGFyYW1WYWx1ZVBhaXI+IGdldFBhcmFtVmFsdWVQYWlycygpDQotCXsNCi0JCXJldHVybiBwYXJhbVZhbHVlUGFpcnM7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc2V0UGFyYW1WYWx1ZVBhaXJzKFNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtVmFsdWVQYWlycykNCi0Jew0KLQkJdGhpcy5wYXJhbVZhbHVlUGFpcnMgPSBwYXJhbVZhbHVlUGFpcnM7DQotCX0NCi0JDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbihDb21waWxhdGlvblVuaXQgdW5pdCwgQVNUIGFzdCkNCi0Jew0KLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdCA9IGFzdC5uZXdOb3JtYWxBbm5vdGF0aW9uKCk7DQotCQlib29sZWFuIHdhc0FkZGVkID0gYWRkSW1wb3J0cyhhc3QsIHVuaXQsIGdldEFubm90YXRpb25OYW1lKCkpOw0KLQkJaWYgKHdhc0FkZGVkKQ0KLQkJew0KLQkJCSgoU2ltcGxlTmFtZSkgYW5ub3QuZ2V0VHlwZU5hbWUoKSkuc2V0SWRlbnRpZmllcihnZXRTaW1wbGVBbm5vdGF0aW9uTmFtZSgpKTsNCi0JCX0gZWxzZQ0KLQkJew0KLQkJCU5hbWUgbmFtZSA9IGFzdC5uZXdOYW1lKGdldEFubm90YXRpb25OYW1lKCkpOw0KLQkJCWFubm90LnNldFR5cGVOYW1lKG5hbWUpOw0KLQkJfQ0KLQkJZm9yIChJUGFyYW1WYWx1ZVBhaXIgcGFyYW1WYWx1ZVBhaXIgOiBwYXJhbVZhbHVlUGFpcnMpDQotCQl7DQotCQkJTWVtYmVyVmFsdWVQYWlyIHBhaXIgPSBhc3QubmV3TWVtYmVyVmFsdWVQYWlyKCk7DQotCQkJcGFpci5nZXROYW1lKCkuc2V0SWRlbnRpZmllcihwYXJhbVZhbHVlUGFpci5nZXRQYXJhbSgpKTsNCi0JCQlwYWlyLnNldFZhbHVlKCgoVmFsdWVJbXBsKSBwYXJhbVZhbHVlUGFpci5nZXRWYWx1ZSgpKS5nZXRFeHByZXNzaW9uKHVuaXQsIGFzdCkpOw0KLQkJCWFubm90LnZhbHVlcygpLmFkZChwYWlyKTsNCi0JCX0NCi0JCXJldHVybiBhbm5vdDsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGludCBoYXNoQ29kZSgpDQotCXsNCi0JCWlmKHBhcmFtVmFsdWVQYWlycyA9PSBudWxsIHx8IHBhcmFtVmFsdWVQYWlycy5zaXplKCkgPCAxKQ0KLQkJew0KLQkJCXJldHVybiAzMSAqIHN1cGVyLmhhc2hDb2RlKCk7DQotCQl9DQotCQlyZXR1cm4gMzEgKiBzdXBlci5oYXNoQ29kZSgpICsgQXJyYXlzLmhhc2hDb2RlKHBhcmFtVmFsdWVQYWlycy50b0FycmF5KG5ldyBJUGFyYW1WYWx1ZVBhaXJbcGFyYW1WYWx1ZVBhaXJzLnNpemUoKV0pKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopDQotCXsNCi0JCWlmICghc3VwZXIuZXF1YWxzKG9iaikpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJZmluYWwgQW5ub3RhdGlvbkltcGw8Pz4gb3RoZXIgPSAoQW5ub3RhdGlvbkltcGw8Pz4pIG9iajsNCi0JCXJldHVybiAoQXJyYXlzLmVxdWFscyhwYXJhbVZhbHVlUGFpcnMudG9BcnJheShuZXcgSVBhcmFtVmFsdWVQYWlyW3BhcmFtVmFsdWVQYWlycy5zaXplKCldKSwgb3RoZXIucGFyYW1WYWx1ZVBhaXJzLnRvQXJyYXkobmV3IElQYXJhbVZhbHVlUGFpcltwYXJhbVZhbHVlUGFpcnMuc2l6ZSgpXSkpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgVCBnZXRBcHBsaWVkRWxlbWVudCgpDQotCXsNCi0JCXJldHVybiB0aGlzLmphdmFFbGVtZW50Ow0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9Bbm5vdGF0aW9uSW5zcGVjdG9ySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0Fubm90YXRpb25JbnNwZWN0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJjODY3ZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0Fubm90YXRpb25JbnNwZWN0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbDsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5Db250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW07DQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSW1wb3J0RGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1lbWJlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQWJzdHJhY3RUeXBlRGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQXJyYXlJbml0aWFsaXplcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJvZHlEZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJvb2xlYW5MaXRlcmFsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkZpZWxkRGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JRXh0ZW5kZWRNb2RpZmllcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1hcmtlckFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2REZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5hbWU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTnVtYmVyTGl0ZXJhbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlF1YWxpZmllZE5hbWU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5RdWFsaWZpZWRUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2ltcGxlVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3RyaW5nTGl0ZXJhbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlRGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlTGl0ZXJhbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbkluc3BlY3RvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklMb2NhdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVZhbHVlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuY2xhenouQVNUVXRpbHM7DQotDQotLyoqDQotICogQ2xhc3MsIHdoaWNoIGlzIG1hZGUgdG8gbG9hZCBhbmQgcmV0dXJuIGFubm90YXRpb25zIGZyb20gYSBnaXZlbiBJSmF2YUVsZW1ldC4NCi0gKiANCi0gKiBAYXV0aG9yIFBsYW1lbiBQYXZsb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkluc3BlY3RvckltcGwgaW1wbGVtZW50cyBJQW5ub3RhdGlvbkluc3BlY3Rvcg0KLXsNCi0JcHJpdmF0ZSBJVHlwZSBpVHlwZTsNCi0JcHJpdmF0ZSBDb21waWxhdGlvblVuaXQgY1VuaXQ7DQotDQotCXB1YmxpYyBBbm5vdGF0aW9uSW5zcGVjdG9ySW1wbChmaW5hbCBJVHlwZSB0eXBlKQ0KLQl7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0odHlwZSwgInR5cGUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJDQotCQl0aGlzLmlUeXBlID0gdHlwZTsNCi0JfQkNCi0NCi0JcHVibGljIElBbm5vdGF0aW9uPElNZXRob2Q+IGluc3BlY3RNZXRob2QoZmluYWwgSU1ldGhvZCBtZXRob2QsIGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uUU5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKG1ldGhvZCwgIm1ldGhvZCIpOyAvLyROT04tTkxTLTEkDQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0oYW5ub3RhdGlvblFOYW1lLCAiYW5ub3RhdGlvblFOYW1lIik7IC8vJE5PTi1OTFMtMSQNCi0JCWlmKCEobWV0aG9kIGluc3RhbmNlb2YgSU1ldGhvZCkpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWV0aG9kIGFyZ3VtZW50IGlzIG5vdCBvZiBjb3JyZWN0IFR5cGUhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCWlmKGFubm90YXRpb25RTmFtZS50cmltKCkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJA0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFubm90YXRpb25RTmFtZSBhcmd1bWVudCBpcyBub3Qgd2l0aCBwcm9wcGVyIHZhbHVlISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlyZXR1cm4gZ2V0U3BlY2lmaWNBbm5vdGF0aW9uRnJvbU1lbWJlcihtZXRob2QsIG1ldGhvZC5nZXRQYXJlbnQoKS5nZXRFbGVtZW50TmFtZSgpLCBhbm5vdGF0aW9uUU5hbWUpOwkJDQotCX0JDQotDQotCXB1YmxpYyBDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElNZXRob2Q+PiBpbnNwZWN0TWV0aG9kKElNZXRob2QgbWV0aG9kKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShtZXRob2QsICJtZXRob2QiKTsgLy8kTk9OLU5MUy0xJA0KLQkJDQotCQlpZighKG1ldGhvZCBpbnN0YW5jZW9mIElNZXRob2QpKQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1ldGhvZCBhcmd1bWVudCBpcyBub3Qgb2YgY29ycmVjdCBUeXBlISIpOwkvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlyZXR1cm4gZ2V0RnJvbU1lbWJlcihtZXRob2QsIG1ldGhvZC5nZXRQYXJlbnQoKS5nZXRFbGVtZW50TmFtZSgpKTsJCQ0KLQl9DQotCQ0KLQlwdWJsaWMgSUFubm90YXRpb248SUZpZWxkPiBpbnNwZWN0RmllbGQoZmluYWwgSUZpZWxkIGZpZWxkLCBmaW5hbCBTdHJpbmcgYW5ub3RhdGlvblFOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCW51bGxDaGVja1BhcmFtKGZpZWxkLCAiZmllbGQiKTsgLy8kTk9OLU5MUy0xJA0KLQkJbnVsbENoZWNrUGFyYW0oYW5ub3RhdGlvblFOYW1lLCAiYW5ub3RhdGlvblFOYW1lIik7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCWlmKCEoZmllbGQgaW5zdGFuY2VvZiBJRmllbGQpKQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImZpZWxkIGFyZ3VtZW50IGlzIG5vdCBvZiBjb3JyZWN0IFR5cGUhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCWlmKGFubm90YXRpb25RTmFtZS50cmltKCkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJA0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFubm90YXRpb25RTmFtZSBhcmd1bWVudCBpcyBub3Qgd2l0aCBwcm9wcGVyIHZhbHVlISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlmaW5hbCBTdHJpbmcgY2xhc3NOYW1lID0gZmllbGQuZ2V0UGFyZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsNCi0JCXJldHVybiBnZXRTcGVjaWZpY0Fubm90YXRpb25Gcm9tTWVtYmVyKGZpZWxkLCBjbGFzc05hbWUsIGFubm90YXRpb25RTmFtZSk7CQkNCi0JfQ0KLQkNCi0JcHVibGljIENvbGxlY3Rpb248SUFubm90YXRpb248SUZpZWxkPj4gaW5zcGVjdEZpZWxkKElGaWVsZCBmaWVsZCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlpZiAoZmllbGQgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImZpZWxkIHNob3VsZCBub3QgYmUgbnVsbCEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJaWYoIShmaWVsZCBpbnN0YW5jZW9mIElGaWVsZCkpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZmllbGQgYXJndW1lbnQgaXMgbm90IG9mIGNvcnJlY3QgVHlwZSEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJZmluYWwgU3RyaW5nIGNsYXNzTmFtZSA9IGZpZWxkLmdldFBhcmVudCgpLmdldEVsZW1lbnROYW1lKCk7DQotCQlyZXR1cm4gZ2V0RnJvbU1lbWJlcihmaWVsZCwgY2xhc3NOYW1lKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IGluc3BlY3RQYXJhbShmaW5hbCBJVHlwZVBhcmFtZXRlciBwYXJhbSwgZmluYWwgU3RyaW5nIGFubm90YXRpb25RTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQludWxsQ2hlY2tQYXJhbShwYXJhbSwgInBhcmFtIik7IC8vJE5PTi1OTFMtMSQNCi0JCW51bGxDaGVja1BhcmFtKGFubm90YXRpb25RTmFtZSwgImFubm90YXRpb25RTmFtZSIpOyAvLyROT04tTkxTLTEkDQotCQkNCi0JCWlmKCEocGFyYW0gaW5zdGFuY2VvZiBJVHlwZVBhcmFtZXRlcikpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGFyYW0gYXJndW1lbnQgaXMgbm90IG9mIGNvcnJlY3QgVHlwZSEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJaWYoYW5ub3RhdGlvblFOYW1lLnRyaW0oKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYW5ub3RhdGlvblFOYW1lIGFyZ3VtZW50IGlzIG5vdCB3aXRoIHByb3BwZXIgdmFsdWUhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCWZpbmFsIFN0cmluZyBjbGFzc05hbWUgPSBnZXRDbGFzc05hbWVGcm9tUGFyYW0ocGFyYW0pOw0KLQkJcmV0dXJuIGdldFNwZWNpZmljQW5ub3RhdGlvbkZyb21NZW1iZXIocGFyYW0sIGNsYXNzTmFtZSwgYW5ub3RhdGlvblFOYW1lKTsJCQ0KLQl9DQotCQ0KLQlwdWJsaWMgQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4+IGluc3BlY3RQYXJhbShJVHlwZVBhcmFtZXRlciBwYXJhbSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlpZiAocGFyYW0gPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInBhcmFtIHNob3VsZCBub3QgYmUgbnVsbCEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJaWYoIShwYXJhbSBpbnN0YW5jZW9mIElUeXBlUGFyYW1ldGVyKSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXJhbSBhcmd1bWVudCBpcyBub3Qgb2YgY29ycmVjdCBUeXBlISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlyZXR1cm4gZ2V0RnJvbU1lbWJlcihwYXJhbSwgZ2V0Q2xhc3NOYW1lRnJvbVBhcmFtKHBhcmFtKSk7DQotCX0NCi0NCi0JcHVibGljIElBbm5vdGF0aW9uPElUeXBlPiBpbnNwZWN0VHlwZShmaW5hbCBTdHJpbmcgYW5ub3RhdGlvblFOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCW51bGxDaGVja1BhcmFtKGFubm90YXRpb25RTmFtZSwgImFubm90YXRpb25RTmFtZSIpOyAvLyROT04tTkxTLTEkDQotCQkNCi0JCWlmIChhbm5vdGF0aW9uUU5hbWUudHJpbSgpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhbm5vdGF0aW9uUU5hbWUgYXJndW1lbnQgaXMgbm90IHdpdGggcHJvcHBlciB2YWx1ZSEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZ2V0U3BlY2lmaWNBbm5vdGF0aW9uRnJvbU1lbWJlcihpVHlwZSwgaVR5cGUuZ2V0RWxlbWVudE5hbWUoKSwgYW5ub3RhdGlvblFOYW1lKTsNCi0JfQ0KLQkNCi0JcHVibGljIENvbGxlY3Rpb248SUFubm90YXRpb248SVR5cGU+PiBpbnNwZWN0VHlwZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJcmV0dXJuIGdldEZyb21NZW1iZXIoaVR5cGUsIGlUeXBlLmdldEVsZW1lbnROYW1lKCkpOw0KLQl9CQ0KLQkNCi0JLy8gIyBpbXBsZW1lbnRhdGlvbg0KLQkNCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q2xhc3NOYW1lRnJvbVBhcmFtKGZpbmFsIElUeXBlUGFyYW1ldGVyIHBhcmFtKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWlmKHBhcmFtLmdldERlY2xhcmluZ01lbWJlcigpIGluc3RhbmNlb2YgSU1ldGhvZCkNCi0JCXsNCi0JCQlyZXR1cm4gcGFyYW0uZ2V0RGVjbGFyaW5nTWVtYmVyKCkuZ2V0UGFyZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsNCi0JCX0NCi0NCi0JCXJldHVybiBwYXJhbS5nZXREZWNsYXJpbmdNZW1iZXIoKS5nZXRFbGVtZW50TmFtZSgpOw0KLQl9DQotDQotCXByb3RlY3RlZCA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gU2V0PElBbm5vdGF0aW9uPFQ+PiBnZXRGcm9tTWVtYmVyKFQgdHlwZSwgU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlpZiAoIWlzU3VwcG9ydGVkSmF2YUVsZW1lbnQodHlwZSkpIHsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXNzZWQgYXJndW1lbnQgaXMgbm90IG9mIGNvcnJlY3QgdHlwZS4iKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJDQotCQlJQ29tcGlsYXRpb25Vbml0IGNVbml0ID0gbnVsbDsNCi0JCWlmKHR5cGUgaW5zdGFuY2VvZiBJTWVtYmVyKSB7DQotCQkJY1VuaXQgPSAoKElNZW1iZXIpdHlwZSkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQl9DQotCQllbHNlIHsNCi0JCQljVW5pdCA9ICgoSVR5cGVQYXJhbWV0ZXIpdHlwZSkuZ2V0RGVjbGFyaW5nTWVtYmVyKCkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQl9DQotCQkNCi0JCWlmIChjVW5pdCA9PSBudWxsKSB7DQotCQkJcmV0dXJuIG5ldyBIYXNoU2V0PElBbm5vdGF0aW9uPFQ+PigpOw0KLQkJfQ0KLQ0KLQkJZmluYWwgQ29tcGlsYXRpb25Vbml0IHVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCWZpbmFsIEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKGNsYXNzTmFtZSwgdW5pdCk7DQotCQkNCi0JCXN3aXRjaCh0eXBlLmdldEVsZW1lbnRUeXBlKCkpDQotCQl7DQotCQljYXNlIElKYXZhRWxlbWVudC5UWVBFOg0KLQkJCXJldHVybiBnZXRBbm5vdGF0aW9ucyh0eXBlLCB0eXBlRGVjbGFyYXRpb24pOw0KLQkJCQ0KLQkJY2FzZSBJSmF2YUVsZW1lbnQuRklFTEQ6DQotCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRGaWVsZERlY2xhcmF0aW9uKChJRmllbGQpIHR5cGUsIChUeXBlRGVjbGFyYXRpb24pdHlwZURlY2xhcmF0aW9uKTsNCi0JCQlyZXR1cm4gZ2V0QW5ub3RhdGlvbnModHlwZSwgZmllbGREZWNsYXJhdGlvbik7DQotCQkJDQotCQljYXNlIElKYXZhRWxlbWVudC5NRVRIT0Q6DQotCQkJTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldE1ldGhvZERlY2xhcmF0aW9uKChJTWV0aG9kKSB0eXBlLCAoVHlwZURlY2xhcmF0aW9uKXR5cGVEZWNsYXJhdGlvbik7DQotCQkJcmV0dXJuIGdldEFubm90YXRpb25zKHR5cGUsIG1ldGhvZERlY2xhcmF0aW9uKTsNCi0JCQkNCi0JCWNhc2UgSUphdmFFbGVtZW50LlRZUEVfUEFSQU1FVEVSOg0KLQkJCW1ldGhvZERlY2xhcmF0aW9uID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRNZXRob2REZWNsYXJhdGlvbigoSU1ldGhvZCkoKElUeXBlUGFyYW1ldGVyKSB0eXBlKS5nZXRQYXJlbnQoKSwgKFR5cGVEZWNsYXJhdGlvbil0eXBlRGVjbGFyYXRpb24pOw0KLQkJCXJldHVybiBnZXRQYXJhbUFubm90YXRpb25zKHR5cGUsIG1ldGhvZERlY2xhcmF0aW9uKTsNCi0JCX0NCi0NCi0JCXJldHVybiBuZXcgSGFzaFNldDxJQW5ub3RhdGlvbjxUPj4oKTsNCi0JfQ0KLQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHJpdmF0ZSA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gU2V0PElBbm5vdGF0aW9uPFQ+PiBnZXRBbm5vdGF0aW9ucyhUIGlNZW1iZXIsIEJvZHlEZWNsYXJhdGlvbiBib2R5RGVjbGFyYXRpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJaWYgKGJvZHlEZWNsYXJhdGlvbiAhPSBudWxsKQ0KLQkJew0KLQkJCUxpc3QgbGlzdCA9IGJvZHlEZWNsYXJhdGlvbi5tb2RpZmllcnMoKTsNCi0JCQlyZXR1cm4gZXh0cmFjdEFubm90YXRpb25zKGlNZW1iZXIsIGxpc3QpOw0KLQkJfQ0KLQkJcmV0dXJuIG5ldyBIYXNoU2V0PElBbm5vdGF0aW9uPFQ+PigpOw0KLQl9DQotCQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHJpdmF0ZSA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gU2V0PElBbm5vdGF0aW9uPFQ+PiBnZXRQYXJhbUFubm90YXRpb25zKFQgaU1lbWJlciwgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJaWYgKG1ldGhvZERlY2xhcmF0aW9uICE9IG51bGwpDQotCQl7DQotCQkJZm9yIChPYmplY3QgcGFyYW0gOiBtZXRob2REZWNsYXJhdGlvbi5wYXJhbWV0ZXJzKCkpDQotCQkJew0KLQkJCQlpZiAocGFyYW0gaW5zdGFuY2VvZiBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uICYmDQotCQkJCQkJKChJVHlwZVBhcmFtZXRlcilpTWVtYmVyKS5nZXRFbGVtZW50TmFtZSgpLnRvU3RyaW5nKCkuZXF1YWxzKCgoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbilwYXJhbSkuZ2V0TmFtZSgpLnRvU3RyaW5nKCkpKQ0KLQkJCQl7DQotCQkJCQlMaXN0IGxpc3QgPSAoKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pIHBhcmFtKS5tb2RpZmllcnMoKTsNCi0JCQkJDQotCQkJCQlyZXR1cm4gZXh0cmFjdEFubm90YXRpb25zKGlNZW1iZXIsIGxpc3QpOw0KLQkJCQl9DQotCQkJfQkJCQ0KLQkJfQ0KLQkJcmV0dXJuIG5ldyBIYXNoU2V0PElBbm5vdGF0aW9uPFQ+PigpOw0KLQl9DQotCQ0KLQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHJpdmF0ZSA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gU2V0PElBbm5vdGF0aW9uPFQ+PiBleHRyYWN0QW5ub3RhdGlvbnMoVCBpTWVtYmVyLCBMaXN0IGxpc3QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsNCi0JCVNldDxJVmFsdWU+IHZhbHVlcyA9IG5ldyBIYXNoU2V0PElWYWx1ZT4oKTsNCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkNCi0JCXsNCi0JCQlJRXh0ZW5kZWRNb2RpZmllciBlbGVtZW50ID0gKElFeHRlbmRlZE1vZGlmaWVyKSBpdGVyLm5leHQoKTsNCi0JCQlpZiAoZWxlbWVudC5pc0Fubm90YXRpb24oKSkNCi0JCQl7DQotCQkJCXZhbHVlcy5hZGQoY29udmVydEV4cHJlc3Npb24oKEV4cHJlc3Npb24pIGVsZW1lbnQpKTsNCi0JCQl9DQotCQl9DQotDQotCQlTZXQ8SUFubm90YXRpb248VD4+IGV4cHJlc3Npb25zID0gbmV3IEhhc2hTZXQ8SUFubm90YXRpb248VD4+KCk7DQotCQlmb3IgKElWYWx1ZSB2YWx1ZSA6IHZhbHVlcykgDQotCQl7DQotCQkJQW5ub3RhdGlvbkltcGw8VD4gYW5uID0gKEFubm90YXRpb25JbXBsPFQ+KXZhbHVlOw0KLQkJCWFubi5zZXRBcHBsaWVkRWxlbWVudFdpdGhvdXRTYXZlKGlNZW1iZXIpOw0KLQkJCWV4cHJlc3Npb25zLmFkZChhbm4pOw0KLQkJfQ0KLQkJcmV0dXJuIGV4cHJlc3Npb25zOwkJDQotCX0NCi0JDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlwcml2YXRlIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiBJQW5ub3RhdGlvbjxUPiBleHRyYWN0U3BlY2lmaWNBbm5vdGF0aW9uKFQgaU1lbWJlciwgTGlzdCBsaXN0LCBJVHlwZSB0eXBlLCBTdHJpbmcgYW5ub3RhdGlvblFOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCUl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7DQotCQlTZXQ8SVZhbHVlPiB2YWx1ZXMgPSBuZXcgSGFzaFNldDxJVmFsdWU+KCk7DQotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpDQotCQl7DQotCQkJSUV4dGVuZGVkTW9kaWZpZXIgZWxlbWVudCA9IChJRXh0ZW5kZWRNb2RpZmllcikgaXRlci5uZXh0KCk7DQotCQkJaWYgKGVsZW1lbnQuaXNBbm5vdGF0aW9uKCkpDQotCQkJewkJCQkNCi0JCQkJZmluYWwgTmFtZSB0eXBlTmFtZSA9ICgoQW5ub3RhdGlvbillbGVtZW50KS5nZXRUeXBlTmFtZSgpOw0KLQkJCQlpZiAoYW5ub3RhdGlvblFOYW1lLmVuZHNXaXRoKHR5cGVOYW1lLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKSkgew0KLQkJCQkJdmFsdWVzLmFkZChjb252ZXJ0RXhwcmVzc2lvbigoRXhwcmVzc2lvbikgZWxlbWVudCkpOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJZm9yIChJVmFsdWUgdmFsdWUgOiB2YWx1ZXMpIA0KLQkJew0KLQkJCUFubm90YXRpb25JbXBsPFQ+IHRtcEFubm90YXRpb24gPSAoQW5ub3RhdGlvbkltcGw8VD4pdmFsdWU7DQotCQkJaWYoY2hlY2tTcGVjaWZpY0Fubm90YXR0aW9uKHRtcEFubm90YXRpb24sIHR5cGUsIGFubm90YXRpb25RTmFtZSkpDQotCQkJew0KLQkJCQlBbm5vdGF0aW9uSW1wbDxUPiByZXN1bHQgPSBuZXcgQW5ub3RhdGlvbkltcGw8VD4oYW5ub3RhdGlvblFOYW1lLCB0bXBBbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpKTsNCi0JCQkJcmVzdWx0LnNldEFwcGxpZWRFbGVtZW50V2l0aG91dFNhdmUoaU1lbWJlcik7DQotCQkJCXJlc3VsdC5zZXRMb2NhdG9yKHRtcEFubm90YXRpb24uZ2V0TG9jYXRvcigpKTsNCi0JCQkJcmV0dXJuIHJlc3VsdDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsJCQ0KLQl9CQ0KLQ0KLQlwcml2YXRlIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiBib29sZWFuIGNoZWNrU3BlY2lmaWNBbm5vdGF0dGlvbihmaW5hbCBBbm5vdGF0aW9uSW1wbDxUPiBhbm5vdGF0aW9uLCBmaW5hbCBJVHlwZSB0eXBlLCBmaW5hbCBTdHJpbmcgYW5ub3RhdGlvblFOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWlmKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoYW5ub3RhdGlvblFOYW1lKSB8fCANCi0JCQkJKHR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKSArICIuIiArIGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSkuZXF1YWxzKGFubm90YXRpb25RTmFtZSkpIC8vJE5PTi1OTFMtMSQNCi0JCXsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCQ0KLQkJSUNvbXBpbGF0aW9uVW5pdCBjVW5pdCA9IHR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQlJSW1wb3J0RGVjbGFyYXRpb25bXSBpbXBvcnRzID0gY1VuaXQuZ2V0SW1wb3J0cygpOw0KLQkJZm9yIChJSW1wb3J0RGVjbGFyYXRpb24gaW1wb3J0RGVjbGFyYXRpb24gOiBpbXBvcnRzKQ0KLQkJew0KLQkJCWlmKGFubm90YXRpb25RTmFtZS5lbmRzV2l0aChhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpICYmIGltcG9ydERlY2xhcmF0aW9uLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKGFubm90YXRpb25RTmFtZSkpDQotCQkJew0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWZvciAoSUltcG9ydERlY2xhcmF0aW9uIGltcG9ydERlY2xhcmF0aW9uIDogaW1wb3J0cykNCi0JCXsNCi0JCQlpZihpbXBvcnREZWNsYXJhdGlvbi5nZXRFbGVtZW50TmFtZSgpLmVuZHNXaXRoKCIqIikpIC8vJE5PTi1OTFMtMSQNCi0JCQl7DQotCQkJCVN0cmluZyBpbXBvcnRTdHIgPSBpbXBvcnREZWNsYXJhdGlvbi5nZXRFbGVtZW50TmFtZSgpLnN1YnN0cmluZygwLCBpbXBvcnREZWNsYXJhdGlvbi5nZXRFbGVtZW50TmFtZSgpLmxlbmd0aCgpIC0gMSk7DQotCQkJCWlmKGFubm90YXRpb25RTmFtZS5lbmRzV2l0aChhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpICYmIGFubm90YXRpb25RTmFtZS5pbmRleE9mKGltcG9ydFN0cikgPT0gMCkNCi0JCQkJew0KLQkJCQkJcmV0dXJuIHRydWU7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHJpdmF0ZSBJVmFsdWUgY29udmVydEV4cHJlc3Npb24oRXhwcmVzc2lvbiBlbGVtZW50KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXN3aXRjaCAoZWxlbWVudC5nZXROb2RlVHlwZSgpKQ0KLQkJew0KLQkJCWNhc2UgQVNUTm9kZS5NQVJLRVJfQU5OT1RBVElPTjoNCi0JCQl7DQotCQkJCU1hcmtlckFubm90YXRpb24gbWEgPSAoTWFya2VyQW5ub3RhdGlvbikgZWxlbWVudDsNCi0JCQkJQW5ub3RhdGlvbkltcGwgYW5ub3RhdGlvbiA9IG5ldyBBbm5vdGF0aW9uSW1wbChnZXRGdWxseVF1YWxpZmllZEFubm90YXRpb25OYW1lKG1hKSwgbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpKTsNCi0JCQkJYW5ub3RhdGlvbi5zZXRMb2NhdG9yKGNyZWF0ZUxvY2F0b3IobWEpKTsNCi0JCQkJcmV0dXJuIGFubm90YXRpb247DQotCQkJfQ0KLQkJCWNhc2UgQVNUTm9kZS5TSU5HTEVfTUVNQkVSX0FOTk9UQVRJT046DQotCQkJew0KLQkJCQlmaW5hbCBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIHNtYSA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBlbGVtZW50Ow0KLQkJCQlmaW5hbCBTZXQ8SVBhcmFtVmFsdWVQYWlyPiB2YWx1ZXMgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotDQotCQkJCWZpbmFsIElWYWx1ZSB2YWx1ZSA9IGNvbnZlcnRFeHByZXNzaW9uKHNtYS5nZXRWYWx1ZSgpKTsNCi0JCQkJaWYgKHZhbHVlIT1udWxsKSB7DQotCQkJCQl2YWx1ZXMuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInZhbHVlIiwgdmFsdWUpKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQl9DQotCQkJCQ0KLQkJCQlBbm5vdGF0aW9uSW1wbCBhbm5vdGF0aW9uID0gbmV3IEFubm90YXRpb25JbXBsKGdldEZ1bGx5UXVhbGlmaWVkQW5ub3RhdGlvbk5hbWUoc21hKSwgdmFsdWVzKTsNCi0JCQkJYW5ub3RhdGlvbi5zZXRMb2NhdG9yKGNyZWF0ZUxvY2F0b3Ioc21hKSk7DQotCQkJCXJldHVybiBhbm5vdGF0aW9uOw0KLQkJCX0NCi0JCQljYXNlIEFTVE5vZGUuTk9STUFMX0FOTk9UQVRJT046DQotCQkJew0KLQkJCQlyZXR1cm4gZ2V0Tm9ybWFsQW5ub3RhdGlvblZhbHVlKChOb3JtYWxBbm5vdGF0aW9uKSBlbGVtZW50KTsNCi0JCQl9DQotCQkJY2FzZSBBU1ROb2RlLkFSUkFZX0lOSVRJQUxJWkVSOg0KLQkJCXsNCi0JCQkJQXJyYXlJbml0aWFsaXplciBhcnIgPSAoQXJyYXlJbml0aWFsaXplcikgZWxlbWVudDsNCi0JCQkJTGlzdDxFeHByZXNzaW9uPiBsaXN0ID0gYXJyLmV4cHJlc3Npb25zKCk7DQotCQkJCUl0ZXJhdG9yPEV4cHJlc3Npb24+IGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7DQotCQkJCVNldDxJVmFsdWU+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PElWYWx1ZT4oKTsNCi0JCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQ0KLQkJCQl7DQotCQkJCQlFeHByZXNzaW9uIGV4cHIgPSAoRXhwcmVzc2lvbikgaXRlci5uZXh0KCk7DQotCQkJCQlyZXN1bHQuYWRkKGNvbnZlcnRFeHByZXNzaW9uKGV4cHIpKTsNCi0JCQkJfQ0KLQkJCQlyZXR1cm4gbmV3IEFycmF5VmFsdWVJbXBsKHJlc3VsdCk7DQotCQkJfQ0KLQkJCWNhc2UgQVNUTm9kZS5OVUxMX0xJVEVSQUw6DQotCQkJew0KLQkJCQkvLyByZXR1cm4gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlTnVsbFZhbHVlKCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIEFTVE5vZGUuU0lNUExFX05BTUU6DQotCQkJew0KLQkJCQlicmVhazsvL3JldHVybiBuZXcgU3RyaW5nVmFsdWVJbXBsKCgoU2ltcGxlTmFtZSllbGVtZW50KS5nZXRJZGVudGlmaWVyKCkpOw0KLQkJCX0NCi0JCQljYXNlIEFTVE5vZGUuVFlQRV9MSVRFUkFMOg0KLQkJCXsNCi0JCQkJcmV0dXJuIGdldFR5cGVMaXRlcmFsVmFsdWUoKFR5cGVMaXRlcmFsKSBlbGVtZW50KTsNCi0JCQl9DQotCQkJY2FzZSBBU1ROb2RlLlFVQUxJRklFRF9OQU1FOg0KLQkJCXsNCi0JCQkJUXVhbGlmaWVkTmFtZSBxbiA9IChRdWFsaWZpZWROYW1lKSBlbGVtZW50Ow0KLQkJCQlRdWFsaWZpZWROYW1lVmFsdWVJbXBsIHFuVmFsdWUgPSBuZXcgUXVhbGlmaWVkTmFtZVZhbHVlSW1wbChxbi5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7DQotCQkJCXFuVmFsdWUuc2V0TG9jYXRvcihjcmVhdGVMb2NhdG9yKHFuKSk7DQotCQkJCXJldHVybiBxblZhbHVlOw0KLQkJCX0NCi0JCQljYXNlIEFTVE5vZGUuQk9PTEVBTl9MSVRFUkFMOg0KLQkJCXsNCi0JCQkJQm9vbGVhbkxpdGVyYWwgYmwgPSAoQm9vbGVhbkxpdGVyYWwpIGVsZW1lbnQ7DQotCQkJCUJvb2xlYW5WYWx1ZUltcGwgYlZhbHVlID0gbmV3IEJvb2xlYW5WYWx1ZUltcGwoYmwuYm9vbGVhblZhbHVlKCkpOw0KLQkJCQliVmFsdWUuc2V0TG9jYXRvcihjcmVhdGVMb2NhdG9yKGJsKSk7DQotCQkJCXJldHVybiBiVmFsdWU7DQotCQkJfQ0KLQkJCWNhc2UgQVNUTm9kZS5DSEFSQUNURVJfTElURVJBTDoNCi0JCQl7DQotCQkJCS8vIENoYXJhY3RlckxpdGVyYWwgY2wgPSAoQ2hhcmFjdGVyTGl0ZXJhbCkgZWxlbWVudDsNCi0JCQkJLy8gVE9ETyBGaW5pc2ggd2l0aCB0aGlzIHJldHVybiBuZXcgQ2hhcmFjdGVyVmFsdWUoY2wuY2hhclZhbHVlKCkpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBBU1ROb2RlLk5VTUJFUl9MSVRFUkFMOg0KLQkJCXsNCi0JCQkJTnVtYmVyTGl0ZXJhbCBubCA9IChOdW1iZXJMaXRlcmFsKSBlbGVtZW50Ow0KLQkJCQlJbnRlZ2VyVmFsdWVJbXBsIGludFZhbHVlID0gbmV3IEludGVnZXJWYWx1ZUltcGwobmwuZ2V0VG9rZW4oKSk7DQotCQkJCWludFZhbHVlLnNldExvY2F0b3IoY3JlYXRlTG9jYXRvcihubCkpOw0KLQkJCQlyZXR1cm4gaW50VmFsdWU7DQotCQkJfQ0KLQkJCWNhc2UgQVNUTm9kZS5TVFJJTkdfTElURVJBTDoNCi0JCQl7DQotCQkJCVN0cmluZ0xpdGVyYWwgc2wgPSAoU3RyaW5nTGl0ZXJhbCkgZWxlbWVudDsNCi0JCQkJU3RyaW5nVmFsdWVJbXBsIHN0clZhbHVlID0gbmV3IFN0cmluZ1ZhbHVlSW1wbChzbC5nZXRMaXRlcmFsVmFsdWUoKSk7DQotCQkJCXN0clZhbHVlLnNldExvY2F0b3IoY3JlYXRlTG9jYXRvcihzbCkpOw0KLQkJCQlyZXR1cm4gc3RyVmFsdWU7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXByaXZhdGUgSVZhbHVlIGdldFR5cGVMaXRlcmFsVmFsdWUoVHlwZUxpdGVyYWwgdGwpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJVHlwZSB0eXBlID0gdGwuZ2V0VHlwZSgpOw0KLQkJTmFtZSBuYW1lID0gbnVsbDsNCi0JCWlmICh0eXBlLmlzUXVhbGlmaWVkVHlwZSgpKQ0KLQkJew0KLQkJCW5hbWUgPSAoKFF1YWxpZmllZFR5cGUpIHR5cGUpLmdldE5hbWUoKTsNCi0JCX0gZWxzZQ0KLQkJew0KLQkJCWlmICh0eXBlLmlzU2ltcGxlVHlwZSgpKQ0KLQkJCXsNCi0JCQkJbmFtZSA9ICgoU2ltcGxlVHlwZSkgdHlwZSkuZ2V0TmFtZSgpOw0KLQkJCX0NCi0JCX0NCi0JCWlmIChuYW1lICE9IG51bGwpDQotCQl7DQotCQkJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KHRsKTsNCi0JCQlpZiAoY3UgIT0gbnVsbCkNCi0JCQl7DQotCQkJCVN0cmluZyBmdWxseVF1YWxpZmllZE5hbWUgPSBuYW1lLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOw0KLQkJCQlpZiAodHlwZS5pc1NpbXBsZVR5cGUoKSkNCi0JCQkJew0KLQkJCQkJZnVsbHlRdWFsaWZpZWROYW1lID0gcmVzb2x2ZVR5cGUoKElDb21waWxhdGlvblVuaXQpIGN1LmdldEphdmFFbGVtZW50KCksIGZ1bGx5UXVhbGlmaWVkTmFtZSk7DQotCQkJCX0NCi0NCi0JCQkJQ2xhc3NWYWx1ZUltcGwgY1ZhbHVlID0gbmV3IENsYXNzVmFsdWVJbXBsKGZ1bGx5UXVhbGlmaWVkTmFtZSk7DQotCQkJCWNWYWx1ZS5zZXRMb2NhdG9yKGNyZWF0ZUxvY2F0b3IodGwpKTsNCi0JCQkJcmV0dXJuIGNWYWx1ZTsNCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCXByaXZhdGUgSVZhbHVlIGdldE5vcm1hbEFubm90YXRpb25WYWx1ZShOb3JtYWxBbm5vdGF0aW9uIG5hKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCUxpc3Q8TWVtYmVyVmFsdWVQYWlyPiBsID0gbmEudmFsdWVzKCk7DQotCQlJdGVyYXRvcjxNZW1iZXJWYWx1ZVBhaXI+IGl0ZXIgPSBsLml0ZXJhdG9yKCk7DQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiByZXN1bHQgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpDQotCQl7DQotCQkJTWVtYmVyVmFsdWVQYWlyIG12cCA9IChNZW1iZXJWYWx1ZVBhaXIpIGl0ZXIubmV4dCgpOw0KLQkJCUlWYWx1ZSBtdnB2YWwgPSBjb252ZXJ0RXhwcmVzc2lvbihtdnAuZ2V0VmFsdWUoKSk7DQotCQkJUGFyYW1WYWx1ZVBhaXJJbXBsIHBhaXIgPSBuZXcgUGFyYW1WYWx1ZVBhaXJJbXBsKG12cC5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpLCBtdnB2YWwpOw0KLQkJCXBhaXIuc2V0TG9jYXRvcihjcmVhdGVMb2NhdG9yKG12cCkpOw0KLQkJCXJlc3VsdC5hZGQocGFpcik7DQotCQl9DQotCQkNCi0JCUFubm90YXRpb25JbXBsIGFubm90YXRpb24gPSBuZXcgQW5ub3RhdGlvbkltcGwoZ2V0RnVsbHlRdWFsaWZpZWRBbm5vdGF0aW9uTmFtZShuYSksIHJlc3VsdCk7DQotCQlhbm5vdGF0aW9uLnNldExvY2F0b3IoY3JlYXRlTG9jYXRvcihuYSkpOw0KLQkJcmV0dXJuIGFubm90YXRpb247DQotCX0JDQotDQotCXByaXZhdGUgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkQW5ub3RhdGlvbk5hbWUoQW5ub3RhdGlvbiBhbm5vKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCU5hbWUgdHlwZU5hbWUgPSBhbm5vLmdldFR5cGVOYW1lKCk7DQotCQlTdHJpbmcgZnVsbHlRdWFsaWZpZWROYW1lID0gdHlwZU5hbWUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7DQotCQlpZiAodHlwZU5hbWUuaXNTaW1wbGVOYW1lKCkpDQotCQl7DQotCQkJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KGFubm8pOw0KLQkJCWZ1bGx5UXVhbGlmaWVkTmFtZSA9IHJlc29sdmVUeXBlKChJQ29tcGlsYXRpb25Vbml0KSBjdS5nZXRKYXZhRWxlbWVudCgpLCBmdWxseVF1YWxpZmllZE5hbWUpOw0KLQkJfQ0KLQkJcmV0dXJuIGZ1bGx5UXVhbGlmaWVkTmFtZTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KEV4cHJlc3Npb24gZWxlbWVudCkNCi0Jew0KLQkJQVNUTm9kZSBjdSA9IGVsZW1lbnQ7DQotCQl3aGlsZSAoY3UgIT0gbnVsbCAmJiAhKGN1IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KSkNCi0JCXsNCi0JCQljdSA9IGN1LmdldFBhcmVudCgpOw0KLQkJfQ0KLQkJcmV0dXJuIChDb21waWxhdGlvblVuaXQpIGN1Ow0KLQl9DQotCQ0KLQlwcml2YXRlIFN0cmluZyByZXNvbHZlVHlwZShJQ29tcGlsYXRpb25Vbml0IGljdSwgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlTdHJpbmcgbG9jYWxGdWxseVF1YWxpZmllZE5hbWUgPSBmdWxseVF1YWxpZmllZE5hbWU7DQotCQlJVHlwZVtdIGFsbFR5cGVzID0gaWN1LmdldEFsbFR5cGVzKCk7DQotCQlpZiAoYWxsVHlwZXMgPT0gbnVsbCkNCi0JCXsNCi0JCQlyZXR1cm4gbG9jYWxGdWxseVF1YWxpZmllZE5hbWU7DQotCQl9DQotDQotCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbFR5cGVzLmxlbmd0aDsgaSsrKQ0KLQkJew0KLQkJCVN0cmluZ1tdW10gcmVzb2x2ZWRUeXBlID0gYWxsVHlwZXNbaV0ucmVzb2x2ZVR5cGUobG9jYWxGdWxseVF1YWxpZmllZE5hbWUpOw0KLQkJCWlmIChyZXNvbHZlZFR5cGUgIT0gbnVsbCAmJiByZXNvbHZlZFR5cGUubGVuZ3RoID4gMCkNCi0JCQl7DQotCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVzb2x2ZWRUeXBlWzBdLmxlbmd0aDsgaisrKQ0KLQkJCQl7DQotCQkJCQlidWYgPSBhcHBlbmREb3QoaiwgYnVmKTsNCi0JCQkJCWJ1Zi5hcHBlbmQocmVzb2x2ZWRUeXBlWzBdW2pdKTsNCi0JCQkJfQ0KLQkJCQlsb2NhbEZ1bGx5UXVhbGlmaWVkTmFtZSA9IGJ1Zi50b1N0cmluZygpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gbG9jYWxGdWxseVF1YWxpZmllZE5hbWU7DQotCX0NCi0JDQotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGFwcGVuZERvdChpbnQgaW5kZXgsIFN0cmluZ0J1ZmZlciBidWZmKQ0KLQl7DQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gYnVmZjsNCi0JCWlmIChpbmRleCAhPSAwKQ0KLQkJew0KLQkJCXJlc3VsdC5hcHBlbmQoJy4nKTsNCi0JCX0NCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0JDQotCXByb3RlY3RlZCA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gSUFubm90YXRpb248VD4gZ2V0U3BlY2lmaWNBbm5vdGF0aW9uRnJvbU1lbWJlcihmaW5hbCBUIHR5cGUsIGZpbmFsIFN0cmluZyBjbGFzc05hbWUsIGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uUU5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJaWYgKCFpc1N1cHBvcnRlZEphdmFFbGVtZW50KHR5cGUpKQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhc3NlZCBhcmd1bWVudCBpcyBub3Qgb2YgY29ycmVjdCB0eXBlLiIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQkNCi0JCUlDb21waWxhdGlvblVuaXQgY1VuaXQgPSBudWxsOw0KLQkJaWYgKHR5cGUgaW5zdGFuY2VvZiBJTWVtYmVyKSB7DQotCQkJY1VuaXQgPSAoKElNZW1iZXIpdHlwZSkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQl9DQotCQllbHNlIHsNCi0JCQljVW5pdCA9ICgoSVR5cGVQYXJhbWV0ZXIpdHlwZSkuZ2V0RGVjbGFyaW5nTWVtYmVyKCkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQl9DQotCQkNCi0JCWlmIChjVW5pdCA9PSBudWxsKSB7DQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotDQotCQlmaW5hbCBDb21waWxhdGlvblVuaXQgdW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJZmluYWwgQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlRGVjbGFyYXRpb24oY2xhc3NOYW1lLCB1bml0KTsNCi0JCQ0KLQkJc3dpdGNoKHR5cGUuZ2V0RWxlbWVudFR5cGUoKSkNCi0JCXsNCi0JCWNhc2UgSUphdmFFbGVtZW50LlRZUEU6DQotCQkJcmV0dXJuIGdldFNwZWNpZmljQW5ub3RhdGlvbih0eXBlLCB0eXBlRGVjbGFyYXRpb24sIChJVHlwZSl0eXBlLCBhbm5vdGF0aW9uUU5hbWUpOw0KLQkJDQotCQljYXNlIElKYXZhRWxlbWVudC5GSUVMRDoNCi0JCQlJRmllbGQgZmllbGQgPSAoSUZpZWxkKSB0eXBlOw0KLQkJCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0RmllbGREZWNsYXJhdGlvbihmaWVsZCwgKFR5cGVEZWNsYXJhdGlvbil0eXBlRGVjbGFyYXRpb24pOw0KLQkJCXJldHVybiBnZXRTcGVjaWZpY0Fubm90YXRpb24odHlwZSwgZmllbGREZWNsYXJhdGlvbiwgZmllbGQuZ2V0RGVjbGFyaW5nVHlwZSgpLCBhbm5vdGF0aW9uUU5hbWUpOw0KLQ0KLQkJY2FzZSBJSmF2YUVsZW1lbnQuTUVUSE9EOg0KLQkJCUlNZXRob2QgbWV0aG9kID0gKElNZXRob2QpIHR5cGU7DQotCQkJTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldE1ldGhvZERlY2xhcmF0aW9uKG1ldGhvZCwgKFR5cGVEZWNsYXJhdGlvbil0eXBlRGVjbGFyYXRpb24pOw0KLQkJCXJldHVybiBnZXRTcGVjaWZpY0Fubm90YXRpb24odHlwZSwgbWV0aG9kRGVjbGFyYXRpb24sIG1ldGhvZC5nZXREZWNsYXJpbmdUeXBlKCksIGFubm90YXRpb25RTmFtZSk7DQotDQotCQljYXNlIElKYXZhRWxlbWVudC5UWVBFX1BBUkFNRVRFUjoNCi0JCQltZXRob2QgPSAoSU1ldGhvZCkoKElUeXBlUGFyYW1ldGVyKSB0eXBlKS5nZXRQYXJlbnQoKTsNCi0JCQltZXRob2REZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0TWV0aG9kRGVjbGFyYXRpb24obWV0aG9kLCAoVHlwZURlY2xhcmF0aW9uKXR5cGVEZWNsYXJhdGlvbik7DQotCQkJcmV0dXJuIGdldFNwZWNpZmljUGFyYW1Bbm5vdGF0aW9uKHR5cGUsIG1ldGhvZERlY2xhcmF0aW9uLCBtZXRob2QuZ2V0RGVjbGFyaW5nVHlwZSgpLCBhbm5vdGF0aW9uUU5hbWUpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIG51bGw7DQotCX0JDQotCQ0KLQlwcml2YXRlIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiBJQW5ub3RhdGlvbjxUPiBnZXRTcGVjaWZpY0Fubm90YXRpb24oZmluYWwgVCBpTWVtYmVyLCBmaW5hbCBCb2R5RGVjbGFyYXRpb24gYm9keURlY2xhcmF0aW9uLCBmaW5hbCBJVHlwZSB0eXBlLCBmaW5hbCBTdHJpbmcgYW5ub3RhdGlvblFOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWlmIChib2R5RGVjbGFyYXRpb24gIT0gbnVsbCkNCi0JCXsNCi0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JCQlmaW5hbCBMaXN0IGxpc3QgPSBib2R5RGVjbGFyYXRpb24ubW9kaWZpZXJzKCk7DQotCQkJcmV0dXJuIGV4dHJhY3RTcGVjaWZpY0Fubm90YXRpb24oaU1lbWJlciwgbGlzdCwgdHlwZSwgYW5ub3RhdGlvblFOYW1lKTsNCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcml2YXRlIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiBJQW5ub3RhdGlvbjxUPiBnZXRTcGVjaWZpY1BhcmFtQW5ub3RhdGlvbihUIGlNZW1iZXIsIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uLCBmaW5hbCBJVHlwZSB0eXBlLCBmaW5hbCBTdHJpbmcgYW5ub3RhdGlvblFOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWlmIChtZXRob2REZWNsYXJhdGlvbiAhPSBudWxsKQ0KLQkJew0KLQkJCWZvciAoT2JqZWN0IHBhcmFtIDogbWV0aG9kRGVjbGFyYXRpb24ucGFyYW1ldGVycygpKQ0KLQkJCXsNCi0JCQkJaWYgKHBhcmFtIGluc3RhbmNlb2YgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiAmJg0KLQkJCQkJCSgoSVR5cGVQYXJhbWV0ZXIpaU1lbWJlcikuZ2V0RWxlbWVudE5hbWUoKS50b1N0cmluZygpLmVxdWFscygoKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pcGFyYW0pLmdldE5hbWUoKS50b1N0cmluZygpKSkNCi0JCQkJew0KLQkJCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCQkJCQlmaW5hbCBMaXN0IGxpc3QgPSAoKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pIHBhcmFtKS5tb2RpZmllcnMoKTsNCi0JCQkJDQotCQkJCQlyZXR1cm4gZXh0cmFjdFNwZWNpZmljQW5ub3RhdGlvbihpTWVtYmVyLCBsaXN0LCB0eXBlLCBhbm5vdGF0aW9uUU5hbWUpOw0KLQkJCQl9DQotCQkJfQkJCQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0JDQotCQ0KLQlwcml2YXRlIGJvb2xlYW4gaXNTdXBwb3J0ZWRKYXZhRWxlbWVudChmaW5hbCBJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQpIA0KLQl7DQotCQlyZXR1cm4gCWphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCk9PUlKYXZhRWxlbWVudC5NRVRIT0QgfHwNCi0JCQkJamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKT09SUphdmFFbGVtZW50LlRZUEUgfHwNCi0JCQkJamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKT09SUphdmFFbGVtZW50LkZJRUxEIHx8DQotCQkJCWphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCk9PUlKYXZhRWxlbWVudC5UWVBFX1BBUkFNRVRFUjsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KCkgDQotCXsNCi0JCWlmIChjVW5pdD09bnVsbCkgew0KLQkJCWNVbml0ID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5jcmVhdGVDb21waWxhdGlvblVuaXQoaVR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksIG51bGwpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gY1VuaXQ7DQotCX0NCi0JDQotCXByaXZhdGUgSUxvY2F0b3IgY3JlYXRlTG9jYXRvcihmaW5hbCBBU1ROb2RlIG5vZGUpDQotCXsNCi0JCWZpbmFsIGludCBsaW5lTnVtYmVyID0gZ2V0Q29tcGlsYXRpb25Vbml0KCkuZ2V0TGluZU51bWJlcihub2RlLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQlyZXR1cm4gbmV3IExvY2F0b3JJbXBsKGxpbmVOdW1iZXIsIG5vZGUuZ2V0U3RhcnRQb3NpdGlvbigpLCBub2RlLmdldExlbmd0aCgpKTsNCi0JfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQW5ub3RhdGlvblByb3BlcnR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQW5ub3RhdGlvblByb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNjMTdiZmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0Fubm90YXRpb25Qcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uUHJvcGVydHk7DQotDQotDQotcHVibGljIGNsYXNzIEFubm90YXRpb25Qcm9wZXJ0eSBpbXBsZW1lbnRzIElBbm5vdGF0aW9uUHJvcGVydHkNCi17DQotCXByaXZhdGUgU3RyaW5nIGFubm90YXRpb25OYW1lOw0KLQlwcml2YXRlIFN0cmluZyBhdHRyaWJ1dGVOYW1lOw0KLQlwcml2YXRlIFN0cmluZyB2YWx1ZTsNCi0JcHJpdmF0ZSBBdHRyaWJ1dGVUeXBlRW51bSBhdHRyaWJ1dGVUeXBlOw0KLQkNCi0JLyoqDQotCSAqIFB1YmxpYyBjb25zdHJ1Y3RvciBmb3IgQW5ub3RhdGlvblByb3BlcnR5IG9iamVjdHMNCi0JICogDQotCSAqIEBwYXJhbSBhbm5vdGF0aW9uTmFtZSAtIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgTmFtZSBmb3IgdGhlIEFubm90YXRpb24uDQotCSAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lIC0gU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBOYW1lIGZvciB0aGUgQXR0cmlidXRlLg0KLQkgKiBAcGFyYW0gdmFsdWUgLSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIFZhbHVlIGZvciB0aGUgQXR0cmlidXRlLg0KLQkgKi8NCi0JcHVibGljIEFubm90YXRpb25Qcm9wZXJ0eShmaW5hbCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUsIGZpbmFsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBmaW5hbCBTdHJpbmcgdmFsdWUsIGZpbmFsIEF0dHJpYnV0ZVR5cGVFbnVtIGF0dHJpYnV0ZVR5cGUpDQotCXsNCi0JCXRoaXMuYW5ub3RhdGlvbk5hbWUgPSBhbm5vdGF0aW9uTmFtZTsNCi0JCXRoaXMuYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZU5hbWU7DQotCQl0aGlzLnZhbHVlID0gdmFsdWU7DQotCQl0aGlzLmF0dHJpYnV0ZVR5cGUgPSBhdHRyaWJ1dGVUeXBlOw0KLQl9DQotCQkNCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpDQotCXsNCi0JCXJldHVybiB0aGlzLmFubm90YXRpb25OYW1lOw0KLQl9DQotDQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpDQotCXsNCi0JCXJldHVybiB0aGlzLmF0dHJpYnV0ZU5hbWU7DQotCX0NCi0JDQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKQ0KLQl7DQotCQlyZXR1cm4gdGhpcy52YWx1ZTsNCi0JfQ0KLQkNCi0JcHVibGljIEF0dHJpYnV0ZVR5cGVFbnVtIGdldEF0dHJpYnV0ZVR5cGUoKQ0KLQl7DQotCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVUeXBlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9Bbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9Bbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWIwMThjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbDsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklQYXJhbVZhbHVlUGFpcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklWYWx1ZTsNCi0NCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyIGltcGxlbWVudHMgSUFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lcg0KLXsNCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTZXQ8SVBhcmFtVmFsdWVQYWlyPj4gdHlwZUFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwID0gDQotCQluZXcgSGFzaE1hcDxTdHJpbmcsIFNldDxJUGFyYW1WYWx1ZVBhaXI+PigpOw0KLQlwcml2YXRlIE1hcDxTdHJpbmcsIFNldDxJUGFyYW1WYWx1ZVBhaXI+PiBtZXRob2RBbm5vdGF0aW9uTmFtZTJQYXJhbVZhbHVlc01hcCA9IA0KLQkJbmV3IEhhc2hNYXA8U3RyaW5nLCBTZXQ8SVBhcmFtVmFsdWVQYWlyPj4oKTsNCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTZXQ8SVBhcmFtVmFsdWVQYWlyPj4gcGFyYW1ldGVyQW5ub3RhdGlvbk5hbWUyUGFyYW1WYWx1ZXNNYXAgPSANCi0JCW5ldyBIYXNoTWFwPFN0cmluZywgU2V0PElQYXJhbVZhbHVlUGFpcj4+KCk7DQotCQ0KLQkvKioNCi0JICogQWRkIEFubm90YXRpb24gUHJvcGVydHkgdG8gdGhlIGNvbnRhaW5lci4gDQotCSAqIA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+IG9yIDxjb2RlPmFubm90YXRpb25Qcm9wZXJ0eTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBhZGRBbm5vdGF0aW9uUHJvcGVydHkoZmluYWwgQW5ub3RhdGlvblByb3BlcnR5IGFubm90YXRpb25Qcm9wZXJ0eSwgZmluYWwgRWxlbWVudFR5cGUgdGFyZ2V0KQ0KLQl7DQotCQlpZihhbm5vdGF0aW9uUHJvcGVydHkgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImFubm90YXRpb25Qcm9wZXJ0eSBjb3VsZCBub3QgYmUgbnVsbCEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJaWYodGFyZ2V0ID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJ0YXJnZXQgY291bGQgbm90IGJlIG51bGwhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCWlmKCEodGFyZ2V0LmVxdWFscyhFbGVtZW50VHlwZS5UWVBFKSkgJiYgISh0YXJnZXQuZXF1YWxzKEVsZW1lbnRUeXBlLk1FVEhPRCkpICYmICEodGFyZ2V0LmVxdWFscyhFbGVtZW50VHlwZS5QQVJBTUVURVIpKSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0YXJnZXQgcGFyYW1ldGVyIGlzIG5vdCBvZiBjb3JyZWN0IHR5cGUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJTWFwPFN0cmluZywgU2V0PElQYXJhbVZhbHVlUGFpcj4+IGFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwID0gbnVsbDsNCi0JCQ0KLQkJaWYodGFyZ2V0LmVxdWFscyhFbGVtZW50VHlwZS5UWVBFKSkNCi0JCXsNCi0JCQlhbm5vdGF0aW9uTmFtZTJQYXJhbVZhbHVlc01hcCA9IHR5cGVBbm5vdGF0aW9uTmFtZTJQYXJhbVZhbHVlc01hcDsNCi0JCX0NCi0JCWlmKHRhcmdldC5lcXVhbHMoRWxlbWVudFR5cGUuTUVUSE9EKSkNCi0JCXsNCi0JCQlhbm5vdGF0aW9uTmFtZTJQYXJhbVZhbHVlc01hcCA9IG1ldGhvZEFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwOw0KLQkJfQ0KLQkJaWYodGFyZ2V0LmVxdWFscyhFbGVtZW50VHlwZS5QQVJBTUVURVIpKQ0KLQkJew0KLQkJCWFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwID0gcGFyYW1ldGVyQW5ub3RhdGlvbk5hbWUyUGFyYW1WYWx1ZXNNYXA7DQotCQl9DQotCQkNCi0JCQ0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZXNTZXQgPSBhbm5vdGF0aW9uTmFtZTJQYXJhbVZhbHVlc01hcC5nZXQoYW5ub3RhdGlvblByb3BlcnR5LmdldEFubm90YXRpb25OYW1lKCkpOw0KLQkJaWYocGFyYW1WYWx1ZXNTZXQgPT0gbnVsbCkNCi0JCXsNCi0JCQlwYXJhbVZhbHVlc1NldCA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCQlhbm5vdGF0aW9uTmFtZTJQYXJhbVZhbHVlc01hcC5wdXQoYW5ub3RhdGlvblByb3BlcnR5LmdldEFubm90YXRpb25OYW1lKCksIHBhcmFtVmFsdWVzU2V0KTsNCi0JCX0NCi0NCi0JCUlWYWx1ZSB2YWx1ZSA9IG51bGw7IA0KLQkJaWYoYW5ub3RhdGlvblByb3BlcnR5LmdldEF0dHJpYnV0ZVR5cGUoKSA9PSBudWxsKQ0KLQkJew0KLQkJCXJldHVybjsNCi0JCX0NCi0JCQ0KLQkJaWYoYW5ub3RhdGlvblByb3BlcnR5LmdldEF0dHJpYnV0ZVR5cGUoKS5lcXVhbHMoQXR0cmlidXRlVHlwZUVudW0uQk9PTEVBTikpDQotCQl7DQotCQkJdmFsdWUgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVCb29sZWFuVmFsdWUobmV3IEJvb2xlYW4oYW5ub3RhdGlvblByb3BlcnR5LmdldFZhbHVlKCkpKTsNCi0JCX0NCi0JCWlmKGFubm90YXRpb25Qcm9wZXJ0eS5nZXRBdHRyaWJ1dGVUeXBlKCkuZXF1YWxzKEF0dHJpYnV0ZVR5cGVFbnVtLkNMQVNTKSkNCi0JCXsNCi0JCQkvL1RPRE8gY2hhbmdlIHRoaXMhISEhISENCi0JCQkvL3ZhbHVlID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQ2xhc3NWYWx1ZShhbm5vdGF0aW9uUHJvcGVydHkuZ2V0VmFsdWUoKSk7DQotCQl9DQotCQlpZihhbm5vdGF0aW9uUHJvcGVydHkuZ2V0QXR0cmlidXRlVHlwZSgpLmVxdWFscyhBdHRyaWJ1dGVUeXBlRW51bS5JTlRFR0VSKSkNCi0JCXsNCi0JCQl2YWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUludGVnZXJWYWx1ZShhbm5vdGF0aW9uUHJvcGVydHkuZ2V0VmFsdWUoKSk7DQotCQl9DQotCQlpZihhbm5vdGF0aW9uUHJvcGVydHkuZ2V0QXR0cmlidXRlVHlwZSgpLmVxdWFscyhBdHRyaWJ1dGVUeXBlRW51bS5RVUFMSUZJRURfTkFNRSkpDQotCQl7DQotCQkJdmFsdWUgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoYW5ub3RhdGlvblByb3BlcnR5LmdldFZhbHVlKCkpOw0KLQkJfQ0KLQkJaWYodmFsdWUgPT0gbnVsbCkNCi0JCXsNCi0JCQl2YWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKGFubm90YXRpb25Qcm9wZXJ0eS5nZXRWYWx1ZSgpKTsNCi0JCX0NCi0NCi0JCUlQYXJhbVZhbHVlUGFpciBwYXJhbVZhbHVlUGFpciA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoYW5ub3RhdGlvblByb3BlcnR5LmdldEF0dHJpYnV0ZU5hbWUoKSwgdmFsdWUpOw0KLQkJDQotCQlwYXJhbVZhbHVlc1NldC5hZGQocGFyYW1WYWx1ZVBhaXIpOw0KLQl9DQotCS8qKg0KLQkgKiBAcGFyYW0gSVR5cGVQYXJhbWV0ZXIgDQotCSAqIEByZXR1cm4gU2V0IHdpdGggYWxsIEFubm90YXRpb24gZnJvbSB0aGUgY29udGFpbmVyLCB3aGljaCBhcmUgSVR5cGVQYXJhbWV0ZXIgcmVsZXZhbnQuDQotCSAqLw0KLQlwdWJsaWMgU2V0PElBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPj4gZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnMoSVR5cGVQYXJhbWV0ZXIgdFBhcmFtKQ0KLQl7DQotCQlyZXR1cm4gZ2V0QW5ub3RhdGlvbnMoRWxlbWVudFR5cGUuUEFSQU1FVEVSLCB0UGFyYW0pOw0KLQl9DQotDQotCS8qKg0KLQkgKiBAcmV0dXJuIFNldCB3aXRoIGFsbCBBbm5vdGF0aW9uIGZyb20gdGhlIGNvbnRhaW5lciwgd2hpY2ggYXJlIElUeXBlIHJlbGV2YW50Lg0KLQkgKi8NCi0JcHVibGljIFNldDxJQW5ub3RhdGlvbjxJVHlwZT4+IGdldFR5cGVBbm5vdGF0aW9ucyhJVHlwZSB0eXBlKQ0KLQl7DQotCQlyZXR1cm4gZ2V0QW5ub3RhdGlvbnMoRWxlbWVudFR5cGUuVFlQRSwgdHlwZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gU2V0IHdpdGggYWxsIEFubm90YXRpb24gZnJvbSB0aGUgY29udGFpbmVyLCB3aGljaCBhcmUgSU1ldGhvZCByZWxldmFudC4NCi0JICovDQotCXB1YmxpYyBTZXQ8SUFubm90YXRpb248SU1ldGhvZD4+IGdldE1ldGhvZEFubm90YXRpb25zKElNZXRob2QgbWV0aG9kKQ0KLQl7DQotCQlyZXR1cm4gZ2V0QW5ub3RhdGlvbnMoRWxlbWVudFR5cGUuTUVUSE9EICwgbWV0aG9kKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gU2V0PElBbm5vdGF0aW9uPFQ+PiBnZXRBbm5vdGF0aW9ucyhmaW5hbCBFbGVtZW50VHlwZSB0YXJnZXQsIGZpbmFsIFQgaVRhcmdldCkNCi0Jew0KLQkJaWYoISh0YXJnZXQuZXF1YWxzKEVsZW1lbnRUeXBlLlRZUEUpKSAmJiAhKHRhcmdldC5lcXVhbHMoRWxlbWVudFR5cGUuTUVUSE9EKSkgJiYgISh0YXJnZXQuZXF1YWxzKEVsZW1lbnRUeXBlLlBBUkFNRVRFUikpKQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRhcmdldCBwYXJhbWV0ZXIgaXMgbm90IG9mIGNvcnJlY3QgdHlwZSIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlNYXA8U3RyaW5nLCBTZXQ8SVBhcmFtVmFsdWVQYWlyPj4gYW5ub3RhdGlvbk5hbWUyUGFyYW1WYWx1ZXNNYXAgPSBudWxsOw0KLQkJaWYodGFyZ2V0LmVxdWFscyhFbGVtZW50VHlwZS5UWVBFKSkNCi0JCXsNCi0JCQlhbm5vdGF0aW9uTmFtZTJQYXJhbVZhbHVlc01hcCA9IHR5cGVBbm5vdGF0aW9uTmFtZTJQYXJhbVZhbHVlc01hcDsNCi0JCX0NCi0JCWlmKHRhcmdldC5lcXVhbHMoRWxlbWVudFR5cGUuTUVUSE9EKSkNCi0JCXsNCi0JCQlhbm5vdGF0aW9uTmFtZTJQYXJhbVZhbHVlc01hcCA9IG1ldGhvZEFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwOw0KLQkJfQ0KLQkJaWYodGFyZ2V0LmVxdWFscyhFbGVtZW50VHlwZS5QQVJBTUVURVIpKQ0KLQkJew0KLQkJCWFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwID0gcGFyYW1ldGVyQW5ub3RhdGlvbk5hbWUyUGFyYW1WYWx1ZXNNYXA7DQotCQl9DQotCQlTZXQ8SUFubm90YXRpb248VD4+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PElBbm5vdGF0aW9uPFQ+PigpOw0KLQkJU2V0PFN0cmluZz4ga2V5cyA9IGFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwLmtleVNldCgpOw0KLQkJZm9yIChTdHJpbmcga2V5IDoga2V5cykNCi0JCXsNCi0JCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlUGFpcnNTZXQgPSBhbm5vdGF0aW9uTmFtZTJQYXJhbVZhbHVlc01hcC5nZXQoa2V5KTsNCi0JCQlJQW5ub3RhdGlvbjxUPiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbihrZXksIHBhcmFtVmFsdWVQYWlyc1NldCwgaVRhcmdldCk7DQotCQkJcmVzdWx0LmFkZChhbm5vdGF0aW9uKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQkNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0Fubm90YXRpb25VdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0Fubm90YXRpb25VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjODU1YTFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9Bbm5vdGF0aW9uVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BYnN0cmFjdFR5cGVEZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Cb2R5RGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JRXh0ZW5kZWRNb2RpZmllcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZERlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVEZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuY2xhenouQVNUVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC50ZXh0LkpheFdzVXRpbE1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMucmVzb3VyY2VzLkVkaXRSZXNvdXJjZXNNYW5hZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMucmVzb3VyY2VzLkZpbGVVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnJlc291cmNlcy5JRmlsZVV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk1hbGZvcm1lZFRyZWVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ7DQotDQotLyoqDQotICogQ29udGFpbnMgdXRpbGl0aWVzIGZvciBnZXR0aW5nIEFTVCBvYmplY3RzIG5lZWRlZCBpbiBhbm5vdGF0aW9uIHByb2Nlc3NpbmcNCi0gKiANCi0gKiBAYXV0aG9yIFBsYW1lbiBQYXZsb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvblV0aWxzDQotew0KLQlwcml2YXRlIHN0YXRpYyBBbm5vdGF0aW9uVXRpbHMgdXRpbHMgPSBudWxsOw0KLQlwcml2YXRlIGZpbmFsIElGaWxlVXRpbHMgZmlsZVV0aWxzID0gRmlsZVV0aWxzLmdldEluc3RhbmNlKCk7DQotDQotCS8qKg0KLQkgKiBUaGUgZmFjdG9yeSBtZXRob2QuDQotCSAqIA0KLQkgKiBAcmV0dXJuIGEgQW5ub3RhdGlvblV0aWxzIGluc3RhbmNlLg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uVXRpbHMgZ2V0SW5zdGFuY2UoKQ0KLQl7DQotCQlpZiAodXRpbHMgPT0gbnVsbCkNCi0JCXsNCi0JCQl1dGlscyA9IG5ldyBBbm5vdGF0aW9uVXRpbHMoKTsNCi0JCX0NCi0JCXJldHVybiB1dGlsczsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIEdldHMgSURvY3VtZW50LCB3aGljaCBjb3Jlc3BvbmRzIHRvIG9uZSBDb21waWxhdGlvblVuaXQuDQotCSAqIA0KLQkgKiBAcGFyYW0gdW5pdCAtDQotCSAqICAgICAgICAgICAgQ29tcGlsYXRpb24gVW5pdCwgd2hpY2ggd2lsbCBiZSB1c2VkIGFzIHN0YXJ0aW5nIHBvaW50IHRvIGdldCB0aGUgSURvY3VtZW50Lg0KLQkgKiANCi0JICogQHJldHVybiBJRG9jdW1lbnQgd2hpY2ggaXMgZm91bmQuDQotCSAqIA0KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoSUNvbXBpbGF0aW9uVW5pdCB1bml0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlTdHJpbmcgc291cmNlID0gdW5pdC5nZXRCdWZmZXIoKS5nZXRDb250ZW50cygpOyANCi0JCXJldHVybiBuZXcgRG9jdW1lbnQoc291cmNlKTsgDQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZW1vdmVzIEFubm90YXRpb25zIG9mIHNwZWNpZmllZCBJSmF2YUVsZW1lbnQuDQotCSAqIA0KLQkgKiBAcGFyYW0gamF2YUVsZW1lbnQgLSBJSmF2YUVsZW1lbnQgd2hpY2ggd2lsbCBiZSB1c2VkIGFzIHN0YXJ0aW5nIHBvaW4gZm9yIHJlbW92aW5nIHRoZSBhbm5vdGF0aW9ucy4NCi0JICogQHBhcmFtIGFubm90YXRpb25zIC0gU2V0IHdoaWNoIGNvbnRhaW5zIFN0cmluZyB2YWx1ZXMgZm9yIHRoZSBhbm5vdGF0aW9ucyB3aGljaCB3aWxsIGJlIHJlbW92ZWQuIElmIHRoaXMgU2V0IGlzIGVtcHR5IGFsbCBBbm5vdGF0aW9ucyB3aWxsIGJlIHJlbW92ZWQuDQotCSAqIEBwYXJhbSBkZWVwUmVtb3ZlIC0gQm9vbGVhbiB2YWx1ZSwgcmVwcmVzZW50aW5nIHdoZXRoZXIgQW5ub3RhdGlvbnMgZnJvbSBqYXZhRWxlbWV0IGNoaWxkcyB3aWxsIGJlIHJlbW92ZWQuIA0KLQkgKiBAdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24gDQotCSAqIA0KLQkgKiBAdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgdGhvd24gaWYgQVNUIFR5cGVEZWNsYXJhdGlvbiBjYW5ub3QgYmUgZm91bmQgZm9yIDxjb2RlPnR5cGU8L2NvZGU+IGFuZCBhbHNvIGlzIHVzZWQgYXMgd3JhcHBlciBpbiBjYXNlIHtAbGluayBDb3JlRXhjZXB0aW9ufSBvcg0KLQkgKiAgICAgICAgICAgICB7QGxpbmsgQmFkTG9jYXRpb25FeGNlcHRpb259IGlzIHRocm93biB3aGlsZSBwcm9jZXNzaW5nLg0KLQkgKiBAdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIA0KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gDQotCSAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIA0KLQkgKiBAdGhyb3dzIE1hbGZvcm1lZFRyZWVFeGNlcHRpb24gDQotCSAqLw0KLQlwdWJsaWMgdm9pZCByZW1vdmVBbm5vdGF0aW9ucyhJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsIFNldDxTdHJpbmc+IGFubm90YXRpb25zLCBib29sZWFuIGRlZXBSZW1vdmUpIHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uLCBNYWxmb3JtZWRUcmVlRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIEJhZExvY2F0aW9uRXhjZXB0aW9uDQotCXsNCi0JCWlmKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSVR5cGUpDQotCQl7DQotCQkJSVR5cGUgdHlwZSA9IChJVHlwZSlqYXZhRWxlbWVudDsNCi0JCQlJQ29tcGlsYXRpb25Vbml0IGNVbml0ID0gdHlwZS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCQlTdHJpbmcgY2xhc3NOYW1lID0gdHlwZS5nZXRFbGVtZW50TmFtZSgpOw0KLQkJCUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5jcmVhdGVDb21waWxhdGlvblVuaXQoY1VuaXQsIG51bGwpOw0KLQ0KLQkJCUFic3RyYWN0VHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKGNsYXNzTmFtZSwgdW5pdCk7DQotCQkJaWYgKHR5cGVEZWNsYXJhdGlvbiA9PSBudWxsKQ0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oInR5cGVEZWNsYXJhdGlvbiBzaG91bGQgbm90IGJlIG51bGwiLC8vJE5PTi1OTFMtMSQNCi0JCQkJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoSmF4V3NVdGlsTWVzc2FnZXMuQW5ub3RhdGlvblV0aWxzX1BhcmFtU2hvdWxkTm90QmVOdWxsTXNnLCAidHlwZURlY2xhcmF0aW9uIikpOyAvLyROT04tTkxTLTEkDQotCQkJfQ0KLQkJCQ0KLQkJCXJlbW92ZVR5cGVBbm5vdGF0aW9ucyh0eXBlLCB0eXBlRGVjbGFyYXRpb24sIHVuaXQsIGNVbml0LCBhbm5vdGF0aW9ucyk7DQotDQotCQkJaWYoIWRlZXBSZW1vdmUpDQotCQkJew0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQkJCQ0KLQkJCUlGaWVsZFtdIHRtcEZpZWxkcyA9IHR5cGUuZ2V0RmllbGRzKCk7DQotCQkJaWYgKHRtcEZpZWxkcyAhPSBudWxsICYmIHRtcEZpZWxkcy5sZW5ndGggPiAwKQ0KLQkJCXsNCi0JCQkJZm9yIChJRmllbGQgdG1wRmllbGQgOiB0bXBGaWVsZHMpDQotCQkJCXsNCi0JCQkJCXJlbW92ZUZpZWxkQW5ub3RhdGlvbnModG1wRmllbGQsIHR5cGUsIGNVbml0LCBhbm5vdGF0aW9ucyk7DQotCQkJCX0NCi0JCQl9DQotCQkJDQotCQkJSU1ldGhvZFtdIHRtcE1ldGhvZHMgPSB0eXBlLmdldE1ldGhvZHMoKTsNCi0JCQlpZiAodG1wTWV0aG9kcyAhPSBudWxsICYmIHRtcE1ldGhvZHMubGVuZ3RoID4gMCkNCi0JCQl7DQotCQkJCWZvciAoSU1ldGhvZCB0bXBNZXRob2QgOiB0bXBNZXRob2RzKQ0KLQkJCQl7DQotCQkJCQlyZW1vdmVNZXRob2RBbm5vdGF0aW9ucyh0bXBNZXRob2QsIHR5cGUsIGNVbml0LCBhbm5vdGF0aW9ucyk7DQotDQotCQkJCQkvL1JlbW92ZSBwYXJhbXMgYW5ub3RhdGlvbnMNCi0JCQkJCWZvciAoU3RyaW5nIHBhcmFtTmFtZSA6IHRtcE1ldGhvZC5nZXRQYXJhbWV0ZXJOYW1lcygpKQ0KLQkJCQkJew0KLQkJCQkJCUlUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgPSB0bXBNZXRob2QuZ2V0VHlwZVBhcmFtZXRlcihwYXJhbU5hbWUpOw0KLQkJCQkJCXJlbW92ZVBhcmFtQW5ub3RhdGlvbnModHlwZVBhcmFtZXRlciwgdHlwZSwgY1VuaXQsIGFubm90YXRpb25zLCBwYXJhbU5hbWUpOwkJCQ0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlpZihqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElGaWVsZCkNCi0JCXsNCi0JCQlJRmllbGQgZmllbGQgPSAoSUZpZWxkKWphdmFFbGVtZW50Ow0KLQkJCUlUeXBlIGRlY2xhcmluZ1R5cGUgPSBmaWVsZC5nZXREZWNsYXJpbmdUeXBlKCk7DQotCQkJSUNvbXBpbGF0aW9uVW5pdCBkZWNsYXJpbmdUeXBlQ29tcFVuaXQgPSBkZWNsYXJpbmdUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJCQ0KLQkJCXJlbW92ZUZpZWxkQW5ub3RhdGlvbnMoZmllbGQsIGRlY2xhcmluZ1R5cGUsIGRlY2xhcmluZ1R5cGVDb21wVW5pdCwgYW5ub3RhdGlvbnMpOw0KLQkJfQ0KLQkJDQotCQlpZihqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElNZXRob2QpDQotCQl7DQotCQkJSU1ldGhvZCBtZXRob2QgPSAoSU1ldGhvZClqYXZhRWxlbWVudDsNCi0JCQlJVHlwZSBkZWNsYXJpbmdUeXBlID0gbWV0aG9kLmdldERlY2xhcmluZ1R5cGUoKTsNCi0JCQlJQ29tcGlsYXRpb25Vbml0IGRlY2xhcmluZ1R5cGVDb21wVW5pdCA9IGRlY2xhcmluZ1R5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQkJDQotCQkJcmVtb3ZlTWV0aG9kQW5ub3RhdGlvbnMobWV0aG9kLCBkZWNsYXJpbmdUeXBlLCBkZWNsYXJpbmdUeXBlQ29tcFVuaXQsIGFubm90YXRpb25zKTsNCi0JCQlpZighZGVlcFJlbW92ZSkNCi0JCQl7DQotCQkJCXJldHVybjsNCi0JCQl9DQotDQotCQkJLy9SZW1vdmUgcGFyYW1zIGFubm90YXRpb25zDQotCQkJZm9yIChTdHJpbmcgcGFyYW1OYW1lOiBtZXRob2QuZ2V0UGFyYW1ldGVyTmFtZXMoKSkNCi0JCQl7DQotCQkJICBJVHlwZVBhcmFtZXRlciBwYXJhbSA9IG1ldGhvZC5nZXRUeXBlUGFyYW1ldGVyKHBhcmFtTmFtZSk7DQotCQkJICByZW1vdmVQYXJhbUFubm90YXRpb25zKHBhcmFtLCBkZWNsYXJpbmdUeXBlLCBkZWNsYXJpbmdUeXBlQ29tcFVuaXQsIGFubm90YXRpb25zLCBwYXJhbU5hbWUpOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJaWYoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZVBhcmFtZXRlcikNCi0JCXsNCi0JCQlJVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyID0gKElUeXBlUGFyYW1ldGVyKWphdmFFbGVtZW50Ow0KLQkJCUlNZXRob2QgdG1wTWV0aG9kID0gKElNZXRob2QpIHR5cGVQYXJhbWV0ZXIuZ2V0RGVjbGFyaW5nTWVtYmVyKCk7DQotCQkJLy9UT0RPIGNoZWNrIHRoaXMNCi0JCQkvL3BhcmFtLmdldFBhcmVudCgpOw0KLQkJCUlUeXBlIGRlY2xhcmluZ1R5cGUgPSB0bXBNZXRob2QuZ2V0RGVjbGFyaW5nVHlwZSgpOw0KLQkJCUlDb21waWxhdGlvblVuaXQgZGVjbGFyaW5nVHlwZUNvbXBVbml0ID0gZGVjbGFyaW5nVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCQkvL1RPRE8gRklYIFRISVMNCi0JCQlyZW1vdmVQYXJhbUFubm90YXRpb25zKHR5cGVQYXJhbWV0ZXIsIGRlY2xhcmluZ1R5cGUsIGRlY2xhcmluZ1R5cGVDb21wVW5pdCwgYW5ub3RhdGlvbnMsIG51bGwpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlVHlwZUFubm90YXRpb25zKElUeXBlIHR5cGUsIEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgQ29tcGlsYXRpb25Vbml0IHVuaXQsIElDb21waWxhdGlvblVuaXQgY1VuaXQsIFNldDxTdHJpbmc+IGFubm90YXRpb25zU2V0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiwgQmFkTG9jYXRpb25FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQl1bml0LnJlY29yZE1vZGlmaWNhdGlvbnMoKTsNCi0JCWlmIChyZW1vdmVBbm5vdGF0aW9ucyh0eXBlRGVjbGFyYXRpb24ubW9kaWZpZXJzKCksIGFubm90YXRpb25zU2V0KSkNCi0JCXsNCi0JCQlJRG9jdW1lbnQgZG9jID0gQW5ub3RhdGlvblV0aWxzLmdldEluc3RhbmNlKCkuZ2V0RG9jdW1lbnQoY1VuaXQpOw0KLQkJCVRleHRFZGl0IGVkaXQgPSB1bml0LnJld3JpdGUoZG9jLCBudWxsKTsNCi0JCQllZGl0LmFwcGx5KGRvYyk7DQotDQotCQkJc2F2ZUNvbnRlbnQoY1VuaXQsIGRvYyk7DQotCQl9DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUZpZWxkQW5ub3RhdGlvbnMoSUZpZWxkIGZpZWxkLCBJVHlwZSBkZWNsYXJpbmdUeXBlLCBJQ29tcGlsYXRpb25Vbml0IGRlY2xhcmluZ1R5cGVDb21wVW5pdCwgU2V0PFN0cmluZz4gYW5ub3RhdGlvbnNTZXQpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRUcmVlRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCUlDb21waWxhdGlvblVuaXQgZmNVbml0ID0gZmllbGQuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQlTdHJpbmcgY2xhc3NOYW1lID0gZGVjbGFyaW5nVHlwZS5nZXRFbGVtZW50TmFtZSgpOw0KLQkJQ29tcGlsYXRpb25Vbml0IGZVbml0ID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5jcmVhdGVDb21waWxhdGlvblVuaXQoZmNVbml0LCBudWxsKTsNCi0NCi0JCUJvZHlEZWNsYXJhdGlvbiBmQm9keURlY2xhcmF0aW9uID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlRGVjbGFyYXRpb24oY2xhc3NOYW1lLCBmVW5pdCk7DQotCQlmQm9keURlY2xhcmF0aW9uID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRGaWVsZERlY2xhcmF0aW9uKGZpZWxkLCAoVHlwZURlY2xhcmF0aW9uKSBmQm9keURlY2xhcmF0aW9uKTsNCi0NCi0JCWZVbml0LnJlY29yZE1vZGlmaWNhdGlvbnMoKTsNCi0JCWlmIChyZW1vdmVBbm5vdGF0aW9ucyhmQm9keURlY2xhcmF0aW9uLm1vZGlmaWVycygpLCBhbm5vdGF0aW9uc1NldCkpDQotCQl7DQotCQkJSURvY3VtZW50IGRvYyA9IGdldERvY3VtZW50KGRlY2xhcmluZ1R5cGVDb21wVW5pdCk7DQotCQkJVGV4dEVkaXQgZWRpdCA9IGZVbml0LnJld3JpdGUoZG9jLCBudWxsKTsNCi0JCQllZGl0LmFwcGx5KGRvYyk7DQotDQotCQkJc2F2ZUNvbnRlbnQoZGVjbGFyaW5nVHlwZUNvbXBVbml0LCBkb2MpOw0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgdm9pZCByZW1vdmVNZXRob2RBbm5vdGF0aW9ucyhJTWV0aG9kIG1ldGhvZCwgSVR5cGUgZGVjbGFyaW5nVHlwZSwgSUNvbXBpbGF0aW9uVW5pdCBkZWNsYXJpbmdUeXBlQ29tcFVuaXQsIFNldDxTdHJpbmc+IGFubm90YXRpb25zU2V0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiwgQmFkTG9jYXRpb25FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQlJQ29tcGlsYXRpb25Vbml0IG1jVW5pdCA9IG1ldGhvZC5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCVN0cmluZyBjbGFzc05hbWUgPSBkZWNsYXJpbmdUeXBlLmdldEVsZW1lbnROYW1lKCk7DQotCQlDb21waWxhdGlvblVuaXQgbVVuaXQgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChtY1VuaXQsIG51bGwpOw0KLQ0KLQkJQm9keURlY2xhcmF0aW9uIG1Cb2R5RGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldFR5cGVEZWNsYXJhdGlvbihjbGFzc05hbWUsIG1Vbml0KTsNCi0JCW1Cb2R5RGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldE1ldGhvZERlY2xhcmF0aW9uKG1ldGhvZCwgKFR5cGVEZWNsYXJhdGlvbikgbUJvZHlEZWNsYXJhdGlvbik7DQotCQltVW5pdC5yZWNvcmRNb2RpZmljYXRpb25zKCk7DQotCQlpZiAocmVtb3ZlQW5ub3RhdGlvbnMobUJvZHlEZWNsYXJhdGlvbi5tb2RpZmllcnMoKSwgYW5ub3RhdGlvbnNTZXQpKQ0KLQkJew0KLQkJCUlEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudChkZWNsYXJpbmdUeXBlQ29tcFVuaXQpOw0KLQkJCVRleHRFZGl0IGVkaXQgPSBtVW5pdC5yZXdyaXRlKGRvYywgbnVsbCk7DQotCQkJZWRpdC5hcHBseShkb2MpOw0KLQ0KLQkJCXNhdmVDb250ZW50KGRlY2xhcmluZ1R5cGVDb21wVW5pdCwgZG9jKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlUGFyYW1Bbm5vdGF0aW9ucyhJVHlwZVBhcmFtZXRlciBwYXJhbSwgSVR5cGUgZGVjbGFyaW5nVHlwZSwgSUNvbXBpbGF0aW9uVW5pdCBkZWNsYXJpbmdUeXBlQ29tcFVuaXQsIFNldDxTdHJpbmc+IGFubm90YXRpb25zU2V0LCBTdHJpbmcgcGFyYW1OYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiwgQmFkTG9jYXRpb25FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQlJTWV0aG9kIHRtcE1ldGhvZCA9IChJTWV0aG9kKXBhcmFtLmdldERlY2xhcmluZ01lbWJlcigpOw0KLQkJLy9UT0RPIGNoZWNrIHRoaXMNCi0JCS8vcGFyYW0uZ2V0UGFyZW50KCk7DQotCQlTdHJpbmcgY2xhc3NOYW1lID0gZGVjbGFyaW5nVHlwZS5nZXRFbGVtZW50TmFtZSgpOw0KLQkJSUNvbXBpbGF0aW9uVW5pdCBtY1VuaXQgPSB0bXBNZXRob2QuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQlDb21waWxhdGlvblVuaXQgbVVuaXQgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChtY1VuaXQsIG51bGwpOw0KLQ0KLQkJQm9keURlY2xhcmF0aW9uIG1Cb2R5RGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldFR5cGVEZWNsYXJhdGlvbihjbGFzc05hbWUsIG1Vbml0KTsNCi0JCW1Cb2R5RGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldE1ldGhvZERlY2xhcmF0aW9uKHRtcE1ldGhvZCwgKFR5cGVEZWNsYXJhdGlvbikgbUJvZHlEZWNsYXJhdGlvbik7DQotCQltVW5pdC5yZWNvcmRNb2RpZmljYXRpb25zKCk7DQotDQotCQlmb3IgKE9iamVjdCBvYmplY3QgOiAoKE1ldGhvZERlY2xhcmF0aW9uKSBtQm9keURlY2xhcmF0aW9uKS5wYXJhbWV0ZXJzKCkpDQotCQl7DQotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pDQotCQkJew0KLQkJCSAgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBzdmQgPSAoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikgb2JqZWN0Ow0KLQkJCQlpZiAoKHBhcmFtTmFtZSA9PSBudWxsIHx8IHN2ZC5nZXROYW1lKCkudG9TdHJpbmcoKS5lcXVhbHMocGFyYW1OYW1lKSkgJiYNCi0JCQkJICAgICAgICByZW1vdmVBbm5vdGF0aW9ucyhzdmQubW9kaWZpZXJzKCksIGFubm90YXRpb25zU2V0KSkNCi0JCQkJew0KLQkJCQkJSURvY3VtZW50IGRvYyA9IGdldERvY3VtZW50KGRlY2xhcmluZ1R5cGVDb21wVW5pdCk7DQotCQkJCQlUZXh0RWRpdCBlZGl0ID0gbVVuaXQucmV3cml0ZShkb2MsIG51bGwpOw0KLQkJCQkJZWRpdC5hcHBseShkb2MpOw0KLQkJCQkJDQotCQkJCQlzYXZlQ29udGVudChkZWNsYXJpbmdUeXBlQ29tcFVuaXQsIGRvYyk7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCX0NCi0JDQotCXByaXZhdGUgdm9pZCBzYXZlQ29udGVudChJQ29tcGlsYXRpb25Vbml0IGNVbml0LCBJRG9jdW1lbnQgZG9jKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBKYXZhTW9kZWxFeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJSVN0YXR1cyBzdGF0dXMgPSAobmV3IEVkaXRSZXNvdXJjZXNNYW5hZ2VyKCkpLnNldEZpbGVFZGl0YWJsZSgoSUZpbGUpIGNVbml0LmdldFJlc291cmNlKCkpOw0KLQkJaWYoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5PSyApDQotCQl7DQotCQkJZmlsZVV0aWxzLnNldENvbXBpbGF0aW9uVW5pdENvbnRlbnRBbmRTYXZlRGlydHlFZGl0b3JzKGNVbml0LCBkb2MuZ2V0KCksIHRydWUsIG51bGwpOw0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCXRocm93IG5ldyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uKCJBbm5vdGF0dGlvbiBjb3VsZCBub3QgYmUgc3RvcmVkLCB0aGUgZmlsZSBpcyBub3Qgd3JpdGFibGUiLCAvLyROT04tTkxTLTEkDQotCQkJCQkJCQkJCQlKYXhXc1V0aWxNZXNzYWdlcy5Bbm5vdGF0aW9uQ2Fubm90QmVTdG9yZWRNc2cpOw0KLQkJfQ0KLQl9DQotCQ0KLQkvKioNCi0JICogUmVtb3ZlcyBzcGVjaWZpYyBBbm5vdGF0aW9uIG9mIHNwZWNpZmllZCBJSmF2YUVsZW1lbnQuDQotCSAqIA0KLQkgKiBAcGFyYW0gamF2YUVsZW1lbnQgLSBJSmF2YUVsZW1lbnQgd2hpY2ggd2lsbCBiZSB1c2VkIGFzIHN0YXJ0aW5nIHBvaW4gZm9yIHJlbW92aW5nIHRoZSBBbm5vdGF0aW9uLg0KLQkgKiBAcGFyYW0gYW5ub3RhdGlvbk5hbWUgLSBTdHJpbmcgd2hpY2ggaXMgdGhlIHJlcHJlc2VudGF0aW9uIE5hbWUgb2YgdGhlIEFubm90YXRpb24sIHdoaWNoIHdpbGwgYmUgcmVtb3ZlZC4NCi0JICogDQotCSAqIEB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbiANCi0JICogQHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHRob3duIGlmIEFTVCBUeXBlRGVjbGFyYXRpb24gY2Fubm90IGJlIGZvdW5kIGZvciA8Y29kZT50eXBlPC9jb2RlPiBhbmQgYWxzbyBpcyB1c2VkIGFzIHdyYXBwZXIgaW4gY2FzZSB7QGxpbmsgQ29yZUV4Y2VwdGlvbn0gb3INCi0JICogICAgICAgICAgICAge0BsaW5rIEJhZExvY2F0aW9uRXhjZXB0aW9ufSBpcyB0aHJvd24gd2hpbGUgcHJvY2Vzc2luZy4NCi0JICogQHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiANCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIA0KLQkgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiANCi0JICogQHRocm93cyBNYWxmb3JtZWRUcmVlRXhjZXB0aW9uIA0KLQkgKi8NCi0JcHVibGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbihJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgQmFkTG9jYXRpb25FeGNlcHRpb24NCi0Jew0KLQkJaWYoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZSkNCi0JCXsNCi0JCQlJVHlwZSB0eXBlID0gKElUeXBlKWphdmFFbGVtZW50Ow0KLQkJCUlDb21waWxhdGlvblVuaXQgY1VuaXQgPSB0eXBlLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJCVN0cmluZyBjbGFzc05hbWUgPSB0eXBlLmdldEVsZW1lbnROYW1lKCk7DQotCQkJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChjVW5pdCwgbnVsbCk7DQotDQotCQkJQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlRGVjbGFyYXRpb24oY2xhc3NOYW1lLCB1bml0KTsNCi0JCQlpZiAodHlwZURlY2xhcmF0aW9uID09IG51bGwpDQotCQkJew0KLQkJCQl0aHJvdyBuZXcgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbigidHlwZURlY2xhcmF0aW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIC8vJE5PTi1OTFMtMSQNCi0JCQkJCQkJCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChKYXhXc1V0aWxNZXNzYWdlcy5Bbm5vdGF0aW9uVXRpbHNfUGFyYW1TaG91bGROb3RCZU51bGxNc2csICJ0eXBlRGVjbGFyYXRpb24iKSk7IC8vJE5PTi1OTFMtMSQNCi0JCQl9DQotCQkJDQotCQkJcmVtb3ZlVHlwZUFubm90YXRpb24odHlwZSwgdHlwZURlY2xhcmF0aW9uLCB1bml0LCBjVW5pdCwgYW5ub3RhdGlvbk5hbWUpOw0KLQ0KLQkJfQ0KLQkJDQotCQlpZihqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElGaWVsZCkNCi0JCXsNCi0JCQlJRmllbGQgZmllbGQgPSAoSUZpZWxkKWphdmFFbGVtZW50Ow0KLQkJCUlUeXBlIGRlY2xhcmluZ1R5cGUgPSBmaWVsZC5nZXREZWNsYXJpbmdUeXBlKCk7DQotCQkJSUNvbXBpbGF0aW9uVW5pdCBkZWNsYXJpbmdUeXBlQ29tcFVuaXQgPSBkZWNsYXJpbmdUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJCQ0KLQkJCXJlbW92ZUZpZWxkQW5ub3RhdGlvbihmaWVsZCwgZGVjbGFyaW5nVHlwZSwgZGVjbGFyaW5nVHlwZUNvbXBVbml0LCBhbm5vdGF0aW9uTmFtZSk7DQotCQl9DQotCQkNCi0JCWlmKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSU1ldGhvZCkNCi0JCXsNCi0JCQlJTWV0aG9kIG1ldGhvZCA9IChJTWV0aG9kKWphdmFFbGVtZW50Ow0KLQkJCUlUeXBlIGRlY2xhcmluZ1R5cGUgPSBtZXRob2QuZ2V0RGVjbGFyaW5nVHlwZSgpOw0KLQkJCUlDb21waWxhdGlvblVuaXQgZGVjbGFyaW5nVHlwZUNvbXBVbml0ID0gZGVjbGFyaW5nVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCQkNCi0JCQlyZW1vdmVNZXRob2RBbm5vdGF0aW9uKG1ldGhvZCwgZGVjbGFyaW5nVHlwZSwgZGVjbGFyaW5nVHlwZUNvbXBVbml0LCBhbm5vdGF0aW9uTmFtZSk7DQotCQl9DQotCQkNCi0JCWlmKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSVR5cGVQYXJhbWV0ZXIpDQotCQl7DQotCQkJSVR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IChJVHlwZVBhcmFtZXRlcilqYXZhRWxlbWVudDsNCi0JCQlJTWV0aG9kIHRtcE1ldGhvZCA9IChJTWV0aG9kKSB0eXBlUGFyYW1ldGVyLmdldERlY2xhcmluZ01lbWJlcigpOw0KLQkJCS8vVE9ETyBjaGVjayB0aGlzDQotCQkJLy9wYXJhbS5nZXRQYXJlbnQoKTsNCi0JCQlJVHlwZSBkZWNsYXJpbmdUeXBlID0gdG1wTWV0aG9kLmdldERlY2xhcmluZ1R5cGUoKTsNCi0JCQlJQ29tcGlsYXRpb25Vbml0IGRlY2xhcmluZ1R5cGVDb21wVW5pdCA9IGRlY2xhcmluZ1R5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotDQotCQkJcmVtb3ZlUGFyYW1Bbm5vdGF0aW9uKHR5cGVQYXJhbWV0ZXIsIGRlY2xhcmluZ1R5cGUsIGRlY2xhcmluZ1R5cGVDb21wVW5pdCwgYW5ub3RhdGlvbk5hbWUpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlVHlwZUFubm90YXRpb24oSVR5cGUgdHlwZSwgQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBDb21waWxhdGlvblVuaXQgdW5pdCwgSUNvbXBpbGF0aW9uVW5pdCBjVW5pdCwgU3RyaW5nIGFubm90YXRpb25OYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiwgQmFkTG9jYXRpb25FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQl1bml0LnJlY29yZE1vZGlmaWNhdGlvbnMoKTsNCi0JCWlmIChyZW1vdmVBbm5vdGF0aW9uKHR5cGVEZWNsYXJhdGlvbi5tb2RpZmllcnMoKSwgYW5ub3RhdGlvbk5hbWUpKQ0KLQkJew0KLQkJCUlEb2N1bWVudCBkb2MgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXREb2N1bWVudChjVW5pdCk7DQotCQkJVGV4dEVkaXQgZWRpdCA9IHVuaXQucmV3cml0ZShkb2MsIG51bGwpOw0KLQkJCWVkaXQuYXBwbHkoZG9jKTsNCi0NCi0JCQlzYXZlQ29udGVudChjVW5pdCwgZG9jKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlRmllbGRBbm5vdGF0aW9uKElGaWVsZCBmaWVsZCwgSVR5cGUgZGVjbGFyaW5nVHlwZSwgSUNvbXBpbGF0aW9uVW5pdCBkZWNsYXJpbmdUeXBlQ29tcFVuaXQsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE1hbGZvcm1lZFRyZWVFeGNlcHRpb24sIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJSUNvbXBpbGF0aW9uVW5pdCBmY1VuaXQgPSBmaWVsZC5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCVN0cmluZyBjbGFzc05hbWUgPSBkZWNsYXJpbmdUeXBlLmdldEVsZW1lbnROYW1lKCk7DQotCQlDb21waWxhdGlvblVuaXQgZlVuaXQgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChmY1VuaXQsIG51bGwpOw0KLQ0KLQkJQm9keURlY2xhcmF0aW9uIGZCb2R5RGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldFR5cGVEZWNsYXJhdGlvbihjbGFzc05hbWUsIGZVbml0KTsNCi0JCWZCb2R5RGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldEZpZWxkRGVjbGFyYXRpb24oZmllbGQsIChUeXBlRGVjbGFyYXRpb24pIGZCb2R5RGVjbGFyYXRpb24pOw0KLQ0KLQkJZlVuaXQucmVjb3JkTW9kaWZpY2F0aW9ucygpOw0KLQkJaWYgKHJlbW92ZUFubm90YXRpb24oZkJvZHlEZWNsYXJhdGlvbi5tb2RpZmllcnMoKSwgYW5ub3RhdGlvbk5hbWUpKQ0KLQkJew0KLQkJCUlEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudChkZWNsYXJpbmdUeXBlQ29tcFVuaXQpOw0KLQkJCVRleHRFZGl0IGVkaXQgPSBmVW5pdC5yZXdyaXRlKGRvYywgbnVsbCk7DQotCQkJZWRpdC5hcHBseShkb2MpOw0KLQ0KLQkJCXNhdmVDb250ZW50KGRlY2xhcmluZ1R5cGVDb21wVW5pdCwgZG9jKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTWV0aG9kQW5ub3RhdGlvbihJTWV0aG9kIG1ldGhvZCwgSVR5cGUgZGVjbGFyaW5nVHlwZSwgSUNvbXBpbGF0aW9uVW5pdCBkZWNsYXJpbmdUeXBlQ29tcFVuaXQsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE1hbGZvcm1lZFRyZWVFeGNlcHRpb24sIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJSUNvbXBpbGF0aW9uVW5pdCBtY1VuaXQgPSBtZXRob2QuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQlTdHJpbmcgY2xhc3NOYW1lID0gZGVjbGFyaW5nVHlwZS5nZXRFbGVtZW50TmFtZSgpOw0KLQkJQ29tcGlsYXRpb25Vbml0IG1Vbml0ID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5jcmVhdGVDb21waWxhdGlvblVuaXQobWNVbml0LCBudWxsKTsNCi0NCi0JCUJvZHlEZWNsYXJhdGlvbiBtQm9keURlY2xhcmF0aW9uID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlRGVjbGFyYXRpb24oY2xhc3NOYW1lLCBtVW5pdCk7DQotCQltQm9keURlY2xhcmF0aW9uID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRNZXRob2REZWNsYXJhdGlvbihtZXRob2QsIChUeXBlRGVjbGFyYXRpb24pIG1Cb2R5RGVjbGFyYXRpb24pOw0KLQkJbVVuaXQucmVjb3JkTW9kaWZpY2F0aW9ucygpOw0KLQkJaWYocmVtb3ZlQW5ub3RhdGlvbihtQm9keURlY2xhcmF0aW9uLm1vZGlmaWVycygpLCBhbm5vdGF0aW9uTmFtZSkpDQotCQl7DQotCQkJSURvY3VtZW50IGRvYyA9IGdldERvY3VtZW50KGRlY2xhcmluZ1R5cGVDb21wVW5pdCk7DQotCQkJVGV4dEVkaXQgZWRpdCA9IG1Vbml0LnJld3JpdGUoZG9jLCBudWxsKTsNCi0JCQllZGl0LmFwcGx5KGRvYyk7DQotDQotCQkJc2F2ZUNvbnRlbnQoZGVjbGFyaW5nVHlwZUNvbXBVbml0LCBkb2MpOw0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgdm9pZCByZW1vdmVQYXJhbUFubm90YXRpb24oSVR5cGVQYXJhbWV0ZXIgcGFyYW0sIElUeXBlIGRlY2xhcmluZ1R5cGUsIElDb21waWxhdGlvblVuaXQgZGVjbGFyaW5nVHlwZUNvbXBVbml0LCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRUcmVlRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCUlNZXRob2QgdG1wTWV0aG9kID0gKElNZXRob2QpcGFyYW0uZ2V0RGVjbGFyaW5nTWVtYmVyKCk7DQotCQkvL1RPRE8gY2hlY2sgdGhpcw0KLQkJLy9wYXJhbS5nZXRQYXJlbnQoKTsNCi0JCVN0cmluZyBjbGFzc05hbWUgPSBkZWNsYXJpbmdUeXBlLmdldEVsZW1lbnROYW1lKCk7DQotCQlJQ29tcGlsYXRpb25Vbml0IG1jVW5pdCA9IHRtcE1ldGhvZC5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCWNsYXNzTmFtZSA9IHRtcE1ldGhvZC5nZXRQYXJlbnQoKS5nZXRFbGVtZW50TmFtZSgpOw0KLQkJQ29tcGlsYXRpb25Vbml0IG1Vbml0ID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5jcmVhdGVDb21waWxhdGlvblVuaXQobWNVbml0LCBudWxsKTsNCi0NCi0JCUJvZHlEZWNsYXJhdGlvbiBtQm9keURlY2xhcmF0aW9uID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlRGVjbGFyYXRpb24oY2xhc3NOYW1lLCBtVW5pdCk7DQotCQltQm9keURlY2xhcmF0aW9uID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRNZXRob2REZWNsYXJhdGlvbih0bXBNZXRob2QsIChUeXBlRGVjbGFyYXRpb24pIG1Cb2R5RGVjbGFyYXRpb24pOw0KLQ0KLQkJbVVuaXQucmVjb3JkTW9kaWZpY2F0aW9ucygpOw0KLQkJZm9yIChPYmplY3Qgb2JqZWN0IDogKChNZXRob2REZWNsYXJhdGlvbikgbUJvZHlEZWNsYXJhdGlvbikucGFyYW1ldGVycygpKQ0KLQkJew0KLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKQ0KLQkJCXsNCi0JCQkJaWYgKHJlbW92ZUFubm90YXRpb24oKChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKSBvYmplY3QpLm1vZGlmaWVycygpLCBhbm5vdGF0aW9uTmFtZSkpDQotCQkJCXsNCi0JCQkJCUlEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudChkZWNsYXJpbmdUeXBlQ29tcFVuaXQpOw0KLQkJCQkJVGV4dEVkaXQgZWRpdCA9IG1Vbml0LnJld3JpdGUoZG9jLCBudWxsKTsNCi0JCQkJCWVkaXQuYXBwbHkoZG9jKTsNCi0NCi0JCQkJCXNhdmVDb250ZW50KGRlY2xhcmluZ1R5cGVDb21wVW5pdCwgZG9jKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogUmVtb3ZlcyBzcGVjaWZpYyBhbm5vdGF0aW9uIGZyb20gdGhlIGxpc3Qgb2YgbW9kaWZpZXJzLg0KLQkgKiANCi0JICogQHBhcmFtIG1vZGlmaWVycw0KLQkgKiBAcGFyYW0gYW5ub3RhdGlvbk5hbWUNCi0JICogDQotCSAqIEByZXR1cm4gYm9vbGVhbiB2YWx1ZSwgd2hpY2ggcmVwcmVzZW50cyB3aGV0ZXIgdGhlIGFubm90YXRpb24gaXMgcmVtb3ZlZCBvciBub3QuDQotCSAqLw0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHJpdmF0ZSBib29sZWFuIHJlbW92ZUFubm90YXRpb24oTGlzdCBtb2RpZmllcnMsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSkNCi0Jew0KLQkJQW5ub3RhdGlvbltdIG1Bbm5vdGF0aW9ucyA9IGV4dHJhY3RBbm5vdGF0aW9ucyhtb2RpZmllcnMpOw0KLQkJZm9yIChBbm5vdGF0aW9uIG1Bbm5vdGF0aW9uIDogbUFubm90YXRpb25zKQ0KLQkJew0KLQkJCWlmKHZhbGlkYXRlQW5ub3RhdGF0aW9uKG1Bbm5vdGF0aW9uLCBhbm5vdGF0aW9uTmFtZSkpDQotCQkJew0KLQkJCQltb2RpZmllcnMucmVtb3ZlKG1Bbm5vdGF0aW9uKTsNCi0JCQkJcmV0dXJuIHRydWU7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCXByaXZhdGUgYm9vbGVhbiByZW1vdmVBbm5vdGF0aW9ucyhMaXN0IG1vZGlmaWVycywgU2V0PFN0cmluZz4gYW5ub3RhdGlvbnNTZXQpDQotCXsNCi0JCWJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOw0KLQkJQW5ub3RhdGlvbltdIG1Bbm5vdGF0aW9ucyA9IGV4dHJhY3RBbm5vdGF0aW9ucyhtb2RpZmllcnMpOw0KLQkJZm9yIChpbnQgbWFpID0gMDsgbWFpIDwgbUFubm90YXRpb25zLmxlbmd0aDsgbWFpKyspDQotCQl7DQotCQkJaWYgKGFubm90YXRpb25zU2V0ICE9IG51bGwpDQotCQkJew0KLQkJCQlpZiAoYW5ub3RhdGlvbnNTZXQuY29udGFpbnMobUFubm90YXRpb25zW21haV0uZ2V0VHlwZU5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSkpDQotCQkJCXsNCi0JCQkJCW1vZGlmaWVycy5yZW1vdmUobUFubm90YXRpb25zW21haV0pOw0KLQkJCQkJY2hhbmdlZCA9IHRydWU7DQotCQkJCX0NCi0JCQl9IGVsc2UNCi0JCQl7DQotCQkJCW1vZGlmaWVycy5yZW1vdmUobUFubm90YXRpb25zW21haV0pOw0KLQkJCQljaGFuZ2VkID0gdHJ1ZTsNCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gY2hhbmdlZDsNCi0JfQ0KLQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHJpdmF0ZSBBbm5vdGF0aW9uW10gZXh0cmFjdEFubm90YXRpb25zKExpc3QgbW9kaWZpZXJzKQ0KLQl7DQotCQlJdGVyYXRvciBpdGVyYXRvciA9IG1vZGlmaWVycy5pdGVyYXRvcigpOw0KLQkJU2V0PEFubm90YXRpb24+IGFubm90YXRpb25zU2V0ID0gbmV3IEhhc2hTZXQ8QW5ub3RhdGlvbj4oKTsNCi0NCi0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpDQotCQl7DQotCQkJSUV4dGVuZGVkTW9kaWZpZXIgbW9kaWYgPSAoSUV4dGVuZGVkTW9kaWZpZXIpIGl0ZXJhdG9yLm5leHQoKTsNCi0JCQlpZiAobW9kaWYuaXNBbm5vdGF0aW9uKCkpDQotCQkJew0KLQkJCQlhbm5vdGF0aW9uc1NldC5hZGQoKEFubm90YXRpb24pIG1vZGlmKTsNCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gYW5ub3RhdGlvbnNTZXQudG9BcnJheShuZXcgQW5ub3RhdGlvblthbm5vdGF0aW9uc1NldC5zaXplKCldKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVBbm5vdGF0YXRpb24oQW5ub3RhdGlvbiBtQW5ub3RhdGlvbiwgU3RyaW5nIGFubm90YXRpb25OYW1lKQ0KLQl7DQotCQlTdHJpbmcgbUFubm90YXRpb25TdHJpbmcgPSBtQW5ub3RhdGlvbi50b1N0cmluZygpOw0KLQkJaW50IGluZGV4ID0gbUFubm90YXRpb25TdHJpbmcuaW5kZXhPZigiKCIpOyAvLyROT04tTkxTLTEkDQotCQlpZihpbmRleCA9PSAtMSkNCi0JCXsNCi0JCQltQW5ub3RhdGlvblN0cmluZyA9IG1Bbm5vdGF0aW9uU3RyaW5nLnRyaW0oKTsNCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQltQW5ub3RhdGlvblN0cmluZyA9IG1Bbm5vdGF0aW9uU3RyaW5nLnN1YnN0cmluZygwLCBpbmRleCkudHJpbSgpOw0KLQkJfQ0KLQkJDQotCQlpZihtQW5ub3RhdGlvblN0cmluZy5lbmRzV2l0aChhbm5vdGF0aW9uTmFtZSkpDQotCQl7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQkgDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0FycmF5VmFsdWVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQXJyYXlWYWx1ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzMxODYyYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQXJyYXlWYWx1ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFycmF5SW5pdGlhbGl6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVZhbHVlOw0KLQ0KLS8qKg0KLSAqIEltcGxlbWVudGF0aW9uIGZvciB7QGxpbmsgSUFycmF5VmFsdWV9DQotICogDQotICogQGF1dGhvciBQbGFtZW4gUGF2bG92DQotICovDQotcHVibGljIGNsYXNzIEFycmF5VmFsdWVJbXBsIGV4dGVuZHMgVmFsdWVJbXBsDQotew0KLQlwcml2YXRlIFNldDxJVmFsdWU+IHZhbHVlcyA9IG5ldyBIYXNoU2V0PElWYWx1ZT4oKTsNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdGlvbg0KLQkgKiANCi0JICogQHBhcmFtIHZhbHVlcw0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIGluIGNhc2UgPGNvZGU+dmFsdWVzPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICovDQotCXB1YmxpYyBBcnJheVZhbHVlSW1wbChTZXQ8SVZhbHVlPiB2YWx1ZXMpDQotCXsNCi0JCWlmICh2YWx1ZXMgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInZhbHVlcyBzaG91bGQgbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJdGhpcy52YWx1ZXMgPSB2YWx1ZXM7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQ0KLQl7DQotCQlTdHJpbmcgcmVzdWx0ID0gIlsiOyAvLyROT04tTkxTLTEkDQotCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsNCi0JCWZvciAoSVZhbHVlIHZhbHVlIDogdmFsdWVzKQ0KLQkJew0KLQkJCWlmKGZpcnN0KQ0KLQkJCXsNCi0JCQkJcmVzdWx0ID0gcmVzdWx0ICsgdmFsdWUudG9TdHJpbmcoKTsNCi0JCQkJZmlyc3QgPSBmYWxzZTsNCi0JCQl9DQotCQkJZWxzZQ0KLQkJCXsNCi0JCQkJcmVzdWx0ID0gcmVzdWx0ICsgIiwgIiArIHZhbHVlLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQNCi0JCQl9DQotCQl9DQotCQlyZXN1bHQgPSByZXN1bHQgKyAiXSI7IC8vJE5PTi1OTFMtMSQNCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0JDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbihDb21waWxhdGlvblVuaXQgdW5pdCwgQVNUIGFzdCkNCi0Jew0KLQkJLy9UT0RPIGNoZWNrIHRoaXMgbWV0aG9kDQotCQlBcnJheUluaXRpYWxpemVyIGFyciA9IGFzdC5uZXdBcnJheUluaXRpYWxpemVyKCk7DQotCQlmb3IgKElWYWx1ZSB2YWx1ZSA6IHZhbHVlcykNCi0JCXsNCi0JCQlhcnIuZXhwcmVzc2lvbnMoKS5hZGQoKChWYWx1ZUltcGwpIHZhbHVlKS5nZXRFeHByZXNzaW9uKHVuaXQsIGFzdCkpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGFycjsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGludCBoYXNoQ29kZSgpDQotCXsNCi0JCXJldHVybiBBcnJheXMuaGFzaENvZGUodmFsdWVzLnRvQXJyYXkobmV3IElWYWx1ZVt2YWx1ZXMuc2l6ZSgpXSkpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikNCi0Jew0KLQkJaWYgKHRoaXMgPT0gb2JqKQ0KLQkJew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJaWYgKG9iaiA9PSBudWxsKQ0KLQkJew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQ0KLQkJew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCWZpbmFsIEFycmF5VmFsdWVJbXBsIG90aGVyID0gKEFycmF5VmFsdWVJbXBsKSBvYmo7DQotCQlyZXR1cm4gQXJyYXlzLmVxdWFscyh2YWx1ZXMudG9BcnJheShuZXcgSVZhbHVlW3ZhbHVlcy5zaXplKCldKSwgb3RoZXIudmFsdWVzLnRvQXJyYXkobmV3IElWYWx1ZVt2YWx1ZXMuc2l6ZSgpXSkpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9BdHRyaWJ1dGVUeXBlRW51bS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0F0dHJpYnV0ZVR5cGVFbnVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEwYmE2MDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0F0dHJpYnV0ZVR5cGVFbnVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsOw0KLQ0KLXB1YmxpYyBlbnVtIEF0dHJpYnV0ZVR5cGVFbnVtIA0KLXsNCi0JQk9PTEVBTigiQm9vbGVhbiIpLCAvLyROT04tTkxTLTEkDQotCUNMQVNTKCJDbGFzcyIpLCAvLyROT04tTkxTLTEkDQotCUlOVEVHRVIoIkludGVnZXIiKSwgLy8kTk9OLU5MUy0xJA0KLQlRVUFMSUZJRURfTkFNRSgiUXVhbGlmaWVkIE5hbWUiKSwgLy8kTk9OLU5MUy0xJA0KLQlTVFJJTkcoIlN0cmluZyIpOyAvLyROT04tTkxTLTEkDQotCQ0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB2YWx1ZTsNCi0gICAgDQotICAgIEF0dHJpYnV0ZVR5cGVFbnVtKGZpbmFsIFN0cmluZyB2YWx1ZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOw0KLSAgICB9DQotDQotICAgIGZpbmFsIFN0cmluZyBnZXRWYWx1ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnZhbHVlOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9Cb29sZWFuVmFsdWVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQm9vbGVhblZhbHVlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NWZlMWY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9Cb29sZWFuVmFsdWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsNCi0NCi0vKioNCi0gKiBJbXBsZW1lbnRhdGlvbiBmb3Ige0BsaW5rIElCb29sZWFuVmFsdWV9DQotICogDQotICogQGF1dGhvciBQbGFtZW4gUGF2bG92DQotICovDQotcHVibGljIGNsYXNzIEJvb2xlYW5WYWx1ZUltcGwgZXh0ZW5kcyBWYWx1ZUltcGwNCi17IC8vJEpMLUVRVUFMUyQNCi0JcHJpdmF0ZSBib29sZWFuIHZhbHVlOw0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3INCi0JICogDQotCSAqIEBwYXJhbSB2YWx1ZQ0KLQkgKi8NCi0JcHVibGljIEJvb2xlYW5WYWx1ZUltcGwoYm9vbGVhbiB2YWx1ZSkNCi0Jew0KLQkJdGhpcy52YWx1ZSA9IHZhbHVlOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKENvbXBpbGF0aW9uVW5pdCB1bml0LCBBU1QgYXN0KQ0KLQl7DQotCQlyZXR1cm4gYXN0Lm5ld0Jvb2xlYW5MaXRlcmFsKHZhbHVlKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQ0KLQl7DQotCQlyZXR1cm4gQm9vbGVhbi50b1N0cmluZyh2YWx1ZSk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikNCi0Jew0KLQkJaWYgKHRoaXMgPT0gb2JqKQ0KLQkJew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJaWYgKG9iaiA9PSBudWxsKQ0KLQkJew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQ0KLQkJew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCWZpbmFsIEJvb2xlYW5WYWx1ZUltcGwgb3RoZXIgPSAoQm9vbGVhblZhbHVlSW1wbCkgb2JqOw0KLQkJcmV0dXJuIHZhbHVlID09IG90aGVyLnZhbHVlOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9DbGFzc1ZhbHVlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0NsYXNzVmFsdWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJkY2VhNTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0NsYXNzVmFsdWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5hbWU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW1wbGVUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZUxpdGVyYWw7DQotDQotcHVibGljIGNsYXNzIENsYXNzVmFsdWVJbXBsIGV4dGVuZHMgVmFsdWVJbXBsIA0KLXsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NRTmFtZTsNCi0NCi0gICAgcHVibGljIENsYXNzVmFsdWVJbXBsKFN0cmluZyBjbGFzc1FOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNsYXNzUU5hbWUgPSBjbGFzc1FOYW1lOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oQ29tcGlsYXRpb25Vbml0IHVuaXQsIEFTVCBhc3QpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBjbHNOYW1lID0gdGhpcy5jbGFzc1FOYW1lOw0KLSAgICAgICAgaWYgKGFkZEltcG9ydHMoYXN0LCB1bml0LCBjbHNOYW1lKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjbHNOYW1lID0gZ2V0U2ltcGxlTmFtZShjbHNOYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIE5hbWUgbmFtZSA9IGFzdC5uZXdOYW1lKGNsc05hbWUpOw0KLSAgICAgICAgU2ltcGxlVHlwZSBzaW1wbGVUeXBlID0gYXN0Lm5ld1NpbXBsZVR5cGUobmFtZSk7DQotICAgICAgICBUeXBlTGl0ZXJhbCBsaXRlcmFsID0gYXN0Lm5ld1R5cGVMaXRlcmFsKCk7DQotICAgICAgICBsaXRlcmFsLnNldFR5cGUoc2ltcGxlVHlwZSk7DQotICAgICAgICByZXR1cm4gbGl0ZXJhbDsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpDQotCXsNCi0JCXJldHVybiB0aGlzLmNsYXNzUU5hbWU7DQotCX0NCi0gICAgDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0Jew0KLQkJcmV0dXJuIHRoaXMuY2xhc3NRTmFtZS5oYXNoQ29kZSgpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikNCi0Jew0KLQkJaWYgKHRoaXMgPT0gb2JqKQ0KLQkJew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJaWYgKG9iaiA9PSBudWxsKQ0KLQkJew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQ0KLQkJew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCWZpbmFsIENsYXNzVmFsdWVJbXBsIG90aGVyID0gKENsYXNzVmFsdWVJbXBsKSBvYmo7DQotCQlyZXR1cm4gdGhpcy5jbGFzc1FOYW1lLmVxdWFscyhvdGhlci5jbGFzc1FOYW1lKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvSW50ZWdlclZhbHVlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0ludGVnZXJWYWx1ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmFmZmUwZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvSW50ZWdlclZhbHVlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OdW1iZXJMaXRlcmFsOw0KLQ0KLS8qKg0KLSAqIEltcGxlbWVudG9yIGZvciBJSW50ZWdlclZhbHVlDQotICogDQotICogQGF1dGhvciBQbGFtZW4gUGF2bG92DQotICovDQotcHVibGljIGNsYXNzIEludGVnZXJWYWx1ZUltcGwgZXh0ZW5kcyBWYWx1ZUltcGwNCi17DQotCXByaXZhdGUgU3RyaW5nIHZhbHVlOw0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3INCi0JICogDQotCSAqIEBwYXJhbSB2YWx1ZQ0KLQkgKi8NCi0JcHVibGljIEludGVnZXJWYWx1ZUltcGwoU3RyaW5nIHZhbHVlKQ0KLQl7DQotCQl0aGlzLnZhbHVlID0gdmFsdWU7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oQ29tcGlsYXRpb25Vbml0IHVuaXQsIEFTVCBhc3QpDQotCXsNCi0JCU51bWJlckxpdGVyYWwgbGl0ZXJhbCA9IGFzdC5uZXdOdW1iZXJMaXRlcmFsKCk7DQotICAgICAgICBsaXRlcmFsLnNldFRva2VuKG5ldyBJbnRlZ2VyKHZhbHVlKS50b1N0cmluZygpKTsNCi0JCXJldHVybiBsaXRlcmFsOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0Jew0KLQkJcmV0dXJuIG5ldyBJbnRlZ2VyKHZhbHVlKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopDQotCXsNCi0JCWlmICh0aGlzID09IG9iaikNCi0JCXsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCWlmIChvYmogPT0gbnVsbCkNCi0JCXsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkNCi0JCXsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQlmaW5hbCBJbnRlZ2VyVmFsdWVJbXBsIG90aGVyID0gKEludGVnZXJWYWx1ZUltcGwpIG9iajsNCi0JCXJldHVybiB2YWx1ZSA9PSBvdGhlci52YWx1ZTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQ0KLQl7DQotCQlyZXR1cm4gdmFsdWU7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0xvY2F0b3JJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvTG9jYXRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODllODU5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvTG9jYXRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JTG9jYXRvcjsNCi0NCi0vKioNCi0gKiBJbXBsZW1lbnRvciBvZiB7QGxpbmsgSUxvY2F0b3J9IGludGVyZmFjZQ0KLSAqLw0KLXB1YmxpYyBjbGFzcyBMb2NhdG9ySW1wbCBpbXBsZW1lbnRzIElMb2NhdG9yDQotew0KLQlwcml2YXRlIGludCBsaW5lTnVtYmVyOw0KLQlwcml2YXRlIGludCBzdGFydFBvc2l0aW9uOw0KLQlwcml2YXRlIGludCBsZW5ndGg7DQotCQ0KLQlwdWJsaWMgTG9jYXRvckltcGwoZmluYWwgaW50IGxpbmVOdW1iZXIsIGZpbmFsIGludCBzdGFydFBvc2l0aW9uLCBmaW5hbCBpbnQgbGVuZ3RoKQ0KLQl7DQotCQl0aGlzLmxlbmd0aCA9IGxlbmd0aDsNCi0JCXRoaXMuc3RhcnRQb3NpdGlvbiA9IHN0YXJ0UG9zaXRpb247DQotCQl0aGlzLmxpbmVOdW1iZXIgPSBsaW5lTnVtYmVyOw0KLQl9DQotCQ0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpDQotCXsNCi0JCXJldHVybiB0aGlzLmxlbmd0aDsNCi0JfQ0KLQ0KLQlwdWJsaWMgaW50IGdldFN0YXJ0UG9zaXRpb24oKQ0KLQl7DQotCQlyZXR1cm4gdGhpcy5zdGFydFBvc2l0aW9uOw0KLQl9DQotDQotCXB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIA0KLQl7DQotCQlyZXR1cm4gbGluZU51bWJlcjsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvUGFyYW1WYWx1ZVBhaXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvUGFyYW1WYWx1ZVBhaXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDljZTMxZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL1BhcmFtVmFsdWVQYWlySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklMb2NhdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVZhbHVlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgUGxhbWVuIFBhdmxvdg0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBQYXJhbVZhbHVlUGFpckltcGwgaW1wbGVtZW50cyBJUGFyYW1WYWx1ZVBhaXINCi17DQotCQ0KLQlwcml2YXRlIElMb2NhdG9yIGxvY2F0b3IgPSBudWxsOw0KLQ0KLQ0KLQlwcml2YXRlIFN0cmluZyBwYXJhbTsNCi0NCi0JcHJpdmF0ZSBJVmFsdWUgdmFsdWU7DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rvcg0KLQkgKiANCi0JICogQHBhcmFtIHBhcmFtDQotCSAqIEBwYXJhbSB2YWx1ZQ0KLQkgKi8NCi0JcHVibGljIFBhcmFtVmFsdWVQYWlySW1wbChTdHJpbmcgcGFyYW0sIElWYWx1ZSB2YWx1ZSkNCi0Jew0KLQkJdGhpcy5wYXJhbSA9IHBhcmFtOw0KLQkJdGhpcy52YWx1ZSA9IHZhbHVlOw0KLQl9DQotDQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFyYW0oKQ0KLQl7DQotCQlyZXR1cm4gcGFyYW07DQotCX0NCi0NCi0JcHVibGljIElWYWx1ZSBnZXRWYWx1ZSgpDQotCXsNCi0JCXJldHVybiB2YWx1ZTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGludCBoYXNoQ29kZSgpDQotCXsNCi0JCWlmKHZhbHVlICE9IG51bGwpDQotCQl7DQotCQkJcmV0dXJuIDMxICogcGFyYW0uaGFzaENvZGUoKSArIHZhbHVlLmhhc2hDb2RlKCk7DQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJcmV0dXJuIDMxICogcGFyYW0uaGFzaENvZGUoKTsNCi0JCX0NCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopDQotCXsNCi0JCWlmICh0aGlzID09IG9iaikNCi0JCXsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCWlmIChvYmogPT0gbnVsbCkNCi0JCXsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkNCi0JCXsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQlmaW5hbCBQYXJhbVZhbHVlUGFpckltcGwgb3RoZXIgPSAoUGFyYW1WYWx1ZVBhaXJJbXBsKSBvYmo7DQotCQlpZiAoIXBhcmFtLmVxdWFscyhvdGhlci5wYXJhbSkpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJcmV0dXJuIHZhbHVlLmVxdWFscyhvdGhlci52YWx1ZSk7DQotCX0NCi0JDQotCXB1YmxpYyBJTG9jYXRvciBnZXRMb2NhdG9yKCkNCi0Jew0KLQkJcmV0dXJuIHRoaXMubG9jYXRvcjsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRMb2NhdG9yKGZpbmFsIElMb2NhdG9yIGxvY2F0b3IpDQotCXsNCi0JCXRoaXMubG9jYXRvciA9IGxvY2F0b3I7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL1F1YWxpZmllZE5hbWVWYWx1ZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9RdWFsaWZpZWROYW1lVmFsdWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDViYjY2Y2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL1F1YWxpZmllZE5hbWVWYWx1ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOw0KLQ0KLS8qKg0KLSAqIEltcGxlbWVudG9yIGZvciB7QGxpbmsgSVF1YWxpZmllZE5hbWVWYWx1ZX0NCi0gKiANCi0gKiBAYXV0aG9yIFBsYW1lbiBQYXZsb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgUXVhbGlmaWVkTmFtZVZhbHVlSW1wbCBleHRlbmRzIFZhbHVlSW1wbA0KLXsNCi0JcHJpdmF0ZSBTdHJpbmcgdmFsdWU7DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rvcg0KLQkgKiANCi0JICogQHBhcmFtIHZhbHVlDQotCSAqLw0KLQlwdWJsaWMgUXVhbGlmaWVkTmFtZVZhbHVlSW1wbChTdHJpbmcgdmFsdWUpDQotCXsNCi0JCXRoaXMudmFsdWUgPSB2YWx1ZTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbihDb21waWxhdGlvblVuaXQgdW5pdCwgQVNUIGFzdCkNCi0Jew0KLQkJLy8gImphdmF4LmVqYi5UcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuUkVRVUlSRUQiDQotCQlpbnQgaSA9IHZhbHVlLmxhc3RJbmRleE9mKCcuJyk7DQotCQlpZiAoaSAhPSAtMSkNCi0JCXsNCi0JCQlTdHJpbmcgY2xzTmFtZSA9IHZhbHVlLnN1YnN0cmluZygwLCBpKTsNCi0JCQlpZiAoYWRkSW1wb3J0cyhhc3QsIHVuaXQsIGNsc05hbWUpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIGFzdC5uZXdOYW1lKGdldFNpbXBsZU5hbWUoY2xzTmFtZSkgKyB2YWx1ZS5zdWJzdHJpbmcoaSkpOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBhc3QubmV3TmFtZSh2YWx1ZSk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KLQl7DQotCQlyZXR1cm4gdmFsdWUuaGFzaENvZGUoKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopDQotCXsNCi0JCWlmICh0aGlzID09IG9iaikNCi0JCXsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCWlmIChvYmogPT0gbnVsbCkNCi0JCXsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkNCi0JCXsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQlmaW5hbCBRdWFsaWZpZWROYW1lVmFsdWVJbXBsIG90aGVyID0gKFF1YWxpZmllZE5hbWVWYWx1ZUltcGwpIG9iajsNCi0JCXJldHVybiB2YWx1ZS5lcXVhbHMob3RoZXIudmFsdWUpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpDQotCXsNCi0JCXJldHVybiB2YWx1ZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvU3RyaW5nVmFsdWVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvU3RyaW5nVmFsdWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU4YmQxYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL1N0cmluZ1ZhbHVlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TdHJpbmdMaXRlcmFsOw0KLQ0KLS8qKg0KLSAqIEltcGxlbWVudG9yIGZvciBJU3RyaW5nVmFsdWUNCi0gKiANCi0gKiBAYXV0aG9yIFBsYW1lbiBQYXZsb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgU3RyaW5nVmFsdWVJbXBsIGV4dGVuZHMgVmFsdWVJbXBsDQotew0KLQlwcml2YXRlIFN0cmluZyB2YWx1ZTsNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yDQotCSAqIA0KLQkgKiBAcGFyYW0gdmFsdWUNCi0JICovDQotCXB1YmxpYyBTdHJpbmdWYWx1ZUltcGwoU3RyaW5nIHZhbHVlKQ0KLQl7DQotCQl0aGlzLnZhbHVlID0gdmFsdWU7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oQ29tcGlsYXRpb25Vbml0IHVuaXQsIEFTVCBhc3QpDQotCXsNCi0JCVN0cmluZ0xpdGVyYWwgbGl0ZXJhbCA9IGFzdC5uZXdTdHJpbmdMaXRlcmFsKCk7DQotCQlsaXRlcmFsLnNldExpdGVyYWxWYWx1ZSh2YWx1ZSk7DQotCQlyZXR1cm4gbGl0ZXJhbDsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGludCBoYXNoQ29kZSgpDQotCXsNCi0JCXJldHVybiB2YWx1ZS5oYXNoQ29kZSgpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikNCi0Jew0KLQkJaWYgKHRoaXMgPT0gb2JqKQ0KLQkJew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJaWYgKG9iaiA9PSBudWxsKQ0KLQkJew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQ0KLQkJew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCWZpbmFsIFN0cmluZ1ZhbHVlSW1wbCBvdGhlciA9IChTdHJpbmdWYWx1ZUltcGwpIG9iajsNCi0JCXJldHVybiB2YWx1ZS5lcXVhbHMob3RoZXIudmFsdWUpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpDQotCXsNCi0JCXJldHVybiB2YWx1ZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvVmFsdWVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvVmFsdWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg4YzU3MTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL1ZhbHVlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGw7DQotDQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSW1wb3J0RGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OYW1lOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUXVhbGlmaWVkTmFtZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbXBsZU5hbWU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JTG9jYXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklWYWx1ZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIFBsYW1lbiBQYXZsb3YNCi0gKi8NCi0NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmFsdWVJbXBsIGltcGxlbWVudHMgSVZhbHVlDQotew0KLQlwcml2YXRlIElMb2NhdG9yIGxvY2F0b3IgPSBudWxsOw0KLQ0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKENvbXBpbGF0aW9uVW5pdCB1bml0LCBBU1QgYXN0KTsNCi0NCi0JDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRJbXBvcnRzKEFTVCBhc3QsIENvbXBpbGF0aW9uVW5pdCB1bml0LCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpDQotCXsNCi0JCVN0cmluZyBwYWNrYWdlQW5ub3RhdGlvbk5hbWUgPSBnZXRQYWNrYWdlTmFtZShhbm5vdGF0aW9uTmFtZSk7DQotCQlpZiAocGFja2FnZUFubm90YXRpb25OYW1lID09IG51bGwpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQ0KLQkJaWYgKHBhY2thZ2VBbm5vdGF0aW9uTmFtZS5lcXVhbHMoImphdmEubGFuZyIpKSAvLyROT04tTkxTLTEkDQotCQl7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQlpZiAodW5pdCAhPSBudWxsKQ0KLQkJew0KLQkJCUltcG9ydERlY2xhcmF0aW9uIGltcCA9IGFzdC5uZXdJbXBvcnREZWNsYXJhdGlvbigpOw0KLQkJCWltcC5zZXROYW1lKGFzdC5uZXdOYW1lKGFubm90YXRpb25OYW1lKSk7DQotCQkJTGlzdDxJbXBvcnREZWNsYXJhdGlvbj4gaW1wb3J0cyA9IHVuaXQuaW1wb3J0cygpOw0KLQkJCVN0cmluZyBpbXAxID0gZ2V0SW1wb3J0KGltcG9ydHMsIGdldFNpbXBsZU5hbWUoYW5ub3RhdGlvbk5hbWUpKTsNCi0JCQlpZiAoaW1wMSA9PSBudWxsKQ0KLQkJCXsNCi0JCQkJaWYgKGdldE9uRGVtYW5kSW1wb3J0KGltcG9ydHMsIHBhY2thZ2VBbm5vdGF0aW9uTmFtZSkgPT0gbnVsbCkNCi0JCQkJew0KLQkJCQkJaW1wb3J0cy5hZGQoaW1wKTsNCi0JCQkJfQ0KLQkJCX0gZWxzZQ0KLQkJCXsNCi0JCQkJaWYgKCFpbXAxLmVxdWFscyhhbm5vdGF0aW9uTmFtZSkpDQotCQkJCXsNCi0JCQkJCXJldHVybiBmYWxzZTsNCi0JCQkJfQ0KLQkJCX0NCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0NCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRJbXBvcnQoTGlzdDxJbXBvcnREZWNsYXJhdGlvbj4gaW1wb3J0cywgU3RyaW5nIGltcCkNCi0Jew0KLQkJSXRlcmF0b3I8SW1wb3J0RGVjbGFyYXRpb24+IGl0ZXIgPSBpbXBvcnRzLml0ZXJhdG9yKCk7DQotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpDQotCQl7DQotCQkJSW1wb3J0RGVjbGFyYXRpb24gbmV4dCA9IGl0ZXIubmV4dCgpOw0KLQkJCU5hbWUgZnFOYW1lID0gbmV4dC5nZXROYW1lKCk7DQotCQkJU2ltcGxlTmFtZSBuYW1lOw0KLQkJCWlmIChmcU5hbWUuaXNRdWFsaWZpZWROYW1lKCkpDQotCQkJew0KLQkJCQluYW1lID0gKChRdWFsaWZpZWROYW1lKSBmcU5hbWUpLmdldE5hbWUoKTsNCi0JCQl9IGVsc2UNCi0JCQl7DQotCQkJCW5hbWUgPSAoU2ltcGxlTmFtZSkgZnFOYW1lOw0KLQkJCX0NCi0JCQlTdHJpbmcgc2ltcGxlTmFtZSA9IG5hbWUuZ2V0SWRlbnRpZmllcigpOw0KLQkJCWlmIChpbXAuZXF1YWxzKHNpbXBsZU5hbWUpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIGZxTmFtZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRPbkRlbWFuZEltcG9ydChMaXN0PEltcG9ydERlY2xhcmF0aW9uPiBpbXBvcnRzLCBTdHJpbmcgaW1wKQ0KLQl7DQotCQlJdGVyYXRvcjxJbXBvcnREZWNsYXJhdGlvbj4gaXRlciA9IGltcG9ydHMuaXRlcmF0b3IoKTsNCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkNCi0JCXsNCi0JCQlJbXBvcnREZWNsYXJhdGlvbiBuZXh0ID0gaXRlci5uZXh0KCk7DQotCQkJaWYgKCFuZXh0LmlzT25EZW1hbmQoKSkNCi0JCQl7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQlOYW1lIGZxTmFtZSA9IG5leHQuZ2V0TmFtZSgpOw0KLQkJCVN0cmluZyBuYW1lID0gZnFOYW1lLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOw0KLQkJCWlmIChpbXAuZXF1YWxzKG5hbWUpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIG5hbWU7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoU3RyaW5nIG5hbWUpDQotCXsNCi0JCWludCBpID0gbmFtZS5sYXN0SW5kZXhPZignLicpOw0KLQkJaWYgKGkgPT0gLTEpDQotCQkJcmV0dXJuIG51bGw7DQotCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcoMCwgaSk7DQotCX0NCi0NCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0U2ltcGxlTmFtZShTdHJpbmcgbmFtZSkNCi0Jew0KLQkJaW50IGkgPSBuYW1lLmxhc3RJbmRleE9mKCcuJyk7DQotCQlpZiAoaSA9PSAtMSkNCi0JCQlyZXR1cm4gbmFtZTsNCi0JCXJldHVybiBuYW1lLnN1YnN0cmluZyhpICsgMSk7DQotCX0NCi0JDQotCXB1YmxpYyBJTG9jYXRvciBnZXRMb2NhdG9yKCkNCi0Jew0KLQkJcmV0dXJuIHRoaXMubG9jYXRvcjsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRMb2NhdG9yKGZpbmFsIElMb2NhdG9yIGxvY2F0b3IpDQotCXsNCi0JCXRoaXMubG9jYXRvciA9IGxvY2F0b3I7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9wbHVnaW4vSmF4d3NVdGlsc1BsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9wbHVnaW4vSmF4d3NVdGlsc1BsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NGQzZmE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvcGx1Z2luL0pheHdzVXRpbHNQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLnBsdWdpbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVN0YXJ0dXA7DQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBKYXh3c1V0aWxzUGx1Z2luIGV4dGVuZHMgUGx1Z2luIGltcGxlbWVudHMgSVN0YXJ0dXANCi17DQotCS8vIFRoZSBwbHVnLWluIElEDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMiOw0KLQ0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlDQotCXByaXZhdGUgc3RhdGljIEpheHdzVXRpbHNQbHVnaW4gcGx1Z2luOw0KLQkNCi0JLyoqDQotCSAqIFRoZSBjb25zdHJ1Y3Rvcg0KLQkgKi8NCi0JcHVibGljIEpheHdzVXRpbHNQbHVnaW4oKSB7DQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW5zI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOw0KLQkJcGx1Z2luID0gdGhpczsNCi0JCQ0KLQl9DQotDQotCS8qDQotCSAqIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQlwbHVnaW4gPSBudWxsOw0KLQkJc3VwZXIuc3RvcChjb250ZXh0KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlDQotCSAqDQotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBKYXh3c1V0aWxzUGx1Z2luIGdldERlZmF1bHQoKSB7DQotCQlyZXR1cm4gcGx1Z2luOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGVhcmx5U3RhcnR1cCgpDQotCXsNCi0JCS8vIE5vdGhpbmcgdG8gZG8uIEhvd2V2ZXIsIHRoaXMgcHVnaW4gaGFzIHRvIHN0YXJ0IGFzIGVhcmx5IGFzIHBvc3NpYmxlIHNpbmNlIGl0cyBzZXJ2aWNlcyB3aWxsIGJlIHVzZWQgZm9yIGNvbW1vbiBsb2dnaW5nDQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC90ZXh0L0pheFdzVXRpbE1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL3RleHQvSmF4V3NVdGlsTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmQ0ZDM2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL3RleHQvSmF4V3NVdGlsTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLnRleHQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7DQotDQotcHVibGljIGNsYXNzIEpheFdzVXRpbE1lc3NhZ2VzIGV4dGVuZHMgTkxTDQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLnRleHQuSmF4V3NVdGlsTWVzc2FnZXMiOyAvLyROT04tTkxTLTEkDQotCQ0KLQkNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2Fubm90UGVyZm9ybUVkaXRNc2c7DQotDQotDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbXBVbml0TWlzc2luZ01zZzsNCi0NCi0NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW52YWxpZFRyZWVTdGF0ZU1zZzsNCi0NCi0NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW5ub3RhdGlvbkNhbm5vdEJlU3RvcmVkTXNnOw0KLQ0KLQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbm5vdGF0aW9uVXRpbHNfUGFyYW1TaG91bGROb3RCZU51bGxNc2c7DQotDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRSZXNvdXJjZXNNYW5hZ2VyX0ZJTEVfQ09OVEVOVFNfQ0hBTkdFX0ZBSUxFRF9NU0c7DQotCQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0TWFuYWdlbWVudFV0aWxzX1Byb2plY3RIYXNOb01ldGFJbmZGb2xkZXJNc2c7DQotCQ0KLQlzdGF0aWMNCi0Jew0KLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgSmF4V3NVdGlsTWVzc2FnZXMuY2xhc3MpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvdGV4dC9KYXhXc1V0aWxNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC90ZXh0L0pheFdzVXRpbE1lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJkY2ZlY2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC90ZXh0L0pheFdzVXRpbE1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotQ2Fubm90UGVyZm9ybUVkaXRNc2cJCQkJCQkJCQkJCQk9IEVkaXQgY2Fubm90IGJlIHBlcmZvcm1lZA0KLUNvbXBVbml0TWlzc2luZ01zZwkJCQkJCQkJCQkJCQk9IENvbXBpbGF0aW9uIHVuaXQgZmlsZSBtaXNzaW5nDQotSW52YWxpZFRyZWVTdGF0ZU1zZwkJCQkJCQkJCQkJCQk9IEludmFsaWQgcHJvamVjdCB0cmVlIHN0YXRlDQotQW5ub3RhdGlvbkNhbm5vdEJlU3RvcmVkTXNnCQkJCQkJCQkJCQk9IEFubm90YXRpb24gY291bGQgbm90IGJlIHN0b3JlZCwgdGhlIGZpbGUgaXMgbm90IHdyaXRhYmxlDQotQW5ub3RhdGlvblV0aWxzX1BhcmFtU2hvdWxkTm90QmVOdWxsTXNnCQkJCQkJCQk9IHswfSBzaG91bGQgbm90IGJlIG51bGwNCi0NCi1FZGl0UmVzb3VyY2VzTWFuYWdlcl9GSUxFX0NPTlRFTlRTX0NIQU5HRV9GQUlMRURfTVNHCQkJCT0gRmlsZSBjb250ZW50cyBjb3VsZCBub3QgYmUgc2V0DQotUHJvamVjdE1hbmFnZW1lbnRVdGlsc19Qcm9qZWN0SGFzTm9NZXRhSW5mRm9sZGVyTXNnCQkJCQk9IHByb2plY3QgezB9IGRvZXMgbm90IGhhdmUgYSBNRVRBLUlORiBmb2xkZXINCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2xvZ2dpbmcvSUxvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9sb2dnaW5nL0lMb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTdmOTJmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2xvZ2dpbmcvSUxvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZzsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIElMb2dnZXINCi17DQotCS8qKg0KLQkgKiBMb2dzIGEgbWVzc2FnZSB3aXRoIHNldmVyaXR5IGVycm9yLg0KLQkgKiANCi0JICogQHBhcmFtIG1lc3NhZ2UNCi0JICogICAgICAgICAgICBtZXNzYWdlIHRvIGJlIGxvZ2dlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgbG9nRXJyb3IoZmluYWwgU3RyaW5nIG1lc3NhZ2UpOw0KLQ0KLQkvKioNCi0JICogTG9ncyBhIG1lc3NhZ2Ugd2l0aCBzZXZlcml0eSBlcnJvci4NCi0JICogDQotCSAqIEBwYXJhbSBtZXNzYWdlDQotCSAqICAgICAgICAgICAgbWVzc2FnZSB0byBiZSBsb2dnZWQNCi0JICogQHBhcmFtIGNhdXNlDQotCSAqICAgICAgICAgICAgY2F1c2luZyBleGNlcHRpb24NCi0JICovDQotCXB1YmxpYyB2b2lkIGxvZ0Vycm9yKGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBUaHJvd2FibGUgY2F1c2UpOw0KLQ0KLQkvKioNCi0JICogTG9ncyBhIG1lc3NhZ2Ugd2l0aCBzZXZlcml0eSB3YXJuaW5nLg0KLQkgKiANCi0JICogQHBhcmFtIG1lc3NhZ2UNCi0JICogICAgICAgICAgICBtZXNzYWdlIHRvIGJlIGxvZ2dlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgbG9nV2FybihmaW5hbCBTdHJpbmcgbWVzc2FnZSk7DQotDQotCS8qKg0KLQkgKiBMb2dzIGEgbWVzc2FnZSB3aXRoIHNldmVyaXR5IHdhcm5pbmcuDQotCSAqIA0KLQkgKiBAcGFyYW0gbWVzc2FnZQ0KLQkgKiAgICAgICAgICAgIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkDQotCSAqIEBwYXJhbSBjYXVzZQ0KLQkgKiAgICAgICAgICAgIGNhdXNpbmcgZXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBsb2dXYXJuKGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBUaHJvd2FibGUgY2F1c2UpOw0KLQ0KLQkvKioNCi0JICogTG9ncyBhIG1lc3NhZ2Ugd2l0aCBzZXZlcml0eSBkZWJ1Zy4NCi0JICogDQotCSAqIEBwYXJhbSBtZXNzYWdlDQotCSAqICAgICAgICAgICAgbWVzc2FnZSB0byBiZSBsb2dnZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIGxvZ0RlYnVnKGZpbmFsIFN0cmluZyBtZXNzYWdlKTsNCi0NCi0JLyoqDQotCSAqIExvZ3MgYSBtZXNzYWdlIHdpdGggc2V2ZXJpdHkgZGVidWcuDQotCSAqIA0KLQkgKiBAcGFyYW0gbWVzc2FnZQ0KLQkgKiAgICAgICAgICAgIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkDQotCSAqIEBwYXJhbSBjYXVzZQ0KLQkgKiAgICAgICAgICAgIGNhdXNpbmcgZXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBsb2dEZWJ1ZyhmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgVGhyb3dhYmxlIGNhdXNlKTsNCi0NCi0JDQotCXB1YmxpYyBib29sZWFuIGlzRGVidWcoKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9sb2dnaW5nL0xvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9sb2dnaW5nL0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZmFkMzE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvbG9nZ2luZy9Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmc7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JTG9nOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuU3RhdHVzVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5wbHVnaW4uSmF4d3NVdGlsc1BsdWdpbjsNCi0NCi1wdWJsaWMgY2xhc3MgTG9nZ2VyIGltcGxlbWVudHMgSUxvZ2dlcg0KLXsNCi0JcHVibGljIHZvaWQgbG9nRGVidWcoU3RyaW5nIG1lc3NhZ2UpDQotCXsNCi0vLwkJbG9nKCkubG9nKFN0YXR1c1V0aWxzLnN0YXR1c0luZm8obWVzc2FnZSkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGxvZ0RlYnVnKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpDQotCXsNCi0vLwkJbG9nKCkubG9nKFN0YXR1c1V0aWxzLnN0YXR1c0luZm8obWVzc2FnZSwgY2F1c2UpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgbWVzc2FnZSkNCi0Jew0KLQkJbG9nKCkubG9nKFN0YXR1c1V0aWxzLnN0YXR1c0Vycm9yKG1lc3NhZ2UpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKQ0KLQl7DQotCQlsb2coKS5sb2coU3RhdHVzVXRpbHMuc3RhdHVzRXJyb3IobWVzc2FnZSwgY2F1c2UpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBsb2dXYXJuKFN0cmluZyBtZXNzYWdlKQ0KLQl7DQotCQlsb2coKS5sb2coU3RhdHVzVXRpbHMuc3RhdHVzV2FybmluZyhtZXNzYWdlKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgbG9nV2FybihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKQ0KLQl7DQotCQlsb2coKS5sb2coU3RhdHVzVXRpbHMuc3RhdHVzV2FybmluZyhtZXNzYWdlLCBjYXVzZSkpOw0KLQl9DQotDQotCXByaXZhdGUgSUxvZyBsb2coKQ0KLQl7DQotCQlyZXR1cm4gSmF4d3NVdGlsc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCk7DQotCX0NCi0NCi0JcHVibGljIGJvb2xlYW4gaXNEZWJ1ZygpDQotCXsNCi0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWINCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Jlc291cmNlcy9FZGl0UmVzb3VyY2VzTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9yZXNvdXJjZXMvRWRpdFJlc291cmNlc01hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjYzOThhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Jlc291cmNlcy9FZGl0UmVzb3VyY2VzTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnJlc291cmNlczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5TdGF0dXNVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLnRleHQuSmF4V3NVdGlsTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLklMb2dnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLkxvZ2dlcjsNCi0NCi0vKioNCi0gKiBUaGlzIGlzIGFuIHV0aWxpdHkgY2xhc3Mgd2hpY2ggaXMgbWVhbnQgdG8gcHJvdmlkZSBjb21tb24gZnVuY3Rpb25hbGl0eSB0byBzYXZlIGFuZCBtb2RpZnkgcmVzb3VyY2VzLiBJdCBpcyBhIHdyYXBwZXIgb2YgdGhlIGVjbGlwc2UgQVBJIGFuZA0KLSAqIHdvcmthcm91bmRzIHNvbWUgRFRSIGlzc3Vlcy4gVW50aWwgRFRSIGNvbGxlYWd1ZXMgZml4IHRoZWlyIGNvZGluZywgdGhpcyBtYW5hZ2VyIG11c3QgYmUgdXNlZCBvbiBlYWNoIGZpbGUgbW9kaWZpY2F0aW9uIG9jY2FzaW9uDQotICogDQotICogQGF1dGhvciBEYW5haWwgQnJhbmVrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRWRpdFJlc291cmNlc01hbmFnZXINCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElMb2dnZXIgbG9nZ2VyID0gbmV3IExvZ2dlcigpOw0KLQkNCi0JLyoqDQotCSAqIFNldHMgZWRpdGFiaWxpdHkgb2YgYSBmaWxlLiBJbiBjYXNlIHRoZSBmaWxlIHNwZWNpZmllZCBpcyBhbHJlYWR5IHdyaXRhYmxlLCA8Y29kZT5TdGF0dXMuT0tfU1RBVFVTPC9jb2RlPiBpcyByZXR1cm5lZA0KLQkgKiANCi0JICogQHBhcmFtIGZpbGUNCi0JICogICAgICAgICAgICBUaGUgZmlsZSB0byBiZSBzZXQgZWRpdGFibGUNCi0JICogQHBhcmFtIGNvbnRleHQNCi0JICogICAgICAgICAgICBlaXRoZXIge0BsaW5rIElXb3Jrc3BhY2UjVkFMSURBVEVfUFJPTVBUfSwgb3IgdGhlIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsPC9jb2RlPiB0aGF0IGlzIHRvIGJlIHVzZWQgdG8gcGFyZW50IGFueQ0KLQkgKiAgICAgICAgICAgIGRpYWxvZ3Mgd2l0aCB0aGUgdXNlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gVUkgY29udGV4dCAoZGVjbGFyZWQgYXMgYW4gPGNvZGU+T2JqZWN0PC9jb2RlPiB0byBhdm9pZCBhbnkgZGlyZWN0DQotCSAqICAgICAgICAgICAgcmVmZXJlbmNlcyBvbiB0aGUgU1dUIGNvbXBvbmVudCkNCi0JICogQHJldHVybiB0aGUgc3RhdHVzIG9mIHRoZSBvcGVyYXRpb24NCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIHRoZSBmaWxlIHNwZWNpZmllZCBpcyBudWxsDQotCSAqIEBzZWUgSVdvcmtzcGFjZSNWQUxJREFURV9QUk9NUFQNCi0JICovDQotCXB1YmxpYyBJU3RhdHVzIHNldEZpbGVFZGl0YWJsZShJRmlsZSBmaWxlLCBPYmplY3QgY29udGV4dCkNCi0Jew0KLQkJaWYgKGZpbGUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImZpbGUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJaWYoIWZpbGUuaXNSZWFkT25seSgpKQ0KLQkJew0KLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOw0KLQkJfQ0KLQkJDQotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IGZpbGUuZ2V0V29ya3NwYWNlKCk7DQotCQlyZXR1cm4gd29ya3NwYWNlLnZhbGlkYXRlRWRpdChuZXcgSUZpbGVbXSB7IGZpbGUgfSwgY29udGV4dCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgZWRpdGFibGlsaXR5IG9mIGEgZmlsZS4gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCBlcXVpdmFsZW50IHRvIGludm9raW5nDQotCSAqIDxjb2RlPnNldEZpbGVFZGl0YWJsZShmaWxlLCBJV29ya3NwYWNlLlZBTElEQVRFX1BST01QVCk8L2NvZGU+DQotCSAqIA0KLQkgKiBAcGFyYW0gZmlsZQ0KLQkgKiAgICAgICAgICAgIFRoZSBmaWxlIHRvIGJlIHNldCBlZGl0YWJsZQ0KLQkgKiBAcmV0dXJuIHRoZSBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvbg0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIGZpbGUgc3BlY2lmaWVkIGlzIG51bGwNCi0JICogQHNlZSBFZGl0UmVzb3VyY2VzTWFuYWdlciNzZXRGaWxlRWRpdGFibGUoSUZpbGUsIE9iamVjdCkNCi0JICogQHNlZSBJV29ya3NwYWNlI1ZBTElEQVRFX1BST01QVA0KLQkgKiANCi0JICovDQotCXB1YmxpYyBJU3RhdHVzIHNldEZpbGVFZGl0YWJsZShJRmlsZSBmaWxlKQ0KLQl7DQotCQlyZXR1cm4gc2V0RmlsZUVkaXRhYmxlKGZpbGUsIElXb3Jrc3BhY2UuVkFMSURBVEVfUFJPTVBUKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyBlZGl0YWJsaWxpdHkgb2YgYW4gYXJyYXkgb2YgZmlsZXMuIEluIGNhc2UgYWxsIGZpbGVzIHNwZWNpZmllZCBhcmUgYWxyZWFkeSB3cml0YWJsZSwgPGNvZGU+U3RhdHVzLk9LX1NUQVRVUzwvY29kZT4gaXMgcmV0dXJuZWQNCi0JICogDQotCSAqIEBwYXJhbSBmaWxlcw0KLQkgKiAgICAgICAgICAgIFRoZSBhcnJheSBvZiBmaWxlcyB0byBiZSBzZXQgZWRpdGFibGUNCi0JICogQHBhcmFtIGNvbnRleHQNCi0JICogICAgICAgICAgICBlaXRoZXIge0BsaW5rIElXb3Jrc3BhY2UjVkFMSURBVEVfUFJPTVBUfSwgb3IgdGhlIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsPC9jb2RlPiB0aGF0IGlzIHRvIGJlIHVzZWQgdG8gcGFyZW50IGFueQ0KLQkgKiAgICAgICAgICAgIGRpYWxvZ3Mgd2l0aCB0aGUgdXNlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gVUkgY29udGV4dCAoZGVjbGFyZWQgYXMgYW4gPGNvZGU+T2JqZWN0PC9jb2RlPiB0byBhdm9pZCBhbnkgZGlyZWN0DQotCSAqICAgICAgICAgICAgcmVmZXJlbmNlcyBvbiB0aGUgU1dUIGNvbXBvbmVudCkNCi0JICogQHJldHVybiB0aGUgc3RhdHVzIG9mIHRoZSBvcGVyYXRpb24NCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgYXJyYXkgaXMgZW1wdHkgb3IgbnVsbA0KLQkgKi8NCi0JcHVibGljIElTdGF0dXMgc2V0RmlsZXNFZGl0YWJsZShJRmlsZVtdIGZpbGVzLCBPYmplY3QgY29udGV4dCkNCi0Jew0KLQkJaWYgKGZpbGVzID09IG51bGwgfHwgZmlsZXMubGVuZ3RoID09IDApDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQXJyYXkgbXVzdCBub3QgYmUgZW1wdHkgbm9yIG51bGwiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJTGlzdDxJRmlsZT4gcm9GaWxlcyA9IG5ldyBBcnJheUxpc3Q8SUZpbGU+KCk7DQotCQlmb3IoSUZpbGUgZiA6IGZpbGVzKQ0KLQkJew0KLQkJCWlmKGYuaXNSZWFkT25seSgpKQ0KLQkJCXsNCi0JCQkJcm9GaWxlcy5hZGQoZik7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlpZihyb0ZpbGVzLnNpemUoKSA9PSAwKQ0KLQkJew0KLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOw0KLQkJfQ0KLQ0KLQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSByb0ZpbGVzLmdldCgwKS5nZXRXb3Jrc3BhY2UoKTsNCi0JCXJldHVybiB3b3Jrc3BhY2UudmFsaWRhdGVFZGl0KHJvRmlsZXMudG9BcnJheShuZXcgSUZpbGVbcm9GaWxlcy5zaXplKCldKSwgY29udGV4dCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgZWRpdGFibGlsaXR5IG9mIGFuIGFycmF5IG9mIGZpbGVzLiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIGVxdWl2YWxlbnQgdG8gaW52b2tpbmcNCi0JICogPGNvZGU+c2V0RmlsZXNFZGl0YWJsZShmaWxlcywgSVdvcmtzcGFjZS5WQUxJREFURV9QUk9NUFQpPC9jb2RlPiANCi0JICogDQotCSAqIEBwYXJhbSBmaWxlcw0KLQkgKiAgICAgICAgICAgIFRoZSBhcnJheSBvZiBmaWxlcyB0byBiZSBzZXQgZWRpdGFibGUNCi0JICogQHJldHVybiB0aGUgc3RhdHVzIG9mIHRoZSBvcGVyYXRpb24NCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgYXJyYXkgaXMgZW1wdHkgb3IgbnVsbA0KLQkgKiBAc2VlIEVkaXRSZXNvdXJjZXNNYW5hZ2VyI3NldEZpbGVzRWRpdGFibGUoSUZpbGVbXSwgT2JqZWN0KQ0KLQkgKi8NCi0JcHVibGljIElTdGF0dXMgc2V0RmlsZXNFZGl0YWJsZShJRmlsZVtdIGZpbGVzKQ0KLQl7DQotCQlyZXR1cm4gc2V0RmlsZXNFZGl0YWJsZShmaWxlcywgSVdvcmtzcGFjZS5WQUxJREFURV9QUk9NUFQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBjb250ZW50IG9mIGEgZmlsZQ0KLQkgKiANCi0JICogQHBhcmFtIGZpbGUNCi0JICogICAgICAgICAgICB0aGUgZmlsZSB0byBiZSBzZXQNCi0JICogQHBhcmFtIGNvbnRlbnQNCi0JICogICAgICAgICAgICB0aGUgY29udGVudCB0byBiZSBzZXQNCi0JICogQHBhcmFtIHVwZGF0ZUZsYWdzDQotCSAqICAgICAgICAgICAgdXBkYXRlIGZsYWdzLg0KLQkgKiBAc2VlIElGaWxlI3NldENvbnRlbnRzKGphdmEuaW8uSW5wdXRTdHJlYW0sIGludCwgSVByb2dyZXNzTW9uaXRvcikNCi0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcg0KLQkgKiAgICAgICAgICAgIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MgcmVwb3J0aW5nIGlzIG5vdCBkZXNpcmVkDQotCSAqIEByZXR1cm4gc3RhdHVzIG9mIHRoZSBvcGVyYXRpb24NCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIDxjb2RlPmZpbGU8L2NvZGU+IG9yIDxjb2RlPmNvbnRlbnQ8L2NvZGU+IGlzIG51bGwNCi0JICovDQotCXB1YmxpYyBJU3RhdHVzIHNldEZpbGVDb250ZW50cyhJRmlsZSBmaWxlLCBTdHJpbmcgY29udGVudCwgaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikNCi0Jew0KLQkJaWYgKGZpbGUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImZpbGUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImNvbnRlbnQiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJSVN0YXR1cyBlZGl0U3RhdHVzID0gc2V0RmlsZUVkaXRhYmxlKGZpbGUpOw0KLQkJaWYgKGVkaXRTdGF0dXMuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLk9LKQ0KLQkJew0KLQkJCS8vIHNvbWV0aGluZyB3ZW50IHdyb25nIHdpdGggdGhlIHZhbGlkYXRlRWRpdCBvcGVyYXRpb24NCi0JCQlyZXR1cm4gZWRpdFN0YXR1czsNCi0JCX0NCi0NCi0JCXRyeQ0KLQkJew0KLQkJCWZpbGUuc2V0Q29udGVudHMobmV3IFN0cmluZ0lucHV0U3RyZWFtQWRhcHRlcihjb250ZW50KSwgdXBkYXRlRmxhZ3MsIHByb2dyZXNzTW9uaXRvcik7DQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7DQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJbG9nZ2VyLmxvZ0Vycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsNCi0JCQlyZXR1cm4gU3RhdHVzVXRpbHMuc3RhdHVzRXJyb3IoSmF4V3NVdGlsTWVzc2FnZXMuRWRpdFJlc291cmNlc01hbmFnZXJfRklMRV9DT05URU5UU19DSEFOR0VfRkFJTEVEX01TRywgZSk7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIGNvbnRlbnQgb2YgYSBmaWxlLiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IG9mIGludm9raW5nDQotCSAqIDxjb2RlPnNldEZpbGVDb250ZW5zKElGaWxlIGZpbGUsIFN0cmluZyBjb250ZW50LCAoa2VlcEhpc3RvcnkgPyBJRmlsZS5LRUVQX0hJU1RPUlkgOiBJUmVzb3VyY2UuTk9ORSkgfCAoZm9yY2UgPyBJRmlsZS5GT1JDRSA6IElSZXNvdXJjZS5OT05FKSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTwvY29kZT4NCi0JICogDQotCSAqIEBwYXJhbSBmaWxlDQotCSAqICAgICAgICAgICAgdGhlIGZpbGUgdG8gYmUgc2V0DQotCSAqIEBwYXJhbSBjb250ZW50DQotCSAqICAgICAgICAgICAgdGhlIGNvbnRlbnQgdG8gYmUgc2V0DQotCSAqIEBwYXJhbSBmb3JjZQ0KLQkgKiAgICAgICAgICAgIGEgZmxhZyBjb250cm9sbGluZyBob3cgdG8gZGVhbCB3aXRoIHJlc291cmNlcyB0aGF0IGFyZSBub3QgaW4gc3luYyB3aXRoIHRoZSBsb2NhbCBmaWxlIHN5c3RlbQ0KLQkgKiBAcGFyYW0ga2VlcEhpc3RvcnkNCi0JICogICAgICAgICAgICBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCBzdG9yZSB0aGUgY3VycmVudCBjb250ZW50cyBpbiB0aGUgbG9jYWwgaGlzdG9yeQ0KLQkgKiBAcGFyYW0gbW9uaXRvcg0KLQkgKiAgICAgICAgICAgIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MgcmVwb3J0aW5nIGlzIG5vdCBkZXNpcmVkDQotCSAqIEByZXR1cm4gc3RhdHVzIG9mIHRoZSBvcGVyYXRpb24NCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIDxjb2RlPmZpbGU8L2NvZGU+IG9yIDxjb2RlPmNvbnRlbnQ8L2NvZGU+IGlzIG51bGwNCi0JICogQHNlZSBFZGl0UmVzb3VyY2VzTWFuYWdlciNzZXRGaWxlQ29udGVudHMoSUZpbGUsIFN0cmluZywgaW50LCBJUHJvZ3Jlc3NNb25pdG9yKQ0KLQkgKi8NCi0JcHVibGljIElTdGF0dXMgc2V0RmlsZUNvbnRlbnRzKElGaWxlIGZpbGUsIFN0cmluZyBjb250ZW50LCBib29sZWFuIGZvcmNlLCBib29sZWFuIGtlZXBIaXN0b3J5LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpDQotCXsNCi0JCXJldHVybiBzZXRGaWxlQ29udGVudHMoZmlsZSwgY29udGVudCwgKChrZWVwSGlzdG9yeSA/IElGaWxlLktFRVBfSElTVE9SWSA6IElSZXNvdXJjZS5OT05FKSB8IChmb3JjZSA/IElGaWxlLkZPUkNFIDogSVJlc291cmNlLk5PTkUpKSwgbW9uaXRvcik7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9yZXNvdXJjZXMvRmlsZVV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Jlc291cmNlcy9GaWxlVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGRkYjNhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Jlc291cmNlcy9GaWxlVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5yZXNvdXJjZXM7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5Db250cmFjdENoZWNrZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JEZXNjcmlwdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVnaXN0cnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOw0KLQ0KLS8qKg0KLSAqIEltcGxlbWVudGF0aW9uIGZvciBmaWxlIHV0aWxpdGllcyBpbnRlcmZhY2UNCi0gKiANCi0gKiBAYXV0aG9yIERhbmFpbCBCcmFuZWtvdg0KLSAqIA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBGaWxlVXRpbHMgaW1wbGVtZW50cyBJRmlsZVV0aWxzIHsNCi0JcHJpdmF0ZSBzdGF0aWMgSUZpbGVVdGlscyB1dGlscyA9IG51bGw7DQotCXByaXZhdGUgc3RhdGljIGludCBpbmRleCA9IDA7DQotDQotCXB1YmxpYyBGaWxlVXRpbHMoKSB7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoZSBmYWN0b3J5IG1ldGhvZA0KLQkgKiANCi0JICogQHJldHVybiBhIEZpbGVVdGlscyBpbnN0YW5jZQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJRmlsZVV0aWxzIGdldEluc3RhbmNlKCkgew0KLQkJaWYgKHV0aWxzID09IG51bGwpIHsNCi0JCQl1dGlscyA9IG5ldyBGaWxlVXRpbHMoKTsNCi0JCX0NCi0NCi0JCXJldHVybiB1dGlsczsNCi0JfQ0KLQ0KLQlwdWJsaWMgZmluYWwgTGlzdDxJRWRpdG9yUGFydD4gZ2V0RWRpdG9yc0J5RmlsZUxvY2F0aW9uKA0KLQkJCWZpbmFsIFN0cmluZyBmaWxlTG9jYXRpb24pIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gew0KLQkJTGlzdDxJQ29tcGlsYXRpb25Vbml0PiB1bml0cyA9IGdldENvbXBpbGF0aW9uVW5pdHMoZmlsZUxvY2F0aW9uKTsNCi0JCVNldDxJRWRpdG9yUGFydD4gZWRpdG9ycyA9IG5ldyBIYXNoU2V0PElFZGl0b3JQYXJ0PigpOw0KLQkJZm9yIChJQ29tcGlsYXRpb25Vbml0IGN1IDogdW5pdHMpIHsNCi0JCQlmaW5hbCBJRWRpdG9yRGVzY3JpcHRvciBlZGl0b3JEZXNjciA9IGdldEVkaXRvckRlc2NyaXB0b3IoY3UNCi0JCQkJCS5nZXRFbGVtZW50TmFtZSgpKTsNCi0JCQllZGl0b3JzLmFkZEFsbChnZXRFZGl0b3JzQnlDb21waWxhdGlvblVuaXQoZWRpdG9yRGVzY3IsDQotCQkJCQlnZXRBY3RpdmVXb3JrYmVuY2hQYWdlKCksIGN1KSk7DQotDQotCQl9DQotDQotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdChlZGl0b3JzLnRvQXJyYXkobmV3IElFZGl0b3JQYXJ0W2VkaXRvcnMuc2l6ZSgpXSkpOw0KLQl9DQotDQotCXB1YmxpYyBmaW5hbCBMaXN0PElDb21waWxhdGlvblVuaXQ+IGdldENvbXBpbGF0aW9uVW5pdHMoDQotCQkJZmluYWwgU3RyaW5nIGZpbGVMb2NhdGlvbikgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7DQotCQlpZiAoZmlsZUxvY2F0aW9uID09IG51bGwpIHsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImZpbGVMb2NhdGlvbiIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlJRmlsZVtdIGZpbGVzRm91bmQgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpDQotCQkJCS5maW5kRmlsZXNGb3JMb2NhdGlvblVSSShuZXcgRmlsZShmaWxlTG9jYXRpb24pLnRvVVJJKCkpOw0KLQkJaWYgKGZpbGVzRm91bmQgPT0gbnVsbCB8fCBmaWxlc0ZvdW5kLmxlbmd0aCA9PSAwKSB7DQotCQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiRmlsZTogIiArIGZpbGVMb2NhdGlvbiArICIgZG9lcyBub3QgZXhpc3QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQl9DQotDQotCQlMaXN0PElDb21waWxhdGlvblVuaXQ+IHVuaXRzID0gbmV3IEFycmF5TGlzdDxJQ29tcGlsYXRpb25Vbml0PigpOw0KLQ0KLQkJZm9yIChJRmlsZSBmaWxlIDogZmlsZXNGb3VuZCkgew0KLQkJCUlKYXZhRWxlbWVudCBqYXZhRWxlbWVudCA9IEphdmFDb3JlLmNyZWF0ZShmaWxlKTsNCi0JCQlpZiAoIShqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQpKSB7DQotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZpbGU6ICIgKyBmaWxlTG9jYXRpb24gKyAiIGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQkJfQ0KLQ0KLQkJCXVuaXRzLmFkZCgoSUNvbXBpbGF0aW9uVW5pdCkgamF2YUVsZW1lbnQpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHVuaXRzOw0KLQl9DQotCQkJDQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0VW5pdChTdHJpbmcgZmlsZUxvY2F0aW9uKQ0KLQkJCXRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gew0KLQkJDQotCQlpZiAoZmlsZUxvY2F0aW9uID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJmaWxlTG9jYXRpb24iKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJSUZpbGUgZmlsZSA9IGdldEZpbGVGb3JMb2NhdGlvbihuZXcgUGF0aChmaWxlTG9jYXRpb24pKTsNCi0JCWlmIChmaWxlID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiRmlsZTogIiArIGZpbGVMb2NhdGlvbiArICIgZG9lcyBub3QgZXhpc3QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQl9DQotDQotCQlyZXR1cm4gZmlsZS5nZXRQcm9qZWN0KCk7DQotCX0NCi0NCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNGaWxlRGlzcGxheWVkSW5EaXJ0eUVkaXRvcihmaW5hbCBTdHJpbmcgZmlsZUxvY2F0aW9uKQ0KLQkJCXRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gew0KLQkJcmV0dXJuIGlzRmlsZURpc3BsYXllZEluRGlydHlFZGl0b3IoZ2V0RWRpdG9yc0J5RmlsZUxvY2F0aW9uKGZpbGVMb2NhdGlvbikpOw0KLQl9DQotDQotCXB1YmxpYyBib29sZWFuIGlzQ29tcGlsYXRpb25Vbml0RGlzcGxheWVkSW5EaXJ0eUVkaXRvcigNCi0JCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IHVuaXQpIHsNCi0JCXJldHVybiBpc0ZpbGVEaXNwbGF5ZWRJbkRpcnR5RWRpdG9yKGdldEVkaXRvcnNCeUNvbXBpbGF0aW9uVW5pdCh1bml0KSk7DQotCX0NCi0NCi0JcHVibGljIGZpbmFsIHZvaWQgc2F2ZUVkaXRvcihTdHJpbmcgZmlsZUxvY2F0aW9uKQ0KLQkJCXRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gew0KLQkJc2F2ZUVkaXRvcihmaWxlTG9jYXRpb24sIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNhdmVFZGl0b3IoZmluYWwgU3RyaW5nIGZpbGVMb2NhdGlvbiwNCi0JCQlmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gew0KLQkJTGlzdDxJRWRpdG9yUGFydD4gZWRpdG9ycyA9IGdldEVkaXRvcnNCeUZpbGVMb2NhdGlvbihmaWxlTG9jYXRpb24pOw0KLQkJaWYgKGVkaXRvcnMuc2l6ZSgpID09IDApIHsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgZmlsZSBpcyBub3QgZGlzcGxheWVkIGJ5IGFuIGVkaXRvciIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlzYXZlRWRpdG9ycyhlZGl0b3JzLCBtb25pdG9yKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzYXZlRWRpdG9yKGZpbmFsIElDb21waWxhdGlvblVuaXQgY3UsDQotCQkJZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7DQotCQlMaXN0PElFZGl0b3JQYXJ0PiBlZGl0b3JzID0gZ2V0RWRpdG9yc0J5Q29tcGlsYXRpb25Vbml0KGN1KTsNCi0JCWlmIChlZGl0b3JzLnNpemUoKSA9PSAwKSB7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIGZpbGUgaXMgbm90IGRpc3BsYXllZCBieSBhbiBlZGl0b3IiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJc2F2ZUVkaXRvcnMoZWRpdG9ycywgbW9uaXRvcik7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc2F2ZUVkaXRvcihmaW5hbCBJQ29tcGlsYXRpb25Vbml0IGN1KSB7DQotCQlMaXN0PElFZGl0b3JQYXJ0PiBlZGl0b3JzID0gZ2V0RWRpdG9yc0J5Q29tcGlsYXRpb25Vbml0KGN1KTsNCi0JCWlmIChlZGl0b3JzLnNpemUoKSA9PSAwKSB7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIGZpbGUgaXMgbm90IGRpc3BsYXllZCBieSBhbiBlZGl0b3IiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJc2F2ZUVkaXRvcnMoZWRpdG9ycywgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHNhdmVFZGl0b3JzKGZpbmFsIExpc3Q8SUVkaXRvclBhcnQ+IGVkaXRvcnMsDQotCQkJZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7DQotCQlmb3IgKElFZGl0b3JQYXJ0IGUgOiBlZGl0b3JzKSB7DQotCQkJaWYgKGUuaXNEaXJ0eSgpKSB7DQotCQkJCWUuZG9TYXZlKG1vbml0b3IpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgQ29sbGVjdGlvbjxJRWRpdG9yUGFydD4gZ2V0RGlydHlFZGl0b3JzKCkgew0KLQkJZmluYWwgU2V0PElFZGl0b3JJbnB1dD4gaW5wdXRzID0gbmV3IEhhc2hTZXQ8SUVkaXRvcklucHV0PigpOw0KLQkJZmluYWwgQ29sbGVjdGlvbjxJRWRpdG9yUGFydD4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxJRWRpdG9yUGFydD4oKTsNCi0JCWZpbmFsIElXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsNCi0JCWZpbmFsIElXb3JrYmVuY2hXaW5kb3dbXSB3aW5kb3dzID0gd29ya2JlbmNoLmdldFdvcmtiZW5jaFdpbmRvd3MoKTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgd2luZG93cy5sZW5ndGg7IGkrKykgew0KLQkJCWZpbmFsIElXb3JrYmVuY2hQYWdlW10gcGFnZXMgPSB3aW5kb3dzW2ldLmdldFBhZ2VzKCk7DQotCQkJZm9yIChpbnQgeCA9IDA7IHggPCBwYWdlcy5sZW5ndGg7IHgrKykgew0KLQkJCQlmaW5hbCBJRWRpdG9yUGFydFtdIGVkaXRvcnMgPSBwYWdlc1t4XS5nZXREaXJ0eUVkaXRvcnMoKTsNCi0JCQkJZm9yIChpbnQgeiA9IDA7IHogPCBlZGl0b3JzLmxlbmd0aDsgeisrKSB7DQotCQkJCQlmaW5hbCBJRWRpdG9yUGFydCBlcCA9IGVkaXRvcnNbel07DQotCQkJCQlmaW5hbCBJRWRpdG9ySW5wdXQgaW5wdXQgPSBlcC5nZXRFZGl0b3JJbnB1dCgpOw0KLQkJCQkJaWYgKCFpbnB1dHMuY29udGFpbnMoaW5wdXQpKSB7DQotCQkJCQkJaW5wdXRzLmFkZChpbnB1dCk7DQotCQkJCQkJcmVzdWx0LmFkZChlcCk7DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotDQotCXByaXZhdGUgSUVkaXRvckRlc2NyaXB0b3IgZ2V0RWRpdG9yRGVzY3JpcHRvcihTdHJpbmcgZmlsZU5hbWUpIHsNCi0JCUlFZGl0b3JSZWdpc3RyeSBlZGl0b3JSZWdpc3RyeSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkNCi0JCQkJLmdldEVkaXRvclJlZ2lzdHJ5KCk7DQotCQlyZXR1cm4gZWRpdG9yUmVnaXN0cnkuZ2V0RGVmYXVsdEVkaXRvcihmaWxlTmFtZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENvbnZlcnRzIGEgU3RyaW5nIHRvIGEgVVJMLCBhc3N1bWluZyAnZmlsZTonIGFzIGEgZGVmYXVsdCBzY2hlbWUuDQotCSAqIA0KLQkgKiBAcGFyYW0gYmFzZQ0KLQkgKiBAcGFyYW0gcGF0aA0KLQkgKiANCi0JICogQHJldHVybg0KLQkgKiANCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiwNCi0JICogICAgICAgICAgICAgaWYgdGhlIFN0cmluZyBpcyBuZWl0aGVyIGEgdmFsaWQgVVJMLCBub3IgYSB2YWxpZCBmaWxlbmFtZS4NCi0JICogDQotCSAqLw0KLQlwdWJsaWMgZmluYWwgVVJMIGZpbGVPclVSTFRvVVJMKGZpbmFsIFVSTCBiYXNlLCBmaW5hbCBTdHJpbmcgcGF0aCkNCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJaWYgKHBhdGggPT0gbnVsbCkgew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicGF0aCIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlTdHJpbmcgbG9jYWxQYXRoID0gcGF0aDsNCi0JCVVSTCBsb2NhbEJhc2UgPSBiYXNlOw0KLQ0KLQkJaWYgKGxvY2FsQmFzZSA9PSBudWxsKSB7DQotCQkJbG9jYWxCYXNlID0gbmV3IFVSTCgiZmlsZToiKTsvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlsb2NhbFBhdGggPSBsb2NhbFBhdGgucmVwbGFjZSgnXFwnLCAnLycpOw0KLQkJdHJ5IHsNCi0JCQlTdHJpbmcgcHJvdG9jb2wgPSBsb2NhbEJhc2UuZ2V0UHJvdG9jb2woKTsNCi0JCQlpZiAoISJodHRwIi5lcXVhbHMocHJvdG9jb2wpIC8vJE5PTi1OTFMtMSQNCi0JCQkJCSYmICEiaHR0cHMiLmVxdWFscyhwcm90b2NvbCkgLy8kTk9OLU5MUy0xJA0KLQkJCQkJJiYgKGxvY2FsUGF0aC5jaGFyQXQoMSkgPT0gJzonDQotCQkJCQkJCXx8IGxvY2FsUGF0aC5jaGFyQXQoMCkgPT0gJy8nIHx8IGxvY2FsUGF0aA0KLQkJCQkJCQkuY2hhckF0KDApID09ICdcXCcpKSB7DQotCQkJCWxvY2FsUGF0aCA9IChuZXcgRmlsZShsb2NhbFBhdGgpKS50b1VSSSgpLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKTsNCi0JCQl9DQotCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsNCi0JCQkvLyAkSkwtRVhDJA0KLQkJfQ0KLQ0KLQkJaWYgKGxvY2FsUGF0aC5zdGFydHNXaXRoKCJmaWxlOiIpICYmIGxvY2FsUGF0aC5sZW5ndGgoKSA+IDUgLy8kTk9OLU5MUy0xJA0KLQkJCQkmJiBsb2NhbFBhdGguY2hhckF0KDUpICE9ICcvJykgew0KLQkJCWxvY2FsUGF0aCA9ICJmaWxlOi8iLmNvbmNhdChsb2NhbFBhdGguc3Vic3RyaW5nKDUpKTsgLy8kTk9OLU5MUy0xJA0KLQkJfSBlbHNlIHsNCi0JCQlpZiAobG9jYWxQYXRoLnN0YXJ0c1dpdGgoImZpbGU6Ly8iKSAvLyROT04tTkxTLTEkDQotCQkJCQkmJiAhbG9jYWxQYXRoLnN0YXJ0c1dpdGgoImZpbGU6Ly8vLyIpIC8vJE5PTi1OTFMtMSQNCi0JCQkJCSYmICFsb2NhbFBhdGguc3RhcnRzV2l0aCgiZmlsZTovL2xvY2FsaG9zdC8iKSkgeyAvLyROT04tTkxTLTEkDQotCQkJCWxvY2FsUGF0aCA9ICJmaWxlOi8vLy8iLmNvbmNhdChsb2NhbFBhdGguc3Vic3RyaW5nKCJmaWxlOi8vIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCQkJCQkubGVuZ3RoKCkpKTsNCi0JCQl9DQotCQl9DQotCQlVUkwgdXJsID0gbmV3IFVSTChsb2NhbEJhc2UsIGxvY2FsUGF0aCk7DQotCQlyZXR1cm4gdXJsOw0KLQl9DQotDQotCXB1YmxpYyBGaWxlIGNyZWF0ZVRlbXBEaXJlY3RvcnkoKSB7DQotCQlTdHJpbmcgdGVtcERpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5kZXgrKzsNCi0JCUZpbGUgdGVtcDEgPSBuZXcgRmlsZSh0ZW1wRGlyLCBJbnRlZ2VyLnRvU3RyaW5nKHRoaXMuaGFzaENvZGUoKSkgKyAiXyIgLy8kTk9OLU5MUy0xJA0KLQkJCQkrIGluZGV4KTsNCi0JCXRlbXAxLm1rZGlyKCk7DQotCQlyZXR1cm4gdGVtcDE7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgZGVsZXRlRGlyZWN0b3J5KGZpbmFsIEZpbGUgZGlyZWN0b3J5KSB7DQotCQlpZiAoZGlyZWN0b3J5ID09IG51bGwpIHsNCi0JCQlyZXR1cm47DQotCQl9DQotCQlpZiAoIWRpcmVjdG9yeS5leGlzdHMoKSkgew0KLQkJCXJldHVybjsNCi0JCX0NCi0JCWZvciAoRmlsZSBmIDogZGlyZWN0b3J5Lmxpc3RGaWxlcygpKSB7DQotCQkJZi5kZWxldGUoKTsNCi0JCX0NCi0JCWRpcmVjdG9yeS5kZWxldGUoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgSUZpbGVbXSBnZXRGaWxlc0J5RXh0ZW5zaW9uKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBleHRlbnNpb24pDQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKGV4dGVuc2lvbiwgImV4dGVuc2lvbiIpOyAvLyROT04tTkxTLTEkDQotCQlBcnJheUxpc3Q8SUZpbGU+IGZvdW5kRmlsZXMgPSBuZXcgQXJyYXlMaXN0PElGaWxlPigpOw0KLQ0KLQkJZ2V0RmlsZXNCeUV4dGVuc2lvbihmb3VuZEZpbGVzLCBwcm9qZWN0Lm1lbWJlcnMoKSwgZXh0ZW5zaW9uKTsNCi0NCi0JCXJldHVybiBmb3VuZEZpbGVzLnRvQXJyYXkobmV3IElGaWxlW2ZvdW5kRmlsZXMuc2l6ZSgpXSk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGdldEZpbGVzQnlFeHRlbnNpb24oQXJyYXlMaXN0PElGaWxlPiBmb3VuZEZpbGVzLA0KLQkJCUlSZXNvdXJjZVtdIGN1cnJlbnRSZXNvdXJjZXMsIFN0cmluZyBleHRlbnNpb24pDQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJZm9yIChpbnQgaWkgPSAwOyBpaSA8IGN1cnJlbnRSZXNvdXJjZXMubGVuZ3RoOyBpaSsrKSB7DQotCQkJaWYgKGN1cnJlbnRSZXNvdXJjZXNbaWldLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSKSB7DQotCQkJCWdldEZpbGVzQnlFeHRlbnNpb24oZm91bmRGaWxlcywNCi0JCQkJCQkoKElGb2xkZXIpIGN1cnJlbnRSZXNvdXJjZXNbaWldKS5tZW1iZXJzKCksIGV4dGVuc2lvbik7DQotCQkJfSBlbHNlIGlmIChjdXJyZW50UmVzb3VyY2VzW2lpXS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUNCi0JCQkJCSYmIGV4dGVuc2lvbg0KLQkJCQkJCQkuZXF1YWxzKGN1cnJlbnRSZXNvdXJjZXNbaWldLmdldEZpbGVFeHRlbnNpb24oKSkpIHsNCi0JCQkJZm91bmRGaWxlcy5hZGQoKElGaWxlKSBjdXJyZW50UmVzb3VyY2VzW2lpXSk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyBJRmlsZSBnZXRGaWxlRm9yTG9jYXRpb24oSVBhdGggbG9jYXRpb24pIHsNCi0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbigNCi0JCQkJbG9jYXRpb24pOw0KLQl9DQotDQotCXByaXZhdGUgSVdvcmtiZW5jaFBhZ2UgZ2V0QWN0aXZlV29ya2JlbmNoUGFnZSgpIHsNCi0JCWlmIChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpID09IG51bGwpIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0NCi0JCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpDQotCQkJCS5nZXRBY3RpdmVQYWdlKCk7DQotCX0NCi0NCi0JcHVibGljIExpc3Q8SUVkaXRvclBhcnQ+IGdldEVkaXRvcnNCeUNvbXBpbGF0aW9uVW5pdCgNCi0JCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IGN1KSB7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0oY3UsICJjdSIpOyAvLyROT04tTkxTLTEkDQotCQlmaW5hbCBJRWRpdG9yRGVzY3JpcHRvciBlZGl0b3JEZXNjciA9IGdldEVkaXRvckRlc2NyaXB0b3IoY3UNCi0JCQkJLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJZmluYWwgSVdvcmtiZW5jaFBhZ2Ugd2JQYWdlID0gZ2V0QWN0aXZlV29ya2JlbmNoUGFnZSgpOw0KLQkJaWYgKHdiUGFnZSA9PSBudWxsKSB7DQotCQkJcmV0dXJuIG5ldyBBcnJheUxpc3Q8SUVkaXRvclBhcnQ+KDApOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGdldEVkaXRvcnNCeUNvbXBpbGF0aW9uVW5pdChlZGl0b3JEZXNjciwgd2JQYWdlLCBjdSk7DQotCX0NCi0NCi0JcHJpdmF0ZSBMaXN0PElFZGl0b3JQYXJ0PiBnZXRFZGl0b3JzQnlDb21waWxhdGlvblVuaXQoDQotCQkJZmluYWwgSUVkaXRvckRlc2NyaXB0b3IgZWRpdG9yRGVzY3JpcHRvciwNCi0JCQlmaW5hbCBJV29ya2JlbmNoUGFnZSBwYWdlLCBmaW5hbCBJQ29tcGlsYXRpb25Vbml0IGN1KSB7DQotCQlMaXN0PElFZGl0b3JQYXJ0PiBlZGl0b3JQYXJ0UmV0dXJuZWQgPSBuZXcgQXJyYXlMaXN0PElFZGl0b3JQYXJ0PigpOw0KLQ0KLQkJaWYgKGVkaXRvckRlc2NyaXB0b3IgIT0gbnVsbCAmJiBwYWdlICE9IG51bGwpIHsNCi0JCQlmb3IgKElFZGl0b3JSZWZlcmVuY2UgZWRpdG9yUmVmZXJlY2UgOiBwYWdlLmdldEVkaXRvclJlZmVyZW5jZXMoKSkgew0KLQkJCQlJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gZWRpdG9yUmVmZXJlY2UuZ2V0RWRpdG9yKHRydWUpOw0KLQkJCQlpZiAoaXNFZGl0b3JBcHBsaWNhYmxlRm9yQ3UoZWRpdG9yUGFydCwgY3UpKSB7DQotCQkJCQllZGl0b3JQYXJ0UmV0dXJuZWQuYWRkKGVkaXRvclBhcnQpOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGVkaXRvclBhcnRSZXR1cm5lZDsNCi0JfQ0KLQ0KLQlwcml2YXRlIGJvb2xlYW4gaXNFZGl0b3JBcHBsaWNhYmxlRm9yQ3UoZmluYWwgSUVkaXRvclBhcnQgZWRpdG9yLA0KLQkJCWZpbmFsIElDb21waWxhdGlvblVuaXQgY3UpIHsNCi0JCWlmIChlZGl0b3IgPT0gbnVsbCkgew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0NCi0JCWlmICghKGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpIGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkNCi0JCQkJfHwgIShjdS5nZXRSZXNvdXJjZSgpIGluc3RhbmNlb2YgSUZpbGUpKSB7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQ0KLQkJZmluYWwgSUZpbGUgY3VGaWxlID0gKElGaWxlKSBjdS5nZXRSZXNvdXJjZSgpOw0KLQkJZmluYWwgSUZpbGVFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IChJRmlsZUVkaXRvcklucHV0KSBlZGl0b3INCi0JCQkJLmdldEVkaXRvcklucHV0KCk7DQotDQotCQlyZXR1cm4gY3VGaWxlLmVxdWFscyhlZGl0b3JJbnB1dC5nZXRGaWxlKCkpOw0KLQl9DQotDQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRmlsZURpc3BsYXllZEluRGlydHlFZGl0b3IoDQotCQkJZmluYWwgTGlzdDxJRWRpdG9yUGFydD4gZGlzcGxheWluZ0VkaXRvcnMpIHsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShkaXNwbGF5aW5nRWRpdG9ycywgImRpc3BsYXlpbmdFZGl0b3JzIik7IC8vJE5PTi1OTFMtMSQNCi0JCWZvciAoSUVkaXRvclBhcnQgZWRpdG9yIDogZGlzcGxheWluZ0VkaXRvcnMpIHsNCi0JCQlpZiAoZWRpdG9yLmlzRGlydHkoKSkgew0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJlYWRzIGZpbGUgY29udGVudCBhcyB0ZXh0IGFuZCByZXR1cm5zIHtAbGluayBTdHJpbmd9DQotCSAqIA0KLQkgKiBAcGFyYW0gc291cmNlRmlsZQ0KLQkgKiBAcmV0dXJuIHRoZSBjb250ZW50IG9mIGZpbGUNCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRGaWxlQ29udGVudChmaW5hbCBGaWxlIHNvdXJjZUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCQlmaW5hbCBGaWxlUmVhZGVyIGZyID0gbmV3IEZpbGVSZWFkZXIoc291cmNlRmlsZSk7DQotCQlmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOw0KLQ0KLQkJdHJ5IHsNCi0JCQlmaW5hbCBjaGFyW10gYnVmZiA9IG5ldyBjaGFyWzEwMjRdOw0KLQkJCWZvciAoaW50IGNudCA9IDA7IChjbnQgPSBmci5yZWFkKGJ1ZmYpKSA+IC0xOykgew0KLQkJCQlidWlsZGVyLmFwcGVuZChidWZmLCAwLCBjbnQpOw0KLQkJCX0NCi0JCX0gZmluYWxseSB7DQotCQkJZnIuY2xvc2UoKTsNCi0JCX0NCi0NCi0JCXJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc2V0Q29tcGlsYXRpb25Vbml0Q29udGVudChmaW5hbCBJQ29tcGlsYXRpb25Vbml0IHVuaXQsDQotCQkJZmluYWwgU3RyaW5nIGNvbnRlbnQsIGZpbmFsIGJvb2xlYW4gZm9yY2UsDQotCQkJZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbSh1bml0LCAidW5pdCIpOyAvLyROT04tTkxTLTEkDQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0oY29udGVudCwgImNvbnRlbnQiKTsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJdW5pdC5iZWNvbWVXb3JraW5nQ29weShtb25pdG9yKTsNCi0JCXRyeSB7DQotCQkJdW5pdC5nZXRCdWZmZXIoKS5zZXRDb250ZW50cyhjb250ZW50KTsNCi0JCQl1bml0LmNvbW1pdFdvcmtpbmdDb3B5KGZvcmNlLCBtb25pdG9yKTsNCi0JCX0gZmluYWxseSB7DQotCQkJdW5pdC5kaXNjYXJkV29ya2luZ0NvcHkoKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRDb21waWxhdGlvblVuaXRDb250ZW50QW5kU2F2ZURpcnR5RWRpdG9ycygNCi0JCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IHVuaXQsIGZpbmFsIFN0cmluZyBjb250ZW50LA0KLQkJCWZpbmFsIGJvb2xlYW4gZm9yY2UsIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikNCi0JCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsNCi0JCXNldENvbXBpbGF0aW9uVW5pdENvbnRlbnQodW5pdCwgY29udGVudCwgZm9yY2UsIG1vbml0b3IpOw0KLQkJaWYgKGlzQ29tcGlsYXRpb25Vbml0RGlzcGxheWVkSW5EaXJ0eUVkaXRvcih1bml0KSkgew0KLQkJCXNhdmVFZGl0b3IodW5pdCk7DQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9yZXNvdXJjZXMvSUZpbGVVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9yZXNvdXJjZXMvSUZpbGVVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZmRmYTA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvcmVzb3VyY2VzL0lGaWxlVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5yZXNvdXJjZXM7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsNCi0NCi0vKioNCi0gKiBJbnRlcmZhY2UgdGhhdCBkZWZpbmVzIGNvbW1vbiB1dGlsaWVzIGZvciBmaWxlIG1hbmlwdWxhdGlvbg0KLSAqIA0KLSAqIEBhdXRob3IgRGFuYWlsIEJyYW5la292DQotICovDQotcHVibGljIGludGVyZmFjZSBJRmlsZVV0aWxzIHsNCi0NCi0JLyoqDQotCSAqIFJldHJpZXZlcyB0aGUgZWRpdG9ycyB0aGF0IGFyZSBjdXJyZW50bHkgZGlzcGxheWluZyB0aGUgZmlsZSBzcGVjZmllZC4NCi0JICogDQotCSAqIEBwYXJhbSBmaWxlTG9jYXRpb24NCi0JICogICAgICAgICAgICBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBmaWxlDQotCSAqIEBzZWUgSVJlc291cmNlI2dldExvY2F0aW9uKCkudG9PU1N0cmluZygpDQotCSAqIEByZXR1cm4gQ3VycmVudCBvcGVuZWQgZWRpdG9ycyBvZiB0aGUgZmlsZSBzcGVjaWZpZWQgb3IgYW4gZW1wdHkgbGlzdCBpZiBzdWNoIGFyZSBub3Qgb3BlbmVkDQotCSAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QNCi0JICovDQotCXB1YmxpYyBhYnN0cmFjdCBMaXN0PElFZGl0b3JQYXJ0PiBnZXRFZGl0b3JzQnlGaWxlTG9jYXRpb24oDQotCQkJZmluYWwgU3RyaW5nIGZpbGVMb2NhdGlvbikgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIERldGVybWluZXMgd2hldGhlciB0aGUgZmlsZSBzcGVjaWZpZWQgaXMgZGlzcGxheWVkIHdpdGhpbiBhbiBlZGl0b3Igd2hpY2gNCi0JICogaGFzIGEgZGlydHkgc3RhdGUuDQotCSAqIA0KLQkgKiBAcGFyYW0gZmlsZUxvY2F0aW9uDQotCSAqICAgICAgICAgICAgQWJzb2x1dGUgcGF0aCB0byB0aGUgZmlsZQ0KLQkgKiBAc2VlIElSZXNvdXJjZSNnZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKQ0KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGZpbGUgaXMgZGlydHkNCi0JICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGRvZXMgbm90IGV4aXN0DQotCSAqLw0KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0ZpbGVEaXNwbGF5ZWRJbkRpcnR5RWRpdG9yKA0KLQkJCWZpbmFsIFN0cmluZyBmaWxlTG9jYXRpb24pIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBTYXZlcyB0aGUgZGlydHkgc3RhdGUgZWRpdG9yDQotCSAqIA0KLQkgKiBAcGFyYW0gZmlsZUxvY2F0aW9uDQotCSAqICAgICAgICAgICAgQWJzb2x1dGUgcGF0aCB0byB0aGUgZmlsZQ0KLQkgKiBAc2VlIElSZXNvdXJjZSNnZXRMb2NhdGlvbigpI3RvT1NTdHJpbmcoKQ0KLQkgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgZG9lcyBub3QgZXhpcw0KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIHRoZSBmaWxlIGlzIG5vdCBkaXNwbGF5ZWQgYnkgYW4gZWRpdG9yDQotCSAqLw0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzYXZlRWRpdG9yKFN0cmluZyBmaWxlTG9jYXRpb24pDQotCQkJdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIFNhdmVzIHRoZSBkaXJ0eSBzdGF0ZSBlZGl0b3INCi0JICogDQotCSAqIEBwYXJhbSBmaWxlTG9jYXRpb24NCi0JICogICAgICAgICAgICBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBmaWxlDQotCSAqIEBzZWUgSVJlc291cmNlI2dldExvY2F0aW9uKCkjdG9PU1N0cmluZygpDQotCSAqIEBwYXJhbSBtb25pdG9yDQotCSAqICAgICAgICAgICAgUHJvZ3Jlc3MgbW9uaXRvcg0KLQkgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgZG9lcyBub3QgZXhpcw0KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIHRoZSBmaWxlIGlzIG5vdCBkaXNwbGF5ZWQgYnkgYW4gZWRpdG9yDQotCSAqLw0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzYXZlRWRpdG9yKFN0cmluZyBmaWxlTG9jYXRpb24sDQotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogUmV0cmlldmVzIGEgbGlzdCBvZiBkaXJ0eSBlZGl0b3JzDQotCSAqIA0KLQkgKiBAcmV0dXJuIGNvbGxlY3Rpb24gY29udGFpbmluZyBkaXJ0eSBlZGl0b3JzDQotCSAqLw0KLQlwdWJsaWMgYWJzdHJhY3QgQ29sbGVjdGlvbjxJRWRpdG9yUGFydD4gZ2V0RGlydHlFZGl0b3JzKCk7DQotDQotCS8qKg0KLQkgKiBSZXRyaWV2ZSBjb21waWxhdGlvbiB1bml0cyBmb3IgdGhlIGxvY2F0aW9uIHNwZWNpZmllZA0KLQkgKiANCi0JICogQHBhcmFtIGZpbGVMb2NhdGlvbg0KLQkgKiAgICAgICAgICAgIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBmaWxlLCBlLmcuDQotCSAqICAgICAgICAgICAgPGNvZGU+QzpcXGRpcjFcXGRpcjJcXGZpbGUubmFtZTwvY29kZT4NCi0JICogQHNlZSBJUmVzb3VyY2UjZ2V0TG9jYXRpb24oKSN0b09TU3RyaW5nKCkNCi0JICogDQotCSAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIGZpbGUgc3BlY2lmaWVkIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgd29ya3NwYWNlDQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIGZpbGUgc3BlY2lmaWVkIGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQNCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIGZpbGVMb2NhdGlvbiBpcyBudWxsDQotCSAqIEByZXR1cm4gVGhlIGNvbXBpbGF0aW9uIHVuaXRzOyBjYW5ub3QgYmUgbnVsbA0KLQkgKi8NCi0JcHVibGljIGFic3RyYWN0IExpc3Q8SUNvbXBpbGF0aW9uVW5pdD4gZ2V0Q29tcGlsYXRpb25Vbml0cygNCi0JCQlmaW5hbCBTdHJpbmcgZmlsZUxvY2F0aW9uKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uOw0KLQkNCi0JLyoqDQotCSAqIFJldHJpZXZlIHByb2plY3QgdW5pdCBmb3IgdGhlIGxvY2F0aW9uIHNwZWNpZmllZA0KLQkgKiANCi0JICogQHBhcmFtIGZpbGVMb2NhdGlvbg0KLQkgKiAgICAgICAgICAgIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBmaWxlLCBlLmcuDQotCSAqICAgICAgICAgICAgPGNvZGU+QzpcXGRpcjFcXGRpcjJcXGZpbGUubmFtZTwvY29kZT4NCi0JICogQHNlZSBJUmVzb3VyY2UjZ2V0TG9jYXRpb24oKSN0b09TU3RyaW5nKCkNCi0JICogDQotCSAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIGZpbGUgc3BlY2lmaWVkIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgd29ya3NwYWNlDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiBmaWxlTG9jYXRpb24gaXMgbnVsbA0KLQkgKiBAcmV0dXJuIFRoZSBjb21waWxhdGlvbiB1bml0czsgY2Fubm90IGJlIG51bGwNCi0JICovDQotCXB1YmxpYyBhYnN0cmFjdCBJUHJvamVjdCBnZXRQcm9qZWN0VW5pdCgNCi0JCQlmaW5hbCBTdHJpbmcgZmlsZUxvY2F0aW9uKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogQ29udmVydHMgYSBTdHJpbmcgdG8gYSBVUkwsIGFzc3VtaW5nICdmaWxlOicgYXMgYSBkZWZhdWx0IHNjaGVtZS4NCi0JICogDQotCSAqIEBwYXJhbSBiYXNlDQotCSAqIEBwYXJhbSBwYXRoDQotCSAqIA0KLQkgKiBAcmV0dXJuDQotCSAqIA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uLA0KLQkgKiAgICAgICAgICAgICBpZiB0aGUgU3RyaW5nIGlzIG5laXRoZXIgYSB2YWxpZCBVUkwsIG5vciBhIHZhbGlkIGZpbGVuYW1lLg0KLQkgKiANCi0JICovDQotCXB1YmxpYyBhYnN0cmFjdCBVUkwgZmlsZU9yVVJMVG9VUkwoZmluYWwgVVJMIGJhc2UsIGZpbmFsIFN0cmluZyBwYXRoKQ0KLQkJCXRocm93cyBJT0V4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYSBuZXcgZGlyZWN0b3J5IGluIHRoZSBPUyB0ZW1wIGZvbGRlcg0KLQkgKiANCi0JICogQHJldHVybiB0aGUgZGlyZWN0b3J5DQotCSAqLw0KLQlwdWJsaWMgRmlsZSBjcmVhdGVUZW1wRGlyZWN0b3J5KCk7DQotDQotCS8qKg0KLQkgKiBEZWxldGVzIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IGFuZCBhbGwgaXRzIGNvbnRlbnQNCi0JICogDQotCSAqIHBhcmFtIGRpcmVjdG9yeQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgZGVsZXRlRGlyZWN0b3J5KGZpbmFsIEZpbGUgZGlyZWN0b3J5KTsNCi0NCi0JLyoqDQotCSAqIEdldHMgYWxsIHRoZSBmaWxlcyB3aXRoIHRoZSBwcm92aWRlZCBleHRlbnNpb24gd2l0aGluIGEgcHJvamVjdC4NCi0JICogDQotCSAqIEBwYXJhbSBwcm9qZWN0IC0NCi0JICogICAgICAgICAgICB0byBiZSBzZWFyY2hlZA0KLQkgKiBAcGFyYW0gZXh0ZW5zaW9uIC0NCi0JICogICAgICAgICAgICB0eXBlcyBvZiBmaWxlcyBvZiBpbnRlcmVzdA0KLQkgKi8NCi0JcHVibGljIElGaWxlW10gZ2V0RmlsZXNCeUV4dGVuc2lvbihJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgZXh0ZW5zaW9uKQ0KLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogUmV0cmlldmVzIGEgbGlzdCBvZiBlZGl0b3JzIHRoYXQgYXJlIGN1cnJlbnRseSBkaXNwbGF5aW5nIHRoZSBjb21waWxhdGlvbg0KLQkgKiB1bml0IHNwZWNpZmllZC4NCi0JICogDQotCSAqIEBwYXJhbSBjdQ0KLQkgKiAgICAgICAgICAgIHRoZSBjb21waWxhdGlvbiB1bml0OyBtdXN0IG5vdCBiZSBudWxsDQotCSAqIEByZXR1cm4gQ3VycmVudCBlZGl0b3JzIGxpc3Qgb3IgYW4gZW1wdHkgbGlzdCBpbiBjYXNlIHRoZXJlIGFyZSBub3QNCi0JICogICAgICAgICBlZGl0b3JzIGRpc3BsYXlpbmcgdGhlIGZpbGUgc3BlY2lmaWVkDQotCSAqIA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIDxjb2RlPmN1PC9jb2RlPiBwYXJhbWV0ZXIgaXMgbnVsbA0KLQkgKi8NCi0JcHVibGljIGFic3RyYWN0IExpc3Q8SUVkaXRvclBhcnQ+IGdldEVkaXRvcnNCeUNvbXBpbGF0aW9uVW5pdCgNCi0JCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IGN1KTsNCi0NCi0JLyoqDQotCSAqIERldGVybWluZXMgd2hldGhlciB0aGUgY29tcGlsYXRpb24gdW5pdCBzcGVjaWZpZWQgaXMgZGlzcGxheWVkIHdpdGhpbiBhbg0KLQkgKiBlZGl0b3Igd2hpY2ggaGFzIGEgZGlydHkgc3RhdGUuDQotCSAqIA0KLQkgKiBAcGFyYW0gdW5pdA0KLQkgKiAgICAgICAgICAgIFRoZSBjb21waWxhdGlvbiB1bml0DQotCSAqIA0KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGNvbXBpbGF0aW9uIHVuaXQgaXMgZGlydHkNCi0JICovDQotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQ29tcGlsYXRpb25Vbml0RGlzcGxheWVkSW5EaXJ0eUVkaXRvcigNCi0JCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IHVuaXQpOw0KLQ0KLQkvKioNCi0JICogU2F2ZXMgYWxsIHRoZSBkaXJ0eSBzdGF0ZSBlZGl0b3JzIHRoYXQgYXJlIGN1cnJlbnRseSBkaXNwbGF5aW5nIHRoZQ0KLQkgKiBjb21waWxhdGlvbiB1bml0IHNwZWNpZmllZA0KLQkgKiANCi0JICogQHBhcmFtIGN1DQotCSAqICAgICAgICAgICAgdGhlIGNvbXBpbGF0aW9uIHVuaXQNCi0JICogQHBhcmFtIG1vbml0b3INCi0JICogICAgICAgICAgICBQcm9ncmVzcyBtb25pdG9yDQotCSAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBkb2VzIG5vdCBleGlzdA0KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIHRoZSBmaWxlIGlzIG5vdCBkaXNwbGF5ZWQgYnkgYW4gZWRpdG9yDQotCSAqLw0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzYXZlRWRpdG9yKElDb21waWxhdGlvblVuaXQgY3UsDQotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsNCi0NCi0JLyoqDQotCSAqIFNhdmVzIGFsbCB0aGUgZGlydHkgc3RhdGUgZWRpdG9ycyB0aGF0IGFyZSBjdXJyZW50bHkgZGlzcGxheWluZyB0aGUNCi0JICogY29tcGlsYXRpb24gdW5pdCBzcGVjaWZpZWQNCi0JICogDQotCSAqIEBwYXJhbSBjdQ0KLQkgKiAgICAgICAgICAgIHRoZSBjb21waWxhdGlvbiB1bml0DQotCSAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBkb2VzIG5vdCBleGlzdA0KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIHRoZSBmaWxlIGlzIG5vdCBkaXNwbGF5ZWQgYnkgYW4gZWRpdG9yDQotCSAqLw0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzYXZlRWRpdG9yKElDb21waWxhdGlvblVuaXQgY3UpOw0KLQ0KLQkvKioNCi0JICogUmV0cmlldmUgYSBmaWxlIGluc3RhbmNlIGZvciB0aGUgbG9jYXRpb24gc3BlY2lmaWVkLiBUaGlzIG1ldGhvZCBpcyBhDQotCSAqIGNvbnZlbmllbmNlIG1ldGhvZCBlcXVpdmFsZW50IHRvIGludm9raW5nDQotCSAqIDxjb2RlPlJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKGxvY2F0aW9uKTwvY29kZT4NCi0JICogDQotCSAqIEBwYXJhbSBsb2NhdGlvbg0KLQkgKiAgICAgICAgICAgIHRoZSBmaWxlIGxvY2F0aW9uOyBtdXN0IGJlIGFic29sdXRlDQotCSAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgZmlsZSBpbiB0aGUgd29ya3NwYWNlLCBvciBudWxsIGlmIG5vbmUNCi0JICogQHNlZSBJV29ya3NwYWNlUm9vdCNnZXRGaWxlRm9yTG9jYXRpb24oSVBhdGgpDQotCSAqLw0KLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZUZvckxvY2F0aW9uKElQYXRoIGxvY2F0aW9uKTsNCi0NCi0JLyoqDQotCSAqIFJlYWRzIGZpbGUgY29udGVudCBhcyB0ZXh0IGFuZCByZXR1cm5zIHtAbGluayBTdHJpbmd9DQotCSAqIA0KLQkgKiBAcGFyYW0gc291cmNlRmlsZQ0KLQkgKiBAcmV0dXJuIHRoZSBjb250ZW50IG9mIGZpbGUNCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRGaWxlQ29udGVudChmaW5hbCBGaWxlIHNvdXJjZUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIGNvbnRlbnQgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQgc3BlY2lmaWVkIHdpdGggdGhlDQotCSAqIDxjb2RlPmNvbnRlbnQ8L2NvZGU+IHByb3ZpZGVkLiBUaGVyZSBpcyBubyB2YWxpZGF0aW9uIG9mIHRoZSBjb250ZW50DQotCSAqIA0KLQkgKiBAcGFyYW0gY1VuaXQNCi0JICogICAgICAgICAgICB0aGUgY29tcGlsYXRpb24gdW5pdC4gTXVzdCBub3QgYmUgbnVsbC4gSWYgdGhlIGNvbXBpbGF0aW9uDQotCSAqICAgICAgICAgICAgdW5pdCBkb2VzIG5vdCBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkDQotCSAqIEBwYXJhbSBjb250ZW50DQotCSAqICAgICAgICAgICAgdGhlIGNvbnRlbnQgdG8gYmUgc2V0LiBNdXN0IG5vdCBiZSBudWxsDQotCSAqIEBwYXJhbSBmb3JjZQ0KLQkgKiAgICAgICAgICAgIGEgZmxhZyB0byBoYW5kbGUgdGhlIGNhc2VzIHdoZW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBvcmlnaW5hbA0KLQkgKiAgICAgICAgICAgIHJlc291cmNlIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGlzIHdvcmtpbmcgY29weSB3YXMgY3JlYXRlZA0KLQkgKiBAcGFyYW0gbW9uaXRvcg0KLQkgKiAgICAgICAgICAgIHRoZSBtb25pdG9yIHRvIHJlcG9ydCBwcm9ncmVzcyB0byBvciBudWxsIGlmIG5vIHByb2dyZXNzDQotCSAqICAgICAgICAgICAgbW9uaXRvcmluZyBpcyByZXF1aXJlZA0KLQkgKiANCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCBzZXR0aW5nIGNvbXBpbGF0aW9uIHVuaXQgY29udGVudA0KLQkgKiBAc2VlIElDb21waWxhdGlvblVuaXQjYmVjb21lV29ya2luZ0NvcHkoSVByb2dyZXNzTW9uaXRvcikNCi0JICogQHNlZSBJQ29tcGlsYXRpb25Vbml0I2NvbW1pdFdvcmtpbmdDb3B5KGJvb2xlYW4sIElQcm9ncmVzc01vbml0b3IpDQotCSAqIEBzZWUgSUNvbXBpbGF0aW9uVW5pdCNkaXNjYXJkV29ya2luZ0NvcHkoKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0Q29tcGlsYXRpb25Vbml0Q29udGVudChJQ29tcGlsYXRpb25Vbml0IGNVbml0LA0KLQkJCVN0cmluZyBjb250ZW50LCBib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpDQotCQkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIGNvbnRlbnQgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQgc3BlY2lmaWVkIHdpdGggdGhlDQotCSAqIDxjb2RlPmNvbnRlbnQ8L2NvZGU+IHByb3ZpZGVkIGFuZCBzYXZlcyB0aGUgZGlydHkgZWRpdG9ycyBpZiBhbnkgd2hpY2gNCi0JICogZGlzcGxheSB0aGUgY29tcGlsYXRpb24gdW5pdC4gVGhlcmUgaXMgbm8gdmFsaWRhdGlvbiBvZiB0aGUgY29udGVudA0KLQkgKiANCi0JICogQHBhcmFtIGNVbml0DQotCSAqICAgICAgICAgICAgdGhlIGNvbXBpbGF0aW9uIHVuaXQuIE11c3Qgbm90IGJlIG51bGwuIElmIHRoZSBjb21waWxhdGlvbg0KLQkgKiAgICAgICAgICAgIHVuaXQgZG9lcyBub3QgZXhpc3QsIGl0IHdpbGwgYmUgY3JlYXRlZA0KLQkgKiBAcGFyYW0gY29udGVudA0KLQkgKiAgICAgICAgICAgIHRoZSBjb250ZW50IHRvIGJlIHNldC4gTXVzdCBub3QgYmUgbnVsbA0KLQkgKiBAcGFyYW0gZm9yY2UNCi0JICogICAgICAgICAgICBhIGZsYWcgdG8gaGFuZGxlIHRoZSBjYXNlcyB3aGVuIHRoZSBjb250ZW50cyBvZiB0aGUgb3JpZ2luYWwNCi0JICogICAgICAgICAgICByZXNvdXJjZSBoYXZlIGNoYW5nZWQgc2luY2UgdGhpcyB3b3JraW5nIGNvcHkgd2FzIGNyZWF0ZWQNCi0JICogQHBhcmFtIG1vbml0b3INCi0JICogICAgICAgICAgICB0aGUgbW9uaXRvciB0byByZXBvcnQgcHJvZ3Jlc3MgdG8gb3IgbnVsbCBpZiBubyBwcm9ncmVzcw0KLQkgKiAgICAgICAgICAgIG1vbml0b3JpbmcgaXMgcmVxdWlyZWQNCi0JICogDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggc2V0dGluZyBjb21waWxhdGlvbiB1bml0IGNvbnRlbnQNCi0JICogQHNlZSBJQ29tcGlsYXRpb25Vbml0I2JlY29tZVdvcmtpbmdDb3B5KElQcm9ncmVzc01vbml0b3IpDQotCSAqIEBzZWUgSUNvbXBpbGF0aW9uVW5pdCNjb21taXRXb3JraW5nQ29weShib29sZWFuLCBJUHJvZ3Jlc3NNb25pdG9yKQ0KLQkgKiBAc2VlIElDb21waWxhdGlvblVuaXQjZGlzY2FyZFdvcmtpbmdDb3B5KCkNCi0JICogQHNlZSBJRmlsZVV0aWxzI3NldENvbXBpbGF0aW9uVW5pdENvbnRlbnQoSUNvbXBpbGF0aW9uVW5pdCwgU3RyaW5nLA0KLQkgKiAgICAgIGJvb2xlYW4sIElQcm9ncmVzc01vbml0b3IpDQotCSAqIEBzZWUgSUZpbGVVdGlscyNpc0ZpbGVEaXNwbGF5ZWRJbkRpcnR5RWRpdG9yKFN0cmluZykNCi0JICogQHNlZSBJRmlsZVV0aWxzI3NhdmVFZGl0b3IoSUNvbXBpbGF0aW9uVW5pdCwgSVByb2dyZXNzTW9uaXRvcikNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldENvbXBpbGF0aW9uVW5pdENvbnRlbnRBbmRTYXZlRGlydHlFZGl0b3JzKA0KLQkJCUlDb21waWxhdGlvblVuaXQgY1VuaXQsIFN0cmluZyBjb250ZW50LCBib29sZWFuIGZvcmNlLA0KLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9yZXNvdXJjZXMvUHJvamVjdE1hbmFnZW1lbnRVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9yZXNvdXJjZXMvUHJvamVjdE1hbmFnZW1lbnRVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4Zjg4MGEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvcmVzb3VyY2VzL1Byb2plY3RNYW5hZ2VtZW50VXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5yZXNvdXJjZXM7DQotDQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmV4Y2VwdGlvbi5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5mYWNldHMuRmFjZXRVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmZhY2V0cy5JRmFjZXRVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLnRleHQuSmF4V3NVdGlsTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLklMb2dnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLkxvZ2dlcjsNCi0NCi0NCi0vKioNCi0gKiBVdGlsaXR5IHRoYXQgcHJvdmlkZXMgdXNlZnVsIHByb2plY3QgbWFuYWdlbWVudCBzZXJ2aWNlcw0KLSAqIA0KLSAqIEBhdXRob3IgSm9lcmcgRGVobWVsDQotICogQGF1dGhvciBEYW5haWwgQnJhbmVrb3YNCi0gKi8NCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJvamVjdE1hbmFnZW1lbnRVdGlscw0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUxvZ2dlciBsb2dnZXIgPSBuZXcgTG9nZ2VyKCk7DQotCQ0KLQkvKioNCi0JICogUHJvdmlkZXMgdGhlIG1ldGEtaW5mIGZvbGRlciBvZiBhIEVKQiBwcm9qZWN0Lg0KLQkgKiANCi0JICogQHBhcmFtIHBQcm9qZWN0TmFtZQ0KLQkgKiAgICAgICAgICAgIHByb2plY3QgbmFtZQ0KLQkgKiBAcmV0dXJuIHRoZSByZXNvdXJjZSBvZiB0aGUgbWV0YS1pbmYgZm9sZGVyDQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gcHJvamVjdCBuYW1lIHNwZWNpZmllZCBpcyA8Y29kZT5udWxsPC9jb2RlPiwgZW1wdHkgc3RyaW5nLCB0aGUgcHJvamVjdCBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYWNjZXNzaWJsZSwgb3IgdGhlIHByb2plY3QNCi0JICogICAgICAgICAgICAgaXMgbm90IGFuIGVqYiBwcm9qZWN0DQotCSAqIEB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIGVpdGhlciB0aGUgcHJvamVjdCBkb2Vzbid0IGV4aXN0IGluIHRoZSB3b3Jrc3BhY2Ugb3IgaXQgZG9lc24ndCBjb250YWluIGEgbWV0YS1pbmYgZm9sZGVyDQotCSAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIGVycm9yIG9jY3VyZWQgd2hpbGUgYWNjZXNzaW5nIGphdmEgbW9kZWwNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSUZvbGRlciBmaW5kTWV0YUluZkZvbGRlcihmaW5hbCBTdHJpbmcgcFByb2plY3ROYW1lKSB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIFN0cmluZyBtZXRhSW5mTmFtZSA9ICJNRVRBLUlORiI7IC8vJE5PTi1OTFMtMSQNCi0JCWZpbmFsIFN0cmluZyBlamJNb2R1bGVOYW1lID0gImVqYk1vZHVsZSI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCWlmICghaXNFamIzUHJvamVjdChwUHJvamVjdE5hbWUpKQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlByb2plY3QgIiArIHBQcm9qZWN0TmFtZSArICIgaXMgbm90IGFuIEVKQiBwcm9qZWN0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJfQ0KLQ0KLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3RCeU5hbWUocFByb2plY3ROYW1lKTsNCi0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IGdldEphdmFQcm9qZWN0KHByb2plY3QpOw0KLQkJSVBhY2thZ2VGcmFnbWVudCBlamJNb2R1bGVQa2dGcmFnbWVudCA9IG51bGw7DQotDQotCQl0cnkNCi0JCXsNCi0JCQlmb3IgKElQYWNrYWdlRnJhZ21lbnRSb290IGZyYWdtZW50Um9vdCA6IGphdmFQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCkpDQotCQkJew0KLQkJCQlpZiAoZnJhZ21lbnRSb290LmdldEtpbmQoKSA9PSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRSAmJiBmcmFnbWVudFJvb3QuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoZWpiTW9kdWxlTmFtZSkpDQotCQkJCXsNCi0JCQkJCWVqYk1vZHVsZVBrZ0ZyYWdtZW50ID0gZnJhZ21lbnRSb290LmdldFBhY2thZ2VGcmFnbWVudChtZXRhSW5mTmFtZSk7DQotCQkJCX0NCi0JCQl9DQotDQotCQkJdmVyaWZ5TWV0YUluZkZvbGRlcihlamJNb2R1bGVQa2dGcmFnbWVudCwgcFByb2plY3ROYW1lKTsNCi0JCQlyZXR1cm4gKElGb2xkZXIpIGVqYk1vZHVsZVBrZ0ZyYWdtZW50LmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpOw0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJbG9nZ2VyLmxvZ0Vycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsNCi0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7DQotCQl9DQotCX0NCi0NCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB2ZXJpZnlNZXRhSW5mRm9sZGVyKElQYWNrYWdlRnJhZ21lbnQgZnJhZ21lbnQsIFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbg0KLQl7DQotCQlpZiAoZnJhZ21lbnQgPT0gbnVsbCkNCi0JCXsNCi0JCQlmaW5hbCBTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoInByb2plY3QgezB9IGRvZXMgbm90IGhhdmUgYSBNRVRBLUlORiBmb2xkZXIiLCBuZXcgT2JqZWN0W10geyBwcm9qZWN0TmFtZSB9KTsgLy8kTk9OLU5MUy0xJA0KLQkJCWZpbmFsIFN0cmluZyBsb2NhbGl6ZWRNc2cgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChKYXhXc1V0aWxNZXNzYWdlcy5Qcm9qZWN0TWFuYWdlbWVudFV0aWxzX1Byb2plY3RIYXNOb01ldGFJbmZGb2xkZXJNc2csIG5ldyBPYmplY3RbXSB7IHByb2plY3ROYW1lIH0pOw0KLQkJCXRocm93IG5ldyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24obXNnLCBsb2NhbGl6ZWRNc2cpOw0KLQkJfQ0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJSVJlc291cmNlIHJlc291cmNlID0gZnJhZ21lbnQuZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCk7DQotCQkJLy8gc2hvdWxkIG5vdCBoYXBwZW4hDQotCQkJaWYgKCEocmVzb3VyY2UgaW5zdGFuY2VvZiBJRm9sZGVyKSkNCi0JCQl7DQotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJSZXNvdXJjZSAiICsgcmVzb3VyY2UuZ2V0TmFtZSgpICsgIiBpcyBub3QgYSBmb2xkZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQkJfQ0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJbG9nZ2VyLmxvZ0Vycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsNCi0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIENoZWNrIHdoZXRoZXIgYSBwcm9qZWN0IGlzIGFuIGVqYiAzIHByb2plY3QNCi0JICogDQotCSAqIEBwYXJhbSBwcm9qZWN0TmFtZQ0KLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0OyBjYW5ub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4gb3IgZW1wdHkgc3RyaW5nDQotCSAqIEByZXR1cm4gdHJ1ZSBpbiBjYXNlIHRoZSBwcm9qZWN0IHNwZWNpZmllZCBpcyBhIGVqYiAzIHByb2plY3Q7IGZhbHNlIG90aGVyd2lzZQ0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIHRoZSBwcm9qZWN0IG5hbWUgc3BlY2lmaWVkIGlzIDxjb2RlPm51bGw8L2NvZGU+LCBlbXB0eSBzdHJpbmcNCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgcHJvamVjdCBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYWNjZXNzaWJsZQ0KLQkgKiBAdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiBhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBhY2Nlc3NpbmcgdGhlIHByb2plY3QgbWV0YWRhdGENCi0JICovDQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VqYjNQcm9qZWN0KGZpbmFsIFN0cmluZyBwcm9qZWN0TmFtZSkNCi0Jew0KLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3RCeU5hbWUocHJvamVjdE5hbWUpOw0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJcmV0dXJuIGZhY2V0VXRpbHMoKS5oYXNGYWNldFdpdGhWZXJzaW9uKHByb2plY3QsIElGYWNldFV0aWxzLkVKQl8zMF9GQUNFVF9WRVJTSU9OLCBJRmFjZXRVdGlscy5FSkJfMzBfRkFDRVRfSUQsIHRydWUpOw0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCWxvZ2dlci5sb2dFcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7DQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBDaGVjayB3aGV0aGVyIGEgcHJvamVjdCBpcyBhbiB3ZWIgMi41IHByb2plY3QNCi0JICogDQotCSAqIEBwYXJhbSBwcm9qZWN0TmFtZQ0KLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0OyBjYW5ub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4gb3IgZW1wdHkgc3RyaW5nDQotCSAqIEByZXR1cm4gdHJ1ZSBpbiBjYXNlIHRoZSBwcm9qZWN0IHNwZWNpZmllZCBpcyBhIHdlYiAyLjUgcHJvamVjdDsgZmFsc2Ugb3RoZXJ3aXNlDQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIHByb2plY3QgbmFtZSBzcGVjaWZpZWQgaXMgPGNvZGU+bnVsbDwvY29kZT4sIGVtcHR5IHN0cmluZw0KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIHRoZSBwcm9qZWN0IGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhY2Nlc3NpYmxlDQotCSAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIGFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGFjY2Vzc2luZyB0aGUgcHJvamVjdCBtZXRhZGF0YQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzV2ViMjVQcm9qZWN0KGZpbmFsIFN0cmluZyBwcm9qZWN0TmFtZSkNCi0Jew0KLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3RCeU5hbWUocHJvamVjdE5hbWUpOw0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJcmV0dXJuIGZhY2V0VXRpbHMoKS5oYXNGYWNldFdpdGhWZXJzaW9uKHByb2plY3QsIElGYWNldFV0aWxzLldFQl8yNV9GQUNFVF9WRVJTSU9OLCBJRmFjZXRVdGlscy5XRUJfMjVfRkFDRVRfSUQsIHRydWUpOw0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCWxvZ2dlci5sb2dFcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7DQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXRyaWV2ZSB0aGUgcHJvamVjdCBpbnN0YW5jZSBieSBwcm9qZWN0IG5hbWUNCi0JICogDQotCSAqIEBwYXJhbSBwcm9qZWN0TmFtZQ0KLQkgKiAgICAgICAgICAgIHRoZSBwcm9qZWN0IG5hbWUNCi0JICogQHJldHVybiB0aGUgcHJvamVjdCBpbnN0YW5jZQ0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIHRoZSBwcm9qZWN0IG5hbWUgc3BlY2lmaWVkIGlzIG51bGwgb3IgZW1wdHkgc3RyaW5nDQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIHByb2plY3QgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGFjY2Vzc2libGUNCi0JICogDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGdldFByb2plY3RCeU5hbWUoU3RyaW5nIHByb2plY3ROYW1lKQ0KLQl7DQotCQlpZiAocHJvamVjdE5hbWUgPT0gbnVsbCB8fCBwcm9qZWN0TmFtZS5sZW5ndGgoKSA9PSAwKQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgcHJvamVjdCBuYW1lOiAiICsgcHJvamVjdE5hbWUpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsNCi0JCWlmIChwcm9qZWN0ID09IG51bGwgfHwgIXByb2plY3QuaXNBY2Nlc3NpYmxlKCkpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUHJvamVjdCBpcyBub3QgYWNjZXNzaWJsZSIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlyZXR1cm4gcHJvamVjdDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogR2V0IHRoZSBqYXZhIHByb2plY3QgaW5zdGFuY2UNCi0JICogDQotCSAqIEBwYXJhbSBwcm9qZWN0DQotCSAqICAgICAgICAgICAgdGhlIHByb2plY3QgYXMgZWNsaXBzZSByZXNvdXJjZQ0KLQkgKiBAcmV0dXJuIHRoZSBqYXZhIHByb2plY3QgaW5zdGFuY2UNCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiA8Y29kZT5wcm9qZWN0PC9jb2RlPiBudWxsIG9yIHRoZSBwcm9qZWN0IGlzIG5vdCBhY2Nlc3NpYmxlDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KQ0KLQl7DQotCQlpZiAocHJvamVjdCA9PSBudWxsIHx8ICFwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlByb2plY3QgaXMgbm90IGFjY2Vzc2libGUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJcmV0dXJuIEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFJlZnJlc2ggdGhlIHJlc291cmNlIHNwZWNpZmllZC4gUmVmcmVzaCBkZXB0aCB1c2VkIGlzIHplcm8NCi0JICogQHBhcmFtIHJlc291cmNlIHRoZSByZXNvdXJjZSB0byBiZSByZWZyZXNoZWQNCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIA0KLQkgKiBAc2VlIElSZXNvdXJjZSNERVBUSF9aRVJPDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaFJlc291cmNlKElSZXNvdXJjZSByZXNvdXJjZSkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJaWYocmVzb3VyY2UgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInJlc291cmNlIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCQ0KLQkJcmVzb3VyY2UucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9aRVJPLCBudWxsKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmVmcmVzaGVzIHRoZSBwcm9qZWN0IHRoZSByZXNvdXJjZSBzcGVjaWZpZWQgYmVsb25ncyB0by4gUmVmcmVzaCBkZXB0aCB1c2VkIGlzIGluZmluaXRlLg0KLQkgKiBAcGFyYW0gdGhlIHJlc291cmNlIHdoaWNoIHByb2plY3QgaXMgdG8gYmUgcmVmcmVzaGVkDQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiANCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2hlbiB0aGUgcmVzb3VyY2Ugc3BlY2lmaWVkIGlzIGEgd29ya3NwYWNlIHJvb3QNCi0JICogQHNlZSBJUmVzb3VyY2UjREVQVEhfSU5GSU5JVEUNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoUHJvamVjdEJ5UmVzb3VyY2UoSVJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlpZihyZXNvdXJjZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicmVzb3VyY2UiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJDQotCQlpZihyZXNvdXJjZSBpbnN0YW5jZW9mIElXb3Jrc3BhY2VSb290KQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk9wZXJhdGlvbiBpcyBub3QgZGVmaW5lZCBmb3Igd29ya3NwYWNlIHJvb3RzIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCQ0KLQkJcmVzb3VyY2UuZ2V0UHJvamVjdCgpLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG51bGwpOw0KLQl9DQotCQ0KLQlwcml2YXRlIHN0YXRpYyBJRmFjZXRVdGlscyBmYWNldFV0aWxzKCkNCi0Jew0KLQkJcmV0dXJuIG5ldyBGYWNldFV0aWxzKCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9yZXNvdXJjZXMvU3RyaW5nSW5wdXRTdHJlYW1BZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Jlc291cmNlcy9TdHJpbmdJbnB1dFN0cmVhbUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzBjOTYyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Jlc291cmNlcy9TdHJpbmdJbnB1dFN0cmVhbUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnJlc291cmNlczsNCi0NCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7DQotDQotLyoqDQotICogQWRhcHRlciBjbGFzcyB0aGF0IHVzZXMgYSBTdHJpbmdSZWFkZXIgdG8gb3JnYW5pemUgYW4gSW5wdXRTdHJlYW0NCi0gKiANCi0gKiBAYXV0aG9yIERhbmFpbCBCcmFuZWtvdg0KLSAqIA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTdHJpbmdJbnB1dFN0cmVhbUFkYXB0ZXIgZXh0ZW5kcyBJbnB1dFN0cmVhbQ0KLXsNCi0JcHJpdmF0ZSBTdHJpbmdSZWFkZXIgcmVhZGVyOw0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3INCi0JICogDQotCSAqIEBwYXJhbSBzdHJpbmcNCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIDxjb2RlPnN0cmluZzwvY29kZT4gaXMgbnVsbA0KLQkgKi8NCi0JcHVibGljIFN0cmluZ0lucHV0U3RyZWFtQWRhcHRlcihTdHJpbmcgc3RyaW5nKQ0KLQl7DQotCQlpZiAoc3RyaW5nID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJzdHJpbmciKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJcmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlcihzdHJpbmcpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24NCi0Jew0KLQkJcmV0dXJuIHJlYWRlci5yZWFkKCk7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi8ucHJvamVjdCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MjhjODguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMGRjYWUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3Y7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvYWJvdXQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk0ODNlNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+QXByaWwgOSwgMjAxMDwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvYm9vay5jc3MgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L2Jvb2suY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGQ4ODgwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvYm9vay5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1AaW1wb3J0ICIuLi9QUk9EVUNUX1BMVUdJTi9ib29rLmNzcyI7CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L2J1aWxkLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMzA1NWMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UvLFwKLSAgICAgICAgICAgICAgIHRvcGljc19hcGlfcmVmZXJlbmNlLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBib29rLmNzcyxcCi0gICAgICAgICAgICAgICB0b3BpY3NfZXh0ZW5zaW9uX3BvaW50c19yZWZlcmVuY2UueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgc2NoZW1hLmNzcwpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9wbHVnaW4ucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZDc1OGIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwIFNoYW5lIENsYXJrZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9SkFYLVdTIFRvb2xzIERldmVsb3BlciBHdWlkZQotcGx1Z2luUHJvdmlkZXI9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVkNzM2Yi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuNCI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPgotICAgICAgPHRvYyBmaWxlPSJ0b3BpY3NfYXBpX3JlZmVyZW5jZS54bWwiLz4KLSAgICAgIDx0b2MgZmlsZT0idG9waWNzX2V4dGVuc2lvbl9wb2ludHNfcmVmZXJlbmNlLnhtbCIvPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLmphdmFkb2MiPgotICAgICAgIDxqYXZhZG9jIHBhdGg9InJlZmVyZW5jZS9hcGkiPgotICAgICAgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSIvPgotICAgICAgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZSIvPgotICAgICAgIDwvamF2YWRvYz4KLSAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvYWxsY2xhc3Nlcy1mcmFtZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2FsbGNsYXNzZXMtZnJhbWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMwNDZkNC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvYWxsY2xhc3Nlcy1mcmFtZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjQ2OjIzIEJTVCAyMDEwIC0tPgotPFRJVExFPgotQWxsIENsYXNzZXMKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTAtMDQtMDciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0ic3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSI+Ci08Rk9OVCBzaXplPSIrMSIgQ0xBU1M9IkZyYW1lSGVhZGluZ0ZvbnQiPgotPEI+QWxsIENsYXNzZXM8L0I+PC9GT05UPgotPEJSPgotCi08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBOT1dSQVA+PEZPTlQgQ0xBU1M9IkZyYW1lSXRlbUZvbnQiPjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3NvciIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I8L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPkFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25EZWZpbml0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5Bbm5vdGF0aW9uRGVmaW5pdGlvbjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiIHRhcmdldD0iY2xhc3NGcmFtZSI+QW5ub3RhdGlvbnNDb3JlPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5Bbm5vdGF0aW9uc0NvcmVQbHVnaW48L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc01hbmFnZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPkFubm90YXRpb25zTWFuYWdlcjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMiIHRhcmdldD0iY2xhc3NGcmFtZSI+QW5ub3RhdGlvblV0aWxzPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vRGVmYXVsdHNBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPkRlZmF1bHRzQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjxJPklBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvSkRUVXRpbHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPkpEVFV0aWxzPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvV1NETFV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscyIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5XU0RMVXRpbHM8L0E+Ci08QlI+Ci08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZjdlYTIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjQ2OjIzIEJTVCAyMDEwIC0tPgotPFRJVExFPgotQWxsIENsYXNzZXMKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTAtMDQtMDciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0ic3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSI+Ci08Rk9OVCBzaXplPSIrMSIgQ0xBU1M9IkZyYW1lSGVhZGluZ0ZvbnQiPgotPEI+QWxsIENsYXNzZXM8L0I+PC9GT05UPgotPEJSPgotCi08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBOT1dSQVA+PEZPTlQgQ0xBU1M9IkZyYW1lSXRlbUZvbnQiPjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3NvciI+QWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbiI+QW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj5Bbm5vdGF0aW9uRGVmaW5pdGlvbjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPkFubm90YXRpb25zQ29yZTwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZVBsdWdpbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPkFubm90YXRpb25zQ29yZVBsdWdpbjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zTWFuYWdlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPkFubm90YXRpb25zTWFuYWdlcjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMiPkFubm90YXRpb25VdGlsczwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0RlZmF1bHRzQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbiI+RGVmYXVsdHNBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI8L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24iPjxJPklBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvSkRUVXRpbHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzIj5KRFRVdGlsczwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL1dTRExVdGlscy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMiPldTRExVdGlsczwvQT4KLTxCUj4KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9jb25zdGFudC12YWx1ZXMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9jb25zdGFudC12YWx1ZXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYyYjI2Zi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvY29uc3RhbnQtdmFsdWVzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjQ2OjIyIEJTVCAyMDEwIC0tPgotPFRJVExFPgotQ29uc3RhbnQgRmllbGQgVmFsdWVzCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDEwLTA0LTA3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9InN0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iQ29uc3RhbnQgRmllbGQgVmFsdWVzIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Im92ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImRlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImhlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iaW5kZXguaHRtbD9jb25zdGFudC12YWx1ZXMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJjb25zdGFudC12YWx1ZXMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSJhbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgxPgotQ29uc3RhbnQgRmllbGQgVmFsdWVzPC9IMT4KLTwvQ0VOVEVSPgotPEhSIFNJWkU9IjQiIE5PU0hBREU+Ci08Qj5Db250ZW50czwvQj48VUw+Ci08TEk+PEEgSFJFRj0iI29yZy5lY2xpcHNlIj5vcmcuZWNsaXBzZS4qPC9BPgotPC9VTD4KLQotPEEgTkFNRT0ib3JnLmVjbGlwc2UiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Rk9OVCBTSVpFPSIrMiI+Ci1vcmcuZWNsaXBzZS4qPC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIzIj5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmVQbHVnaW4uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj5Bbm5vdGF0aW9uc0NvcmVQbHVnaW48L0E+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZVBsdWdpbi5QTFVHSU5fSUQiPjwhLS0gLS0+PC9BPjxURCBBTElHTj0icmlnaHQiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnB1YmxpYyZuYnNwO3N0YXRpYyZuYnNwO2ZpbmFsJm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURCBBTElHTj0ibGVmdCI+PENPREU+PEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmh0bWwjUExVR0lOX0lEIj5QTFVHSU5fSUQ8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4ib3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLQotPFA+Ci0KLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMyI+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24uPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbiI+QW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9BPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbi5Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuTUlTU0lOR19JREVOVElGRVIiPjwhLS0gLS0+PC9BPjxURCBBTElHTj0icmlnaHQiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnByb3RlY3RlZCZuYnNwO3N0YXRpYyZuYnNwO2ZpbmFsJm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURCBBTElHTj0ibGVmdCI+PENPREU+PEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwjTUlTU0lOR19JREVOVElGRVIiPk1JU1NJTkdfSURFTlRJRkVSPC9BPjwvQ09ERT48L1REPgotPFREIEFMSUdOPSJyaWdodCI+PENPREU+IiRtaXNzaW5nJCI8L0NPREU+PC9URD4KLTwvVFI+Ci08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotCi08UD4KLQotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIzIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9XU0RMVXRpbHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzIj5XU0RMVXRpbHM8L0E+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLldTRExVdGlscy5XU0RMX0ZJTEVfRVhURU5TSU9OIj48IS0tIC0tPjwvQT48VEQgQUxJR049InJpZ2h0Ij48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wdWJsaWMmbmJzcDtzdGF0aWMmbmJzcDtmaW5hbCZuYnNwO2phdmEubGFuZy5TdHJpbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQgQUxJR049ImxlZnQiPjxDT0RFPjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL1dTRExVdGlscy5odG1sI1dTRExfRklMRV9FWFRFTlNJT04iPldTRExfRklMRV9FWFRFTlNJT048L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4iLndzZGwiPC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLQotPFA+Ci0KLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Im92ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImRlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImhlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iaW5kZXguaHRtbD9jb25zdGFudC12YWx1ZXMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJjb25zdGFudC12YWx1ZXMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSJhbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9kZXByZWNhdGVkLWxpc3QuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9kZXByZWNhdGVkLWxpc3QuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNjYmQ3MC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvZGVwcmVjYXRlZC1saXN0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjQ2OjIzIEJTVCAyMDEwIC0tPgotPFRJVExFPgotRGVwcmVjYXRlZCBMaXN0Ci08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDEwLTA0LTA3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9InN0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iRGVwcmVjYXRlZCBMaXN0IjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Im92ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImluZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJoZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9ImluZGV4Lmh0bWw/ZGVwcmVjYXRlZC1saXN0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iZGVwcmVjYXRlZC1saXN0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPkRlcHJlY2F0ZWQgQVBJPC9CPjwvSDI+Ci08L0NFTlRFUj4KLTxIUiBTSVpFPSI0IiBOT1NIQURFPgotPEI+Q29udGVudHM8L0I+PFVMPgotPC9VTD4KLQotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Im92ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImluZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJoZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9ImluZGV4Lmh0bWw/ZGVwcmVjYXRlZC1saXN0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iZGVwcmVjYXRlZC1saXN0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvaGVscC1kb2MuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9oZWxwLWRvYy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzQ3NWRkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9oZWxwLWRvYy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8xNCkgb24gV2VkIEFwciAwNyAwNzo0NjoyMyBCU1QgMjAxMCAtLT4KLTxUSVRMRT4KLUFQSSBIZWxwCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDEwLTA0LTA3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9InN0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iQVBJIEhlbHAiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJvdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0ib3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJpbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5IZWxwPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9ImluZGV4Lmh0bWw/aGVscC1kb2MuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJoZWxwLWRvYy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSJhbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDE+Ci1Ib3cgVGhpcyBBUEkgRG9jdW1lbnQgSXMgT3JnYW5pemVkPC9IMT4KLTwvQ0VOVEVSPgotVGhpcyBBUEkgKEFwcGxpY2F0aW9uIFByb2dyYW1taW5nIEludGVyZmFjZSkgZG9jdW1lbnQgaGFzIHBhZ2VzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGl0ZW1zIGluIHRoZSBuYXZpZ2F0aW9uIGJhciwgZGVzY3JpYmVkIGFzIGZvbGxvd3MuPEgzPgotT3ZlcnZpZXc8L0gzPgotPEJMT0NLUVVPVEU+Ci0KLTxQPgotVGhlIDxBIEhSRUY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+T3ZlcnZpZXc8L0E+IHBhZ2UgaXMgdGhlIGZyb250IHBhZ2Ugb2YgdGhpcyBBUEkgZG9jdW1lbnQgYW5kIHByb3ZpZGVzIGEgbGlzdCBvZiBhbGwgcGFja2FnZXMgd2l0aCBhIHN1bW1hcnkgZm9yIGVhY2guICBUaGlzIHBhZ2UgY2FuIGFsc28gY29udGFpbiBhbiBvdmVyYWxsIGRlc2NyaXB0aW9uIG9mIHRoZSBzZXQgb2YgcGFja2FnZXMuPC9CTE9DS1FVT1RFPgotPEgzPgotUGFja2FnZTwvSDM+Ci08QkxPQ0tRVU9URT4KLQotPFA+Ci1FYWNoIHBhY2thZ2UgaGFzIGEgcGFnZSB0aGF0IGNvbnRhaW5zIGEgbGlzdCBvZiBpdHMgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcywgd2l0aCBhIHN1bW1hcnkgZm9yIGVhY2guIFRoaXMgcGFnZSBjYW4gY29udGFpbiBmb3VyIGNhdGVnb3JpZXM6PFVMPgotPExJPkludGVyZmFjZXMgKGl0YWxpYyk8TEk+Q2xhc3NlczxMST5FbnVtczxMST5FeGNlcHRpb25zPExJPkVycm9yczxMST5Bbm5vdGF0aW9uIFR5cGVzPC9VTD4KLTwvQkxPQ0tRVU9URT4KLTxIMz4KLUNsYXNzL0ludGVyZmFjZTwvSDM+Ci08QkxPQ0tRVU9URT4KLQotPFA+Ci1FYWNoIGNsYXNzLCBpbnRlcmZhY2UsIG5lc3RlZCBjbGFzcyBhbmQgbmVzdGVkIGludGVyZmFjZSBoYXMgaXRzIG93biBzZXBhcmF0ZSBwYWdlLiBFYWNoIG9mIHRoZXNlIHBhZ2VzIGhhcyB0aHJlZSBzZWN0aW9ucyBjb25zaXN0aW5nIG9mIGEgY2xhc3MvaW50ZXJmYWNlIGRlc2NyaXB0aW9uLCBzdW1tYXJ5IHRhYmxlcywgYW5kIGRldGFpbGVkIG1lbWJlciBkZXNjcmlwdGlvbnM6PFVMPgotPExJPkNsYXNzIGluaGVyaXRhbmNlIGRpYWdyYW08TEk+RGlyZWN0IFN1YmNsYXNzZXM8TEk+QWxsIEtub3duIFN1YmludGVyZmFjZXM8TEk+QWxsIEtub3duIEltcGxlbWVudGluZyBDbGFzc2VzPExJPkNsYXNzL2ludGVyZmFjZSBkZWNsYXJhdGlvbjxMST5DbGFzcy9pbnRlcmZhY2UgZGVzY3JpcHRpb24KLTxQPgotPExJPk5lc3RlZCBDbGFzcyBTdW1tYXJ5PExJPkZpZWxkIFN1bW1hcnk8TEk+Q29uc3RydWN0b3IgU3VtbWFyeTxMST5NZXRob2QgU3VtbWFyeQotPFA+Ci08TEk+RmllbGQgRGV0YWlsPExJPkNvbnN0cnVjdG9yIERldGFpbDxMST5NZXRob2QgRGV0YWlsPC9VTD4KLUVhY2ggc3VtbWFyeSBlbnRyeSBjb250YWlucyB0aGUgZmlyc3Qgc2VudGVuY2UgZnJvbSB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gZm9yIHRoYXQgaXRlbS4gVGhlIHN1bW1hcnkgZW50cmllcyBhcmUgYWxwaGFiZXRpY2FsLCB3aGlsZSB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb25zIGFyZSBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gdGhlIHNvdXJjZSBjb2RlLiBUaGlzIHByZXNlcnZlcyB0aGUgbG9naWNhbCBncm91cGluZ3MgZXN0YWJsaXNoZWQgYnkgdGhlIHByb2dyYW1tZXIuPC9CTE9DS1FVT1RFPgotPC9CTE9DS1FVT1RFPgotPEgzPgotQW5ub3RhdGlvbiBUeXBlPC9IMz4KLTxCTE9DS1FVT1RFPgotCi08UD4KLUVhY2ggYW5ub3RhdGlvbiB0eXBlIGhhcyBpdHMgb3duIHNlcGFyYXRlIHBhZ2Ugd2l0aCB0aGUgZm9sbG93aW5nIHNlY3Rpb25zOjxVTD4KLTxMST5Bbm5vdGF0aW9uIFR5cGUgZGVjbGFyYXRpb248TEk+QW5ub3RhdGlvbiBUeXBlIGRlc2NyaXB0aW9uPExJPlJlcXVpcmVkIEVsZW1lbnQgU3VtbWFyeTxMST5PcHRpb25hbCBFbGVtZW50IFN1bW1hcnk8TEk+RWxlbWVudCBEZXRhaWw8L1VMPgotPC9CTE9DS1FVT1RFPgotPC9CTE9DS1FVT1RFPgotPEgzPgotRW51bTwvSDM+Ci08QkxPQ0tRVU9URT4KLQotPFA+Ci1FYWNoIGVudW0gaGFzIGl0cyBvd24gc2VwYXJhdGUgcGFnZSB3aXRoIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnM6PFVMPgotPExJPkVudW0gZGVjbGFyYXRpb248TEk+RW51bSBkZXNjcmlwdGlvbjxMST5FbnVtIENvbnN0YW50IFN1bW1hcnk8TEk+RW51bSBDb25zdGFudCBEZXRhaWw8L1VMPgotPC9CTE9DS1FVT1RFPgotPEgzPgotVXNlPC9IMz4KLTxCTE9DS1FVT1RFPgotRWFjaCBkb2N1bWVudGVkIHBhY2thZ2UsIGNsYXNzIGFuZCBpbnRlcmZhY2UgaGFzIGl0cyBvd24gVXNlIHBhZ2UuICBUaGlzIHBhZ2UgZGVzY3JpYmVzIHdoYXQgcGFja2FnZXMsIGNsYXNzZXMsIG1ldGhvZHMsIGNvbnN0cnVjdG9ycyBhbmQgZmllbGRzIHVzZSBhbnkgcGFydCBvZiB0aGUgZ2l2ZW4gY2xhc3Mgb3IgcGFja2FnZS4gR2l2ZW4gYSBjbGFzcyBvciBpbnRlcmZhY2UgQSwgaXRzIFVzZSBwYWdlIGluY2x1ZGVzIHN1YmNsYXNzZXMgb2YgQSwgZmllbGRzIGRlY2xhcmVkIGFzIEEsIG1ldGhvZHMgdGhhdCByZXR1cm4gQSwgYW5kIG1ldGhvZHMgYW5kIGNvbnN0cnVjdG9ycyB3aXRoIHBhcmFtZXRlcnMgb2YgdHlwZSBBLiAgWW91IGNhbiBhY2Nlc3MgdGhpcyBwYWdlIGJ5IGZpcnN0IGdvaW5nIHRvIHRoZSBwYWNrYWdlLCBjbGFzcyBvciBpbnRlcmZhY2UsIHRoZW4gY2xpY2tpbmcgb24gdGhlICJVc2UiIGxpbmsgaW4gdGhlIG5hdmlnYXRpb24gYmFyLjwvQkxPQ0tRVU9URT4KLTxIMz4KLVRyZWUgKENsYXNzIEhpZXJhcmNoeSk8L0gzPgotPEJMT0NLUVVPVEU+Ci1UaGVyZSBpcyBhIDxBIEhSRUY9Im92ZXJ2aWV3LXRyZWUuaHRtbCI+Q2xhc3MgSGllcmFyY2h5PC9BPiBwYWdlIGZvciBhbGwgcGFja2FnZXMsIHBsdXMgYSBoaWVyYXJjaHkgZm9yIGVhY2ggcGFja2FnZS4gRWFjaCBoaWVyYXJjaHkgcGFnZSBjb250YWlucyBhIGxpc3Qgb2YgY2xhc3NlcyBhbmQgYSBsaXN0IG9mIGludGVyZmFjZXMuIFRoZSBjbGFzc2VzIGFyZSBvcmdhbml6ZWQgYnkgaW5oZXJpdGFuY2Ugc3RydWN0dXJlIHN0YXJ0aW5nIHdpdGggPGNvZGU+amF2YS5sYW5nLk9iamVjdDwvY29kZT4uIFRoZSBpbnRlcmZhY2VzIGRvIG5vdCBpbmhlcml0IGZyb20gPGNvZGU+amF2YS5sYW5nLk9iamVjdDwvY29kZT4uPFVMPgotPExJPldoZW4gdmlld2luZyB0aGUgT3ZlcnZpZXcgcGFnZSwgY2xpY2tpbmcgb24gIlRyZWUiIGRpc3BsYXlzIHRoZSBoaWVyYXJjaHkgZm9yIGFsbCBwYWNrYWdlcy48TEk+V2hlbiB2aWV3aW5nIGEgcGFydGljdWxhciBwYWNrYWdlLCBjbGFzcyBvciBpbnRlcmZhY2UgcGFnZSwgY2xpY2tpbmcgIlRyZWUiIGRpc3BsYXlzIHRoZSBoaWVyYXJjaHkgZm9yIG9ubHkgdGhhdCBwYWNrYWdlLjwvVUw+Ci08L0JMT0NLUVVPVEU+Ci08SDM+Ci1EZXByZWNhdGVkIEFQSTwvSDM+Ci08QkxPQ0tRVU9URT4KLVRoZSA8QSBIUkVGPSJkZXByZWNhdGVkLWxpc3QuaHRtbCI+RGVwcmVjYXRlZCBBUEk8L0E+IHBhZ2UgbGlzdHMgYWxsIG9mIHRoZSBBUEkgdGhhdCBoYXZlIGJlZW4gZGVwcmVjYXRlZC4gQSBkZXByZWNhdGVkIEFQSSBpcyBub3QgcmVjb21tZW5kZWQgZm9yIHVzZSwgZ2VuZXJhbGx5IGR1ZSB0byBpbXByb3ZlbWVudHMsIGFuZCBhIHJlcGxhY2VtZW50IEFQSSBpcyB1c3VhbGx5IGdpdmVuLiBEZXByZWNhdGVkIEFQSXMgbWF5IGJlIHJlbW92ZWQgaW4gZnV0dXJlIGltcGxlbWVudGF0aW9ucy48L0JMT0NLUVVPVEU+Ci08SDM+Ci1JbmRleDwvSDM+Ci08QkxPQ0tRVU9URT4KLVRoZSA8QSBIUkVGPSJpbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPkluZGV4PC9BPiBjb250YWlucyBhbiBhbHBoYWJldGljIGxpc3Qgb2YgYWxsIGNsYXNzZXMsIGludGVyZmFjZXMsIGNvbnN0cnVjdG9ycywgbWV0aG9kcywgYW5kIGZpZWxkcy48L0JMT0NLUVVPVEU+Ci08SDM+Ci1QcmV2L05leHQ8L0gzPgotVGhlc2UgbGlua3MgdGFrZSB5b3UgdG8gdGhlIG5leHQgb3IgcHJldmlvdXMgY2xhc3MsIGludGVyZmFjZSwgcGFja2FnZSwgb3IgcmVsYXRlZCBwYWdlLjxIMz4KLUZyYW1lcy9ObyBGcmFtZXM8L0gzPgotVGhlc2UgbGlua3Mgc2hvdyBhbmQgaGlkZSB0aGUgSFRNTCBmcmFtZXMuICBBbGwgcGFnZXMgYXJlIGF2YWlsYWJsZSB3aXRoIG9yIHdpdGhvdXQgZnJhbWVzLgotPFA+Ci08SDM+Ci1TZXJpYWxpemVkIEZvcm08L0gzPgotRWFjaCBzZXJpYWxpemFibGUgb3IgZXh0ZXJuYWxpemFibGUgY2xhc3MgaGFzIGEgZGVzY3JpcHRpb24gb2YgaXRzIHNlcmlhbGl6YXRpb24gZmllbGRzIGFuZCBtZXRob2RzLiBUaGlzIGluZm9ybWF0aW9uIGlzIG9mIGludGVyZXN0IHRvIHJlLWltcGxlbWVudG9ycywgbm90IHRvIGRldmVsb3BlcnMgdXNpbmcgdGhlIEFQSS4gV2hpbGUgdGhlcmUgaXMgbm8gbGluayBpbiB0aGUgbmF2aWdhdGlvbiBiYXIsIHlvdSBjYW4gZ2V0IHRvIHRoaXMgaW5mb3JtYXRpb24gYnkgZ29pbmcgdG8gYW55IHNlcmlhbGl6ZWQgY2xhc3MgYW5kIGNsaWNraW5nICJTZXJpYWxpemVkIEZvcm0iIGluIHRoZSAiU2VlIGFsc28iIHNlY3Rpb24gb2YgdGhlIGNsYXNzIGRlc2NyaXB0aW9uLgotPFA+Ci08SDM+Ci1Db25zdGFudCBGaWVsZCBWYWx1ZXM8L0gzPgotVGhlIDxhIGhyZWY9ImNvbnN0YW50LXZhbHVlcy5odG1sIj5Db25zdGFudCBGaWVsZCBWYWx1ZXM8L2E+IHBhZ2UgbGlzdHMgdGhlIHN0YXRpYyBmaW5hbCBmaWVsZHMgYW5kIHRoZWlyIHZhbHVlcy4KLTxQPgotPEZPTlQgU0laRT0iLTEiPgotPEVNPgotVGhpcyBoZWxwIGZpbGUgYXBwbGllcyB0byBBUEkgZG9jdW1lbnRhdGlvbiBnZW5lcmF0ZWQgdXNpbmcgdGhlIHN0YW5kYXJkIGRvY2xldC48L0VNPgotPC9GT05UPgotPEJSPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Im92ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImRlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SGVscDwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSJpbmRleC5odG1sP2hlbHAtZG9jLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaGVscC1kb2MuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSJhbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmY2YjBlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjQ2OjIzIEJTVCAyMDEwIC0tPgotPFRJVExFPgotQS1JbmRleAotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMC0wNC0wNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IkEtSW5kZXgiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWIExFVFRFUiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMi5odG1sIj48Qj5ORVhUIExFVFRFUjwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi9pbmRleC5odG1sP2luZGV4LWZpbGVzaW5kZXgtMS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTEuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5EPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+RjwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5HPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPkk8L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+SjwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5NPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5QPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5VPC9BPiA8QSBIUkVGPSJpbmRleC0xNi5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNy5odG1sIj5XPC9BPiA8SFI+Ci08QSBOQU1FPSJfQV8iPjwhLS0gLS0+PC9BPjxIMj4KLTxCPkE8L0I+PC9IMj4KLTxETD4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IiPjxCPkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcjwvQj48L0E+IC0gQ2xhc3MgaW4gPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3I8L0E+PEREPkFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHByb2Nlc3NvcnMgY29udHJpYnV0ZWQgdG8gdGhlCi0gPGNvZGU+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvblByb2Nlc3NvcjwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LjxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yLmh0bWwjQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yKCkiPjxCPkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcigpPC9CPjwvQT4gLSAKLUNvbnN0cnVjdG9yIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL0Fic3RyYWN0QW5ub3RhdGlvblByb2Nlc3Nvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yIj5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I8L0E+Ci08REQ+Jm5ic3A7Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwjYWRkQW5ub3RhdGlvbihvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uKSI+PEI+YWRkQW5ub3RhdGlvbihJSmF2YUVsZW1lbnQsIEFubm90YXRpb24pPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscyI+QW5ub3RhdGlvblV0aWxzPC9BPgotPEREPkFkZHMgdGhlIGdpdmVuIDxDT0RFPkFubm90YXRpb248L0NPREU+IHRvIHRoZSA8Q09ERT5JSmF2YUVsZW1lbnQ8L0NPREU+LgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sI2FkZEltcG9ydChvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQsIGphdmEubGFuZy5TdHJpbmcpIj48Qj5hZGRJbXBvcnQoSUphdmFFbGVtZW50LCBTdHJpbmcpPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscyI+QW5ub3RhdGlvblV0aWxzPC9BPgotPEREPkFkZHMgYW4gaW1wb3J0IHRvIHRoZSBjb21waWxhdGlvbiB1bml0IG9mIHRoZSBnaXZlbiA8Q09ERT5JSmF2YUVsZW1lbnQ8L0NPREU+LgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sI2FkZE1lbWJlclZhbHVlUGFpcihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbiwgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcikiPjxCPmFkZE1lbWJlclZhbHVlUGFpcihOb3JtYWxBbm5vdGF0aW9uLCBNZW1iZXJWYWx1ZVBhaXIpPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscyI+QW5ub3RhdGlvblV0aWxzPC9BPgotPEREPkFkZHMgdGhlIDxDT0RFPk1lbWJlclZhbHVlUGFpcjwvQ09ERT4gdG8gdGhlIDxDT0RFPk5vcm1hbEFubm90YXRpb248L0NPREU+LgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL0pEVFV0aWxzLmh0bWwjYWRkVG9DbGFzc3BhdGgob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0LCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnkpIj48Qj5hZGRUb0NsYXNzcGF0aChJSmF2YVByb2plY3QsIElDbGFzc3BhdGhFbnRyeSk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9KRFRVdGlscy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMiPkpEVFV0aWxzPC9BPgotPEREPkFkZCBhIDxjb2RlPklDbGFzc3BhdGhFbnRyeTwvY29kZT4gdG8gYSA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbiI+PEI+QW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9CPjwvQT4gLSBDbGFzcyBpbiA8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb248L0E+PEREPkFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGluaXRpYWxpemVycyBjb250cmlidXRlZCB0byB0aGUKLSA8Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uSW5pdGlhbGl6ZXI8L2NvZGU+IGV4dGVuc2lvbiBwb2ludC48RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwjQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyKCkiPjxCPkFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcigpPC9CPjwvQT4gLSAKLUNvbnN0cnVjdG9yIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbi48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uIj5Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI8L0E+Ci08REQ+Jm5ic3A7Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj48Qj5Bbm5vdGF0aW9uRGVmaW5pdGlvbjwvQj48L0E+IC0gQ2xhc3MgaW4gPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlPC9BPjxERD5BbiA8Y29kZT5Bbm5vdGF0aW9uRGVmaW5pdGlvbjwvY29kZT4gaXMgYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5mb3JtYXRpb24gY29udHJpYnV0ZWQgdGhyb3VnaCB0aGUKLSA8Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uRGVmaW5pdGlvbjwvY29kZT4sCi0gPGNvZGU+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkNhdGVnb3J5PC9jb2RlPiBhbmQKLSA8Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uSW5pdGlhbGl6ZXI8L2NvZGU+IGV4dGVuc2lvbiBwb2ludHMuPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25EZWZpbml0aW9uLmh0bWwjQW5ub3RhdGlvbkRlZmluaXRpb24ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCwgamF2YS5sYW5nLlN0cmluZykiPjxCPkFubm90YXRpb25EZWZpbml0aW9uKElDb25maWd1cmF0aW9uRWxlbWVudCwgU3RyaW5nKTwvQj48L0E+IC0gCi1Db25zdHJ1Y3RvciBmb3IgY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj5Bbm5vdGF0aW9uRGVmaW5pdGlvbjwvQT4KLTxERD5Db25zdHJ1Y3RzIGFuIDxjb2RlPkFubm90YXRpb25EZWZpbml0aW9uPC9jb2RlPiB1c2luZyBpbmZvcm1hdGlvbiBmcm9tIHRoZQotIDxjb2RlPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25EZWZpbml0aW9uPC9jb2RlPiBleHRlbnNpb24gcG9pbnQgYW5kIGNhdGVnb3J5IG5hbWUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSI+PEI+QW5ub3RhdGlvbnNDb3JlPC9CPjwvQT4gLSBDbGFzcyBpbiA8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmU8L0E+PEREPlV0aWxpdHkgY2xhc3MgZm9yIGNyZWF0aW5nIGFubm90YXRpb25zIGFuZCBtZW1iZXIgdmFsdWUgcGFpcnMuPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZVBsdWdpbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPjxCPkFubm90YXRpb25zQ29yZVBsdWdpbjwvQj48L0E+IC0gQ2xhc3MgaW4gPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlPC9BPjxERD4KLSA8c3Ryb25nPlByb3Zpc2lvbmFsIEFQSTo8L3N0cm9uZz4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIAotIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LjxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmVQbHVnaW4uaHRtbCNBbm5vdGF0aW9uc0NvcmVQbHVnaW4oKSI+PEI+QW5ub3RhdGlvbnNDb3JlUGx1Z2luKCk8L0I+PC9BPiAtIAotQ29uc3RydWN0b3IgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZVBsdWdpbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPkFubm90YXRpb25zQ29yZVBsdWdpbjwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc01hbmFnZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj48Qj5Bbm5vdGF0aW9uc01hbmFnZXI8L0I+PC9BPiAtIENsYXNzIGluIDxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZTwvQT48REQ+TWFuYWdlcyB0aGUgYW5ub3RhdGlvbiBjYXRlZ29yaWVzLCBkZWZpbml0aW9ucywgcHJvY2Vzc29ycyBhbmQgaW5pdGlhbGl6ZXJzIGNvbnRyaWJ1dGVkIHRocm91Z2ggdGhlCi0gPGNvZGU+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkRlZmluaXRpb248L2NvZGU+LAotIDxjb2RlPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25DYXRlZ29yeTwvY29kZT4sCi0gPGNvZGU+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkluaXRpYWxpemVyPC9jb2RlPiBhbmQKLSA8Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uUHJvY2Vzc29yPC9jb2RlPiBleHRlbnNpb24gcG9pbnRzLjxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzIj48Qj5Bbm5vdGF0aW9uVXRpbHM8L0I+PC9BPiAtIENsYXNzIGluIDxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlsczwvQT48REQ+VXRpbGl0eSBjbGFzcyBmb3IgYWRkaW5nLCByZW1vdmluZyBhbmQgdXBkYXRpbmcgYW5ub3RhdGlvbnMgYW5kIG1lbWJlciB2YWx1ZSBwYWlycy48L0RMPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5JbmRleDwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViBMRVRURVImbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTIuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTEuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEEgSFJFRj0iaW5kZXgtMS5odG1sIj5BPC9BPiA8QSBIUkVGPSJpbmRleC0yLmh0bWwiPkM8L0E+IDxBIEhSRUY9ImluZGV4LTMuaHRtbCI+RDwvQT4gPEEgSFJFRj0iaW5kZXgtNC5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC01Lmh0bWwiPkY8L0E+IDxBIEhSRUY9ImluZGV4LTYuaHRtbCI+RzwvQT4gPEEgSFJFRj0iaW5kZXgtNy5odG1sIj5JPC9BPiA8QSBIUkVGPSJpbmRleC04Lmh0bWwiPko8L0E+IDxBIEhSRUY9ImluZGV4LTkuaHRtbCI+TDwvQT4gPEEgSFJFRj0iaW5kZXgtMTAuaHRtbCI+TTwvQT4gPEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+UDwvQT4gPEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+UjwvQT4gPEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+UzwvQT4gPEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+VTwvQT4gPEEgSFJFRj0iaW5kZXgtMTYuaHRtbCI+VjwvQT4gPEEgSFJFRj0iaW5kZXgtMTcuaHRtbCI+VzwvQT4gPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvaW5kZXgtZmlsZXMvaW5kZXgtMTAuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9pbmRleC1maWxlcy9pbmRleC0xMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjE3ZGIzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9pbmRleC1maWxlcy9pbmRleC0xMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8xNCkgb24gV2VkIEFwciAwNyAwNzo0NjoyMyBCU1QgMjAxMCAtLT4KLTxUSVRMRT4KLU0tSW5kZXgKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTAtMDQtMDciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJNLUluZGV4IjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5JbmRleDwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtOS5odG1sIj48Qj5QUkVWIExFVFRFUjwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xMS5odG1sIj48Qj5ORVhUIExFVFRFUjwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi9pbmRleC5odG1sP2luZGV4LWZpbGVzaW5kZXgtMTAuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xMC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxBIEhSRUY9ImluZGV4LTEuaHRtbCI+QTwvQT4gPEEgSFJFRj0iaW5kZXgtMi5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC0zLmh0bWwiPkQ8L0E+IDxBIEhSRUY9ImluZGV4LTQuaHRtbCI+RTwvQT4gPEEgSFJFRj0iaW5kZXgtNS5odG1sIj5GPC9BPiA8QSBIUkVGPSJpbmRleC02Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTcuaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtOC5odG1sIj5KPC9BPiA8QSBIUkVGPSJpbmRleC05Lmh0bWwiPkw8L0E+IDxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPk08L0E+IDxBIEhSRUY9ImluZGV4LTExLmh0bWwiPk88L0E+IDxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPlA8L0E+IDxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPlI8L0E+IDxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPlM8L0E+IDxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPlU8L0E+IDxBIEhSRUY9ImluZGV4LTE2Lmh0bWwiPlY8L0E+IDxBIEhSRUY9ImluZGV4LTE3Lmh0bWwiPlc8L0E+IDxIUj4KLTxBIE5BTUU9Il9NXyI+PCEtLSAtLT48L0E+PEgyPgotPEI+TTwvQj48L0gyPgotPERMPgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sI01JU1NJTkdfSURFTlRJRkVSIj48Qj5NSVNTSU5HX0lERU5USUZFUjwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24uPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbiI+QW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9BPgotPEREPiZuYnNwOwotPC9ETD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9ImluZGV4LTkuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTEwLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTAuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5EPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+RjwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5HPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPkk8L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+SjwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5NPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5QPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5VPC9BPiA8QSBIUkVGPSJpbmRleC0xNi5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNy5odG1sIj5XPC9BPiA8SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9pbmRleC1maWxlcy9pbmRleC0xMS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2luZGV4LWZpbGVzL2luZGV4LTExLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOTA2YzQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2luZGV4LWZpbGVzL2luZGV4LTExLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjQ2OjIzIEJTVCAyMDEwIC0tPgotPFRJVExFPgotTy1JbmRleAotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMC0wNC0wNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9Ik8tSW5kZXgiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xMC5odG1sIj48Qj5QUkVWIExFVFRFUjwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xMi5odG1sIj48Qj5ORVhUIExFVFRFUjwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi9pbmRleC5odG1sP2luZGV4LWZpbGVzaW5kZXgtMTEuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xMS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxBIEhSRUY9ImluZGV4LTEuaHRtbCI+QTwvQT4gPEEgSFJFRj0iaW5kZXgtMi5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC0zLmh0bWwiPkQ8L0E+IDxBIEhSRUY9ImluZGV4LTQuaHRtbCI+RTwvQT4gPEEgSFJFRj0iaW5kZXgtNS5odG1sIj5GPC9BPiA8QSBIUkVGPSJpbmRleC02Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTcuaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtOC5odG1sIj5KPC9BPiA8QSBIUkVGPSJpbmRleC05Lmh0bWwiPkw8L0E+IDxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPk08L0E+IDxBIEhSRUY9ImluZGV4LTExLmh0bWwiPk88L0E+IDxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPlA8L0E+IDxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPlI8L0E+IDxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPlM8L0E+IDxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPlU8L0E+IDxBIEhSRUY9ImluZGV4LTE2Lmh0bWwiPlY8L0E+IDxBIEhSRUY9ImluZGV4LTE3Lmh0bWwiPlc8L0E+IDxIUj4KLTxBIE5BTUU9Il9PXyI+PCEtLSAtLT48L0E+PEgyPgotPEI+TzwvQj48L0gyPgotPERMPgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Qj5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZTwvQj48L0E+IC0gcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZTxERD4mbmJzcDs8RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uPC9CPjwvQT4gLSBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uPEREPiZuYnNwOzxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3NvcjwvQj48L0E+IC0gcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3I8REQ+Jm5ic3A7PERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Qj5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlsczwvQj48L0E+IC0gcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlsczxERD4mbmJzcDs8RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzPC9CPjwvQT4gLSBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzPEREPiZuYnNwOzwvREw+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xMC5odG1sIj48Qj5QUkVWIExFVFRFUjwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xMi5odG1sIj48Qj5ORVhUIExFVFRFUjwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi9pbmRleC5odG1sP2luZGV4LWZpbGVzaW5kZXgtMTEuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xMS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxBIEhSRUY9ImluZGV4LTEuaHRtbCI+QTwvQT4gPEEgSFJFRj0iaW5kZXgtMi5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC0zLmh0bWwiPkQ8L0E+IDxBIEhSRUY9ImluZGV4LTQuaHRtbCI+RTwvQT4gPEEgSFJFRj0iaW5kZXgtNS5odG1sIj5GPC9BPiA8QSBIUkVGPSJpbmRleC02Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTcuaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtOC5odG1sIj5KPC9BPiA8QSBIUkVGPSJpbmRleC05Lmh0bWwiPkw8L0E+IDxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPk08L0E+IDxBIEhSRUY9ImluZGV4LTExLmh0bWwiPk88L0E+IDxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPlA8L0E+IDxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPlI8L0E+IDxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPlM8L0E+IDxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPlU8L0E+IDxBIEhSRUY9ImluZGV4LTE2Lmh0bWwiPlY8L0E+IDxBIEhSRUY9ImluZGV4LTE3Lmh0bWwiPlc8L0E+IDxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2luZGV4LWZpbGVzL2luZGV4LTEyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvaW5kZXgtZmlsZXMvaW5kZXgtMTIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJiN2Y0MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvaW5kZXgtZmlsZXMvaW5kZXgtMTIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMTQpIG9uIFdlZCBBcHIgMDcgMDc6NDY6MjMgQlNUIDIwMTAgLS0+Ci08VElUTEU+Ci1QLUluZGV4Ci08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDEwLTA0LTA3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iUC1JbmRleCI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9ImluZGV4LTExLmh0bWwiPjxCPlBSRVYgTEVUVEVSPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPjxCPk5FWFQgTEVUVEVSPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uL2luZGV4Lmh0bWw/aW5kZXgtZmlsZXNpbmRleC0xMi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTEyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEEgSFJFRj0iaW5kZXgtMS5odG1sIj5BPC9BPiA8QSBIUkVGPSJpbmRleC0yLmh0bWwiPkM8L0E+IDxBIEhSRUY9ImluZGV4LTMuaHRtbCI+RDwvQT4gPEEgSFJFRj0iaW5kZXgtNC5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC01Lmh0bWwiPkY8L0E+IDxBIEhSRUY9ImluZGV4LTYuaHRtbCI+RzwvQT4gPEEgSFJFRj0iaW5kZXgtNy5odG1sIj5JPC9BPiA8QSBIUkVGPSJpbmRleC04Lmh0bWwiPko8L0E+IDxBIEhSRUY9ImluZGV4LTkuaHRtbCI+TDwvQT4gPEEgSFJFRj0iaW5kZXgtMTAuaHRtbCI+TTwvQT4gPEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+UDwvQT4gPEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+UjwvQT4gPEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+UzwvQT4gPEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+VTwvQT4gPEEgSFJFRj0iaW5kZXgtMTYuaHRtbCI+VjwvQT4gPEEgSFJFRj0iaW5kZXgtMTcuaHRtbCI+VzwvQT4gPEhSPgotPEEgTkFNRT0iX1BfIj48IS0tIC0tPjwvQT48SDI+Ci08Qj5QPC9CPjwvSDI+Ci08REw+Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmh0bWwjUExVR0lOX0lEIj48Qj5QTFVHSU5fSUQ8L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZVBsdWdpbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPkFubm90YXRpb25zQ29yZVBsdWdpbjwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yLmh0bWwjcHJpbnRFcnJvcihjb20uc3VuLm1pcnJvci51dGlsLlNvdXJjZVBvc2l0aW9uLCBqYXZhLmxhbmcuU3RyaW5nKSI+PEI+cHJpbnRFcnJvcihTb3VyY2VQb3NpdGlvbiwgU3RyaW5nKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3NvciI+QWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yPC9BPgotPEREPlByaW50cyBhbiBlcnJvciBtZXNzYWdlLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IuaHRtbCNwcmludEVycm9yKGphdmEubGFuZy5TdHJpbmcpIj48Qj5wcmludEVycm9yKFN0cmluZyk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IiPkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcjwvQT4KLTxERD5QcmludHMgYW4gZXJyb3IgbWVzc2FnZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yLmh0bWwjcHJpbnRGaXhhYmxlRXJyb3IoY29tLnN1bi5taXJyb3IudXRpbC5Tb3VyY2VQb3NpdGlvbiwgamF2YS5sYW5nLlN0cmluZykiPjxCPnByaW50Rml4YWJsZUVycm9yKFNvdXJjZVBvc2l0aW9uLCBTdHJpbmcpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL0Fic3RyYWN0QW5ub3RhdGlvblByb2Nlc3Nvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yIj5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I8L0E+Ci08REQ+UHJpbnQgYW4gZXJyb3IgaW5jbHVkaW5nIHRoZSBnaXZlbiBhcmd1bWVudHMgZm9yIHVzZSBpbiBxdWljay1maXhlcy4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yLmh0bWwjcHJpbnRGaXhhYmxlRXJyb3IoY29tLnN1bi5taXJyb3IudXRpbC5Tb3VyY2VQb3NpdGlvbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykiPjxCPnByaW50Rml4YWJsZUVycm9yKFNvdXJjZVBvc2l0aW9uLCBTdHJpbmcsIFN0cmluZywgU3RyaW5nKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3NvciI+QWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yPC9BPgotPEREPlByaW50IGFuIGVycm9yIGluY2x1ZGluZyB0aGUgZ2l2ZW4gYXJndW1lbnRzIGZvciB1c2UgaW4gcXVpY2stZml4ZXMuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL0Fic3RyYWN0QW5ub3RhdGlvblByb2Nlc3Nvci5odG1sI3ByaW50Rml4YWJsZUVycm9yKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpIj48Qj5wcmludEZpeGFibGVFcnJvcihTdHJpbmcsIFN0cmluZywgU3RyaW5nKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3NvciI+QWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yPC9BPgotPEREPlByaW50IGFuIGVycm9yIGluY2x1ZGluZyB0aGUgZ2l2ZW4gYXJndW1lbnRzIGZvciB1c2UgaW4gcXVpY2stZml4ZXMuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL0Fic3RyYWN0QW5ub3RhdGlvblByb2Nlc3Nvci5odG1sI3ByaW50Rml4YWJsZU5vdGljZShjb20uc3VuLm1pcnJvci51dGlsLlNvdXJjZVBvc2l0aW9uLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKSI+PEI+cHJpbnRGaXhhYmxlTm90aWNlKFNvdXJjZVBvc2l0aW9uLCBTdHJpbmcsIFN0cmluZywgU3RyaW5nKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3NvciI+QWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yPC9BPgotPEREPlByaW50IGEgbm90aWNlIGluY2x1ZGluZyB0aGUgZ2l2ZW4gYXJndW1lbnRzIGZvciB1c2UgaW4gcXVpY2stZml4ZXMuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL0Fic3RyYWN0QW5ub3RhdGlvblByb2Nlc3Nvci5odG1sI3ByaW50Rml4YWJsZU5vdGljZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKSI+PEI+cHJpbnRGaXhhYmxlTm90aWNlKFN0cmluZywgU3RyaW5nLCBTdHJpbmcpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL0Fic3RyYWN0QW5ub3RhdGlvblByb2Nlc3Nvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yIj5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I8L0E+Ci08REQ+UHJpbnQgYSBub3RpY2UgaW5jbHVkaW5nIHRoZSBnaXZlbiBhcmd1bWVudHMgZm9yIHVzZSBpbiBxdWljay1maXhlcy4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yLmh0bWwjcHJpbnRGaXhhYmxlV2FybmluZyhjb20uc3VuLm1pcnJvci51dGlsLlNvdXJjZVBvc2l0aW9uLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKSI+PEI+cHJpbnRGaXhhYmxlV2FybmluZyhTb3VyY2VQb3NpdGlvbiwgU3RyaW5nLCBTdHJpbmcsIFN0cmluZyk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IiPkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcjwvQT4KLTxERD5QcmludCBhIHdhcm5pbmcgaW5jbHVkaW5nIHRoZSBnaXZlbiBhcmd1bWVudHMgZm9yIHVzZSBpbiBxdWljay1maXhlcy4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yLmh0bWwjcHJpbnRGaXhhYmxlV2FybmluZyhqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKSI+PEI+cHJpbnRGaXhhYmxlV2FybmluZyhTdHJpbmcsIFN0cmluZywgU3RyaW5nKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3NvciI+QWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yPC9BPgotPEREPlByaW50IGEgd2FybmluZyBpbmNsdWRpbmcgdGhlIGdpdmVuIGFyZ3VtZW50cyBmb3IgdXNlIGluIHF1aWNrLWZpeGVzLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IuaHRtbCNwcmludE5vdGljZShjb20uc3VuLm1pcnJvci51dGlsLlNvdXJjZVBvc2l0aW9uLCBqYXZhLmxhbmcuU3RyaW5nKSI+PEI+cHJpbnROb3RpY2UoU291cmNlUG9zaXRpb24sIFN0cmluZyk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IiPkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcjwvQT4KLTxERD5QcmludHMgYSBub3RpY2UuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL0Fic3RyYWN0QW5ub3RhdGlvblByb2Nlc3Nvci5odG1sI3ByaW50Tm90aWNlKGphdmEubGFuZy5TdHJpbmcpIj48Qj5wcmludE5vdGljZShTdHJpbmcpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL0Fic3RyYWN0QW5ub3RhdGlvblByb2Nlc3Nvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yIj5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I8L0E+Ci08REQ+UHJpbnRzIGEgbm90aWNlLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IuaHRtbCNwcmludFdhcm5pbmcoY29tLnN1bi5taXJyb3IudXRpbC5Tb3VyY2VQb3NpdGlvbiwgamF2YS5sYW5nLlN0cmluZykiPjxCPnByaW50V2FybmluZyhTb3VyY2VQb3NpdGlvbiwgU3RyaW5nKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3NvciI+QWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yPC9BPgotPEREPlByaW50cyBhIHdhcm5pbmcgbWVzc2FnZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yLmh0bWwjcHJpbnRXYXJuaW5nKGphdmEubGFuZy5TdHJpbmcpIj48Qj5wcmludFdhcm5pbmcoU3RyaW5nKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3NvciI+QWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yPC9BPgotPEREPlByaW50cyBhIHdhcm5pbmcgbWVzc2FnZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yLmh0bWwjcHJvY2VzcygpIj48Qj5wcm9jZXNzKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IiPkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcjwvQT4KLTxERD5Qcm9jZXNzIGFsbCBwcm9ncmFtIGVsZW1lbnRzIHN1cHBvcnRlZCBieSB0aGlzIGFubm90YXRpb24gcHJvY2Vzc29yLgotPC9ETD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9ImluZGV4LTExLmh0bWwiPjxCPlBSRVYgTEVUVEVSPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPjxCPk5FWFQgTEVUVEVSPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uL2luZGV4Lmh0bWw/aW5kZXgtZmlsZXNpbmRleC0xMi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTEyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEEgSFJFRj0iaW5kZXgtMS5odG1sIj5BPC9BPiA8QSBIUkVGPSJpbmRleC0yLmh0bWwiPkM8L0E+IDxBIEhSRUY9ImluZGV4LTMuaHRtbCI+RDwvQT4gPEEgSFJFRj0iaW5kZXgtNC5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC01Lmh0bWwiPkY8L0E+IDxBIEhSRUY9ImluZGV4LTYuaHRtbCI+RzwvQT4gPEEgSFJFRj0iaW5kZXgtNy5odG1sIj5JPC9BPiA8QSBIUkVGPSJpbmRleC04Lmh0bWwiPko8L0E+IDxBIEhSRUY9ImluZGV4LTkuaHRtbCI+TDwvQT4gPEEgSFJFRj0iaW5kZXgtMTAuaHRtbCI+TTwvQT4gPEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+UDwvQT4gPEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+UjwvQT4gPEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+UzwvQT4gPEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+VTwvQT4gPEEgSFJFRj0iaW5kZXgtMTYuaHRtbCI+VjwvQT4gPEEgSFJFRj0iaW5kZXgtMTcuaHRtbCI+VzwvQT4gPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvaW5kZXgtZmlsZXMvaW5kZXgtMTMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9pbmRleC1maWxlcy9pbmRleC0xMy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTIxOGIxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9pbmRleC1maWxlcy9pbmRleC0xMy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8xNCkgb24gV2VkIEFwciAwNyAwNzo0NjoyMyBCU1QgMjAxMCAtLT4KLTxUSVRMRT4KLVItSW5kZXgKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTAtMDQtMDciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJSLUluZGV4IjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5JbmRleDwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTEzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5EPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+RjwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5HPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPkk8L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+SjwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5NPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5QPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5VPC9BPiA8QSBIUkVGPSJpbmRleC0xNi5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNy5odG1sIj5XPC9BPiA8SFI+Ci08QSBOQU1FPSJfUl8iPjwhLS0gLS0+PC9BPjxIMj4KLTxCPlI8L0I+PC9IMj4KLTxETD4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9XU0RMVXRpbHMuaHRtbCNyZWFkV1NETChqYXZhLm5ldC5VUkwpIj48Qj5yZWFkV1NETChVUkwpPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvV1NETFV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscyI+V1NETFV0aWxzPC9BPgotPEREPlJldHVybnMgYSA8Y29kZT5qYXZheC53c2RsLkRlZmluaXRpb248L2NvZGU+IGJ5IHJlYWRpbmcgdGhlIFdTREwgZG9jdW1lbnQgYXQgdGhlIGdpdmVuIFVSTCBvciBudWxsIGlmIG5vbmUgY2FuIGJlIGZvdW5kCi0gb3IgaWYgdGhlIGNvbm5lY3Rpb24gdGltZXMgb3V0LgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sI3JlbW92ZUFubm90YXRpb24ob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50LCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbikiPjxCPnJlbW92ZUFubm90YXRpb24oSUphdmFFbGVtZW50LCBBbm5vdGF0aW9uKTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMiPkFubm90YXRpb25VdGlsczwvQT4KLTxERD5SZW1vdmVzIHRoZSBnaXZlbiA8Q09ERT5Bbm5vdGF0aW9uPC9DT0RFPiBmcm9tIHRoZSA8Q09ERT5JSmF2YUVsZW1lbnQ8L0NPREU+LgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL0pEVFV0aWxzLmh0bWwjcmVtb3ZlRnJvbUNsYXNzcGF0aChvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3QsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeSkiPjxCPnJlbW92ZUZyb21DbGFzc3BhdGgoSUphdmFQcm9qZWN0LCBJQ2xhc3NwYXRoRW50cnkpPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvSkRUVXRpbHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzIj5KRFRVdGlsczwvQT4KLTxERD5SZW1vdmUgYSA8Y29kZT5JQ2xhc3NwYXRoRW50cnk8L2NvZGU+IGZyb20gYSA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwjcmVtb3ZlSW1wb3J0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCwgamF2YS5sYW5nLlN0cmluZykiPjxCPnJlbW92ZUltcG9ydChJSmF2YUVsZW1lbnQsIFN0cmluZyk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzIj5Bbm5vdGF0aW9uVXRpbHM8L0E+Ci08REQ+UmVtb3ZlcyBhbiBpbXBvcnQgZnJvbSB0aGUgY29tcGlsYXRpb24gdW5pdCBvZiB0aGUgZ2l2ZW4gPENPREU+SUphdmFFbGVtZW50PC9DT0RFPi4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCNyZW1vdmVNZW1iZXJWYWx1ZVBhaXIob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb24sIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXIpIj48Qj5yZW1vdmVNZW1iZXJWYWx1ZVBhaXIoTm9ybWFsQW5ub3RhdGlvbiwgTWVtYmVyVmFsdWVQYWlyKTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMiPkFubm90YXRpb25VdGlsczwvQT4KLTxERD5SZW1vdmVzIHRoZSA8Q09ERT5NZW1iZXJWYWx1ZVBhaXI8L0NPREU+IGZyb20gdGhlIDxDT0RFPk5vcm1hbEFubm90YXRpb248L0NPREU+LgotPC9ETD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPjxCPlBSRVYgTEVUVEVSPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPjxCPk5FWFQgTEVUVEVSPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uL2luZGV4Lmh0bWw/aW5kZXgtZmlsZXNpbmRleC0xMy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTEzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEEgSFJFRj0iaW5kZXgtMS5odG1sIj5BPC9BPiA8QSBIUkVGPSJpbmRleC0yLmh0bWwiPkM8L0E+IDxBIEhSRUY9ImluZGV4LTMuaHRtbCI+RDwvQT4gPEEgSFJFRj0iaW5kZXgtNC5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC01Lmh0bWwiPkY8L0E+IDxBIEhSRUY9ImluZGV4LTYuaHRtbCI+RzwvQT4gPEEgSFJFRj0iaW5kZXgtNy5odG1sIj5JPC9BPiA8QSBIUkVGPSJpbmRleC04Lmh0bWwiPko8L0E+IDxBIEhSRUY9ImluZGV4LTkuaHRtbCI+TDwvQT4gPEEgSFJFRj0iaW5kZXgtMTAuaHRtbCI+TTwvQT4gPEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+UDwvQT4gPEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+UjwvQT4gPEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+UzwvQT4gPEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+VTwvQT4gPEEgSFJFRj0iaW5kZXgtMTYuaHRtbCI+VjwvQT4gPEEgSFJFRj0iaW5kZXgtMTcuaHRtbCI+VzwvQT4gPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvaW5kZXgtZmlsZXMvaW5kZXgtMTQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9pbmRleC1maWxlcy9pbmRleC0xNC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODRmMTRlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9pbmRleC1maWxlcy9pbmRleC0xNC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8xNCkgb24gV2VkIEFwciAwNyAwNzo0NjoyMyBCU1QgMjAxMCAtLT4KLTxUSVRMRT4KLVMtSW5kZXgKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTAtMDQtMDciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJTLUluZGV4IjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5JbmRleDwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTE0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5EPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+RjwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5HPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPkk8L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+SjwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5NPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5QPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5VPC9BPiA8QSBIUkVGPSJpbmRleC0xNi5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNy5odG1sIj5XPC9BPiA8SFI+Ci08QSBOQU1FPSJfU18iPjwhLS0gLS0+PC9BPjxIMj4KLTxCPlM8L0I+PC9IMj4KLTxETD4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yLmh0bWwjc2V0QW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50KGNvbS5zdW4ubWlycm9yLmFwdC5Bbm5vdGF0aW9uUHJvY2Vzc29yRW52aXJvbm1lbnQpIj48Qj5zZXRBbm5vdGF0aW9uUHJvY2Vzc29yRW52aXJvbm1lbnQoQW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50KTwvQj48L0E+IC0gCi1NZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3NvciI+QWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yPC9BPgotPEREPlNldCB0aGUgPENPREU+QW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50PC9DT0RFPiBlbnZpcm9ubWVudCB0byB1c2UgZHVyaW5nIHByb2Nlc3NpbmcuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmh0bWwjc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpIj48Qj5zdGFydChCdW5kbGVDb250ZXh0KTwvQj48L0E+IC0gCi1NZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSI+QW5ub3RhdGlvbnNDb3JlUGx1Z2luPC9BPgotPEREPiZuYnNwOwotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZVBsdWdpbi5odG1sI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpIj48Qj5zdG9wKEJ1bmRsZUNvbnRleHQpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmVQbHVnaW4uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj5Bbm5vdGF0aW9uc0NvcmVQbHVnaW48L0E+Ci08REQ+Jm5ic3A7Ci08L0RMPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5JbmRleDwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTE0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5EPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+RjwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5HPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPkk8L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+SjwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5NPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5QPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5VPC9BPiA8QSBIUkVGPSJpbmRleC0xNi5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNy5odG1sIj5XPC9BPiA8SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9pbmRleC1maWxlcy9pbmRleC0xNS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2luZGV4LWZpbGVzL2luZGV4LTE1Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMjhjMmYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2luZGV4LWZpbGVzL2luZGV4LTE1Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjQ2OjIzIEJTVCAyMDEwIC0tPgotPFRJVExFPgotVS1JbmRleAotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMC0wNC0wNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlUtSW5kZXgiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xNC5odG1sIj48Qj5QUkVWIExFVFRFUjwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xNi5odG1sIj48Qj5ORVhUIExFVFRFUjwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi9pbmRleC5odG1sP2luZGV4LWZpbGVzaW5kZXgtMTUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xNS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxBIEhSRUY9ImluZGV4LTEuaHRtbCI+QTwvQT4gPEEgSFJFRj0iaW5kZXgtMi5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC0zLmh0bWwiPkQ8L0E+IDxBIEhSRUY9ImluZGV4LTQuaHRtbCI+RTwvQT4gPEEgSFJFRj0iaW5kZXgtNS5odG1sIj5GPC9BPiA8QSBIUkVGPSJpbmRleC02Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTcuaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtOC5odG1sIj5KPC9BPiA8QSBIUkVGPSJpbmRleC05Lmh0bWwiPkw8L0E+IDxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPk08L0E+IDxBIEhSRUY9ImluZGV4LTExLmh0bWwiPk88L0E+IDxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPlA8L0E+IDxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPlI8L0E+IDxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPlM8L0E+IDxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPlU8L0E+IDxBIEhSRUY9ImluZGV4LTE2Lmh0bWwiPlY8L0E+IDxBIEhSRUY9ImluZGV4LTE3Lmh0bWwiPlc8L0E+IDxIUj4KLTxBIE5BTUU9Il9VXyI+PCEtLSAtLT48L0E+PEgyPgotPEI+VTwvQj48L0gyPgotPERMPgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sI3VwZGF0ZU1lbWJlclZhbHVlUGFpcihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZSkiPjxCPnVwZGF0ZU1lbWJlclZhbHVlUGFpcihNZW1iZXJWYWx1ZVBhaXIsIEFTVE5vZGUpPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscyI+QW5ub3RhdGlvblV0aWxzPC9BPgotPEREPlVwZGF0ZXMgdGhlIDxDT0RFPk1lbWJlclZhbHVlUGFpcjwvQ09ERT4gdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gPENPREU+QVNUTm9kZTwvQ09ERT4uCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwjdXBkYXRlU2luZ2xlTWVtYmVyQW5ub3RhdGlvbihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiwgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGUpIj48Qj51cGRhdGVTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKFNpbmdsZU1lbWJlckFubm90YXRpb24sIEFTVE5vZGUpPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscyI+QW5ub3RhdGlvblV0aWxzPC9BPgotPEREPlVwZGF0ZXMgdGhlIHZhbHVlIG9mIHRoZSA8Q09ERT5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uPC9DT0RFPiB3aXRoIHRoZSBnaXZlbiA8Q09ERT5BU1ROb2RlPC9DT0RFPi4KLTwvREw+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xNC5odG1sIj48Qj5QUkVWIExFVFRFUjwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xNi5odG1sIj48Qj5ORVhUIExFVFRFUjwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi9pbmRleC5odG1sP2luZGV4LWZpbGVzaW5kZXgtMTUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xNS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxBIEhSRUY9ImluZGV4LTEuaHRtbCI+QTwvQT4gPEEgSFJFRj0iaW5kZXgtMi5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC0zLmh0bWwiPkQ8L0E+IDxBIEhSRUY9ImluZGV4LTQuaHRtbCI+RTwvQT4gPEEgSFJFRj0iaW5kZXgtNS5odG1sIj5GPC9BPiA8QSBIUkVGPSJpbmRleC02Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTcuaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtOC5odG1sIj5KPC9BPiA8QSBIUkVGPSJpbmRleC05Lmh0bWwiPkw8L0E+IDxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPk08L0E+IDxBIEhSRUY9ImluZGV4LTExLmh0bWwiPk88L0E+IDxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPlA8L0E+IDxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPlI8L0E+IDxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPlM8L0E+IDxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPlU8L0E+IDxBIEhSRUY9ImluZGV4LTE2Lmh0bWwiPlY8L0E+IDxBIEhSRUY9ImluZGV4LTE3Lmh0bWwiPlc8L0E+IDxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2luZGV4LWZpbGVzL2luZGV4LTE2Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvaW5kZXgtZmlsZXMvaW5kZXgtMTYuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI3N2VmNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvaW5kZXgtZmlsZXMvaW5kZXgtMTYuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMTQpIG9uIFdlZCBBcHIgMDcgMDc6NDY6MjMgQlNUIDIwMTAgLS0+Ci08VElUTEU+Ci1WLUluZGV4Ci08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDEwLTA0LTA3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVi1JbmRleCI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPjxCPlBSRVYgTEVUVEVSPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTE3Lmh0bWwiPjxCPk5FWFQgTEVUVEVSPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uL2luZGV4Lmh0bWw/aW5kZXgtZmlsZXNpbmRleC0xNi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTE2Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEEgSFJFRj0iaW5kZXgtMS5odG1sIj5BPC9BPiA8QSBIUkVGPSJpbmRleC0yLmh0bWwiPkM8L0E+IDxBIEhSRUY9ImluZGV4LTMuaHRtbCI+RDwvQT4gPEEgSFJFRj0iaW5kZXgtNC5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC01Lmh0bWwiPkY8L0E+IDxBIEhSRUY9ImluZGV4LTYuaHRtbCI+RzwvQT4gPEEgSFJFRj0iaW5kZXgtNy5odG1sIj5JPC9BPiA8QSBIUkVGPSJpbmRleC04Lmh0bWwiPko8L0E+IDxBIEhSRUY9ImluZGV4LTkuaHRtbCI+TDwvQT4gPEEgSFJFRj0iaW5kZXgtMTAuaHRtbCI+TTwvQT4gPEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+UDwvQT4gPEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+UjwvQT4gPEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+UzwvQT4gPEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+VTwvQT4gPEEgSFJFRj0iaW5kZXgtMTYuaHRtbCI+VjwvQT4gPEEgSFJFRj0iaW5kZXgtMTcuaHRtbCI+VzwvQT4gPEhSPgotPEEgTkFNRT0iX1ZfIj48IS0tIC0tPjwvQT48SDI+Ci08Qj5WPC9CPjwvSDI+Ci08REw+Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvSkRUVXRpbHMuaHRtbCN2YWxpZGF0ZUlkZW50aWZpZXIoamF2YS5sYW5nLlN0cmluZykiPjxCPnZhbGlkYXRlSWRlbnRpZmllcihTdHJpbmcpPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvSkRUVXRpbHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzIj5KRFRVdGlsczwvQT4KLTxERD5WYWxpZGF0ZXMgdGhlIGdpdmVuIEphdmEgaWRlbnRpZmllciB3aXRoIHRoZSB3b3Jrc3BhY2Ugc291cmNlIGFuZCBjb21wbGlhbmNlIGxldmVscy4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9KRFRVdGlscy5odG1sI3ZhbGlkYXRlSmF2YVR5cGVOYW1lKGphdmEubGFuZy5TdHJpbmcpIj48Qj52YWxpZGF0ZUphdmFUeXBlTmFtZShTdHJpbmcpPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvSkRUVXRpbHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzIj5KRFRVdGlsczwvQT4KLTxERD5WYWxpZGF0ZXMgdGhlIGdpdmVuIEphdmEgdHlwZSBuYW1lLCBlaXRoZXIgc2ltcGxlIG9yIHF1YWxpZmllZCwgdXNpbmcgdGhlIHdvcmtzcGFjZSBzb3VyY2UgYW5kIGNvbXBsaWFuY2UgbGV2ZWxzLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL0pEVFV0aWxzLmh0bWwjdmFsaWRhdGVKYXZhVHlwZU5hbWUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykiPjxCPnZhbGlkYXRlSmF2YVR5cGVOYW1lKFN0cmluZywgU3RyaW5nKTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL0pEVFV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscyI+SkRUVXRpbHM8L0E+Ci08REQ+VmFsaWRhdGVzIHRoZSBnaXZlbiBKYXZhIHR5cGUgbmFtZSwgZWl0aGVyIHNpbXBsZSBvciBxdWFsaWZpZWQsIHVzaW5nIHRoZSBnaXZlbiBwcm9qZWN0cyBzb3VyY2UgYW5kIGNvbXBsaWFuY2UgbGV2ZWxzLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL0pEVFV0aWxzLmh0bWwjdmFsaWRhdGVQYWNrYWdlTmFtZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKSI+PEI+dmFsaWRhdGVQYWNrYWdlTmFtZShTdHJpbmcsIFN0cmluZyk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9KRFRVdGlscy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMiPkpEVFV0aWxzPC9BPgotPEREPlZhbGlkYXRlIHRoZSBnaXZlbiBwYWNrYWdlIG5hbWUgdXNpbmcgdGhlIGdpdmVuIHByb2plY3RzIHNvdXJjZSBhbmQgY29tcGxpYW5jZSBsZXZlbHMuCi08L0RMPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5JbmRleDwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTcuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTE2Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTYuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5EPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+RjwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5HPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPkk8L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+SjwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5NPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5QPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5VPC9BPiA8QSBIUkVGPSJpbmRleC0xNi5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNy5odG1sIj5XPC9BPiA8SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9pbmRleC1maWxlcy9pbmRleC0xNy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2luZGV4LWZpbGVzL2luZGV4LTE3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhOTM1ODQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2luZGV4LWZpbGVzL2luZGV4LTE3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjQ2OjIzIEJTVCAyMDEwIC0tPgotPFRJVExFPgotVy1JbmRleAotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMC0wNC0wNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlctSW5kZXgiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xNi5odG1sIj48Qj5QUkVWIExFVFRFUjwvQj48L0E+Jm5ic3A7Ci0mbmJzcDtORVhUIExFVFRFUjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTE3Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTcuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5EPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+RjwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5HPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPkk8L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+SjwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5NPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5QPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5VPC9BPiA8QSBIUkVGPSJpbmRleC0xNi5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNy5odG1sIj5XPC9BPiA8SFI+Ci08QSBOQU1FPSJfV18iPjwhLS0gLS0+PC9BPjxIMj4KLTxCPlc8L0I+PC9IMj4KLTxETD4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9XU0RMVXRpbHMuaHRtbCN3cml0ZVdTREwoamF2YS5uZXQuVVJMLCBqYXZheC53c2RsLkRlZmluaXRpb24pIj48Qj53cml0ZVdTREwoVVJMLCBEZWZpbml0aW9uKTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL1dTRExVdGlscy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMiPldTRExVdGlsczwvQT4KLTxERD5Xcml0ZXMgdGhlIGdpdmVuIDxjb2RlPmphdmF4LndzZGwuRGVmaW5pdGlvbjwvY29kZT4gdG8gdGhlIHdzZGwgZG9jdW1lbnQgYXQgdGhlIGdpdmVuIFVSTC4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9XU0RMVXRpbHMuaHRtbCNXU0RMX0ZJTEVfRVhURU5TSU9OIj48Qj5XU0RMX0ZJTEVfRVhURU5TSU9OPC9CPjwvQT4gLSAKLVN0YXRpYyB2YXJpYWJsZSBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9XU0RMVXRpbHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzIj5XU0RMVXRpbHM8L0E+Ci08REQ+Jm5ic3A7Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvV1NETFV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscyI+PEI+V1NETFV0aWxzPC9CPjwvQT4gLSBDbGFzcyBpbiA8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHM8L0E+PEREPldTREwgVXRpbGl0eSBjbGFzcy48L0RMPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5JbmRleDwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTYuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7TkVYVCBMRVRURVI8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uL2luZGV4Lmh0bWw/aW5kZXgtZmlsZXNpbmRleC0xNy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTE3Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEEgSFJFRj0iaW5kZXgtMS5odG1sIj5BPC9BPiA8QSBIUkVGPSJpbmRleC0yLmh0bWwiPkM8L0E+IDxBIEhSRUY9ImluZGV4LTMuaHRtbCI+RDwvQT4gPEEgSFJFRj0iaW5kZXgtNC5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC01Lmh0bWwiPkY8L0E+IDxBIEhSRUY9ImluZGV4LTYuaHRtbCI+RzwvQT4gPEEgSFJFRj0iaW5kZXgtNy5odG1sIj5JPC9BPiA8QSBIUkVGPSJpbmRleC04Lmh0bWwiPko8L0E+IDxBIEhSRUY9ImluZGV4LTkuaHRtbCI+TDwvQT4gPEEgSFJFRj0iaW5kZXgtMTAuaHRtbCI+TTwvQT4gPEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+UDwvQT4gPEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+UjwvQT4gPEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+UzwvQT4gPEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+VTwvQT4gPEEgSFJFRj0iaW5kZXgtMTYuaHRtbCI+VjwvQT4gPEEgSFJFRj0iaW5kZXgtMTcuaHRtbCI+VzwvQT4gPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvaW5kZXgtZmlsZXMvaW5kZXgtMi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2luZGV4LWZpbGVzL2luZGV4LTIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRmZjUxMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvaW5kZXgtZmlsZXMvaW5kZXgtMi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8xNCkgb24gV2VkIEFwciAwNyAwNzo0NjoyMyBCU1QgMjAxMCAtLT4KLTxUSVRMRT4KLUMtSW5kZXgKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTAtMDQtMDciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJDLUluZGV4IjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5JbmRleDwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMS5odG1sIj48Qj5QUkVWIExFVFRFUjwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0zLmh0bWwiPjxCPk5FWFQgTEVUVEVSPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uL2luZGV4Lmh0bWw/aW5kZXgtZmlsZXNpbmRleC0yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxBIEhSRUY9ImluZGV4LTEuaHRtbCI+QTwvQT4gPEEgSFJFRj0iaW5kZXgtMi5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC0zLmh0bWwiPkQ8L0E+IDxBIEhSRUY9ImluZGV4LTQuaHRtbCI+RTwvQT4gPEEgSFJFRj0iaW5kZXgtNS5odG1sIj5GPC9BPiA8QSBIUkVGPSJpbmRleC02Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTcuaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtOC5odG1sIj5KPC9BPiA8QSBIUkVGPSJpbmRleC05Lmh0bWwiPkw8L0E+IDxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPk08L0E+IDxBIEhSRUY9ImluZGV4LTExLmh0bWwiPk88L0E+IDxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPlA8L0E+IDxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPlI8L0E+IDxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPlM8L0E+IDxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPlU8L0E+IDxBIEhSRUY9ImluZGV4LTE2Lmh0bWwiPlY8L0E+IDxBIEhSRUY9ImluZGV4LTE3Lmh0bWwiPlc8L0E+IDxIUj4KLTxBIE5BTUU9Il9DXyI+PCEtLSAtLT48L0E+PEgyPgotPEI+QzwvQj48L0gyPgotPERMPgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sI2NvbXBhcmVGaWVsZE5hbWVzKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5GaWVsZERlY2xhcmF0aW9uLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQpIj48Qj5jb21wYXJlRmllbGROYW1lcyhGaWVsZERlY2xhcmF0aW9uLCBJRmllbGQpPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscyI+QW5ub3RhdGlvblV0aWxzPC9BPgotPEREPkNvbXBhcmVzIHRoZSA8Q09ERT5GaWVsZERlY2xhcmF0aW9uPC9DT0RFPiBhbmQgPENPREU+SUZpZWxkPC9DT0RFPi4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCNjb21wYXJlTWV0aG9kcyhvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kRGVjbGFyYXRpb24sIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2QpIj48Qj5jb21wYXJlTWV0aG9kcyhNZXRob2REZWNsYXJhdGlvbiwgSU1ldGhvZCk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzIj5Bbm5vdGF0aW9uVXRpbHM8L0E+Ci08REQ+Q29tcGFyZXMgdGhlIDxDT0RFPk1ldGhvZERlY2xhcmF0aW9uPC9DT0RFPiBhbmQgPENPREU+SU1ldGhvZDwvQ09ERT4uCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwjY29tcGFyZU1ldGhvZHMob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZERlY2xhcmF0aW9uLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kRGVjbGFyYXRpb24pIj48Qj5jb21wYXJlTWV0aG9kcyhNZXRob2REZWNsYXJhdGlvbiwgTWV0aG9kRGVjbGFyYXRpb24pPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscyI+QW5ub3RhdGlvblV0aWxzPC9BPgotPEREPkNvbXBhcmVzIHRoZSB0d28gPENPREU+TWV0aG9kRGVjbGFyYXRpb248L0NPREU+LgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sI2NvbXBhcmVNZXRob2RzKGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1ldGhvZERlY2xhcmF0aW9uLCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5NZXRob2REZWNsYXJhdGlvbikiPjxCPmNvbXBhcmVNZXRob2RzKE1ldGhvZERlY2xhcmF0aW9uLCBNZXRob2REZWNsYXJhdGlvbik8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzIj5Bbm5vdGF0aW9uVXRpbHM8L0E+Ci08REQ+Q29tcGFyZXMgdGhlIHR3byA8Q09ERT5NZXRob2REZWNsYXJhdGlvbjwvQ09ERT4uCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwjY29tcGFyZVR5cGVOYW1lcyhvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24sIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlKSI+PEI+Y29tcGFyZVR5cGVOYW1lcyhBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiwgSVR5cGUpPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscyI+QW5ub3RhdGlvblV0aWxzPC9BPgotPEREPkNvbXBhcmVzIHRoZSA8Q09ERT5BYnN0cmFjdFR5cGVEZWNsYXJhdGlvbjwvQ09ERT4gYW5kIDxDT0RFPklUeXBlPC9DT0RFPi4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCNjcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50LCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbikiPjxCPmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChJSmF2YUVsZW1lbnQsIEFubm90YXRpb24pPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscyI+QW5ub3RhdGlvblV0aWxzPC9BPgotPEREPkNyZWF0ZXMgYSA8Q09ERT5UZXh0RWRpdDwvQ09ERT4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgYWRkIGFubm90YXRpb24gY2hhbmdlIHRvIHRoZSBzb3VyY2UgY29kZSBvZiB0aGUgamF2YSBlbGVtZW50cyBjb21waWxhdGlvbiB1bml0LgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sI2NyZWF0ZUFkZEltcG9ydFRleHRFZGl0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCwgamF2YS5sYW5nLlN0cmluZykiPjxCPmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KElKYXZhRWxlbWVudCwgU3RyaW5nKTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMiPkFubm90YXRpb25VdGlsczwvQT4KLTxERD5DcmVhdGVzIGEgPENPREU+VGV4dEVkaXQ8L0NPREU+IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGFkZCBpbXBvcnQgY2hhbmdlIHRvIHRoZSBzb3VyY2UgY29kZSBvZiB0aGUgamF2YSBlbGVtZW50cyBjb21waWxhdGlvbiB1bml0LgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sI2NyZWF0ZUFkZE1lbWJlclZhbHVlUGFpclRleHRFZGl0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyKSI+PEI+Y3JlYXRlQWRkTWVtYmVyVmFsdWVQYWlyVGV4dEVkaXQoTm9ybWFsQW5ub3RhdGlvbiwgTWVtYmVyVmFsdWVQYWlyKTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMiPkFubm90YXRpb25VdGlsczwvQT4KLTxERD5DcmVhdGVzIGEgPENPREU+VGV4dEVkaXQ8L0NPREU+IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGNoYW5nZSBvZiBhZGRpbmcgdGhlIDxDT0RFPk1lbWJlclZhbHVlUGFpcjwvQ09ERT4gdG8gdGhlIDxDT0RFPk5vcm1hbEFubm90YXRpb248L0NPREU+LgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZS5odG1sI2NyZWF0ZUFycmF5TWVtYmVyVmFsdWVQYWlyKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3RbXSkiPjxCPmNyZWF0ZUFycmF5TWVtYmVyVmFsdWVQYWlyKEFTVCwgU3RyaW5nLCBPYmplY3RbXSk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmUuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj5Bbm5vdGF0aW9uc0NvcmU8L0E+Ci08REQ+Q3JlYXRlcyBhIG5ldyA8Q09ERT5NZW1iZXJWYWx1ZVBhaXI8L0NPREU+IHdpdGggYW4gPENPREU+QXJyYXlJbml0aWFsaXplcjwvQ09ERT4gdmFsdWUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlLmh0bWwjY3JlYXRlQXJyYXlWYWx1ZUxpdGVyYWwob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVCwgamF2YS5sYW5nLk9iamVjdFtdKSI+PEI+Y3JlYXRlQXJyYXlWYWx1ZUxpdGVyYWwoQVNULCBPYmplY3RbXSk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmUuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj5Bbm5vdGF0aW9uc0NvcmU8L0E+Ci08REQ+Q3JlYXRlcyBhIG5ldyA8Q09ERT5BcnJheUluaXRpYWxpemVyPC9DT0RFPi4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmUuaHRtbCNjcmVhdGVCb29sZWFuTGl0ZXJhbChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNULCBib29sZWFuKSI+PEI+Y3JlYXRlQm9vbGVhbkxpdGVyYWwoQVNULCBib29sZWFuKTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPkFubm90YXRpb25zQ29yZTwvQT4KLTxERD5DcmVhdGVzIGEgbmV3IDxDT0RFPkJvb2xlYW5MaXRlcmFsPC9DT0RFPi4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmUuaHRtbCNjcmVhdGVCb29sZWFuTWVtYmVyVmFsdWVQYWlyKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5Cb29sZWFuKSI+PEI+Y3JlYXRlQm9vbGVhbk1lbWJlclZhbHVlUGFpcihBU1QsIFN0cmluZywgQm9vbGVhbik8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmUuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj5Bbm5vdGF0aW9uc0NvcmU8L0E+Ci08REQ+Q3JlYXRlcyBhIG5ldyA8Q09ERT5NZW1iZXJWYWx1ZVBhaXI8L0NPREU+IHdpdGggYSA8Q09ERT5Cb29sZWFuTGl0ZXJhbDwvQ09ERT4gdmFsdWUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwjY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsKGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uKSI+PEI+Y3JlYXRlQ29tcGxldGlvblByb3Bvc2FsKFN0cmluZywgRXhwcmVzc2lvbik8L0I+PC9BPiAtIAotTWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24iPkFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCNjcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb24sIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZSwgamF2YS5sYW5nLlN0cmluZykiPjxCPmNyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbChTdHJpbmcsIEV4cHJlc3Npb24sIEltYWdlLCBTdHJpbmcpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbi48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uIj5Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI8L0E+Ci08REQ+Jm5ic3A7Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlLmh0bWwjY3JlYXRlRW51bUxpdGVyYWwob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkiPjxCPmNyZWF0ZUVudW1MaXRlcmFsKEFTVCwgU3RyaW5nLCBPYmplY3QpPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSI+QW5ub3RhdGlvbnNDb3JlPC9BPgotPEREPkNyZWF0ZXMgYSBuZXcgPENPREU+UXVhbGlmaWVkTmFtZTwvQ09ERT4gdG8gcmVwcmVzZW50IGFuIDxjb2RlPmVudW08L2NvZGU+IGxpdGVyYWwgdmFsdWUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlLmh0bWwjY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNULCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KSI+PEI+Y3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihBU1QsIFN0cmluZywgU3RyaW5nLCBPYmplY3QpPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSI+QW5ub3RhdGlvbnNDb3JlPC9BPgotPEREPkNyZWF0ZXMgYSBuZXcgPENPREU+TWVtYmVyVmFsdWVQYWlyPC9DT0RFPiB3aXRoIGEgPENPREU+TmFtZTwvQ09ERT4gdmFsdWUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlLmh0bWwjY3JlYXRlTWFya2VyQW5ub3RhdGlvbihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNULCBqYXZhLmxhbmcuU3RyaW5nKSI+PEI+Y3JlYXRlTWFya2VyQW5ub3RhdGlvbihBU1QsIFN0cmluZyk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmUuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj5Bbm5vdGF0aW9uc0NvcmU8L0E+Ci08REQ+Q3JlYXRlcyBhIG5ldyA8Q09ERT5NYXJrZXJBbm5vdGF0aW9uPC9DT0RFPi4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmUuaHRtbCNjcmVhdGVNZW1iZXJWYWx1ZVBhaXIob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVCwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb24pIj48Qj5jcmVhdGVNZW1iZXJWYWx1ZVBhaXIoQVNULCBTdHJpbmcsIEV4cHJlc3Npb24pPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSI+QW5ub3RhdGlvbnNDb3JlPC9BPgotPEREPkNyZWF0ZXMgYSBuZXcgPENPREU+TWVtYmVyVmFsdWVQYWlyPC9DT0RFPi4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmUuaHRtbCNjcmVhdGVOb3JtYWxBbm5vdGF0aW9uKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0KSI+PEI+Y3JlYXRlTm9ybWFsQW5ub3RhdGlvbihBU1QsIFN0cmluZywgTGlzdCZsdDtNZW1iZXJWYWx1ZVBhaXImZ3Q7KTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPkFubm90YXRpb25zQ29yZTwvQT4KLTxERD5DcmVhdGVzIGEgbmV3IDxDT0RFPk5vcm1hbEFubm90YXRpb248L0NPREU+LgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZS5odG1sI2NyZWF0ZU51bWJlckxpdGVyYWwob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVCwgamF2YS5sYW5nLlN0cmluZykiPjxCPmNyZWF0ZU51bWJlckxpdGVyYWwoQVNULCBTdHJpbmcpPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSI+QW5ub3RhdGlvbnNDb3JlPC9BPgotPEREPkNyZWF0ZXMgYSBuZXcgPENPREU+TnVtYmVyTGl0ZXJhbDwvQ09ERT4uCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlLmh0bWwjY3JlYXRlTnVtYmVyTWVtYmVyVmFsdWVQYWlyKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpIj48Qj5jcmVhdGVOdW1iZXJNZW1iZXJWYWx1ZVBhaXIoQVNULCBTdHJpbmcsIFN0cmluZyk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmUuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj5Bbm5vdGF0aW9uc0NvcmU8L0E+Ci08REQ+Q3JlYXRlcyBhIG5ldyA8Q09ERT5NZW1iZXJWYWx1ZVBhaXI8L0NPREU+IHdpdGggYSA8Q09ERT5OdW1iZXJMaXRlcmFsPC9DT0RFPiB2YWx1ZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCNjcmVhdGVSZW1vdmVBbm5vdGF0aW9uVGV4dEVkaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50LCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbikiPjxCPmNyZWF0ZVJlbW92ZUFubm90YXRpb25UZXh0RWRpdChJSmF2YUVsZW1lbnQsIEFubm90YXRpb24pPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscyI+QW5ub3RhdGlvblV0aWxzPC9BPgotPEREPkNyZWF0ZXMgYSA8Q09ERT5UZXh0RWRpdDwvQ09ERT4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmVtb3ZlIGFubm90YXRpb24gY2hhbmdlIHRvIHRoZSBzb3VyY2UgY29kZSBvZiB0aGUgamF2YSBlbGVtZW50cyBjb21waWxhdGlvbiB1bml0LgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sI2NyZWF0ZVJlbW92ZUltcG9ydFRleHRFZGl0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCwgamF2YS5sYW5nLlN0cmluZykiPjxCPmNyZWF0ZVJlbW92ZUltcG9ydFRleHRFZGl0KElKYXZhRWxlbWVudCwgU3RyaW5nKTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMiPkFubm90YXRpb25VdGlsczwvQT4KLTxERD5DcmVhdGVzIGEgPENPREU+VGV4dEVkaXQ8L0NPREU+IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHJlbW92ZSBpbXBvcnQgY2hhbmdlIHRvIHRoZSBzb3VyY2UgY29kZSBvZiB0aGUgamF2YSBlbGVtZW50cyBjb21waWxhdGlvbiB1bml0LgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sI2NyZWF0ZVJlbW92ZU1lbWJlclZhbHVlUGFpclRleHRFZGl0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyKSI+PEI+Y3JlYXRlUmVtb3ZlTWVtYmVyVmFsdWVQYWlyVGV4dEVkaXQoTm9ybWFsQW5ub3RhdGlvbiwgTWVtYmVyVmFsdWVQYWlyKTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMiPkFubm90YXRpb25VdGlsczwvQT4KLTxERD5DcmVhdGVzIGEgPENPREU+VGV4dEVkaXQ8L0NPREU+IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGNoYW5nZSBvZiByZW1vdmluZyB0aGUgPENPREU+TWVtYmVyVmFsdWVQYWlyPC9DT0RFPiBmcm9tIHRoZSA8Q09ERT5Ob3JtYWxBbm5vdGF0aW9uPC9DT0RFPi4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmUuaHRtbCNjcmVhdGVTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uKSI+PEI+Y3JlYXRlU2luZ2xlTWVtYmVyQW5ub3RhdGlvbihBU1QsIFN0cmluZywgRXhwcmVzc2lvbik8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmUuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj5Bbm5vdGF0aW9uc0NvcmU8L0E+Ci08REQ+Q3JlYXRlcyBhIG5ldyA8Q09ERT5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uPC9DT0RFPi4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmUuaHRtbCNjcmVhdGVTdHJpbmdMaXRlcmFsKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QsIGphdmEubGFuZy5TdHJpbmcpIj48Qj5jcmVhdGVTdHJpbmdMaXRlcmFsKEFTVCwgU3RyaW5nKTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPkFubm90YXRpb25zQ29yZTwvQT4KLTxERD5DcmVhdGVzIGEgbmV3IDxDT0RFPlN0cmluZ0xpdGVyYWw8L0NPREU+LgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZS5odG1sI2NyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNULCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKSI+PEI+Y3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKEFTVCwgU3RyaW5nLCBTdHJpbmcpPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSI+QW5ub3RhdGlvbnNDb3JlPC9BPgotPEREPkNyZWF0ZXMgYSBuZXcgPENPREU+TWVtYmVyVmFsdWVQYWlyPC9DT0RFPiB3aXRoIGEgPENPREU+U3RyaW5nTGl0ZXJhbDwvQ09ERT4gdmFsdWUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlLmh0bWwjY3JlYXRlVHlwZUxpdGVyYWwob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVCwgamF2YS5sYW5nLk9iamVjdCkiPjxCPmNyZWF0ZVR5cGVMaXRlcmFsKEFTVCwgT2JqZWN0KTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPkFubm90YXRpb25zQ29yZTwvQT4KLTxERD5DcmVhdGVzIGEgbmV3IDxDT0RFPlR5cGVMaXRlcmFsPC9DT0RFPi4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmUuaHRtbCNjcmVhdGVUeXBlTGl0ZXJhbChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNULCBqYXZhLmxhbmcuQ2xhc3MpIj48Qj5jcmVhdGVUeXBlTGl0ZXJhbChBU1QsIENsYXNzJmx0Oz8mZ3Q7KTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPkFubm90YXRpb25zQ29yZTwvQT4KLTxERD5DcmVhdGVzIGEgbmV3IDxDT0RFPlR5cGVMaXRlcmFsPC9DT0RFPi4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmUuaHRtbCNjcmVhdGVUeXBlTGl0ZXJhbChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNULCBqYXZhLmxhbmcuU3RyaW5nKSI+PEI+Y3JlYXRlVHlwZUxpdGVyYWwoQVNULCBTdHJpbmcpPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSI+QW5ub3RhdGlvbnNDb3JlPC9BPgotPEREPkNyZWF0ZXMgYSBuZXcgPENPREU+VHlwZUxpdGVyYWw8L0NPREU+Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlLmh0bWwjY3JlYXRlVHlwZU1lbWJlclZhbHVlUGFpcihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNULCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KSI+PEI+Y3JlYXRlVHlwZU1lbWJlclZhbHVlUGFpcihBU1QsIFN0cmluZywgT2JqZWN0KTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPkFubm90YXRpb25zQ29yZTwvQT4KLTxERD5DcmVhdGVzIGEgbmV3IDxDT0RFPk1lbWJlclZhbHVlUGFpcjwvQ09ERT4gd2l0aCBhIDxDT0RFPlR5cGVMaXRlcmFsPC9DT0RFPiB2YWx1ZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCNjcmVhdGVVcGRhdGVNZW1iZXJWYWx1ZVBhaXJUZXh0RWRpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZSkiPjxCPmNyZWF0ZVVwZGF0ZU1lbWJlclZhbHVlUGFpclRleHRFZGl0KE1lbWJlclZhbHVlUGFpciwgQVNUTm9kZSk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzIj5Bbm5vdGF0aW9uVXRpbHM8L0E+Ci08REQ+Q3JlYXRlcyBhIDxDT0RFPlRleHRFZGl0PC9DT0RFPiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjaGFuZ2Ugb2YgdXBkYXRpbmcgdGhlIDxDT0RFPk1lbWJlclZhbHVlUGFpcjwvQ09ERT4gd2l0aCB0aGUgPENPREU+QVNUTm9kZTwvQ09ERT4gdmFsdWUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwjY3JlYXRlVXBkYXRlU2luZ2xlTWVtYmVyQW5ub3RhdGlvblRleHRFZGl0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZSkiPjxCPmNyZWF0ZVVwZGF0ZVNpbmdsZU1lbWJlckFubm90YXRpb25UZXh0RWRpdChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uLCBBU1ROb2RlKTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMiPkFubm90YXRpb25VdGlsczwvQT4KLTxERD5DcmVhdGVzIGEgPENPREU+VGV4dEVkaXQ8L0NPREU+IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGNoYW5nZSBvZiB1cGRhdGluZyB0aGUgPENPREU+U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjwvQ09ERT4gd2l0aCB0aGUgPENPREU+QVNUTm9kZTwvQ09ERT4gdmFsdWUuCi08L0RMPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5JbmRleDwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMS5odG1sIj48Qj5QUkVWIExFVFRFUjwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0zLmh0bWwiPjxCPk5FWFQgTEVUVEVSPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uL2luZGV4Lmh0bWw/aW5kZXgtZmlsZXNpbmRleC0yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxBIEhSRUY9ImluZGV4LTEuaHRtbCI+QTwvQT4gPEEgSFJFRj0iaW5kZXgtMi5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC0zLmh0bWwiPkQ8L0E+IDxBIEhSRUY9ImluZGV4LTQuaHRtbCI+RTwvQT4gPEEgSFJFRj0iaW5kZXgtNS5odG1sIj5GPC9BPiA8QSBIUkVGPSJpbmRleC02Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTcuaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtOC5odG1sIj5KPC9BPiA8QSBIUkVGPSJpbmRleC05Lmh0bWwiPkw8L0E+IDxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPk08L0E+IDxBIEhSRUY9ImluZGV4LTExLmh0bWwiPk88L0E+IDxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPlA8L0E+IDxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPlI8L0E+IDxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPlM8L0E+IDxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPlU8L0E+IDxBIEhSRUY9ImluZGV4LTE2Lmh0bWwiPlY8L0E+IDxBIEhSRUY9ImluZGV4LTE3Lmh0bWwiPlc8L0E+IDxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2luZGV4LWZpbGVzL2luZGV4LTMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9pbmRleC1maWxlcy9pbmRleC0zLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYmEzN2YuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2luZGV4LWZpbGVzL2luZGV4LTMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMTQpIG9uIFdlZCBBcHIgMDcgMDc6NDY6MjMgQlNUIDIwMTAgLS0+Ci08VElUTEU+Ci1ELUluZGV4Ci08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDEwLTA0LTA3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iRC1JbmRleCI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9ImluZGV4LTIuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNC5odG1sIj48Qj5ORVhUIExFVFRFUjwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi9pbmRleC5odG1sP2luZGV4LWZpbGVzaW5kZXgtMy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5EPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+RjwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5HPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPkk8L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+SjwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5NPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5QPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5VPC9BPiA8QSBIUkVGPSJpbmRleC0xNi5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNy5odG1sIj5XPC9BPiA8SFI+Ci08QSBOQU1FPSJfRF8iPjwhLS0gLS0+PC9BPjxIMj4KLTxCPkQ8L0I+PC9IMj4KLTxETD4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9EZWZhdWx0c0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24iPjxCPkRlZmF1bHRzQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9CPjwvQT4gLSBDbGFzcyBpbiA8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb248L0E+PEREPkNvbnN0cnVjdHMgPENPREU+TWVtYmVyVmFsdWVQYWlyPC9DT0RFPiBmcm9tIHRoZSBkZWZhdWx0cyBmb3VuZCBpbiB0aGUgZ2l2ZW4gPENPREU+QW5ub3RhdGlvbjwvQ09ERT4uPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0RlZmF1bHRzQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwjRGVmYXVsdHNBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIoKSI+PEI+RGVmYXVsdHNBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIoKTwvQj48L0E+IC0gCi1Db25zdHJ1Y3RvciBmb3IgY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24uPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vRGVmYXVsdHNBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uIj5EZWZhdWx0c0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjwvQT4KLTxERD4mbmJzcDsKLTwvREw+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0yLmh0bWwiPjxCPlBSRVYgTEVUVEVSPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTQuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0zLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEEgSFJFRj0iaW5kZXgtMS5odG1sIj5BPC9BPiA8QSBIUkVGPSJpbmRleC0yLmh0bWwiPkM8L0E+IDxBIEhSRUY9ImluZGV4LTMuaHRtbCI+RDwvQT4gPEEgSFJFRj0iaW5kZXgtNC5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC01Lmh0bWwiPkY8L0E+IDxBIEhSRUY9ImluZGV4LTYuaHRtbCI+RzwvQT4gPEEgSFJFRj0iaW5kZXgtNy5odG1sIj5JPC9BPiA8QSBIUkVGPSJpbmRleC04Lmh0bWwiPko8L0E+IDxBIEhSRUY9ImluZGV4LTkuaHRtbCI+TDwvQT4gPEEgSFJFRj0iaW5kZXgtMTAuaHRtbCI+TTwvQT4gPEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+UDwvQT4gPEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+UjwvQT4gPEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+UzwvQT4gPEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+VTwvQT4gPEEgSFJFRj0iaW5kZXgtMTYuaHRtbCI+VjwvQT4gPEEgSFJFRj0iaW5kZXgtMTcuaHRtbCI+VzwvQT4gPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvaW5kZXgtZmlsZXMvaW5kZXgtNC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2luZGV4LWZpbGVzL2luZGV4LTQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI4MGNkNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvaW5kZXgtZmlsZXMvaW5kZXgtNC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8xNCkgb24gV2VkIEFwciAwNyAwNzo0NjoyMyBCU1QgMjAxMCAtLT4KLTxUSVRMRT4KLUUtSW5kZXgKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTAtMDQtMDciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJFLUluZGV4IjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5JbmRleDwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMy5odG1sIj48Qj5QUkVWIExFVFRFUjwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC01Lmh0bWwiPjxCPk5FWFQgTEVUVEVSPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uL2luZGV4Lmh0bWw/aW5kZXgtZmlsZXNpbmRleC00Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxBIEhSRUY9ImluZGV4LTEuaHRtbCI+QTwvQT4gPEEgSFJFRj0iaW5kZXgtMi5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC0zLmh0bWwiPkQ8L0E+IDxBIEhSRUY9ImluZGV4LTQuaHRtbCI+RTwvQT4gPEEgSFJFRj0iaW5kZXgtNS5odG1sIj5GPC9BPiA8QSBIUkVGPSJpbmRleC02Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTcuaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtOC5odG1sIj5KPC9BPiA8QSBIUkVGPSJpbmRleC05Lmh0bWwiPkw8L0E+IDxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPk08L0E+IDxBIEhSRUY9ImluZGV4LTExLmh0bWwiPk88L0E+IDxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPlA8L0E+IDxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPlI8L0E+IDxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPlM8L0E+IDxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPlU8L0E+IDxBIEhSRUY9ImluZGV4LTE2Lmh0bWwiPlY8L0E+IDxBIEhSRUY9ImluZGV4LTE3Lmh0bWwiPlc8L0E+IDxIUj4KLTxBIE5BTUU9Il9FXyI+PCEtLSAtLT48L0E+PEgyPgotPEI+RTwvQj48L0gyPgotPERMPgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IuaHRtbCNlbnZpcm9ubWVudCI+PEI+ZW52aXJvbm1lbnQ8L0I+PC9BPiAtIAotVmFyaWFibGUgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3NvciI+QWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yPC9BPgotPEREPiZuYnNwOwotPC9ETD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9ImluZGV4LTMuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNS5odG1sIj48Qj5ORVhUIExFVFRFUjwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi9pbmRleC5odG1sP2luZGV4LWZpbGVzaW5kZXgtNC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5EPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+RjwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5HPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPkk8L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+SjwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5NPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5QPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5VPC9BPiA8QSBIUkVGPSJpbmRleC0xNi5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNy5odG1sIj5XPC9BPiA8SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9pbmRleC1maWxlcy9pbmRleC01Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvaW5kZXgtZmlsZXMvaW5kZXgtNS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODk0ZTc4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9pbmRleC1maWxlcy9pbmRleC01Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjQ2OjIzIEJTVCAyMDEwIC0tPgotPFRJVExFPgotRi1JbmRleAotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMC0wNC0wNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IkYtSW5kZXgiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC00Lmh0bWwiPjxCPlBSRVYgTEVUVEVSPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTYuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC01Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEEgSFJFRj0iaW5kZXgtMS5odG1sIj5BPC9BPiA8QSBIUkVGPSJpbmRleC0yLmh0bWwiPkM8L0E+IDxBIEhSRUY9ImluZGV4LTMuaHRtbCI+RDwvQT4gPEEgSFJFRj0iaW5kZXgtNC5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC01Lmh0bWwiPkY8L0E+IDxBIEhSRUY9ImluZGV4LTYuaHRtbCI+RzwvQT4gPEEgSFJFRj0iaW5kZXgtNy5odG1sIj5JPC9BPiA8QSBIUkVGPSJpbmRleC04Lmh0bWwiPko8L0E+IDxBIEhSRUY9ImluZGV4LTkuaHRtbCI+TDwvQT4gPEEgSFJFRj0iaW5kZXgtMTAuaHRtbCI+TTwvQT4gPEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+UDwvQT4gPEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+UjwvQT4gPEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+UzwvQT4gPEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+VTwvQT4gPEEgSFJFRj0iaW5kZXgtMTYuaHRtbCI+VjwvQT4gPEEgSFJFRj0iaW5kZXgtMTcuaHRtbCI+VzwvQT4gPEhSPgotPEEgTkFNRT0iX0ZfIj48IS0tIC0tPjwvQT48SDI+Ci08Qj5GPC9CPjwvSDI+Ci08REw+Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvSkRUVXRpbHMuaHRtbCNmaW5kVHlwZShvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3QsIGphdmEubGFuZy5TdHJpbmcpIj48Qj5maW5kVHlwZShJSmF2YVByb2plY3QsIFN0cmluZyk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9KRFRVdGlscy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMiPkpEVFV0aWxzPC9BPgotPEREPlJldHVybnMgdGhlIGZpcnN0IHR5cGUgZm91bmQgZm9sbG93aW5nIHRoZSBnaXZlbiBqYXZhIHByb2plY3QncyBjbGFzc3BhdGggd2l0aCB0aGUgZ2l2ZW4gZnVsbHkgcXVhbGlmaWVkIG5hbWUgb3IgbnVsbCBpZiBub25lIGlzIGZvdW5kLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL0pEVFV0aWxzLmh0bWwjZmluZFR5cGUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykiPjxCPmZpbmRUeXBlKFN0cmluZywgU3RyaW5nKTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL0pEVFV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscyI+SkRUVXRpbHM8L0E+Ci08REQ+UmV0dXJucyB0aGUgZmlyc3QgdHlwZSBmb3VuZCB3aXRoIHRoZSBnaXZlbiBmdWxseSBxdWFsaWZpZWQgbmFtZSBmb2xsb3dpbmcgdGhlIGNsYXNzcGF0aCBvZiB0aGUgamF2YSBwcm9qZWN0IHdpdGgKLSB0aGUgZ2l2ZSBwcm9qZWN0IG5hbWUgb3IgbnVsbCBpZiBub25lIGlzIGZvdW5kLgotPC9ETD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9ImluZGV4LTQuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNi5odG1sIj48Qj5ORVhUIExFVFRFUjwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi9pbmRleC5odG1sP2luZGV4LWZpbGVzaW5kZXgtNS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5EPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+RjwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5HPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPkk8L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+SjwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5NPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5QPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5VPC9BPiA8QSBIUkVGPSJpbmRleC0xNi5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNy5odG1sIj5XPC9BPiA8SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9pbmRleC1maWxlcy9pbmRleC02Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvaW5kZXgtZmlsZXMvaW5kZXgtNi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2M5NDliLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9pbmRleC1maWxlcy9pbmRleC02Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNDggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjQ2OjIzIEJTVCAyMDEwIC0tPgotPFRJVExFPgotRy1JbmRleAotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMC0wNC0wNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IkctSW5kZXgiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC01Lmh0bWwiPjxCPlBSRVYgTEVUVEVSPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTcuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTYuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC02Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEEgSFJFRj0iaW5kZXgtMS5odG1sIj5BPC9BPiA8QSBIUkVGPSJpbmRleC0yLmh0bWwiPkM8L0E+IDxBIEhSRUY9ImluZGV4LTMuaHRtbCI+RDwvQT4gPEEgSFJFRj0iaW5kZXgtNC5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC01Lmh0bWwiPkY8L0E+IDxBIEhSRUY9ImluZGV4LTYuaHRtbCI+RzwvQT4gPEEgSFJFRj0iaW5kZXgtNy5odG1sIj5JPC9BPiA8QSBIUkVGPSJpbmRleC04Lmh0bWwiPko8L0E+IDxBIEhSRUY9ImluZGV4LTkuaHRtbCI+TDwvQT4gPEEgSFJFRj0iaW5kZXgtMTAuaHRtbCI+TTwvQT4gPEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+UDwvQT4gPEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+UjwvQT4gPEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+UzwvQT4gPEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+VTwvQT4gPEEgSFJFRj0iaW5kZXgtMTYuaHRtbCI+VjwvQT4gPEEgSFJFRj0iaW5kZXgtMTcuaHRtbCI+VzwvQT4gPEhSPgotPEEgTkFNRT0iX0dfIj48IS0tIC0tPjwvQT48SDI+Ci08Qj5HPC9CPjwvSDI+Ci08REw+Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwjZ2V0QW5ub3RhdGlvbihvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQsIGphdmEubGFuZy5DbGFzcykiPjxCPmdldEFubm90YXRpb24oSUphdmFFbGVtZW50LCBDbGFzcyZsdDs/IGV4dGVuZHMgQW5ub3RhdGlvbiZndDspPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscyI+QW5ub3RhdGlvblV0aWxzPC9BPgotPEREPlJldHVybnMgdGhlIEFTVCA8Q09ERT5Bbm5vdGF0aW9uPC9DT0RFPiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiA8Q09ERT5Bbm5vdGF0aW9uPC9DT0RFPiBjbGFzcwotIG9uIHRoZSA8Q09ERT5JSmF2YUVsZW1lbnQ8L0NPREU+LgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sI2dldEFubm90YXRpb24oY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uRGVjbGFyYXRpb24sIGphdmEubGFuZy5DbGFzcykiPjxCPmdldEFubm90YXRpb24oRGVjbGFyYXRpb24sIENsYXNzJmx0Oz8gZXh0ZW5kcyBBbm5vdGF0aW9uJmd0Oyk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzIj5Bbm5vdGF0aW9uVXRpbHM8L0E+Ci08REQ+UmV0dXJucyB0aGUgPENPREU+QW5ub3RhdGlvbk1pcnJvcjwvQ09ERT4gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4gPENPREU+QW5ub3RhdGlvbjwvQ09ERT4gY2xhc3MKLSBvbiB0aGUgPENPREU+RGVjbGFyYXRpb248L0NPREU+LgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sI2dldEFubm90YXRpb24oamF2YS5sYW5nLkNsYXNzLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGFibGUpIj48Qj5nZXRBbm5vdGF0aW9uKENsYXNzJmx0Oz8gZXh0ZW5kcyBBbm5vdGF0aW9uJmd0OywgSUFubm90YXRhYmxlKTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMiPkFubm90YXRpb25VdGlsczwvQT4KLTxERD5SZXR1cm5zIHRoZSBKRFQgPENPREU+SUFubm90YXRpb248L0NPREU+IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIDxDT0RFPkFubm90YXRpb248L0NPREU+IGNsYXNzCi0gb24gdGhlIDxDT0RFPklBbm5vdGF0YWJsZTwvQ09ERT4gZWxlbWVudC4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uRGVmaW5pdGlvbi5odG1sI2dldEFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcigpIj48Qj5nZXRBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj5Bbm5vdGF0aW9uRGVmaW5pdGlvbjwvQT4KLTxERD5SZXR1cm5zIHRoZSBhbm5vdGF0aW9ucyBhdHRyaWJ1dGUgaW5pdGlhbGl6ZXIgYXMgc3BlY2lmaWVkIGluIHRoZQotIDxjb2RlPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25Jbml0aWFsaXplcjwvY29kZT4gZXh0ZW5zaW9uIHBvaW50IG9yIG51bGwgaWYgbm8KLSBpbml0aWFsaXplciBjYW4gYmUgZm91bmQuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNNYW5hZ2VyLmh0bWwjZ2V0QW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyRm9yTmFtZShvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZSkiPjxCPmdldEFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplckZvck5hbWUoTmFtZSk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc01hbmFnZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj5Bbm5vdGF0aW9uc01hbmFnZXI8L0E+Ci08REQ+UmV0dXJucyB0aGUgPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uIj48Q09ERT5JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9DT0RFPjwvQT4gZm9yIHRoZSBnaXZlbiA8Q09ERT5OYW1lPC9DT0RFPgotIG9yIG51bGwgaWYgbm9uZSBjYW4gYmUgZm91bmQuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNNYW5hZ2VyLmh0bWwjZ2V0QW5ub3RhdGlvbkNhdGVnb3JpZXMoKSI+PEI+Z2V0QW5ub3RhdGlvbkNhdGVnb3JpZXMoKTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zTWFuYWdlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPkFubm90YXRpb25zTWFuYWdlcjwvQT4KLTxERD5SZXR1cm5zIGEgbGlzdCBvZiB0aGUgYW5ub3RhdGlvbiBjYXRlZ29yaWVzLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25EZWZpbml0aW9uLmh0bWwjZ2V0QW5ub3RhdGlvbkNsYXNzKCkiPjxCPmdldEFubm90YXRpb25DbGFzcygpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uRGVmaW5pdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPkFubm90YXRpb25EZWZpbml0aW9uPC9BPgotPEREPlJldHVybnMgdGhlIGFubm90YXRpb24gY2xhc3MgYXMgc3BlY2lmaWVkIGJ5IHRoZSA8Y29kZT5jbGFzczwvY29kZT4gYXR0cmlidXRlIG9mIHRoZQotIDxjb2RlPmFubm90YXRpb248YW5ub3RhdGlvbj4gZWxlbWVudCBpbiB0aGUgPGNvZGU+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkRlZmluaXRpb248L2NvZGU+Ci0gZXh0ZW5zaW9uIHBvaW50LgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25EZWZpbml0aW9uLmh0bWwjZ2V0QW5ub3RhdGlvbkNsYXNzTmFtZSgpIj48Qj5nZXRBbm5vdGF0aW9uQ2xhc3NOYW1lKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25EZWZpbml0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSI+QW5ub3RhdGlvbkRlZmluaXRpb248L0E+Ci08REQ+UmV0dXJucyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGFubm90YXRpb24uCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNNYW5hZ2VyLmh0bWwjZ2V0QW5ub3RhdGlvbkRlZmluaXRpb25Gb3JDbGFzcyhqYXZhLmxhbmcuQ2xhc3MpIj48Qj5nZXRBbm5vdGF0aW9uRGVmaW5pdGlvbkZvckNsYXNzKENsYXNzJmx0Oz8gZXh0ZW5kcyBBbm5vdGF0aW9uJmd0Oyk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc01hbmFnZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj5Bbm5vdGF0aW9uc01hbmFnZXI8L0E+Ci08REQ+UmV0dXJucyB0aGUgPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj48Q09ERT5Bbm5vdGF0aW9uRGVmaW5pdGlvbjwvQ09ERT48L0E+IGZvciB0aGUgZ2l2ZW4gPENPREU+QW5ub3RhdGlvbjwvQ09ERT4gY2xhc3MKLSBvciBudWxsIGlmIG5vIGFubm90YXRpb24gZGVmaW5pdGlvbiBjYW4gYmUgZm91bmQuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNNYW5hZ2VyLmh0bWwjZ2V0QW5ub3RhdGlvbkRlZmluaXRpb25Gb3JDbGFzcyhqYXZhLmxhbmcuU3RyaW5nKSI+PEI+Z2V0QW5ub3RhdGlvbkRlZmluaXRpb25Gb3JDbGFzcyhTdHJpbmcpPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNNYW5hZ2VyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSI+QW5ub3RhdGlvbnNNYW5hZ2VyPC9BPgotPEREPlJldHVybnMgdGhlIDxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25EZWZpbml0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSI+PENPREU+QW5ub3RhdGlvbkRlZmluaXRpb248L0NPREU+PC9BPiBmb3IgdGhlIGdpdmVuIGZ1bGx5IHF1YWxpZmllZCA8Q09ERT5Bbm5vdGF0aW9uPC9DT0RFPiBjbGFzcwotIG5hbWUgb3IgbnVsbCBpZiBubyBhbm5vdGF0aW9uIGRlZmluaXRpb24gY2FuIGJlIGZvdW5kLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zTWFuYWdlci5odG1sI2dldEFubm90YXRpb25Jbml0aWFsaXplckNhY2hlKCkiPjxCPmdldEFubm90YXRpb25Jbml0aWFsaXplckNhY2hlKCk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc01hbmFnZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj5Bbm5vdGF0aW9uc01hbmFnZXI8L0E+Ci08REQ+Jm5ic3A7Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwjZ2V0QW5ub3RhdGlvbk5hbWUob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24pIj48Qj5nZXRBbm5vdGF0aW9uTmFtZShBbm5vdGF0aW9uKTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMiPkFubm90YXRpb25VdGlsczwvQT4KLTxERD5SZXR1cm5zIHRoZSBhbm5vdGF0aW9ucyB0eXBlIG5hbWUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNNYW5hZ2VyLmh0bWwjZ2V0QW5ub3RhdGlvblByb2Nlc3NvcnNDYWNoZSgpIj48Qj5nZXRBbm5vdGF0aW9uUHJvY2Vzc29yc0NhY2hlKCk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc01hbmFnZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj5Bbm5vdGF0aW9uc01hbmFnZXI8L0E+Ci08REQ+Jm5ic3A7Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNNYW5hZ2VyLmh0bWwjZ2V0QW5ub3RhdGlvbnMoKSI+PEI+Z2V0QW5ub3RhdGlvbnMoKTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zTWFuYWdlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPkFubm90YXRpb25zTWFuYWdlcjwvQT4KLTxERD5SZXR1cm5zIGEgbGlzdCBvZiA8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uRGVmaW5pdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPjxDT0RFPkFubm90YXRpb25EZWZpbml0aW9uPC9DT0RFPjwvQT4gY29uc3RydWN0ZWQgZnJvbSBjb250cmlidXRpb25zIHRvIHRoZQotIDxjb2RlPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25EZWZpbml0aW9uPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNNYW5hZ2VyLmh0bWwjZ2V0QW5ub3RhdGlvbnMob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50KSI+PEI+Z2V0QW5ub3RhdGlvbnMoSUphdmFFbGVtZW50KTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zTWFuYWdlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPkFubm90YXRpb25zTWFuYWdlcjwvQT4KLTxERD5SZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhlIGNvbnRyaWJ1dGVkIDxDT0RFPkFubm90YXRpb248L0NPREU+IHRoYXQgdGFyZ2V0IHRoZSBnaXZlbiBqYXZhIGVsZW1lbnQgdHlwZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCNnZXRBbm5vdGF0aW9ucyhvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQpIj48Qj5nZXRBbm5vdGF0aW9ucyhJSmF2YUVsZW1lbnQpPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscyI+QW5ub3RhdGlvblV0aWxzPC9BPgotPEREPlJldHVybnMgYSBsaXN0IG9mIGFsbCB0aGUgPENPREU+QW5ub3RhdGlvbjwvQ09ERT4gdGhhdCBhcmUgcHJlc2VudCBvbiB0aGUgZ2l2ZW4gPENPREU+SUphdmFFbGVtZW50PC9DT0RFPgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zTWFuYWdlci5odG1sI2dldEFubm90YXRpb25zQnlDYXRlZ29yeShqYXZhLmxhbmcuU3RyaW5nKSI+PEI+Z2V0QW5ub3RhdGlvbnNCeUNhdGVnb3J5KFN0cmluZyk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc01hbmFnZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj5Bbm5vdGF0aW9uc01hbmFnZXI8L0E+Ci08REQ+UmV0dXJucyBhIGxpc3Qgb2YgYWxsIHRoZSA8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uRGVmaW5pdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPjxDT0RFPkFubm90YXRpb25EZWZpbml0aW9uPC9DT0RFPjwvQT4gd2l0aCB0aGUgZ2l2ZW4gYW5ub3RhdGlvbiBjYXRlZ29yeSBuYW1lLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sI2dldEFubm90YXRpb25WYWx1ZShjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yLCBqYXZhLmxhbmcuU3RyaW5nKSI+PEI+Z2V0QW5ub3RhdGlvblZhbHVlKEFubm90YXRpb25NaXJyb3IsIFN0cmluZyk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzIj5Bbm5vdGF0aW9uVXRpbHM8L0E+Ci08REQ+UmV0dXJucyB0aGUgPENPREU+QW5ub3RhdGlvblZhbHVlPC9DT0RFPiB3aXRoIHRoZSBnaXZlbiBtZW1iZXIgbmFtZSB0aGF0IGlzIGRlY2xhcmVkIHdpdGhpbiB0aGUgPENPREU+QW5ub3RhdGlvbk1pcnJvcjwvQ09ERT4uCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwjZ2V0QW5ub3RhdGlvblZhbHVlKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uLCBqYXZhLmxhbmcuU3RyaW5nKSI+PEI+Z2V0QW5ub3RhdGlvblZhbHVlKE5vcm1hbEFubm90YXRpb24sIFN0cmluZyk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzIj5Bbm5vdGF0aW9uVXRpbHM8L0E+Ci08REQ+UmV0dXJucyB0aGUgPENPREU+Tm9ybWFsQW5ub3RhdGlvbjwvQ09ERT4gbWVtYmVyIHZhbHVlIHBhaXIgdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gbWVtYmVyIG5hbWUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwjZ2V0QW5ub3RhdGlvblZhbHVlKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uLCBqYXZhLmxhbmcuU3RyaW5nKSI+PEI+Z2V0QW5ub3RhdGlvblZhbHVlKElBbm5vdGF0aW9uLCBTdHJpbmcpPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscyI+QW5ub3RhdGlvblV0aWxzPC9BPgotPEREPlJldHVybnMgdGhlIEpEVCA8Q09ERT5JQW5ub3RhdGlvbjwvQ09ERT4gbWVtYmVyIHZhbHVlIHBhaXIgdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gbWVtYmVyIG5hbWUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNNYW5hZ2VyLmh0bWwjZ2V0QXR0cmlidXRlVmFsdWUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCwgamF2YS5sYW5nLlN0cmluZykiPjxCPmdldEF0dHJpYnV0ZVZhbHVlKElDb25maWd1cmF0aW9uRWxlbWVudCwgU3RyaW5nKTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zTWFuYWdlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPkFubm90YXRpb25zTWFuYWdlcjwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCNnZXRCb29sZWFuVmFsdWUoY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvbk1pcnJvciwgamF2YS5sYW5nLlN0cmluZykiPjxCPmdldEJvb2xlYW5WYWx1ZShBbm5vdGF0aW9uTWlycm9yLCBTdHJpbmcpPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscyI+QW5ub3RhdGlvblV0aWxzPC9BPgotPEREPlJldHVybnMgdGhlIG1lbWJlciB2YWx1ZSB3aXRoIHRoZSBnaXZlbiBtZW1iZXIgbmFtZSBmcm9tIHRoZSA8Q09ERT5Bbm5vdGF0aW9uTWlycm9yPC9DT0RFPiBhcyBhIDxDT0RFPkJvb2xlYW48L0NPREU+IHZhbHVlLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sI2dldEJvb2xlYW5WYWx1ZShvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiwgamF2YS5sYW5nLlN0cmluZykiPjxCPmdldEJvb2xlYW5WYWx1ZShBbm5vdGF0aW9uLCBTdHJpbmcpPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscyI+QW5ub3RhdGlvblV0aWxzPC9BPgotPEREPlJldHVybnMgdGhlIG1lbWJlciB2YWx1ZSB3aXRoIHRoZSBnaXZlbiBtZW1iZXIgbmFtZSBmcm9tIHRoZSA8Q09ERT5Bbm5vdGF0aW9uPC9DT0RFPiBhcyBhIDxDT0RFPkJvb2xlYW48L0NPREU+IHZhbHVlLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sI2dldEJvb2xlYW5WYWx1ZShvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbiwgamF2YS5sYW5nLlN0cmluZykiPjxCPmdldEJvb2xlYW5WYWx1ZShJQW5ub3RhdGlvbiwgU3RyaW5nKTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMiPkFubm90YXRpb25VdGlsczwvQT4KLTxERD5SZXR1cm5zIHRoZSAgbWVtYmVyIHZhbHVlIHdpdGggdGhlIGdpdmVuIG1lbWJlciBuYW1lIGZyb20gdGhlIDxDT0RFPklBbm5vdGF0aW9uPC9DT0RFPiBhcyBhIDxDT0RFPkJvb2xlYW48L0NPREU+IHZhbHVlLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25EZWZpbml0aW9uLmh0bWwjZ2V0Q2F0ZWdvcnkoKSI+PEI+Z2V0Q2F0ZWdvcnkoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj5Bbm5vdGF0aW9uRGVmaW5pdGlvbjwvQT4KLTxERD5SZXR1cm5zIHRoZSBjYXRlZ29yeSB0aGUgYW5ub3RhdGlvbiBiZWxvbmdzIHRvLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sI2dldENvbXBpbGF0aW9uVW5pdEZyb21KYXZhRWxlbWVudChvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQpIj48Qj5nZXRDb21waWxhdGlvblVuaXRGcm9tSmF2YUVsZW1lbnQoSUphdmFFbGVtZW50KTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMiPkFubm90YXRpb25VdGlsczwvQT4KLTxERD5SZXR1cm5zIGEgPENPREU+SUNvbXBpbGF0aW9uVW5pdDwvQ09ERT4gZm9yIHRoZSBnaXZlbiA8Q09ERT5JSmF2YUVsZW1lbnQ8L0NPREU+LgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sI2dldENvbXBsZXRpb25Qcm9wb3NhbHNGb3JNZW1iZXJWYWx1ZVBhaXIob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50LCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyKSI+PEI+Z2V0Q29tcGxldGlvblByb3Bvc2Fsc0Zvck1lbWJlclZhbHVlUGFpcihJSmF2YUVsZW1lbnQsIE1lbWJlclZhbHVlUGFpcik8L0I+PC9BPiAtIAotTWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24iPkFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwjZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0Zvck1lbWJlclZhbHVlUGFpcihvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXIpIj48Qj5nZXRDb21wbGV0aW9uUHJvcG9zYWxzRm9yTWVtYmVyVmFsdWVQYWlyKElKYXZhRWxlbWVudCwgTWVtYmVyVmFsdWVQYWlyKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0lBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbiI+SUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjwvQT4KLTxERD5Vc2VkIHRvIHByb3ZpZGUgYSBsaXN0IG9mIDxDT0RFPklDb21wbGV0aW9uUHJvcG9zYWw8L0NPREU+IGZvciBhIDxDT0RFPk1lbWJlclZhbHVlUGFpcjwvQ09ERT4gdmFsdWUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwjZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0ZvclNpbmdsZU1lbWJlckFubm90YXRpb24ob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50LCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikiPjxCPmdldENvbXBsZXRpb25Qcm9wb3NhbHNGb3JTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKElKYXZhRWxlbWVudCwgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbik8L0I+PC9BPiAtIAotTWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24iPkFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwjZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0ZvclNpbmdsZU1lbWJlckFubm90YXRpb24ob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50LCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikiPjxCPmdldENvbXBsZXRpb25Qcm9wb3NhbHNGb3JTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKElKYXZhRWxlbWVudCwgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbik8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbi48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24iPklBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI8L0E+Ci08REQ+VXNlZCB0byBwcm92aWRlIGEgbGlzdCBvZiA8Q09ERT5JQ29tcGxldGlvblByb3Bvc2FsPC9DT0RFPiBmb3IgYSA8Q09ERT5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uPC9DT0RFPiB2YWx1ZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmVQbHVnaW4uaHRtbCNnZXREZWZhdWx0KCkiPjxCPmdldERlZmF1bHQoKTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZVBsdWdpbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPkFubm90YXRpb25zQ29yZVBsdWdpbjwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9XU0RMVXRpbHMuaHRtbCNnZXRFbmRwb2ludEFkZHJlc3MoamF2YXgud3NkbC5EZWZpbml0aW9uKSI+PEI+Z2V0RW5kcG9pbnRBZGRyZXNzKERlZmluaXRpb24pPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvV1NETFV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscyI+V1NETFV0aWxzPC9BPgotPEREPlJldHVybnMgdGhlIGZpcnN0IDxjb2RlPlNPQVBBZGRyZXNzPC9jb2RlPiBvciA8Y29kZT5TT0FQMTJBZGRyZXNzPC9jb2RlPiBmb3VuZCBpbiB0aGUgZ2l2ZW4KLSA8Y29kZT5EZWZpbml0aW9uPC9jb2RlPiBvciBudWxsIGlmIG5vbmUgaXMgZm91bmQuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwjZ2V0RW51bVZhbHVlKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uLCBqYXZhLmxhbmcuU3RyaW5nKSI+PEI+Z2V0RW51bVZhbHVlKEFubm90YXRpb24sIFN0cmluZyk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzIj5Bbm5vdGF0aW9uVXRpbHM8L0E+Ci08REQ+UmV0dXJucyB0aGUgbWVtYmVyIHZhbHVlIHdpdGggdGhlIGdpdmVuIG1lbWJlciBuYW1lIGZyb20gdGhlIDxDT0RFPkFubm90YXRpb248L0NPREU+IGFzIGEgPENPREU+U3RyaW5nPC9DT0RFPiB2YWx1ZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCNnZXRFbnVtVmFsdWUob3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb24sIGphdmEubGFuZy5TdHJpbmcpIj48Qj5nZXRFbnVtVmFsdWUoSUFubm90YXRpb24sIFN0cmluZyk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzIj5Bbm5vdGF0aW9uVXRpbHM8L0E+Ci08REQ+UmV0dXJucyB0aGUgbWVtYmVyIHZhbHVlIHdpdGggdGhlIGdpdmVuIG1lbWJlciBuYW1lIGZyb20gdGhlIDxDT0RFPklBbm5vdGF0aW9uPC9DT0RFPiBhcyBhIDxDT0RFPlN0cmluZzwvQ09ERT4gdmFsdWUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwjZ2V0RmllbGREZWNsYXJhdGlvbihvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQpIj48Qj5nZXRGaWVsZERlY2xhcmF0aW9uKElGaWVsZCk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzIj5Bbm5vdGF0aW9uVXRpbHM8L0E+Ci08REQ+UmV0dXJucyB0aGUgPENPREU+RmllbGREZWNsYXJhdGlvbjwvQ09ERT4gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4gPENPREU+SUZpZWxkPC9DT0RFPi4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9KRFRVdGlscy5odG1sI2dldEphdmFQcm9qZWN0KGphdmEubGFuZy5TdHJpbmcpIj48Qj5nZXRKYXZhUHJvamVjdChTdHJpbmcpPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvSkRUVXRpbHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzIj5KRFRVdGlsczwvQT4KLTxERD5SZXR1cm5zIHRoZSBKYXZhIHByb2plY3QgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gcHJvamVjdCBuYW1lLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL0pEVFV0aWxzLmh0bWwjZ2V0SmF2YVByb2plY3RPdXRwdXREaXJlY3RvcnlQYXRoKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdCkiPjxCPmdldEphdmFQcm9qZWN0T3V0cHV0RGlyZWN0b3J5UGF0aChJSmF2YVByb2plY3QpPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvSkRUVXRpbHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzIj5KRFRVdGlsczwvQT4KLTxERD5SZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIGluIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSBvZiB0aGUgZGVmYXVsdCBvdXRwdXQgbG9jYXRpb24gZm9yIHRoZSBnaXZlbiBqYXZhIHByb2plY3QuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvSkRUVXRpbHMuaHRtbCNnZXRKYXZhUHJvamVjdE91dHB1dERpcmVjdG9yeVBhdGgoamF2YS5sYW5nLlN0cmluZykiPjxCPmdldEphdmFQcm9qZWN0T3V0cHV0RGlyZWN0b3J5UGF0aChTdHJpbmcpPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvSkRUVXRpbHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzIj5KRFRVdGlsczwvQT4KLTxERD5SZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIGluIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSBvZiB0aGUgZGVmYXVsdCBvdXRwdXQgbG9jYXRpb24gZm9yIHRoZSBnaXZlbiBqYXZhIHByb2plY3QgbmFtZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9KRFRVdGlscy5odG1sI2dldEphdmFQcm9qZWN0U291cmNlRGlyZWN0b3J5UGF0aChvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZSkiPjxCPmdldEphdmFQcm9qZWN0U291cmNlRGlyZWN0b3J5UGF0aChJVHlwZSk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9KRFRVdGlscy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMiPkpEVFV0aWxzPC9BPgotPEREPlJldHVybnMgdGhlIGZ1bGwsIGFic29sdXRlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHdvcmtzcGFjZSBvZiB0aGUgc291cmNlIGZvbGRlciB0aGF0IGNvbnRhaW5zIHRoZSBnaXZlbiB0eXBlLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL0pEVFV0aWxzLmh0bWwjZ2V0SmF2YVByb2plY3RTb3VyY2VEaXJlY3RvcnlQYXRoKGphdmEubGFuZy5TdHJpbmcpIj48Qj5nZXRKYXZhUHJvamVjdFNvdXJjZURpcmVjdG9yeVBhdGgoU3RyaW5nKTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL0pEVFV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscyI+SkRUVXRpbHM8L0E+Ci08REQ+UmV0dXJucyB0aGUgZnVsbCwgYWJzb2x1dGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgd29ya3NwYWNlIG9mIHRoZSBmaXJzdCBzb3VyY2UgZm9sZGVyIGZvdW5kIGluIHRoZSBqYXZhIHByb2plY3Qgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9KRFRVdGlscy5odG1sI2dldEphdmFQcm9qZWN0U291cmNlRGlyZWN0b3J5UGF0aChvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3QpIj48Qj5nZXRKYXZhUHJvamVjdFNvdXJjZURpcmVjdG9yeVBhdGgoSUphdmFQcm9qZWN0KTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL0pEVFV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscyI+SkRUVXRpbHM8L0E+Ci08REQ+UmV0dXJucyB0aGUgZnVsbCwgYWJzb2x1dGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgd29ya3NwYWNlIG9mIHRoZSBmaXJzdCBzb3VyY2UgZm9sZGVyIGZvdW5kIGluIHRoZSBnaXZlbiBqYXZhIHByb2plY3QuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwjZ2V0TG9jYWxWYXJpYWJsZShvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kLCBpbnQpIj48Qj5nZXRMb2NhbFZhcmlhYmxlKElNZXRob2QsIGludCk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzIj5Bbm5vdGF0aW9uVXRpbHM8L0E+Ci08REQ+UmV0dXJucyB0aGUgPENPREU+SUxvY2FsVmFyaWFibGU8L0NPREU+IGF0IHRoZSBnaXZlbiBvZmZzZXQgcG9zaXRpb24gaW4gdGhlIHNvdXJjZSBmaWxlLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sI2dldExvY2FsVmFyaWFibGUob3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZCwgamF2YS5sYW5nLlN0cmluZykiPjxCPmdldExvY2FsVmFyaWFibGUoSU1ldGhvZCwgU3RyaW5nKTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMiPkFubm90YXRpb25VdGlsczwvQT4KLTxERD5SZXR1cm5zIHRoZSA8Q09ERT5JTG9jYWxWYXJpYWJsZTwvQ09ERT4gd2l0aCB0aGUgZ2l2ZW4gbmFtZSB3aXRoaW4gdGhlIGRlY2xhcmVkIDxDT0RFPklNZXRob2Q8L0NPREU+LgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sI2dldE1lbWJlclZhbHVlUGFpcihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbiwgamF2YS5sYW5nLlN0cmluZykiPjxCPmdldE1lbWJlclZhbHVlUGFpcihOb3JtYWxBbm5vdGF0aW9uLCBTdHJpbmcpPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscyI+QW5ub3RhdGlvblV0aWxzPC9BPgotPEREPlJldHVybnMgdGhlIDxDT0RFPk1lbWJlclZhbHVlUGFpcjwvQ09ERT4gd2l0aCB0aGUgZ2l2ZW4gbWVtYmVyIG5hbWUgZnJvbSB0aGUgPENPREU+Tm9ybWFsQW5ub3RhdGlvbjwvQ09ERT4uCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwjZ2V0TWVtYmVyVmFsdWVQYWlycyhvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QsIGphdmEubGFuZy5DbGFzcykiPjxCPmdldE1lbWJlclZhbHVlUGFpcnMoSUphdmFFbGVtZW50LCBBU1QsIENsYXNzJmx0Oz8gZXh0ZW5kcyBBbm5vdGF0aW9uJmd0Oyk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24iPkFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9EZWZhdWx0c0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sI2dldE1lbWJlclZhbHVlUGFpcnMob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50LCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNULCBqYXZhLmxhbmcuQ2xhc3MpIj48Qj5nZXRNZW1iZXJWYWx1ZVBhaXJzKElKYXZhRWxlbWVudCwgQVNULCBDbGFzcyZsdDs/IGV4dGVuZHMgQW5ub3RhdGlvbiZndDspPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbi48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9EZWZhdWx0c0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24iPkRlZmF1bHRzQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9BPgotPEREPkNvbnN0cnVjdHMgYSBsaXN0IG9mIDxDT0RFPk1lbWJlclZhbHVlUGFpcjwvQ09ERT4gdXNpbmcgdGhlIGRlY2xhcmVkIG1ldGhvZCBuYW1lcyBhbmQgZGVmYXVsdCB2YWx1ZXMgaW4KLSB0aGUgZ2l2ZW4gPENPREU+QW5ub3RhdGlvbjwvQ09ERT4uCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sI2dldE1lbWJlclZhbHVlUGFpcnMob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50LCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNULCBqYXZhLmxhbmcuQ2xhc3MpIj48Qj5nZXRNZW1iZXJWYWx1ZVBhaXJzKElKYXZhRWxlbWVudCwgQVNULCBDbGFzcyZsdDs/IGV4dGVuZHMgQW5ub3RhdGlvbiZndDspPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24uPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uIj5JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9BPgotPEREPlJldHVybnMgYSBsaXN0IG9mIDxDT0RFPk1lbWJlclZhbHVlUGFpcjwvQ09ERT4gdGhhdCBtYXkgYmUgYWRkZWQgdG8gYSA8Q09ERT5Ob3JtYWxBbm5vdGF0aW9uPC9DT0RFPi4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCNnZXRNZXRob2REZWNsYXJhdGlvbihvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kKSI+PEI+Z2V0TWV0aG9kRGVjbGFyYXRpb24oSU1ldGhvZCk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzIj5Bbm5vdGF0aW9uVXRpbHM8L0E+Ci08REQ+UmV0dXJucyB0aGUgPENPREU+TWV0aG9kRGVjbGFyYXRpb248L0NPREU+IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIDxDT0RFPklNZXRob2Q8L0NPREU+LgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25EZWZpbml0aW9uLmh0bWwjZ2V0TmFtZSgpIj48Qj5nZXROYW1lKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25EZWZpbml0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSI+QW5ub3RhdGlvbkRlZmluaXRpb248L0E+Ci08REQ+UmV0dXJucyB0aGUgYW5ub3RhdGlvbiBuYW1lLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL1dTRExVdGlscy5odG1sI2dldFBhY2thZ2VOYW1lRnJvbU5hbWVzcGFjZShqYXZhLmxhbmcuU3RyaW5nKSI+PEI+Z2V0UGFja2FnZU5hbWVGcm9tTmFtZXNwYWNlKFN0cmluZyk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9XU0RMVXRpbHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzIj5XU0RMVXRpbHM8L0E+Ci08REQ+Q29uc3RydWN0cyBhIGRvdCBzZXBhcmF0ZWQgcGFja2FnZSBuYW1lIGZyb20gYSBnaXZlbiBuYW1lc3BhY2UuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvSkRUVXRpbHMuaHRtbCNnZXRQdWJsaWNNZXRob2RzKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlKSI+PEI+Z2V0UHVibGljTWV0aG9kcyhJVHlwZSk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9KRFRVdGlscy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMiPkpEVFV0aWxzPC9BPgotPEREPklmIHRoZSBnaXZlbiA8Y29kZT5JVHlwZTwvY29kZT4gaXMgYW4gaW50ZXJmYWNlIGFsbCBtZXRob2RzIGRlY2xhcmVkIGluIHRoYXQgaW50ZXJmYWNlIGFyZSByZXR1cm5lZC4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCNnZXRTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklMb2NhbFZhcmlhYmxlKSI+PEI+Z2V0U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbihJTG9jYWxWYXJpYWJsZSk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzIj5Bbm5vdGF0aW9uVXRpbHM8L0E+Ci08REQ+UmV0dXJucyB0aGUgPENPREU+U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbjwvQ09ERT4gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4gPENPREU+SUxvY2FsVmFyaWFibGU8L0NPREU+LgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sI2dldFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb25zKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2QpIj48Qj5nZXRTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9ucyhJTWV0aG9kKTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMiPkFubm90YXRpb25VdGlsczwvQT4KLTxERD5SZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhlIDxDT0RFPlNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb248L0NPREU+IGZvciB0aGUgZ2l2ZW4gPENPREU+SU1ldGhvZDwvQ09ERT4uCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwjZ2V0U3RyaW5nVmFsdWUoY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvbk1pcnJvciwgamF2YS5sYW5nLlN0cmluZykiPjxCPmdldFN0cmluZ1ZhbHVlKEFubm90YXRpb25NaXJyb3IsIFN0cmluZyk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzIj5Bbm5vdGF0aW9uVXRpbHM8L0E+Ci08REQ+UmV0dXJucyB0aGUgbWVtYmVyIHZhbHVlIHdpdGggdGhlIGdpdmVuIG1lbWJlciBuYW1lIGZyb20gdGhlIDxDT0RFPkFubm90YXRpb25NaXJyb3I8L0NPREU+IGFzIGEgPENPREU+U3RyaW5nPC9DT0RFPiB2YWx1ZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCNnZXRTdHJpbmdWYWx1ZShvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiwgamF2YS5sYW5nLlN0cmluZykiPjxCPmdldFN0cmluZ1ZhbHVlKEFubm90YXRpb24sIFN0cmluZyk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzIj5Bbm5vdGF0aW9uVXRpbHM8L0E+Ci08REQ+UmV0dXJucyB0aGUgbWVtYmVyIHZhbHVlIHdpdGggdGhlIGdpdmVuIG1lbWJlciBuYW1lIGZyb20gdGhlIDxDT0RFPkFubm90YXRpb248L0NPREU+IGFzIGEgPENPREU+U3RyaW5nPC9DT0RFPiB2YWx1ZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCNnZXRTdHJpbmdWYWx1ZShvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbiwgamF2YS5sYW5nLlN0cmluZykiPjxCPmdldFN0cmluZ1ZhbHVlKElBbm5vdGF0aW9uLCBTdHJpbmcpPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscyI+QW5ub3RhdGlvblV0aWxzPC9BPgotPEREPlJldHVybnMgdGhlIG1lbWJlciB2YWx1ZSB3aXRoIHRoZSBnaXZlbiBtZW1iZXIgbmFtZSBmcm9tIHRoZSA8Q09ERT5JQW5ub3RhdGlvbjwvQ09ERT4gYXMgYSA8Q09ERT5TdHJpbmc8L0NPREU+IHZhbHVlLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL0pEVFV0aWxzLmh0bWwjZ2V0VGFyZ2V0TmFtZXNwYWNlRnJvbVBhY2thZ2VOYW1lKGphdmEubGFuZy5TdHJpbmcpIj48Qj5nZXRUYXJnZXROYW1lc3BhY2VGcm9tUGFja2FnZU5hbWUoU3RyaW5nKTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL0pEVFV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscyI+SkRUVXRpbHM8L0E+Ci08REQ+Q29uc3RydWN0cyBhIHRhcmdldCBuYW1lc3BhY2Ugc3RyaW5nIGZyb20gdGhlIGdpdmVuIHBhY2thZ2UgbmFtZSBieSBzcGxpdHRpbmcgdGhlIGRvdCAnLicgc2VwYXJhdGVkCi0gcGFja2FnZSBuYW1lLCByZXZlcnNpbmcgdGhlIG9yZGVyIG9mIHRoZSBwYWNrYWdlIG5hbWUgc2VnbWVudHMgZm9sbG93ZWQgYnkgcHJlZml4aW5nIHRoZSBzdHJpbmcgd2l0aAotICdodHRwOi8vJyBhbmQgYXBwZW5kaW5nIGEgZm9yd2FyZCBzbGFzaCAnLycgdG8gdGhlIGVuZC4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uRGVmaW5pdGlvbi5odG1sI2dldFRhcmdldHMoKSI+PEI+Z2V0VGFyZ2V0cygpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uRGVmaW5pdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPkFubm90YXRpb25EZWZpbml0aW9uPC9BPgotPEREPlJldHVybnMgYSBsaXN0IG9mIDxDT0RFPkVsZW1lbnRUeXBlPC9DT0RFPiB0aGF0IHNwZWNpZnkgdGhlIEphdmEgZWxlbWVudHMgdG8gd2hpY2ggdGhlIGFubm90YXRpb24KLSBjYW4gYmUgYXBwbGllZC4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCNnZXRUeXBlRGVjbGFyYXRpb24ob3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGUpIj48Qj5nZXRUeXBlRGVjbGFyYXRpb24oSVR5cGUpPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscyI+QW5ub3RhdGlvblV0aWxzPC9BPgotPEREPlJldHVybnMgdGhlIDxDT0RFPkFic3RyYWN0VHlwZURlY2xhcmF0aW9uPC9DT0RFPiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiA8Q09ERT5JVHlwZTwvQ09ERT4uCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvV1NETFV0aWxzLmh0bWwjZ2V0V2ViQ29udGVudEZvbGRlcihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCkiPjxCPmdldFdlYkNvbnRlbnRGb2xkZXIoSVByb2plY3QpPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvV1NETFV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscyI+V1NETFV0aWxzPC9BPgotPEREPlJldHVybnMgdGhlIFdlYiBDb250ZW50IGZvbGRlciBvZiB0aGUgZ2l2ZW4gcHJvamVjdC4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9XU0RMVXRpbHMuaHRtbCNnZXRXU0RMRm9sZGVyKGphdmEubGFuZy5TdHJpbmcpIj48Qj5nZXRXU0RMRm9sZGVyKFN0cmluZyk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9XU0RMVXRpbHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzIj5XU0RMVXRpbHM8L0E+Ci08REQ+UmV0dXJucyB0aGUgV1NETCBmb2xkZXIgb2YgdGhlIHByb2plY3Qgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9XU0RMVXRpbHMuaHRtbCNnZXRXU0RMRm9sZGVyKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0KSI+PEI+Z2V0V1NETEZvbGRlcihJUHJvamVjdCk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9XU0RMVXRpbHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzIj5XU0RMVXRpbHM8L0E+Ci08REQ+UmV0dXJucyB0aGUgV1NETCBmb2xkZXIgb2YgdGhlIGdpdmVuIHByb2plY3QuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvV1NETFV0aWxzLmh0bWwjZ2V0V1NETExvY2F0aW9uKGphdmF4LndzZGwuRGVmaW5pdGlvbikiPjxCPmdldFdTRExMb2NhdGlvbihEZWZpbml0aW9uKTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL1dTRExVdGlscy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMiPldTRExVdGlsczwvQT4KLTxERD5SZXR1cm5zIHRoZSBsb2NhdGlvbiBVUkkgZnJvbSB0aGUgZmlyc3QgPGNvZGU+U09BUEFkZHJlc3M8L2NvZGU+IG9yIDxjb2RlPlNPQVAxMkFkZHJlc3M8L2NvZGU+IGZvdW5kCi0gaW4gdGhlIGdpdmVuIDxjb2RlPkRlZmluaXRpb248L2NvZGU+IG9yIG51bGwgaWYgbm9uZSBpcyBmb3VuZC4KLTwvREw+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC01Lmh0bWwiPjxCPlBSRVYgTEVUVEVSPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTcuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTYuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC02Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEEgSFJFRj0iaW5kZXgtMS5odG1sIj5BPC9BPiA8QSBIUkVGPSJpbmRleC0yLmh0bWwiPkM8L0E+IDxBIEhSRUY9ImluZGV4LTMuaHRtbCI+RDwvQT4gPEEgSFJFRj0iaW5kZXgtNC5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC01Lmh0bWwiPkY8L0E+IDxBIEhSRUY9ImluZGV4LTYuaHRtbCI+RzwvQT4gPEEgSFJFRj0iaW5kZXgtNy5odG1sIj5JPC9BPiA8QSBIUkVGPSJpbmRleC04Lmh0bWwiPko8L0E+IDxBIEhSRUY9ImluZGV4LTkuaHRtbCI+TDwvQT4gPEEgSFJFRj0iaW5kZXgtMTAuaHRtbCI+TTwvQT4gPEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+UDwvQT4gPEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+UjwvQT4gPEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+UzwvQT4gPEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+VTwvQT4gPEEgSFJFRj0iaW5kZXgtMTYuaHRtbCI+VjwvQT4gPEEgSFJFRj0iaW5kZXgtMTcuaHRtbCI+VzwvQT4gPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvaW5kZXgtZmlsZXMvaW5kZXgtNy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2luZGV4LWZpbGVzL2luZGV4LTcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY5NDNmNC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvaW5kZXgtZmlsZXMvaW5kZXgtNy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8xNCkgb24gV2VkIEFwciAwNyAwNzo0NjoyMyBCU1QgMjAxMCAtLT4KLTxUSVRMRT4KLUktSW5kZXgKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTAtMDQtMDciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJJLUluZGV4IjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5JbmRleDwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNi5odG1sIj48Qj5QUkVWIExFVFRFUjwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC04Lmh0bWwiPjxCPk5FWFQgTEVUVEVSPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uL2luZGV4Lmh0bWw/aW5kZXgtZmlsZXNpbmRleC03Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxBIEhSRUY9ImluZGV4LTEuaHRtbCI+QTwvQT4gPEEgSFJFRj0iaW5kZXgtMi5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC0zLmh0bWwiPkQ8L0E+IDxBIEhSRUY9ImluZGV4LTQuaHRtbCI+RTwvQT4gPEEgSFJFRj0iaW5kZXgtNS5odG1sIj5GPC9BPiA8QSBIUkVGPSJpbmRleC02Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTcuaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtOC5odG1sIj5KPC9BPiA8QSBIUkVGPSJpbmRleC05Lmh0bWwiPkw8L0E+IDxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPk08L0E+IDxBIEhSRUY9ImluZGV4LTExLmh0bWwiPk88L0E+IDxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPlA8L0E+IDxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPlI8L0E+IDxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPlM8L0E+IDxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPlU8L0E+IDxBIEhSRUY9ImluZGV4LTE2Lmh0bWwiPlY8L0E+IDxBIEhSRUY9ImluZGV4LTE3Lmh0bWwiPlc8L0E+IDxIUj4KLTxBIE5BTUU9Il9JXyI+PCEtLSAtLT48L0E+PEgyPgotPEI+STwvQj48L0gyPgotPERMPgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0lBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbiI+PEI+SUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjwvQj48L0E+IC0gSW50ZXJmYWNlIGluIDxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbjwvQT48REQ+QmFzZSBpbnRlcmZhY2UgZm9yIGFubm90YXRpb24gYXR0cmlidXRlIGluaXRpYWxpemVycy48RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwjaXNBbm5vdGF0aW9uUHJlc2VudChvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uKSI+PEI+aXNBbm5vdGF0aW9uUHJlc2VudChJSmF2YUVsZW1lbnQsIEFubm90YXRpb24pPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscyI+QW5ub3RhdGlvblV0aWxzPC9BPgotPEREPkNoZWNrcyBpZiB0aGUgZ2l2ZW4gPENPREU+QW5ub3RhdGlvbjwvQ09ERT4gaXMgcHJlc2VudCBvbiB0aGUgPENPREU+SUphdmFFbGVtZW50PC9DT0RFPi4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCNpc0Fubm90YXRpb25QcmVzZW50KG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCwgamF2YS5sYW5nLlN0cmluZykiPjxCPmlzQW5ub3RhdGlvblByZXNlbnQoSUphdmFFbGVtZW50LCBTdHJpbmcpPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscyI+QW5ub3RhdGlvblV0aWxzPC9BPgotPEREPkNoZWNrcyBpZiB0aGUgYW5ub3RhdGlvbiB3aXRoIHRoZSBnaXZlbiBuYW1lIGlzIHByZXNlbnQgb24gdGhlIDxDT0RFPklKYXZhRWxlbWVudDwvQ09ERT4uCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbCNpc0NsYXNzT25seSgpIj48Qj5pc0NsYXNzT25seSgpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uRGVmaW5pdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPkFubm90YXRpb25EZWZpbml0aW9uPC9BPgotPEREPlJldHVybnMgd2hldGhlciB0aGUgYW5ub3RhdGlvbiBpcyByZXN0cmljdGVkIHRvIGNsYXNzIHR5cGVzLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25EZWZpbml0aW9uLmh0bWwjaXNFbnVtT25seSgpIj48Qj5pc0VudW1Pbmx5KCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25EZWZpbml0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSI+QW5ub3RhdGlvbkRlZmluaXRpb248L0E+Ci08REQ+UmV0dXJucyB3aGV0aGVyIHRoZSBhbm5vdGF0aW9uIGlzIHJlc3RyaWN0ZWQgdG8gZW51bSB0eXBlcy4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uRGVmaW5pdGlvbi5odG1sI2lzSW50ZXJmYWNlT25seSgpIj48Qj5pc0ludGVyZmFjZU9ubHkoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj5Bbm5vdGF0aW9uRGVmaW5pdGlvbjwvQT4KLTxERD5SZXR1cm5zIHdoZXRoZXIgdGhlIGFubm90YXRpb24gaXMgcmVzdHJpY3RlZCB0byBpbnRlcmZhY2UgdHlwZXMuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvSkRUVXRpbHMuaHRtbCNpc0phdmFQcm9qZWN0KG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0KSI+PEI+aXNKYXZhUHJvamVjdChJUHJvamVjdCk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9KRFRVdGlscy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMiPkpEVFV0aWxzPC9BPgotPEREPlJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gcHJvamVjdCBoYXMgdGhlIGphdmEgbmF0dXJlLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL0pEVFV0aWxzLmh0bWwjaXNQdWJsaWNNZXRob2Qob3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZCkiPjxCPmlzUHVibGljTWV0aG9kKElNZXRob2QpPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvSkRUVXRpbHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzIj5KRFRVdGlsczwvQT4KLTxERD5SZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIG1ldGhvZCBpc24ndCBhIG1haW4gbWV0aG9kIG9yIGNvbnN0cnVjdG9yIGFuZCBpZiBpdCBoYXMgdGhlIHB1YmxpYyBtb2RpZmllci4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9XU0RMVXRpbHMuaHRtbCNpc1ZhbGlkV1NETEZpbGVOYW1lKGphdmEubGFuZy5TdHJpbmcpIj48Qj5pc1ZhbGlkV1NETEZpbGVOYW1lKFN0cmluZyk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9XU0RMVXRpbHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzIj5XU0RMVXRpbHM8L0E+Ci08REQ+UmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gZmlsZSBuYW1lIGNvbnRhaW5zIEFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLCB1bmRlcnNjb3JlICdfJywKLSBkYXNoZXMgJy0nIGFuZCBlbmRzIHdpdGggdGhlICcud3NkbCcgZXh0ZW5zaW9uLgotPC9ETD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9ImluZGV4LTYuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtOC5odG1sIj48Qj5ORVhUIExFVFRFUjwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi9pbmRleC5odG1sP2luZGV4LWZpbGVzaW5kZXgtNy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTcuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5EPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+RjwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5HPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPkk8L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+SjwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5NPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5QPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5VPC9BPiA8QSBIUkVGPSJpbmRleC0xNi5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNy5odG1sIj5XPC9BPiA8SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9pbmRleC1maWxlcy9pbmRleC04Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvaW5kZXgtZmlsZXMvaW5kZXgtOC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGIzM2U5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9pbmRleC1maWxlcy9pbmRleC04Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjQ2OjIzIEJTVCAyMDEwIC0tPgotPFRJVExFPgotSi1JbmRleAotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMC0wNC0wNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IkotSW5kZXgiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC03Lmh0bWwiPjxCPlBSRVYgTEVUVEVSPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTkuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTguaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC04Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEEgSFJFRj0iaW5kZXgtMS5odG1sIj5BPC9BPiA8QSBIUkVGPSJpbmRleC0yLmh0bWwiPkM8L0E+IDxBIEhSRUY9ImluZGV4LTMuaHRtbCI+RDwvQT4gPEEgSFJFRj0iaW5kZXgtNC5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC01Lmh0bWwiPkY8L0E+IDxBIEhSRUY9ImluZGV4LTYuaHRtbCI+RzwvQT4gPEEgSFJFRj0iaW5kZXgtNy5odG1sIj5JPC9BPiA8QSBIUkVGPSJpbmRleC04Lmh0bWwiPko8L0E+IDxBIEhSRUY9ImluZGV4LTkuaHRtbCI+TDwvQT4gPEEgSFJFRj0iaW5kZXgtMTAuaHRtbCI+TTwvQT4gPEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+UDwvQT4gPEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+UjwvQT4gPEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+UzwvQT4gPEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+VTwvQT4gPEEgSFJFRj0iaW5kZXgtMTYuaHRtbCI+VjwvQT4gPEEgSFJFRj0iaW5kZXgtMTcuaHRtbCI+VzwvQT4gPEhSPgotPEEgTkFNRT0iX0pfIj48IS0tIC0tPjwvQT48SDI+Ci08Qj5KPC9CPjwvSDI+Ci08REw+Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvSkRUVXRpbHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzIj48Qj5KRFRVdGlsczwvQj48L0E+IC0gQ2xhc3MgaW4gPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzPC9BPjxERD5KRFQgVXRpbGl0eSBjbGFzcy48L0RMPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5JbmRleDwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNy5odG1sIj48Qj5QUkVWIExFVFRFUjwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC05Lmh0bWwiPjxCPk5FWFQgTEVUVEVSPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uL2luZGV4Lmh0bWw/aW5kZXgtZmlsZXNpbmRleC04Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtOC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxBIEhSRUY9ImluZGV4LTEuaHRtbCI+QTwvQT4gPEEgSFJFRj0iaW5kZXgtMi5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC0zLmh0bWwiPkQ8L0E+IDxBIEhSRUY9ImluZGV4LTQuaHRtbCI+RTwvQT4gPEEgSFJFRj0iaW5kZXgtNS5odG1sIj5GPC9BPiA8QSBIUkVGPSJpbmRleC02Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTcuaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtOC5odG1sIj5KPC9BPiA8QSBIUkVGPSJpbmRleC05Lmh0bWwiPkw8L0E+IDxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPk08L0E+IDxBIEhSRUY9ImluZGV4LTExLmh0bWwiPk88L0E+IDxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPlA8L0E+IDxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPlI8L0E+IDxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPlM8L0E+IDxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPlU8L0E+IDxBIEhSRUY9ImluZGV4LTE2Lmh0bWwiPlY8L0E+IDxBIEhSRUY9ImluZGV4LTE3Lmh0bWwiPlc8L0E+IDxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2luZGV4LWZpbGVzL2luZGV4LTkuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9pbmRleC1maWxlcy9pbmRleC05Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NzhjMmIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2luZGV4LWZpbGVzL2luZGV4LTkuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMTQpIG9uIFdlZCBBcHIgMDcgMDc6NDY6MjMgQlNUIDIwMTAgLS0+Ci08VElUTEU+Ci1MLUluZGV4Ci08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDEwLTA0LTA3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iTC1JbmRleCI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9ImluZGV4LTguaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTAuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC05Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEEgSFJFRj0iaW5kZXgtMS5odG1sIj5BPC9BPiA8QSBIUkVGPSJpbmRleC0yLmh0bWwiPkM8L0E+IDxBIEhSRUY9ImluZGV4LTMuaHRtbCI+RDwvQT4gPEEgSFJFRj0iaW5kZXgtNC5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC01Lmh0bWwiPkY8L0E+IDxBIEhSRUY9ImluZGV4LTYuaHRtbCI+RzwvQT4gPEEgSFJFRj0iaW5kZXgtNy5odG1sIj5JPC9BPiA8QSBIUkVGPSJpbmRleC04Lmh0bWwiPko8L0E+IDxBIEhSRUY9ImluZGV4LTkuaHRtbCI+TDwvQT4gPEEgSFJFRj0iaW5kZXgtMTAuaHRtbCI+TTwvQT4gPEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+UDwvQT4gPEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+UjwvQT4gPEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+UzwvQT4gPEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+VTwvQT4gPEEgSFJFRj0iaW5kZXgtMTYuaHRtbCI+VjwvQT4gPEEgSFJFRj0iaW5kZXgtMTcuaHRtbCI+VzwvQT4gPEhSPgotPEEgTkFNRT0iX0xfIj48IS0tIC0tPjwvQT48SDI+Ci08Qj5MPC9CPjwvSDI+Ci08REw+Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmh0bWwjbG9nKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKSI+PEI+bG9nKElTdGF0dXMpPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSI+QW5ub3RhdGlvbnNDb3JlUGx1Z2luPC9BPgotPEREPiZuYnNwOwotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZVBsdWdpbi5odG1sI2xvZyhqYXZhLmxhbmcuVGhyb3dhYmxlKSI+PEI+bG9nKFRocm93YWJsZSk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmVQbHVnaW4uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj5Bbm5vdGF0aW9uc0NvcmVQbHVnaW48L0E+Ci08REQ+Jm5ic3A7Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmh0bWwjbG9nTWVzc2FnZShpbnQsIGphdmEubGFuZy5TdHJpbmcpIj48Qj5sb2dNZXNzYWdlKGludCwgU3RyaW5nKTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZVBsdWdpbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPkFubm90YXRpb25zQ29yZVBsdWdpbjwvQT4KLTxERD4mbmJzcDsKLTwvREw+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC04Lmh0bWwiPjxCPlBSRVYgTEVUVEVSPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPjxCPk5FWFQgTEVUVEVSPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uL2luZGV4Lmh0bWw/aW5kZXgtZmlsZXNpbmRleC05Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtOS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxBIEhSRUY9ImluZGV4LTEuaHRtbCI+QTwvQT4gPEEgSFJFRj0iaW5kZXgtMi5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC0zLmh0bWwiPkQ8L0E+IDxBIEhSRUY9ImluZGV4LTQuaHRtbCI+RTwvQT4gPEEgSFJFRj0iaW5kZXgtNS5odG1sIj5GPC9BPiA8QSBIUkVGPSJpbmRleC02Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTcuaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtOC5odG1sIj5KPC9BPiA8QSBIUkVGPSJpbmRleC05Lmh0bWwiPkw8L0E+IDxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPk08L0E+IDxBIEhSRUY9ImluZGV4LTExLmh0bWwiPk88L0E+IDxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPlA8L0E+IDxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPlI8L0E+IDxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPlM8L0E+IDxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPlU8L0E+IDxBIEhSRUY9ImluZGV4LTE2Lmh0bWwiPlY8L0E+IDxBIEhSRUY9ImluZGV4LTE3Lmh0bWwiPlc8L0E+IDxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2luZGV4Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvaW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEzYTczNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvaW5kZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIEZyYW1lc2V0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2ZyYW1lc2V0LmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2Mgb24gV2VkIEFwciAwNyAwNzo0NjoyMyBCU1QgMjAxMC0tPgotPFRJVExFPgotR2VuZXJhdGVkIERvY3VtZW50YXRpb24gKFVudGl0bGVkKQotPC9USVRMRT4KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgICB0YXJnZXRQYWdlID0gIiIgKyB3aW5kb3cubG9jYXRpb24uc2VhcmNoOwotICAgIGlmICh0YXJnZXRQYWdlICE9ICIiICYmIHRhcmdldFBhZ2UgIT0gInVuZGVmaW5lZCIpCi0gICAgICAgIHRhcmdldFBhZ2UgPSB0YXJnZXRQYWdlLnN1YnN0cmluZygxKTsKLSAgICBpZiAodGFyZ2V0UGFnZS5pbmRleE9mKCI6IikgIT0gLTEpCi0gICAgICAgIHRhcmdldFBhZ2UgPSAidW5kZWZpbmVkIjsKLSAgICBmdW5jdGlvbiBsb2FkRnJhbWVzKCkgewotICAgICAgICBpZiAodGFyZ2V0UGFnZSAhPSAiIiAmJiB0YXJnZXRQYWdlICE9ICJ1bmRlZmluZWQiKQotICAgICAgICAgICAgIHRvcC5jbGFzc0ZyYW1lLmxvY2F0aW9uID0gdG9wLnRhcmdldFBhZ2U7Ci0gICAgfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotPC9IRUFEPgotPEZSQU1FU0VUIGNvbHM9IjIwJSw4MCUiIHRpdGxlPSIiIG9uTG9hZD0idG9wLmxvYWRGcmFtZXMoKSI+Ci08RlJBTUVTRVQgcm93cz0iMzAlLDcwJSIgdGl0bGU9IiIgb25Mb2FkPSJ0b3AubG9hZEZyYW1lcygpIj4KLTxGUkFNRSBzcmM9Im92ZXJ2aWV3LWZyYW1lLmh0bWwiIG5hbWU9InBhY2thZ2VMaXN0RnJhbWUiIHRpdGxlPSJBbGwgUGFja2FnZXMiPgotPEZSQU1FIHNyYz0iYWxsY2xhc3Nlcy1mcmFtZS5odG1sIiBuYW1lPSJwYWNrYWdlRnJhbWUiIHRpdGxlPSJBbGwgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcyAoZXhjZXB0IG5vbi1zdGF0aWMgbmVzdGVkIHR5cGVzKSI+Ci08L0ZSQU1FU0VUPgotPEZSQU1FIHNyYz0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIiBuYW1lPSJjbGFzc0ZyYW1lIiB0aXRsZT0iUGFja2FnZSwgY2xhc3MgYW5kIGludGVyZmFjZSBkZXNjcmlwdGlvbnMiIHNjcm9sbGluZz0ieWVzIj4KLTxOT0ZSQU1FUz4KLTxIMj4KLUZyYW1lIEFsZXJ0PC9IMj4KLQotPFA+Ci1UaGlzIGRvY3VtZW50IGlzIGRlc2lnbmVkIHRvIGJlIHZpZXdlZCB1c2luZyB0aGUgZnJhbWVzIGZlYXR1cmUuIElmIHlvdSBzZWUgdGhpcyBtZXNzYWdlLCB5b3UgYXJlIHVzaW5nIGEgbm9uLWZyYW1lLWNhcGFibGUgd2ViIGNsaWVudC4KLTxCUj4KLUxpbmsgdG88QSBIUkVGPSJvdmVydmlldy1zdW1tYXJ5Lmh0bWwiPk5vbi1mcmFtZSB2ZXJzaW9uLjwvQT4KLTwvTk9GUkFNRVM+Ci08L0ZSQU1FU0VUPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25EZWZpbml0aW9uLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc4OTJmOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMTQpIG9uIFdlZCBBcHIgMDcgMDc6NDY6MjEgQlNUIDIwMTAgLS0+Ci08VElUTEU+Ci1Bbm5vdGF0aW9uRGVmaW5pdGlvbgotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMC0wNC0wNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IkFubm90YXRpb25EZWZpbml0aW9uIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9Bbm5vdGF0aW9uRGVmaW5pdGlvbi5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViBDTEFTUyZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25EZWZpbml0aW9uLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iQW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX3N1bW1hcnkiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9kZXRhaWwiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTwhLS0gPT09PT09PT0gU1RBUlQgT0YgQ0xBU1MgREFUQSA9PT09PT09PSAtLT4KLTxIMj4KLTxGT05UIFNJWkU9Ii0xIj4KLW9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlPC9GT05UPgotPEJSPgotQ2xhc3MgQW5ub3RhdGlvbkRlZmluaXRpb248L0gyPgotPFBSRT4KLWphdmEubGFuZy5PYmplY3QKLSAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25EZWZpbml0aW9uPC9CPgotPC9QUkU+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgZmluYWwgY2xhc3MgPEI+QW5ub3RhdGlvbkRlZmluaXRpb248L0I+PERUPmV4dGVuZHMgamF2YS5sYW5nLk9iamVjdDwvREw+Ci08L1BSRT4KLQotPFA+Ci1BbiA8Y29kZT5Bbm5vdGF0aW9uRGVmaW5pdGlvbjwvY29kZT4gaXMgYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5mb3JtYXRpb24gY29udHJpYnV0ZWQgdGhyb3VnaCB0aGUKLSA8Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uRGVmaW5pdGlvbjwvY29kZT4sCi0gPGNvZGU+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkNhdGVnb3J5PC9jb2RlPiBhbmQKLSA8Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uSW5pdGlhbGl6ZXI8L2NvZGU+IGV4dGVuc2lvbiBwb2ludHMuCi0gZm9yIGEgPGNvZGU+amF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjwvY29kZT4gY2xhc3MuCi0gPHA+Ci0gSXQgc3VwcGxpZXMgdGhlIGFubm90YXRpb24gY2xhc3MgbmFtZSwgaXRzIGFubm90YXRpb24gY2F0ZWdvcnksIHRoZSBhcHBsaWNhYmxlIHRhcmdldHMgZm9yIHRoZSBhbm5vdGF0aW9uCi0gYW5kIGFuIDxjb2RlPklBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI8L2NvZGU+IHRvIGluaXRpYWxpemUgdGhlIGFubm90YXRpb25zIGVsZW1lbnQtdmFsdWUgcGFpcnMuCi0gPC9wPgotIDxzdHJvbmc+UHJvdmlzaW9uYWwgQVBJOjwvc3Ryb25nPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIKLSBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQKLSB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzCi0gdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotIDwvcD4KLTxQPgotCi08UD4KLTxIUj4KLQotPFA+Ci0KLTwhLS0gPT09PT09PT0gQ09OU1RSVUNUT1IgU1VNTUFSWSA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0iY29uc3RydWN0b3Jfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNvbnN0cnVjdG9yIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbCNBbm5vdGF0aW9uRGVmaW5pdGlvbihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50LCBqYXZhLmxhbmcuU3RyaW5nKSI+QW5ub3RhdGlvbkRlZmluaXRpb248L0E+PC9CPihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50Jm5ic3A7Y29uZmlndXJhdGlvbkVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7Y2F0ZWdvcnkpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDb25zdHJ1Y3RzIGFuIDxjb2RlPkFubm90YXRpb25EZWZpbml0aW9uPC9jb2RlPiB1c2luZyBpbmZvcm1hdGlvbiBmcm9tIHRoZQotIDxjb2RlPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25EZWZpbml0aW9uPC9jb2RlPiBleHRlbnNpb24gcG9pbnQgYW5kIGNhdGVnb3J5IG5hbWUuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24iPklBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25EZWZpbml0aW9uLmh0bWwjZ2V0QW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyKCkiPmdldEFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIGFubm90YXRpb25zIGF0dHJpYnV0ZSBpbml0aWFsaXplciBhcyBzcGVjaWZpZWQgaW4gdGhlCi0gPGNvZGU+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkluaXRpYWxpemVyPC9jb2RlPiBleHRlbnNpb24gcG9pbnQgb3IgbnVsbCBpZiBubwotIGluaXRpYWxpemVyIGNhbiBiZSBmb3VuZC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLkNsYXNzJmx0Oz8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uJmd0OzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uRGVmaW5pdGlvbi5odG1sI2dldEFubm90YXRpb25DbGFzcygpIj5nZXRBbm5vdGF0aW9uQ2xhc3M8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBhbm5vdGF0aW9uIGNsYXNzIGFzIHNwZWNpZmllZCBieSB0aGUgPGNvZGU+Y2xhc3M8L2NvZGU+IGF0dHJpYnV0ZSBvZiB0aGUKLSA8Y29kZT5hbm5vdGF0aW9uPGFubm90YXRpb24+IGVsZW1lbnQgaW4gdGhlIDxjb2RlPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25EZWZpbml0aW9uPC9jb2RlPgotIGV4dGVuc2lvbiBwb2ludC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uRGVmaW5pdGlvbi5odG1sI2dldEFubm90YXRpb25DbGFzc05hbWUoKSI+Z2V0QW5ub3RhdGlvbkNsYXNzTmFtZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBhbm5vdGF0aW9uLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25EZWZpbml0aW9uLmh0bWwjZ2V0Q2F0ZWdvcnkoKSI+Z2V0Q2F0ZWdvcnk8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBjYXRlZ29yeSB0aGUgYW5ub3RhdGlvbiBiZWxvbmdzIHRvLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25EZWZpbml0aW9uLmh0bWwjZ2V0TmFtZSgpIj5nZXROYW1lPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgYW5ub3RhdGlvbiBuYW1lLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLnV0aWwuTGlzdCZsdDtqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZSZndDs8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbCNnZXRUYXJnZXRzKCkiPmdldFRhcmdldHM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIGEgbGlzdCBvZiA8Q09ERT5FbGVtZW50VHlwZTwvQ09ERT4gdGhhdCBzcGVjaWZ5IHRoZSBKYXZhIGVsZW1lbnRzIHRvIHdoaWNoIHRoZSBhbm5vdGF0aW9uCi0gY2FuIGJlIGFwcGxpZWQuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbCNpc0NsYXNzT25seSgpIj5pc0NsYXNzT25seTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgd2hldGhlciB0aGUgYW5ub3RhdGlvbiBpcyByZXN0cmljdGVkIHRvIGNsYXNzIHR5cGVzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25EZWZpbml0aW9uLmh0bWwjaXNFbnVtT25seSgpIj5pc0VudW1Pbmx5PC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB3aGV0aGVyIHRoZSBhbm5vdGF0aW9uIGlzIHJlc3RyaWN0ZWQgdG8gZW51bSB0eXBlcy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uRGVmaW5pdGlvbi5odG1sI2lzSW50ZXJmYWNlT25seSgpIj5pc0ludGVyZmFjZU9ubHk8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHdoZXRoZXIgdGhlIGFubm90YXRpb24gaXMgcmVzdHJpY3RlZCB0byBpbnRlcmZhY2UgdHlwZXMuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19qYXZhLmxhbmcuT2JqZWN0Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBqYXZhLmxhbmcuT2JqZWN0PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+Y2xvbmUsIGVxdWFscywgZmluYWxpemUsIGdldENsYXNzLCBoYXNoQ29kZSwgbm90aWZ5LCBub3RpZnlBbGwsIHRvU3RyaW5nLCB3YWl0LCB3YWl0LCB3YWl0PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTwhLS0gPT09PT09PT09IENPTlNUUlVDVE9SIERFVEFJTCA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0iY29uc3RydWN0b3JfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9IkFubm90YXRpb25EZWZpbml0aW9uKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQsIGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1Bbm5vdGF0aW9uRGVmaW5pdGlvbjwvSDM+Ci08UFJFPgotcHVibGljIDxCPkFubm90YXRpb25EZWZpbml0aW9uPC9CPihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50Jm5ic3A7Y29uZmlndXJhdGlvbkVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO2NhdGVnb3J5KTwvUFJFPgotPERMPgotPEREPkNvbnN0cnVjdHMgYW4gPGNvZGU+QW5ub3RhdGlvbkRlZmluaXRpb248L2NvZGU+IHVzaW5nIGluZm9ybWF0aW9uIGZyb20gdGhlCi0gPGNvZGU+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkRlZmluaXRpb248L2NvZGU+IGV4dGVuc2lvbiBwb2ludCBhbmQgY2F0ZWdvcnkgbmFtZS4KLTxQPgotPERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5jb25maWd1cmF0aW9uRWxlbWVudDwvQ09ERT4gLSB0aGUgPGNvZGU+YW5ub3RhdGlvbjwvY29kZT4gZWxlbWVudCBmcm9tIHRoZSA8Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uRGVmaW5pdGlvbjwvY29kZT4gZXh0ZW5zaW9uIHBvaW50PEREPjxDT0RFPmNhdGVnb3J5PC9DT0RFPiAtIHRoZSBjYXRlZ29yeSBuYW1lPC9ETD4KLTwvREw+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iZ2V0TmFtZSgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXROYW1lPC9IMz4KLTxQUkU+Ci1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyA8Qj5nZXROYW1lPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgYW5ub3RhdGlvbiBuYW1lLgotPFA+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBhbm5vdGF0aW9uIG5hbWUuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRDYXRlZ29yeSgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRDYXRlZ29yeTwvSDM+Ci08UFJFPgotcHVibGljIGphdmEubGFuZy5TdHJpbmcgPEI+Z2V0Q2F0ZWdvcnk8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSBjYXRlZ29yeSB0aGUgYW5ub3RhdGlvbiBiZWxvbmdzIHRvLgotPFA+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBhbm5vdGF0aW9uIGNhdGVnb3J5LjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0QW5ub3RhdGlvbkNsYXNzTmFtZSgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRBbm5vdGF0aW9uQ2xhc3NOYW1lPC9IMz4KLTxQUkU+Ci1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyA8Qj5nZXRBbm5vdGF0aW9uQ2xhc3NOYW1lPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGFubm90YXRpb24uCi08UD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBhbm5vdGF0aW9uLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iaXNDbGFzc09ubHkoKSI+PCEtLSAtLT48L0E+PEgzPgotaXNDbGFzc09ubHk8L0gzPgotPFBSRT4KLXB1YmxpYyBib29sZWFuIDxCPmlzQ2xhc3NPbmx5PC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB3aGV0aGVyIHRoZSBhbm5vdGF0aW9uIGlzIHJlc3RyaWN0ZWQgdG8gY2xhc3MgdHlwZXMuCi08UD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+PGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFubm90YXRpb24gaXMgcmVzdHJpY3RlZCB0byBjbGFzc2VzIG9ubHkuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJpc0ludGVyZmFjZU9ubHkoKSI+PCEtLSAtLT48L0E+PEgzPgotaXNJbnRlcmZhY2VPbmx5PC9IMz4KLTxQUkU+Ci1wdWJsaWMgYm9vbGVhbiA8Qj5pc0ludGVyZmFjZU9ubHk8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHdoZXRoZXIgdGhlIGFubm90YXRpb24gaXMgcmVzdHJpY3RlZCB0byBpbnRlcmZhY2UgdHlwZXMuCi08UD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+PGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFubm90YXRpb24gaXMgcmVzdHJpY3RlZCB0byBpbnRlcmZhY2VzIG9ubHkuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJpc0VudW1Pbmx5KCkiPjwhLS0gLS0+PC9BPjxIMz4KLWlzRW51bU9ubHk8L0gzPgotPFBSRT4KLXB1YmxpYyBib29sZWFuIDxCPmlzRW51bU9ubHk8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHdoZXRoZXIgdGhlIGFubm90YXRpb24gaXMgcmVzdHJpY3RlZCB0byBlbnVtIHR5cGVzLgotPFA+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPjxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhbm5vdGF0aW9uIGlzIHJlc3RyaWN0ZWQgdG8gZW51bXMgb25seS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldEFubm90YXRpb25DbGFzcygpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRBbm5vdGF0aW9uQ2xhc3M8L0gzPgotPFBSRT4KLXB1YmxpYyBqYXZhLmxhbmcuQ2xhc3MmbHQ7PyBleHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24mZ3Q7IDxCPmdldEFubm90YXRpb25DbGFzczwvQj4oKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgdGhlIGFubm90YXRpb24gY2xhc3MgYXMgc3BlY2lmaWVkIGJ5IHRoZSA8Y29kZT5jbGFzczwvY29kZT4gYXR0cmlidXRlIG9mIHRoZQotIDxjb2RlPmFubm90YXRpb248YW5ub3RhdGlvbj4gZWxlbWVudCBpbiB0aGUgPGNvZGU+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkRlZmluaXRpb248L2NvZGU+Ci0gZXh0ZW5zaW9uIHBvaW50LgotPFA+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBhbm5vdGF0aW9uIGNsYXNzPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRUYXJnZXRzKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFRhcmdldHM8L0gzPgotPFBSRT4KLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCZsdDtqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZSZndDsgPEI+Z2V0VGFyZ2V0czwvQj4oKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgYSBsaXN0IG9mIDxDT0RFPkVsZW1lbnRUeXBlPC9DT0RFPiB0aGF0IHNwZWNpZnkgdGhlIEphdmEgZWxlbWVudHMgdG8gd2hpY2ggdGhlIGFubm90YXRpb24KLSBjYW4gYmUgYXBwbGllZC4KLSA8cD4KLSBUaGUgZWxlbWVudCB0eXBlcyBhcmUgcmV0cmlldmVkIGZyb20gdGhlIGFubm90YXRpb25zCi0gPENPREU+VGFyZ2V0PC9DT0RFPiBtZXRhLWFubm90YXRpb24gdHlwZS4gVGhpcyBsaXN0IGNhbiBiZSBmaWx0ZXJlZCB1c2luZwotIHRoZSA8Y29kZT50YXJnZXRGaWx0ZXI8L2NvZGU+IGVsZW1lbnQgb24gdGhlCi0gPGNvZGU+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkRlZmluaXRpb248L2NvZGU+IGV4dGVuc2lvbiBwb2ludCB3aGVuIGRlZmluaW5nCi0gdGhlIGFubm90YXRpb24uCi0gPC9wPgotPFA+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPmEgbGlzdCBvZiBlbGVtZW50IHR5cGVzLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0QW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldEFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjwvSDM+Ci08UFJFPgotcHVibGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0lBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbiI+SUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjwvQT4gPEI+Z2V0QW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgYW5ub3RhdGlvbnMgYXR0cmlidXRlIGluaXRpYWxpemVyIGFzIHNwZWNpZmllZCBpbiB0aGUKLSA8Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uSW5pdGlhbGl6ZXI8L2NvZGU+IGV4dGVuc2lvbiBwb2ludCBvciBudWxsIGlmIG5vCi0gaW5pdGlhbGl6ZXIgY2FuIGJlIGZvdW5kLgotPFA+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSA8Y29kZT5JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9jb2RlPjwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvQW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYgQ0xBU1MmbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uRGVmaW5pdGlvbi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IkFubm90YXRpb25EZWZpbml0aW9uLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3JfZGV0YWlsIj5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI3YjZiZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NjQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjQ2OjIxIEJTVCAyMDEwIC0tPgotPFRJVExFPgotQW5ub3RhdGlvbnNDb3JlCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDEwLTA0LTA3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iQW5ub3RhdGlvbnNDb3JlIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9Bbm5vdGF0aW9uc0NvcmUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25EZWZpbml0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmVQbHVnaW4uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iQW5ub3RhdGlvbnNDb3JlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08IS0tID09PT09PT09IFNUQVJUIE9GIENMQVNTIERBVEEgPT09PT09PT0gLS0+Ci08SDI+Ci08Rk9OVCBTSVpFPSItMSI+Ci1vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZTwvRk9OVD4KLTxCUj4KLUNsYXNzIEFubm90YXRpb25zQ29yZTwvSDI+Ci08UFJFPgotamF2YS5sYW5nLk9iamVjdAotICA8SU1HIFNSQz0iLi4vLi4vLi4vLi4vLi4vLi4vcmVzb3VyY2VzL2luaGVyaXQuZ2lmIiBBTFQ9ImV4dGVuZGVkIGJ5ICI+PEI+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlPC9CPgotPC9QUkU+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgZmluYWwgY2xhc3MgPEI+QW5ub3RhdGlvbnNDb3JlPC9CPjxEVD5leHRlbmRzIGphdmEubGFuZy5PYmplY3Q8L0RMPgotPC9QUkU+Ci0KLTxQPgotVXRpbGl0eSBjbGFzcyBmb3IgY3JlYXRpbmcgYW5ub3RhdGlvbnMgYW5kIG1lbWJlciB2YWx1ZSBwYWlycy4KLSA8cD4KLSA8c3Ryb25nPlByb3Zpc2lvbmFsIEFQSTo8L3N0cm9uZz4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyCi0gZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0Ci0gdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcwotIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSA8L3A+Ci08UD4KLQotPFA+Ci08SFI+Ci0KLTxQPgotCi08IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZS5odG1sI2NyZWF0ZUFycmF5TWVtYmVyVmFsdWVQYWlyKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3RbXSkiPmNyZWF0ZUFycmF5TWVtYmVyVmFsdWVQYWlyPC9BPjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVCZuYnNwO2FzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdFtdJm5ic3A7dmFsdWVzKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q3JlYXRlcyBhIG5ldyA8Q09ERT5NZW1iZXJWYWx1ZVBhaXI8L0NPREU+IHdpdGggYW4gPENPREU+QXJyYXlJbml0aWFsaXplcjwvQ09ERT4gdmFsdWUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO29yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BcnJheUluaXRpYWxpemVyPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZS5odG1sI2NyZWF0ZUFycmF5VmFsdWVMaXRlcmFsKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QsIGphdmEubGFuZy5PYmplY3RbXSkiPmNyZWF0ZUFycmF5VmFsdWVMaXRlcmFsPC9BPjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVCZuYnNwO2FzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3RbXSZuYnNwO3ZhbHVlcyk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NyZWF0ZXMgYSBuZXcgPENPREU+QXJyYXlJbml0aWFsaXplcjwvQ09ERT4uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO29yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Cb29sZWFuTGl0ZXJhbDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmUuaHRtbCNjcmVhdGVCb29sZWFuTGl0ZXJhbChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNULCBib29sZWFuKSI+Y3JlYXRlQm9vbGVhbkxpdGVyYWw8L0E+PC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUJm5ic3A7YXN0LAotICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiZuYnNwO3ZhbHVlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q3JlYXRlcyBhIG5ldyA8Q09ERT5Cb29sZWFuTGl0ZXJhbDwvQ09ERT4uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO29yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlLmh0bWwjY3JlYXRlQm9vbGVhbk1lbWJlclZhbHVlUGFpcihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNULCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuQm9vbGVhbikiPmNyZWF0ZUJvb2xlYW5NZW1iZXJWYWx1ZVBhaXI8L0E+PC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUJm5ic3A7YXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLkJvb2xlYW4mbmJzcDt2YWx1ZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NyZWF0ZXMgYSBuZXcgPENPREU+TWVtYmVyVmFsdWVQYWlyPC9DT0RFPiB3aXRoIGEgPENPREU+Qm9vbGVhbkxpdGVyYWw8L0NPREU+IHZhbHVlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUXVhbGlmaWVkTmFtZTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmUuaHRtbCNjcmVhdGVFbnVtTGl0ZXJhbChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNULCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KSI+Y3JlYXRlRW51bUxpdGVyYWw8L0E+PC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUJm5ic3A7YXN0LAotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO2NsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QmbmJzcDt2YWx1ZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NyZWF0ZXMgYSBuZXcgPENPREU+UXVhbGlmaWVkTmFtZTwvQ09ERT4gdG8gcmVwcmVzZW50IGFuIDxjb2RlPmVudW08L2NvZGU+IGxpdGVyYWwgdmFsdWUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO29yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlLmh0bWwjY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNULCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KSI+Y3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcjwvQT48L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QmbmJzcDthc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Jm5ic3A7dmFsdWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDcmVhdGVzIGEgbmV3IDxDT0RFPk1lbWJlclZhbHVlUGFpcjwvQ09ERT4gd2l0aCBhIDxDT0RFPk5hbWU8L0NPREU+IHZhbHVlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWFya2VyQW5ub3RhdGlvbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmUuaHRtbCNjcmVhdGVNYXJrZXJBbm5vdGF0aW9uKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QsIGphdmEubGFuZy5TdHJpbmcpIj5jcmVhdGVNYXJrZXJBbm5vdGF0aW9uPC9BPjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVCZuYnNwO2FzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO2Fubm90YXRpb25OYW1lKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q3JlYXRlcyBhIG5ldyA8Q09ERT5NYXJrZXJBbm5vdGF0aW9uPC9DT0RFPi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7b3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmUuaHRtbCNjcmVhdGVNZW1iZXJWYWx1ZVBhaXIob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVCwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb24pIj5jcmVhdGVNZW1iZXJWYWx1ZVBhaXI8L0E+PC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUJm5ic3A7YXN0LAotICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtuYW1lLAotICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uJm5ic3A7ZXhwcmVzc2lvbik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NyZWF0ZXMgYSBuZXcgPENPREU+TWVtYmVyVmFsdWVQYWlyPC9DT0RFPi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7b3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb248L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlLmh0bWwjY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNULCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdCkiPmNyZWF0ZU5vcm1hbEFubm90YXRpb248L0E+PC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUJm5ic3A7YXN0LAotICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7YW5ub3RhdGlvbk5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5MaXN0Jmx0O29yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXImZ3Q7Jm5ic3A7bWVtYmVyVmFsdWVQYWlycyk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NyZWF0ZXMgYSBuZXcgPENPREU+Tm9ybWFsQW5ub3RhdGlvbjwvQ09ERT4uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO29yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OdW1iZXJMaXRlcmFsPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZS5odG1sI2NyZWF0ZU51bWJlckxpdGVyYWwob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVCwgamF2YS5sYW5nLlN0cmluZykiPmNyZWF0ZU51bWJlckxpdGVyYWw8L0E+PC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUJm5ic3A7YXN0LAotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7dmFsdWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDcmVhdGVzIGEgbmV3IDxDT0RFPk51bWJlckxpdGVyYWw8L0NPREU+LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZS5odG1sI2NyZWF0ZU51bWJlck1lbWJlclZhbHVlUGFpcihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNULCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKSI+Y3JlYXRlTnVtYmVyTWVtYmVyVmFsdWVQYWlyPC9BPjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVCZuYnNwO2FzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7dmFsdWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDcmVhdGVzIGEgbmV3IDxDT0RFPk1lbWJlclZhbHVlUGFpcjwvQ09ERT4gd2l0aCBhIDxDT0RFPk51bWJlckxpdGVyYWw8L0NPREU+IHZhbHVlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmUuaHRtbCNjcmVhdGVTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uKSI+Y3JlYXRlU2luZ2xlTWVtYmVyQW5ub3RhdGlvbjwvQT48L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QmbmJzcDthc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDthbm5vdGF0aW9uTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb24mbmJzcDt2YWx1ZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NyZWF0ZXMgYSBuZXcgPENPREU+U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjwvQ09ERT4uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO29yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TdHJpbmdMaXRlcmFsPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZS5odG1sI2NyZWF0ZVN0cmluZ0xpdGVyYWwob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVCwgamF2YS5sYW5nLlN0cmluZykiPmNyZWF0ZVN0cmluZ0xpdGVyYWw8L0E+PC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUJm5ic3A7YXN0LAotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bGl0ZXJhbFZhbHVlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q3JlYXRlcyBhIG5ldyA8Q09ERT5TdHJpbmdMaXRlcmFsPC9DT0RFPi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7b3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmUuaHRtbCNjcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykiPmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcjwvQT48L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QmbmJzcDthc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO3ZhbHVlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q3JlYXRlcyBhIG5ldyA8Q09ERT5NZW1iZXJWYWx1ZVBhaXI8L0NPREU+IHdpdGggYSA8Q09ERT5TdHJpbmdMaXRlcmFsPC9DT0RFPiB2YWx1ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7b3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVMaXRlcmFsPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZS5odG1sI2NyZWF0ZVR5cGVMaXRlcmFsKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QsIGphdmEubGFuZy5DbGFzcykiPmNyZWF0ZVR5cGVMaXRlcmFsPC9BPjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVCZuYnNwO2FzdCwKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5DbGFzcyZsdDs/Jmd0OyZuYnNwO3ZhbHVlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q3JlYXRlcyBhIG5ldyA8Q09ERT5UeXBlTGl0ZXJhbDwvQ09ERT4uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO29yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlTGl0ZXJhbDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmUuaHRtbCNjcmVhdGVUeXBlTGl0ZXJhbChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNULCBqYXZhLmxhbmcuT2JqZWN0KSI+Y3JlYXRlVHlwZUxpdGVyYWw8L0E+PC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUJm5ic3A7YXN0LAotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdCZuYnNwO3ZhbHVlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q3JlYXRlcyBhIG5ldyA8Q09ERT5UeXBlTGl0ZXJhbDwvQ09ERT4uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO29yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlTGl0ZXJhbDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmUuaHRtbCNjcmVhdGVUeXBlTGl0ZXJhbChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNULCBqYXZhLmxhbmcuU3RyaW5nKSI+Y3JlYXRlVHlwZUxpdGVyYWw8L0E+PC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUJm5ic3A7YXN0LAotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO3ZhbHVlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q3JlYXRlcyBhIG5ldyA8Q09ERT5UeXBlTGl0ZXJhbDwvQ09ERT48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7b3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmUuaHRtbCNjcmVhdGVUeXBlTWVtYmVyVmFsdWVQYWlyKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpIj5jcmVhdGVUeXBlTWVtYmVyVmFsdWVQYWlyPC9BPjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVCZuYnNwO2FzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QmbmJzcDt2YWx1ZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NyZWF0ZXMgYSBuZXcgPENPREU+TWVtYmVyVmFsdWVQYWlyPC9DT0RFPiB3aXRoIGEgPENPREU+VHlwZUxpdGVyYWw8L0NPREU+IHZhbHVlLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3NfamF2YS5sYW5nLk9iamVjdCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gY2xhc3MgamF2YS5sYW5nLk9iamVjdDwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmNsb25lLCBlcXVhbHMsIGZpbmFsaXplLCBnZXRDbGFzcywgaGFzaENvZGUsIG5vdGlmeSwgbm90aWZ5QWxsLCB0b1N0cmluZywgd2FpdCwgd2FpdCwgd2FpdDwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9ImNyZWF0ZU5vcm1hbEFubm90YXRpb24ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVCwgamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLkxpc3QpIj48IS0tIC0tPjwvQT48SDM+Ci1jcmVhdGVOb3JtYWxBbm5vdGF0aW9uPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uIDxCPmNyZWF0ZU5vcm1hbEFubm90YXRpb248L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QmbmJzcDthc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO2Fubm90YXRpb25OYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5MaXN0Jmx0O29yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXImZ3Q7Jm5ic3A7bWVtYmVyVmFsdWVQYWlycyk8L1BSRT4KLTxETD4KLTxERD5DcmVhdGVzIGEgbmV3IDxDT0RFPk5vcm1hbEFubm90YXRpb248L0NPREU+LgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5hc3Q8L0NPREU+IC0gdGhlIDxDT0RFPkFTVDwvQ09ERT4gdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBhbm5vdGF0aW9uLjxERD48Q09ERT5hbm5vdGF0aW9uTmFtZTwvQ09ERT4gLSB0aGUgbmFtZSBvZiB0aGUgYW5ub3RhdGlvbi48REQ+PENPREU+bWVtYmVyVmFsdWVQYWlyczwvQ09ERT4gLSBhIGxpc3Qgb2YgPENPREU+TWVtYmVyVmFsdWVQYWlyPC9DT0RFPiB0byBhZGQgdG8gdGhlIG5vcm1hbCBhbm5vdGF0aW9uLgotPERUPjxCPlJldHVybnM6PC9CPjxERD5hIG5vcm1hbCBhbm5vdGF0aW9uIHdpdGggdGhlIGdpdmVuIG1lbWJlciB2YWx1ZSBwYWlycy48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImNyZWF0ZVNpbmdsZU1lbWJlckFubm90YXRpb24ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVCwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb24pIj48IS0tIC0tPjwvQT48SDM+Ci1jcmVhdGVTaW5nbGVNZW1iZXJBbm5vdGF0aW9uPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uIDxCPmNyZWF0ZVNpbmdsZU1lbWJlckFubm90YXRpb248L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QmbmJzcDthc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO2Fubm90YXRpb25OYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uJm5ic3A7dmFsdWUpPC9QUkU+Ci08REw+Ci08REQ+Q3JlYXRlcyBhIG5ldyA8Q09ERT5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uPC9DT0RFPi4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+YXN0PC9DT0RFPiAtIHRoZSA8Q09ERT5BU1Q8L0NPREU+IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgYW5ub3RhdGlvbi48REQ+PENPREU+YW5ub3RhdGlvbk5hbWU8L0NPREU+IC0gdGhlIG5hbWUgb2YgdGhlIGFubm90YXRpb24uPEREPjxDT0RFPnZhbHVlPC9DT0RFPiAtIHRoZSA8Q09ERT5FeHByZXNzaW9uPC9DT0RFPiB0byBzZXQgYXMgdGhlIHNpbmdsZSBtZW1iZXIgYW5ub3RhdGlvbiB2YWx1ZS4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+YSBzaW5nbGUgbWVtYmVyIGFubm90YXRpb24gd2l0aCB0aGUgZ2l2ZW4gdmFsdWUuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJjcmVhdGVNYXJrZXJBbm5vdGF0aW9uKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QsIGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1jcmVhdGVNYXJrZXJBbm5vdGF0aW9uPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NYXJrZXJBbm5vdGF0aW9uIDxCPmNyZWF0ZU1hcmtlckFubm90YXRpb248L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QmbmJzcDthc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO2Fubm90YXRpb25OYW1lKTwvUFJFPgotPERMPgotPEREPkNyZWF0ZXMgYSBuZXcgPENPREU+TWFya2VyQW5ub3RhdGlvbjwvQ09ERT4uCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmFzdDwvQ09ERT4gLSB0aGUgPENPREU+QVNUPC9DT0RFPiB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIGFubm90YXRpb24uPEREPjxDT0RFPmFubm90YXRpb25OYW1lPC9DT0RFPiAtIHRoZSBuYW1lIG9mIHRoZSBhbm5vdGF0aW9uLgotPERUPjxCPlJldHVybnM6PC9CPjxERD5hIG1hcmtlciBhbm5vdGF0aW9uLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iY3JlYXRlTWVtYmVyVmFsdWVQYWlyKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uKSI+PCEtLSAtLT48L0E+PEgzPgotY3JlYXRlTWVtYmVyVmFsdWVQYWlyPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXIgPEI+Y3JlYXRlTWVtYmVyVmFsdWVQYWlyPC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUJm5ic3A7YXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb24mbmJzcDtleHByZXNzaW9uKTwvUFJFPgotPERMPgotPEREPkNyZWF0ZXMgYSBuZXcgPENPREU+TWVtYmVyVmFsdWVQYWlyPC9DT0RFPi4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+YXN0PC9DT0RFPiAtIHRoZSA8Q09ERT5BU1Q8L0NPREU+IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgbWVtYmVyIHZhbHVlIHBhaXIuPEREPjxDT0RFPm5hbWU8L0NPREU+IC0gdGhlIDxDT0RFPk1lbWJlclZhbHVlUGFpcjwvQ09ERT4gIm5hbWUiLjxERD48Q09ERT5leHByZXNzaW9uPC9DT0RFPiAtIHRoZSA8Q09ERT5FeHByZXNzaW9uPC9DT0RFPiAidmFsdWUiIG9mIHRoZSBtZW1iZXIgdmFsdWUgcGFpci4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+YSBuZXcgbWVtYmVyIHZhbHVlIHBhaXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgdmFsdWUuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJjcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLWNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcjwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyIDxCPmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVCZuYnNwO2FzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDt2YWx1ZSk8L1BSRT4KLTxETD4KLTxERD5DcmVhdGVzIGEgbmV3IDxDT0RFPk1lbWJlclZhbHVlUGFpcjwvQ09ERT4gd2l0aCBhIDxDT0RFPlN0cmluZ0xpdGVyYWw8L0NPREU+IHZhbHVlLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5hc3Q8L0NPREU+IC0gdGhlIDxDT0RFPkFTVDwvQ09ERT4gdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBtZW1iZXIgdmFsdWUgcGFpci48REQ+PENPREU+bmFtZTwvQ09ERT4gLSB0aGUgbWVtYmVyIHZhbHVlIHBhaXIgIm5hbWUiLjxERD48Q09ERT52YWx1ZTwvQ09ERT4gLSB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPiAidmFsdWUiLgotPERUPjxCPlJldHVybnM6PC9CPjxERD5hIG5ldyBtZW1iZXIgdmFsdWUgcGFpciB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCB2YWx1ZS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImNyZWF0ZUJvb2xlYW5NZW1iZXJWYWx1ZVBhaXIob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLkJvb2xlYW4pIj48IS0tIC0tPjwvQT48SDM+Ci1jcmVhdGVCb29sZWFuTWVtYmVyVmFsdWVQYWlyPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXIgPEI+Y3JlYXRlQm9vbGVhbk1lbWJlclZhbHVlUGFpcjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVCZuYnNwO2FzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLkJvb2xlYW4mbmJzcDt2YWx1ZSk8L1BSRT4KLTxETD4KLTxERD5DcmVhdGVzIGEgbmV3IDxDT0RFPk1lbWJlclZhbHVlUGFpcjwvQ09ERT4gd2l0aCBhIDxDT0RFPkJvb2xlYW5MaXRlcmFsPC9DT0RFPiB2YWx1ZS4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+YXN0PC9DT0RFPiAtIHRoZSA8Q09ERT5BU1Q8L0NPREU+IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgbWVtYmVyIHZhbHVlIHBhaXIuPEREPjxDT0RFPm5hbWU8L0NPREU+IC0gdGhlIG1lbWJlciB2YWx1ZSBwYWlyICJuYW1lIi48REQ+PENPREU+dmFsdWU8L0NPREU+IC0gdGhlIDxjb2RlPkJvb2xlYW48L2NvZGU+ICJ2YWx1ZSIuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPmEgbmV3IG1lbWJlciB2YWx1ZSBwYWlyIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIHZhbHVlLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iY3JlYXRlTnVtYmVyTWVtYmVyVmFsdWVQYWlyKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1jcmVhdGVOdW1iZXJNZW1iZXJWYWx1ZVBhaXI8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpciA8Qj5jcmVhdGVOdW1iZXJNZW1iZXJWYWx1ZVBhaXI8L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QmbmJzcDthc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7dmFsdWUpPC9QUkU+Ci08REw+Ci08REQ+Q3JlYXRlcyBhIG5ldyA8Q09ERT5NZW1iZXJWYWx1ZVBhaXI8L0NPREU+IHdpdGggYSA8Q09ERT5OdW1iZXJMaXRlcmFsPC9DT0RFPiB2YWx1ZS4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+YXN0PC9DT0RFPiAtIHRoZSA8Q09ERT5BU1Q8L0NPREU+IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgbWVtYmVyIHZhbHVlIHBhaXIuPEREPjxDT0RFPm5hbWU8L0NPREU+IC0gdGhlIG1lbWJlciB2YWx1ZSBwYWlyICJuYW1lIi48REQ+PENPREU+dmFsdWU8L0NPREU+IC0gdGhlIDxjb2RlPlN0cmluZzwvY29kZT4gInZhbHVlIiByZXByZXNlbnRpbmcgdGhlIG51bWJlci4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+YSBuZXcgbWVtYmVyIHZhbHVlIHBhaXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgdmFsdWUuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJjcmVhdGVFbnVtTWVtYmVyVmFsdWVQYWlyKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpIj48IS0tIC0tPjwvQT48SDM+Ci1jcmVhdGVFbnVtTWVtYmVyVmFsdWVQYWlyPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXIgPEI+Y3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVCZuYnNwO2FzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QmbmJzcDt2YWx1ZSk8L1BSRT4KLTxETD4KLTxERD5DcmVhdGVzIGEgbmV3IDxDT0RFPk1lbWJlclZhbHVlUGFpcjwvQ09ERT4gd2l0aCBhIDxDT0RFPk5hbWU8L0NPREU+IHZhbHVlLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5hc3Q8L0NPREU+IC0gdGhlIDxDT0RFPkFTVDwvQ09ERT4gdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBtZW1iZXIgdmFsdWUgcGFpci48REQ+PENPREU+Y2xhc3NOYW1lPC9DT0RFPiAtIHRoZSBlbmNsb3NpbmcgY2xhc3MgbmFtZS48REQ+PENPREU+bmFtZTwvQ09ERT4gLSB0aGUgbWVtYmVyIHZhbHVlIHBhaXIgIm5hbWUiLjxERD48Q09ERT52YWx1ZTwvQ09ERT4gLSBhbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSA8Y29kZT5lbnVtPC9jb2RlPiB2YWx1ZS4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+YSBuZXcgbWVtYmVyIHZhbHVlIHBhaXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgdmFsdWUuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJjcmVhdGVUeXBlTWVtYmVyVmFsdWVQYWlyKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpIj48IS0tIC0tPjwvQT48SDM+Ci1jcmVhdGVUeXBlTWVtYmVyVmFsdWVQYWlyPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXIgPEI+Y3JlYXRlVHlwZU1lbWJlclZhbHVlUGFpcjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVCZuYnNwO2FzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdCZuYnNwO3ZhbHVlKTwvUFJFPgotPERMPgotPEREPkNyZWF0ZXMgYSBuZXcgPENPREU+TWVtYmVyVmFsdWVQYWlyPC9DT0RFPiB3aXRoIGEgPENPREU+VHlwZUxpdGVyYWw8L0NPREU+IHZhbHVlLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5hc3Q8L0NPREU+IC0gdGhlIDxDT0RFPkFTVDwvQ09ERT4gdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBtZW1iZXIgdmFsdWUgcGFpci48REQ+PENPREU+bmFtZTwvQ09ERT4gLSB0aGUgbWVtYmVyIHZhbHVlIHBhaXIgIm5hbWUiLjxERD48Q09ERT52YWx1ZTwvQ09ERT4gLSBhbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSB0eXBlIHZhbHVlLgotPERUPjxCPlJldHVybnM6PC9CPjxERD5hIG5ldyBtZW1iZXIgdmFsdWUgcGFpciB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCB2YWx1ZS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImNyZWF0ZUFycmF5TWVtYmVyVmFsdWVQYWlyKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3RbXSkiPjwhLS0gLS0+PC9BPjxIMz4KLWNyZWF0ZUFycmF5TWVtYmVyVmFsdWVQYWlyPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXIgPEI+Y3JlYXRlQXJyYXlNZW1iZXJWYWx1ZVBhaXI8L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QmbmJzcDthc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdFtdJm5ic3A7dmFsdWVzKTwvUFJFPgotPERMPgotPEREPkNyZWF0ZXMgYSBuZXcgPENPREU+TWVtYmVyVmFsdWVQYWlyPC9DT0RFPiB3aXRoIGFuIDxDT0RFPkFycmF5SW5pdGlhbGl6ZXI8L0NPREU+IHZhbHVlLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5hc3Q8L0NPREU+IC0gdGhlIDxDT0RFPkFTVDwvQ09ERT4gdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBtZW1iZXIgdmFsdWUgcGFpci48REQ+PENPREU+bmFtZTwvQ09ERT4gLSB0aGUgbWVtYmVyIHZhbHVlIHBhaXIgIm5hbWUiLjxERD48Q09ERT52YWx1ZXM8L0NPREU+IC0gYW4gYXJyYXkgb2YgPGNvZGU+T2JqZWN0PC9jb2RlPiB2YWx1ZXMuIFN1cHBvcnRzICA8Q09ERT5TdHJpbmc8L0NPREU+LCA8Q09ERT5Cb29sZWFuPC9DT0RFPiwgPENPREU+Q2xhc3M8L0NPREU+IHZhbHVlcy4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+YSBuZXcgbWVtYmVyIHZhbHVlIHBhaXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgYXJyYXkgb2YgdmFsdWVzLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iY3JlYXRlQXJyYXlWYWx1ZUxpdGVyYWwob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVCwgamF2YS5sYW5nLk9iamVjdFtdKSI+PCEtLSAtLT48L0E+PEgzPgotY3JlYXRlQXJyYXlWYWx1ZUxpdGVyYWw8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFycmF5SW5pdGlhbGl6ZXIgPEI+Y3JlYXRlQXJyYXlWYWx1ZUxpdGVyYWw8L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QmbmJzcDthc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3RbXSZuYnNwO3ZhbHVlcyk8L1BSRT4KLTxETD4KLTxERD5DcmVhdGVzIGEgbmV3IDxDT0RFPkFycmF5SW5pdGlhbGl6ZXI8L0NPREU+LgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5hc3Q8L0NPREU+IC0gdGhlIDxDT0RFPkFTVDwvQ09ERT4gdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSA8Q09ERT5BcnJheUluaXRpYWxpemVyPC9DT0RFPi48REQ+PENPREU+dmFsdWVzPC9DT0RFPiAtIGFuIGFycmF5IG9mIDxjb2RlPk9iamVjdDwvY29kZT4gdmFsdWVzLiBTdXBwb3J0cyAgPENPREU+U3RyaW5nPC9DT0RFPiwgPENPREU+Qm9vbGVhbjwvQ09ERT4sIDxDT0RFPkNsYXNzPC9DT0RFPiB2YWx1ZXMuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPmEgbmV3IHNycmF5IGluaXRpYWxpemVyLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iY3JlYXRlRW51bUxpdGVyYWwob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkiPjwhLS0gLS0+PC9BPjxIMz4KLWNyZWF0ZUVudW1MaXRlcmFsPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5RdWFsaWZpZWROYW1lIDxCPmNyZWF0ZUVudW1MaXRlcmFsPC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUJm5ic3A7YXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7Y2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Jm5ic3A7dmFsdWUpPC9QUkU+Ci08REw+Ci08REQ+Q3JlYXRlcyBhIG5ldyA8Q09ERT5RdWFsaWZpZWROYW1lPC9DT0RFPiB0byByZXByZXNlbnQgYW4gPGNvZGU+ZW51bTwvY29kZT4gbGl0ZXJhbCB2YWx1ZS4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+YXN0PC9DT0RFPiAtIHRoZSA8Q09ERT5BU1Q8L0NPREU+IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgcXVhbGlmaWVkIG5hbWUuPEREPjxDT0RFPmNsYXNzTmFtZTwvQ09ERT4gLSB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVuY2xvc2luZyBjbGFzcy48REQ+PENPREU+dmFsdWU8L0NPREU+IC0gc24gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgPGNvZGU+ZW51bTwvY29kZT4gdmFsdWUuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPmEgbmV3IHF1YWxpZmllZCBuYW1lLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iY3JlYXRlVHlwZUxpdGVyYWwob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVCwgamF2YS5sYW5nLk9iamVjdCkiPjwhLS0gLS0+PC9BPjxIMz4KLWNyZWF0ZVR5cGVMaXRlcmFsPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlTGl0ZXJhbCA8Qj5jcmVhdGVUeXBlTGl0ZXJhbDwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVCZuYnNwO2FzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QmbmJzcDt2YWx1ZSk8L1BSRT4KLTxETD4KLTxERD5DcmVhdGVzIGEgbmV3IDxDT0RFPlR5cGVMaXRlcmFsPC9DT0RFPi4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+YXN0PC9DT0RFPiAtIHRoZSA8Q09ERT5BU1Q8L0NPREU+IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgPENPREU+VHlwZUxpdGVyYWw8L0NPREU+LjxERD48Q09ERT52YWx1ZTwvQ09ERT4gLSBhIDxjb2RlPkNsYXNzPC9jb2RlPiBvciBhIDxjb2RlPlN0cmluZzwvY29kZT4gZnJvbSB3aGljaCB0byBjcmVhdGUgdGhlIHR5cGUgbGl0ZXJhbC4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+YSBuZXcgdHlwZSBsaXRlcmFsIG9yIG51bGwgaXQgdGhlIHZhbHVlIGlzIG5vdCBvZiB0eXBlIDxjb2RlPkNsYXNzPC9jb2RlPiBvciA8Y29kZT5TdHJpbmc8L2NvZGU+LjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iY3JlYXRlVHlwZUxpdGVyYWwob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVCwgamF2YS5sYW5nLkNsYXNzKSI+PCEtLSAtLT48L0E+PEgzPgotY3JlYXRlVHlwZUxpdGVyYWw8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVMaXRlcmFsIDxCPmNyZWF0ZVR5cGVMaXRlcmFsPC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUJm5ic3A7YXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLkNsYXNzJmx0Oz8mZ3Q7Jm5ic3A7dmFsdWUpPC9QUkU+Ci08REw+Ci08REQ+Q3JlYXRlcyBhIG5ldyA8Q09ERT5UeXBlTGl0ZXJhbDwvQ09ERT4uCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmFzdDwvQ09ERT4gLSB0aGUgPENPREU+QVNUPC9DT0RFPiB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIHR5cGUgbGl0ZXJhbC48REQ+PENPREU+dmFsdWU8L0NPREU+IC0gdGhlIGNsYXNzIHZhbHVlLgotPERUPjxCPlJldHVybnM6PC9CPjxERD5hIG5ldyB0eXBlIGxpdGVyYWwuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJjcmVhdGVUeXBlTGl0ZXJhbChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNULCBqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotY3JlYXRlVHlwZUxpdGVyYWw8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVMaXRlcmFsIDxCPmNyZWF0ZVR5cGVMaXRlcmFsPC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUJm5ic3A7YXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO3ZhbHVlKTwvUFJFPgotPERMPgotPEREPkNyZWF0ZXMgYSBuZXcgPENPREU+VHlwZUxpdGVyYWw8L0NPREU+Ci08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmFzdDwvQ09ERT4gLSB0aGUgPENPREU+QVNUPC9DT0RFPiB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIHR5cGUgbGl0ZXJhbC48REQ+PENPREU+dmFsdWU8L0NPREU+IC0gdGhlIG5hbWUgb2YgdGhlIGNsYXNzLgotPERUPjxCPlJldHVybnM6PC9CPjxERD5hIG5ldyB0eXBlIGxpdGVyYWwuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJjcmVhdGVTdHJpbmdMaXRlcmFsKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QsIGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1jcmVhdGVTdHJpbmdMaXRlcmFsPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TdHJpbmdMaXRlcmFsIDxCPmNyZWF0ZVN0cmluZ0xpdGVyYWw8L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QmbmJzcDthc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO2xpdGVyYWxWYWx1ZSk8L1BSRT4KLTxETD4KLTxERD5DcmVhdGVzIGEgbmV3IDxDT0RFPlN0cmluZ0xpdGVyYWw8L0NPREU+LgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5hc3Q8L0NPREU+IC0gdGhlIDxDT0RFPkFTVDwvQ09ERT4gdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBzdHJpbmcgbGl0ZXJhbC48REQ+PENPREU+bGl0ZXJhbFZhbHVlPC9DT0RFPiAtIHRoZSBzdHJpbmcgdmFsdWUuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPmEgbmV3IHN0cmluZyBsaXRlcmFsLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iY3JlYXRlQm9vbGVhbkxpdGVyYWwob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVCwgYm9vbGVhbikiPjwhLS0gLS0+PC9BPjxIMz4KLWNyZWF0ZUJvb2xlYW5MaXRlcmFsPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Cb29sZWFuTGl0ZXJhbCA8Qj5jcmVhdGVCb29sZWFuTGl0ZXJhbDwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVCZuYnNwO2FzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4mbmJzcDt2YWx1ZSk8L1BSRT4KLTxETD4KLTxERD5DcmVhdGVzIGEgbmV3IDxDT0RFPkJvb2xlYW5MaXRlcmFsPC9DT0RFPi4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+YXN0PC9DT0RFPiAtIHRoZSA8Q09ERT5BU1Q8L0NPREU+IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgYm9vbGVhbiBsaXRlcmFsLjxERD48Q09ERT52YWx1ZTwvQ09ERT4gLSB0aGUgYm9vbGVhbiB2YWx1ZS4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+YSBuZXcgYm9vbGVhbiBsaXRlcmFsLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iY3JlYXRlTnVtYmVyTGl0ZXJhbChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNULCBqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotY3JlYXRlTnVtYmVyTGl0ZXJhbDwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTnVtYmVyTGl0ZXJhbCA8Qj5jcmVhdGVOdW1iZXJMaXRlcmFsPC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUJm5ic3A7YXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDt2YWx1ZSk8L1BSRT4KLTxETD4KLTxERD5DcmVhdGVzIGEgbmV3IDxDT0RFPk51bWJlckxpdGVyYWw8L0NPREU+LgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5hc3Q8L0NPREU+IC0gdGhlIDxDT0RFPkFTVDwvQ09ERT4gdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSA8Q09ERT5OdW1iZXJMaXRlcmFsPC9DT0RFPi48REQ+PENPREU+dmFsdWU8L0NPREU+IC0gdGhlIG51bWJlciB2YWx1ZS4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+YSBuZXcgbnVtYmVyIGxpdGVyYWwuPC9ETD4KLTwvREQ+Ci08L0RMPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIENMQVNTIERBVEEgPT09PT09PT09IC0tPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9Bbm5vdGF0aW9uc0NvcmUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25EZWZpbml0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmVQbHVnaW4uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iQW5ub3RhdGlvbnNDb3JlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmVQbHVnaW4uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmVQbHVnaW4uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU3MDM0Mi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MjggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjQ2OjIxIEJTVCAyMDEwIC0tPgotPFRJVExFPgotQW5ub3RhdGlvbnNDb3JlUGx1Z2luCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDEwLTA0LTA3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iQW5ub3RhdGlvbnNDb3JlUGx1Z2luIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9Bbm5vdGF0aW9uc0NvcmVQbHVnaW4uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNNYW5hZ2VyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZVBsdWdpbi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IkFubm90YXRpb25zQ29yZVBsdWdpbi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjZmllbGRfc3VtbWFyeSI+RklFTEQ8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDs8QSBIUkVGPSIjZmllbGRfZGV0YWlsIj5GSUVMRDwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmU8L0ZPTlQ+Ci08QlI+Ci1DbGFzcyBBbm5vdGF0aW9uc0NvcmVQbHVnaW48L0gyPgotPFBSRT4KLWphdmEubGFuZy5PYmplY3QKLSAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4KLSAgICAgIDxJTUcgU1JDPSIuLi8uLi8uLi8uLi8uLi8uLi9yZXNvdXJjZXMvaW5oZXJpdC5naWYiIEFMVD0iZXh0ZW5kZWQgYnkgIj48Qj5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmVQbHVnaW48L0I+Ci08L1BSRT4KLTxETD4KLTxEVD48Qj5BbGwgSW1wbGVtZW50ZWQgSW50ZXJmYWNlczo8L0I+IDxERD5vcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yPC9ERD4KLTwvREw+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgY2xhc3MgPEI+QW5ub3RhdGlvbnNDb3JlUGx1Z2luPC9CPjxEVD5leHRlbmRzIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW48L0RMPgotPC9QUkU+Ci0KLTxQPgotPHA+Ci0gPHN0cm9uZz5Qcm92aXNpb25hbCBBUEk6PC9zdHJvbmc+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciAKLSBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgCi0gdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyAKLSB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gPC9wPgotPFA+Ci0KLTxQPgotPEhSPgotCi08UD4KLTwhLS0gPT09PT09PT09PT0gRklFTEQgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0iZmllbGRfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkZpZWxkIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZVBsdWdpbi5odG1sI1BMVUdJTl9JRCI+UExVR0lOX0lEPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9ImZpZWxkc19pbmhlcml0ZWRfZnJvbV9jbGFzc19vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+RmllbGRzIGluaGVyaXRlZCBmcm9tIGNsYXNzIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW48L0I+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT5QTFVHSU5fUFJFRkVSRU5DRV9TQ09QRSwgUFJFRkVSRU5DRVNfREVGQVVMVF9PVkVSUklERV9CQVNFX05BTUUsIFBSRUZFUkVOQ0VTX0RFRkFVTFRfT1ZFUlJJREVfRklMRV9OQU1FPC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPCEtLSA9PT09PT09PSBDT05TVFJVQ1RPUiBTVU1NQVJZID09PT09PT09IC0tPgotCi08QSBOQU1FPSJjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmVQbHVnaW4uaHRtbCNBbm5vdGF0aW9uc0NvcmVQbHVnaW4oKSI+QW5ub3RhdGlvbnNDb3JlUGx1Z2luPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmVQbHVnaW4uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj5Bbm5vdGF0aW9uc0NvcmVQbHVnaW48L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZVBsdWdpbi5odG1sI2dldERlZmF1bHQoKSI+Z2V0RGVmYXVsdDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZVBsdWdpbi5odG1sI2xvZyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykiPmxvZzwvQT48L0I+KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzJm5ic3A7c3RhdHVzKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmh0bWwjbG9nKGphdmEubGFuZy5UaHJvd2FibGUpIj5sb2c8L0E+PC9CPihqYXZhLmxhbmcuVGhyb3dhYmxlJm5ic3A7ZXhjZXB0aW9uKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmh0bWwjbG9nTWVzc2FnZShpbnQsIGphdmEubGFuZy5TdHJpbmcpIj5sb2dNZXNzYWdlPC9BPjwvQj4oaW50Jm5ic3A7c2V2ZXJpdHksCi0gICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDttZXNzYWdlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmh0bWwjc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpIj5zdGFydDwvQT48L0I+KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0Jm5ic3A7Y29udGV4dCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZVBsdWdpbi5odG1sI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpIj5zdG9wPC9BPjwvQj4ob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQmbmJzcDtjb250ZXh0KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luPC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+ZmluZCwgZmluZCwgZ2V0QnVuZGxlLCBnZXREZXNjcmlwdG9yLCBnZXRMb2csIGdldFBsdWdpblByZWZlcmVuY2VzLCBnZXRTdGF0ZUxvY2F0aW9uLCBpbml0aWFsaXplRGVmYXVsdFBsdWdpblByZWZlcmVuY2VzLCBpbnRlcm5hbEluaXRpYWxpemVEZWZhdWx0UGx1Z2luUHJlZmVyZW5jZXMsIGlzRGVidWdnaW5nLCBvcGVuU3RyZWFtLCBvcGVuU3RyZWFtLCBzYXZlUGx1Z2luUHJlZmVyZW5jZXMsIHNldERlYnVnZ2luZywgc2h1dGRvd24sIHN0YXJ0dXAsIHRvU3RyaW5nPC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3NfamF2YS5sYW5nLk9iamVjdCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gY2xhc3MgamF2YS5sYW5nLk9iamVjdDwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmNsb25lLCBlcXVhbHMsIGZpbmFsaXplLCBnZXRDbGFzcywgaGFzaENvZGUsIG5vdGlmeSwgbm90aWZ5QWxsLCB3YWl0LCB3YWl0LCB3YWl0PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTwhLS0gPT09PT09PT09PT09IEZJRUxEIERFVEFJTCA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0iZmllbGRfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+RmllbGQgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9IlBMVUdJTl9JRCI+PCEtLSAtLT48L0E+PEgzPgotUExVR0lOX0lEPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgPEI+UExVR0lOX0lEPC9CPjwvUFJFPgotPERMPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vY29uc3RhbnQtdmFsdWVzLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlUGx1Z2luLlBMVUdJTl9JRCI+Q29uc3RhbnQgRmllbGQgVmFsdWVzPC9BPjwvREw+Ci08L0RMPgotCi08IS0tID09PT09PT09PSBDT05TVFJVQ1RPUiBERVRBSUwgPT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImNvbnN0cnVjdG9yX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNvbnN0cnVjdG9yIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJBbm5vdGF0aW9uc0NvcmVQbHVnaW4oKSI+PCEtLSAtLT48L0E+PEgzPgotQW5ub3RhdGlvbnNDb3JlUGx1Z2luPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEI+QW5ub3RhdGlvbnNDb3JlUGx1Z2luPC9CPigpPC9QUkU+Ci08REw+Ci08L0RMPgotCi08IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9ImdldERlZmF1bHQoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0RGVmYXVsdDwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmVQbHVnaW4uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj5Bbm5vdGF0aW9uc0NvcmVQbHVnaW48L0E+IDxCPmdldERlZmF1bHQ8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InN0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KSI+PCEtLSAtLT48L0E+PEgzPgotc3RhcnQ8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnN0YXJ0PC9CPihvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCZuYnNwO2NvbnRleHQpCi0gICAgICAgICAgIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPERUPjxCPlNwZWNpZmllZCBieTo8L0I+PEREPjxDT0RFPnN0YXJ0PC9DT0RFPiBpbiBpbnRlcmZhY2UgPENPREU+b3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjwvQ09ERT48RFQ+PEI+T3ZlcnJpZGVzOjwvQj48REQ+PENPREU+c3RhcnQ8L0NPREU+IGluIGNsYXNzIDxDT0RFPm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW48L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotCi08RFQ+PEI+VGhyb3dzOjwvQj4KLTxERD48Q09ERT5qYXZhLmxhbmcuRXhjZXB0aW9uPC9DT0RFPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkiPjwhLS0gLS0+PC9BPjxIMz4KLXN0b3A8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnN0b3A8L0I+KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0Jm5ic3A7Y29udGV4dCkKLSAgICAgICAgICB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbjwvUFJFPgotPERMPgotPEREPjxETD4KLTxEVD48Qj5TcGVjaWZpZWQgYnk6PC9CPjxERD48Q09ERT5zdG9wPC9DT0RFPiBpbiBpbnRlcmZhY2UgPENPREU+b3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjwvQ09ERT48RFQ+PEI+T3ZlcnJpZGVzOjwvQj48REQ+PENPREU+c3RvcDwvQ09ERT4gaW4gY2xhc3MgPENPREU+b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjwvQ09ERT48L0RMPgotPC9ERD4KLTxERD48REw+Ci0KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPmphdmEubGFuZy5FeGNlcHRpb248L0NPREU+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJsb2dNZXNzYWdlKGludCwgamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLWxvZ01lc3NhZ2U8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgdm9pZCA8Qj5sb2dNZXNzYWdlPC9CPihpbnQmbmJzcDtzZXZlcml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDttZXNzYWdlKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ibG9nKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKSI+PCEtLSAtLT48L0E+PEgzPgotbG9nPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIHZvaWQgPEI+bG9nPC9CPihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyZuYnNwO3N0YXR1cyk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImxvZyhqYXZhLmxhbmcuVGhyb3dhYmxlKSI+PCEtLSAtLT48L0E+PEgzPgotbG9nPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIHZvaWQgPEI+bG9nPC9CPihqYXZhLmxhbmcuVGhyb3dhYmxlJm5ic3A7ZXhjZXB0aW9uKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmUuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zTWFuYWdlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmVQbHVnaW4uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJBbm5vdGF0aW9uc0NvcmVQbHVnaW4uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2ZpZWxkX3N1bW1hcnkiPkZJRUxEPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7PEEgSFJFRj0iI2ZpZWxkX2RldGFpbCI+RklFTEQ8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9kZXRhaWwiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zTWFuYWdlci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zTWFuYWdlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmQ2ODFmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc01hbmFnZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMTQpIG9uIFdlZCBBcHIgMDcgMDc6NDY6MjEgQlNUIDIwMTAgLS0+Ci08VElUTEU+Ci1Bbm5vdGF0aW9uc01hbmFnZXIKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTAtMDQtMDciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJBbm5vdGF0aW9uc01hbmFnZXIiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0Fubm90YXRpb25zTWFuYWdlci5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDtORVhUIENMQVNTPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zTWFuYWdlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IkFubm90YXRpb25zTWFuYWdlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmU8L0ZPTlQ+Ci08QlI+Ci1DbGFzcyBBbm5vdGF0aW9uc01hbmFnZXI8L0gyPgotPFBSRT4KLWphdmEubGFuZy5PYmplY3QKLSAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zTWFuYWdlcjwvQj4KLTwvUFJFPgotPEhSPgotPERMPgotPERUPjxQUkU+cHVibGljIGZpbmFsIGNsYXNzIDxCPkFubm90YXRpb25zTWFuYWdlcjwvQj48RFQ+ZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0PC9ETD4KLTwvUFJFPgotCi08UD4KLU1hbmFnZXMgdGhlIGFubm90YXRpb24gY2F0ZWdvcmllcywgZGVmaW5pdGlvbnMsIHByb2Nlc3NvcnMgYW5kIGluaXRpYWxpemVycyBjb250cmlidXRlZCB0aHJvdWdoIHRoZQotIDxjb2RlPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25EZWZpbml0aW9uPC9jb2RlPiwKLSA8Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uQ2F0ZWdvcnk8L2NvZGU+LAotIDxjb2RlPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25Jbml0aWFsaXplcjwvY29kZT4gYW5kCi0gPGNvZGU+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvblByb2Nlc3NvcjwvY29kZT4gZXh0ZW5zaW9uIHBvaW50cy4KLSA8cD4KLSA8c3Ryb25nPlByb3Zpc2lvbmFsIEFQSTo8L3N0cm9uZz4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyCi0gZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0Ci0gdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcwotIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSA8L3A+Ci08UD4KLQotPFA+Ci08SFI+Ci0KLTxQPgotCi08IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24iPklBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zTWFuYWdlci5odG1sI2dldEFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplckZvck5hbWUob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5hbWUpIj5nZXRBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXJGb3JOYW1lPC9BPjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5hbWUmbmJzcDtuYW1lKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uIj48Q09ERT5JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9DT0RFPjwvQT4gZm9yIHRoZSBnaXZlbiA8Q09ERT5OYW1lPC9DT0RFPgotIG9yIG51bGwgaWYgbm9uZSBjYW4gYmUgZm91bmQuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2phdmEudXRpbC5MaXN0Jmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zTWFuYWdlci5odG1sI2dldEFubm90YXRpb25DYXRlZ29yaWVzKCkiPmdldEFubm90YXRpb25DYXRlZ29yaWVzPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyBhIGxpc3Qgb2YgdGhlIGFubm90YXRpb24gY2F0ZWdvcmllcy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj5Bbm5vdGF0aW9uRGVmaW5pdGlvbjwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNNYW5hZ2VyLmh0bWwjZ2V0QW5ub3RhdGlvbkRlZmluaXRpb25Gb3JDbGFzcyhqYXZhLmxhbmcuQ2xhc3MpIj5nZXRBbm5vdGF0aW9uRGVmaW5pdGlvbkZvckNsYXNzPC9BPjwvQj4oamF2YS5sYW5nLkNsYXNzJmx0Oz8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uJmd0OyZuYnNwO2Fubm90YXRpb25DbGFzcyk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25EZWZpbml0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSI+PENPREU+QW5ub3RhdGlvbkRlZmluaXRpb248L0NPREU+PC9BPiBmb3IgdGhlIGdpdmVuIDxDT0RFPkFubm90YXRpb248L0NPREU+IGNsYXNzCi0gb3IgbnVsbCBpZiBubyBhbm5vdGF0aW9uIGRlZmluaXRpb24gY2FuIGJlIGZvdW5kLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uRGVmaW5pdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPkFubm90YXRpb25EZWZpbml0aW9uPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc01hbmFnZXIuaHRtbCNnZXRBbm5vdGF0aW9uRGVmaW5pdGlvbkZvckNsYXNzKGphdmEubGFuZy5TdHJpbmcpIj5nZXRBbm5vdGF0aW9uRGVmaW5pdGlvbkZvckNsYXNzPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2Nhbm9uaWNhbE5hbWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uRGVmaW5pdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPjxDT0RFPkFubm90YXRpb25EZWZpbml0aW9uPC9DT0RFPjwvQT4gZm9yIHRoZSBnaXZlbiBmdWxseSBxdWFsaWZpZWQgPENPREU+QW5ub3RhdGlvbjwvQ09ERT4gY2xhc3MKLSBuYW1lIG9yIG51bGwgaWYgbm8gYW5ub3RhdGlvbiBkZWZpbml0aW9uIGNhbiBiZSBmb3VuZC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHJvdGVjdGVkIHN0YXRpYyZuYnNwO2phdmEudXRpbC5NYXAmbHQ7amF2YS5sYW5nLlN0cmluZyxvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50Jmd0OzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc01hbmFnZXIuaHRtbCNnZXRBbm5vdGF0aW9uSW5pdGlhbGl6ZXJDYWNoZSgpIj5nZXRBbm5vdGF0aW9uSW5pdGlhbGl6ZXJDYWNoZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtqYXZhLnV0aWwuTWFwJmx0O2phdmEubGFuZy5TdHJpbmcsamF2YS51dGlsLkxpc3QmbHQ7b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCZndDsmZ3Q7PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zTWFuYWdlci5odG1sI2dldEFubm90YXRpb25Qcm9jZXNzb3JzQ2FjaGUoKSI+Z2V0QW5ub3RhdGlvblByb2Nlc3NvcnNDYWNoZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtqYXZhLnV0aWwuTGlzdCZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uRGVmaW5pdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPkFubm90YXRpb25EZWZpbml0aW9uPC9BPiZndDs8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNNYW5hZ2VyLmh0bWwjZ2V0QW5ub3RhdGlvbnMoKSI+Z2V0QW5ub3RhdGlvbnM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIGEgbGlzdCBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uRGVmaW5pdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPjxDT0RFPkFubm90YXRpb25EZWZpbml0aW9uPC9DT0RFPjwvQT4gY29uc3RydWN0ZWQgZnJvbSBjb250cmlidXRpb25zIHRvIHRoZQotIDxjb2RlPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25EZWZpbml0aW9uPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2phdmEudXRpbC5MaXN0Jmx0O2phdmEubGFuZy5DbGFzcyZsdDs/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbiZndDsmZ3Q7PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zTWFuYWdlci5odG1sI2dldEFubm90YXRpb25zKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCkiPmdldEFubm90YXRpb25zPC9BPjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Jm5ic3A7amF2YUVsZW1lbnQpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhlIGNvbnRyaWJ1dGVkIDxDT0RFPkFubm90YXRpb248L0NPREU+IHRoYXQgdGFyZ2V0IHRoZSBnaXZlbiBqYXZhIGVsZW1lbnQgdHlwZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7amF2YS51dGlsLkxpc3QmbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj5Bbm5vdGF0aW9uRGVmaW5pdGlvbjwvQT4mZ3Q7PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zTWFuYWdlci5odG1sI2dldEFubm90YXRpb25zQnlDYXRlZ29yeShqYXZhLmxhbmcuU3RyaW5nKSI+Z2V0QW5ub3RhdGlvbnNCeUNhdGVnb3J5PC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2NhdGVnb3J5TmFtZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgYSBsaXN0IG9mIGFsbCB0aGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj48Q09ERT5Bbm5vdGF0aW9uRGVmaW5pdGlvbjwvQ09ERT48L0E+IHdpdGggdGhlIGdpdmVuIGFubm90YXRpb24gY2F0ZWdvcnkgbmFtZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+KHBhY2thZ2UgcHJpdmF0ZSkgc3RhdGljJm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc01hbmFnZXIuaHRtbCNnZXRBdHRyaWJ1dGVWYWx1ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50LCBqYXZhLmxhbmcuU3RyaW5nKSI+Z2V0QXR0cmlidXRlVmFsdWU8L0E+PC9CPihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50Jm5ic3A7Y29uZmlndXJhdGlvbkVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7YXR0cmlidXRlTmFtZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3NfamF2YS5sYW5nLk9iamVjdCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gY2xhc3MgamF2YS5sYW5nLk9iamVjdDwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmNsb25lLCBlcXVhbHMsIGZpbmFsaXplLCBnZXRDbGFzcywgaGFzaENvZGUsIG5vdGlmeSwgbm90aWZ5QWxsLCB0b1N0cmluZywgd2FpdCwgd2FpdCwgd2FpdDwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9ImdldEFubm90YXRpb25zKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldEFubm90YXRpb25zPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5MaXN0Jmx0OzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25EZWZpbml0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSI+QW5ub3RhdGlvbkRlZmluaXRpb248L0E+Jmd0OyA8Qj5nZXRBbm5vdGF0aW9uczwvQj4oKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgYSBsaXN0IG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25EZWZpbml0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSI+PENPREU+QW5ub3RhdGlvbkRlZmluaXRpb248L0NPREU+PC9BPiBjb25zdHJ1Y3RlZCBmcm9tIGNvbnRyaWJ1dGlvbnMgdG8gdGhlCi0gPGNvZGU+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkRlZmluaXRpb248L2NvZGU+IGV4dGVuc2lvbiBwb2ludC4KLTxQPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5hIGxpc3Qgb2YgYW5ub3RhdGlvbiBkZWZpbml0aW9ucy48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldEFubm90YXRpb25zKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldEFubm90YXRpb25zPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5MaXN0Jmx0O2phdmEubGFuZy5DbGFzcyZsdDs/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbiZndDsmZ3Q7IDxCPmdldEFubm90YXRpb25zPC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQmbmJzcDtqYXZhRWxlbWVudCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhlIGNvbnRyaWJ1dGVkIDxDT0RFPkFubm90YXRpb248L0NPREU+IHRoYXQgdGFyZ2V0IHRoZSBnaXZlbiBqYXZhIGVsZW1lbnQgdHlwZS4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+ZWxlbWVudDwvQ09ERT4gLSBvbmUgb2YKLSA8bGk+b3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VEZWNsYXJhdGlvbjwvbGk+Ci0gPGxpPm9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlPC9saT4KLSA8bGk+b3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkPC9saT4KLSA8bGk+b3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDwvbGk+Ci0gPGxpPm9yZy5lY2xpcHNlLmpkdC5jb3JlLklMb2NhbFZhcmlhYmxlPC9saT4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+YSBsaXN0IG9mIGFubm90YXRpb25zLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0QW5ub3RhdGlvbkRlZmluaXRpb25Gb3JDbGFzcyhqYXZhLmxhbmcuQ2xhc3MpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRBbm5vdGF0aW9uRGVmaW5pdGlvbkZvckNsYXNzPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25EZWZpbml0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSI+QW5ub3RhdGlvbkRlZmluaXRpb248L0E+IDxCPmdldEFubm90YXRpb25EZWZpbml0aW9uRm9yQ2xhc3M8L0I+KGphdmEubGFuZy5DbGFzcyZsdDs/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbiZndDsmbmJzcDthbm5vdGF0aW9uQ2xhc3MpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj48Q09ERT5Bbm5vdGF0aW9uRGVmaW5pdGlvbjwvQ09ERT48L0E+IGZvciB0aGUgZ2l2ZW4gPENPREU+QW5ub3RhdGlvbjwvQ09ERT4gY2xhc3MKLSBvciBudWxsIGlmIG5vIGFubm90YXRpb24gZGVmaW5pdGlvbiBjYW4gYmUgZm91bmQuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmFubm90YXRpb25DbGFzczwvQ09ERT4gLSB0aGUgPGNvZGU+amF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjwvY29kZT4gY2xhc3MuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBhbm5vdGF0aW9uIGRlZmluaXRpb24gZm9yIHRoZSA8Y29kZT5qYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPC9jb2RlPiBjbGFzcy48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldEFubm90YXRpb25EZWZpbml0aW9uRm9yQ2xhc3MoamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLWdldEFubm90YXRpb25EZWZpbml0aW9uRm9yQ2xhc3M8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj5Bbm5vdGF0aW9uRGVmaW5pdGlvbjwvQT4gPEI+Z2V0QW5ub3RhdGlvbkRlZmluaXRpb25Gb3JDbGFzczwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2Nhbm9uaWNhbE5hbWUpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj48Q09ERT5Bbm5vdGF0aW9uRGVmaW5pdGlvbjwvQ09ERT48L0E+IGZvciB0aGUgZ2l2ZW4gZnVsbHkgcXVhbGlmaWVkIDxDT0RFPkFubm90YXRpb248L0NPREU+IGNsYXNzCi0gbmFtZSBvciBudWxsIGlmIG5vIGFubm90YXRpb24gZGVmaW5pdGlvbiBjYW4gYmUgZm91bmQuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmNhbm9uaWNhbE5hbWU8L0NPREU+IC0gdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSA8Y29kZT5qYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPC9jb2RlPiBjbGFzcy4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIGFubm90YXRpb24gZGVmaW5pdGlvbiBmb3IgdGhlIGZ1bGx5IHF1YWxpZmllZCA8Y29kZT5qYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPC9jb2RlPiBjbGFzcyBuYW1lLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0QW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyRm9yTmFtZShvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZSkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldEFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplckZvck5hbWU8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uIj5JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9BPiA8Qj5nZXRBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXJGb3JOYW1lPC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZSZuYnNwO25hbWUpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uIj48Q09ERT5JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9DT0RFPjwvQT4gZm9yIHRoZSBnaXZlbiA8Q09ERT5OYW1lPC9DT0RFPgotIG9yIG51bGwgaWYgbm9uZSBjYW4gYmUgZm91bmQuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPm5hbWU8L0NPREU+IC0gYSA8Q09ERT5TaW1wbGVOYW1lPC9DT0RFPiBvciA8Q09ERT5RdWFsaWZpZWROYW1lPC9DT0RFPiBmb3IgdGhlIGFubm90YXRpb24gdG8gc2VhcmNoIGZvci4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+YW4gPGNvZGU+SUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjwvY29kZT4gZm9yIHRoZSBnaXZlbiBuYW1lLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0QW5ub3RhdGlvbnNCeUNhdGVnb3J5KGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRBbm5vdGF0aW9uc0J5Q2F0ZWdvcnk8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLkxpc3QmbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj5Bbm5vdGF0aW9uRGVmaW5pdGlvbjwvQT4mZ3Q7IDxCPmdldEFubm90YXRpb25zQnlDYXRlZ29yeTwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2NhdGVnb3J5TmFtZSk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25EZWZpbml0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSI+PENPREU+QW5ub3RhdGlvbkRlZmluaXRpb248L0NPREU+PC9BPiB3aXRoIHRoZSBnaXZlbiBhbm5vdGF0aW9uIGNhdGVnb3J5IG5hbWUuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmNhdGVnb3J5TmFtZTwvQ09ERT4gLSB0aGUgYW5ub3RhdGlvbiBjYXRlZ29yeSBuYW1lLgotPERUPjxCPlJldHVybnM6PC9CPjxERD5hIGxpc3Qgb2YgYW5ub3RhdGlvbiBkZWZpbml0aW9ucy48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldEFubm90YXRpb25DYXRlZ29yaWVzKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldEFubm90YXRpb25DYXRlZ29yaWVzPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5MaXN0Jmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7IDxCPmdldEFubm90YXRpb25DYXRlZ29yaWVzPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyBhIGxpc3Qgb2YgdGhlIGFubm90YXRpb24gY2F0ZWdvcmllcy4KLTxQPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5hIGxpc3Qgb2YgYW5ub3RhdGlvbiBjYXRlZ29yaWVzLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0QW5ub3RhdGlvbkluaXRpYWxpemVyQ2FjaGUoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0QW5ub3RhdGlvbkluaXRpYWxpemVyQ2FjaGU8L0gzPgotPFBSRT4KLXByb3RlY3RlZCBzdGF0aWMgamF2YS51dGlsLk1hcCZsdDtqYXZhLmxhbmcuU3RyaW5nLG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQmZ3Q7IDxCPmdldEFubm90YXRpb25Jbml0aWFsaXplckNhY2hlPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRBbm5vdGF0aW9uUHJvY2Vzc29yc0NhY2hlKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldEFubm90YXRpb25Qcm9jZXNzb3JzQ2FjaGU8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLk1hcCZsdDtqYXZhLmxhbmcuU3RyaW5nLGphdmEudXRpbC5MaXN0Jmx0O29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQmZ3Q7Jmd0OyA8Qj5nZXRBbm5vdGF0aW9uUHJvY2Vzc29yc0NhY2hlPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRBdHRyaWJ1dGVWYWx1ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50LCBqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0QXR0cmlidXRlVmFsdWU8L0gzPgotPFBSRT4KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIDxCPmdldEF0dHJpYnV0ZVZhbHVlPC9CPihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50Jm5ic3A7Y29uZmlndXJhdGlvbkVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7YXR0cmlidXRlTmFtZSk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0Fubm90YXRpb25zTWFuYWdlci5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDtORVhUIENMQVNTPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zTWFuYWdlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IkFubm90YXRpb25zTWFuYWdlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvY2xhc3MtdXNlL0Fubm90YXRpb25EZWZpbml0aW9uLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvY2xhc3MtdXNlL0Fubm90YXRpb25EZWZpbml0aW9uLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViZDJmYzUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2NsYXNzLXVzZS9Bbm5vdGF0aW9uRGVmaW5pdGlvbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8xNCkgb24gV2VkIEFwciAwNyAwNzo0NjoyMyBCU1QgMjAxMCAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbkRlZmluaXRpb24KLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTAtMDQtMDciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25EZWZpbml0aW9uIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvXGNsYXNzLXVzZUFubm90YXRpb25EZWZpbml0aW9uLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iQW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBDbGFzczxicj5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjwvQj48L0gyPgotPC9DRU5URVI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotUGFja2FnZXMgdGhhdCB1c2UgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj5Bbm5vdGF0aW9uRGVmaW5pdGlvbjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlPC9CPjwvQT48L1REPgotPFREPiZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj5Bbm5vdGF0aW9uRGVmaW5pdGlvbjwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlPC9BPiB0aGF0IHJldHVybiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uRGVmaW5pdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPkFubm90YXRpb25EZWZpbml0aW9uPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj5Bbm5vdGF0aW9uRGVmaW5pdGlvbjwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+QW5ub3RhdGlvbnNNYW5hZ2VyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc01hbmFnZXIuaHRtbCNnZXRBbm5vdGF0aW9uRGVmaW5pdGlvbkZvckNsYXNzKGphdmEubGFuZy5DbGFzcykiPmdldEFubm90YXRpb25EZWZpbml0aW9uRm9yQ2xhc3M8L0E+PC9CPihqYXZhLmxhbmcuQ2xhc3MmbHQ7PyBleHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24mZ3Q7Jm5ic3A7YW5ub3RhdGlvbkNsYXNzKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj48Q09ERT5Bbm5vdGF0aW9uRGVmaW5pdGlvbjwvQ09ERT48L0E+IGZvciB0aGUgZ2l2ZW4gPENPREU+QW5ub3RhdGlvbjwvQ09ERT4gY2xhc3MKLSBvciBudWxsIGlmIG5vIGFubm90YXRpb24gZGVmaW5pdGlvbiBjYW4gYmUgZm91bmQuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25EZWZpbml0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSI+QW5ub3RhdGlvbkRlZmluaXRpb248L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkFubm90YXRpb25zTWFuYWdlci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNNYW5hZ2VyLmh0bWwjZ2V0QW5ub3RhdGlvbkRlZmluaXRpb25Gb3JDbGFzcyhqYXZhLmxhbmcuU3RyaW5nKSI+Z2V0QW5ub3RhdGlvbkRlZmluaXRpb25Gb3JDbGFzczwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtjYW5vbmljYWxOYW1lKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj48Q09ERT5Bbm5vdGF0aW9uRGVmaW5pdGlvbjwvQ09ERT48L0E+IGZvciB0aGUgZ2l2ZW4gZnVsbHkgcXVhbGlmaWVkIDxDT0RFPkFubm90YXRpb248L0NPREU+IGNsYXNzCi0gbmFtZSBvciBudWxsIGlmIG5vIGFubm90YXRpb24gZGVmaW5pdGlvbiBjYW4gYmUgZm91bmQuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZTwvQT4gdGhhdCByZXR1cm4gdHlwZXMgd2l0aCBhcmd1bWVudHMgb2YgdHlwZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uRGVmaW5pdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPkFubm90YXRpb25EZWZpbml0aW9uPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7amF2YS51dGlsLkxpc3QmbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj5Bbm5vdGF0aW9uRGVmaW5pdGlvbjwvQT4mZ3Q7PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkFubm90YXRpb25zTWFuYWdlci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNNYW5hZ2VyLmh0bWwjZ2V0QW5ub3RhdGlvbnMoKSI+Z2V0QW5ub3RhdGlvbnM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIGEgbGlzdCBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uRGVmaW5pdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPjxDT0RFPkFubm90YXRpb25EZWZpbml0aW9uPC9DT0RFPjwvQT4gY29uc3RydWN0ZWQgZnJvbSBjb250cmlidXRpb25zIHRvIHRoZQotIDxjb2RlPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25EZWZpbml0aW9uPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2phdmEudXRpbC5MaXN0Jmx0OzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25EZWZpbml0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSI+QW5ub3RhdGlvbkRlZmluaXRpb248L0E+Jmd0OzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5Bbm5vdGF0aW9uc01hbmFnZXIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zTWFuYWdlci5odG1sI2dldEFubm90YXRpb25zQnlDYXRlZ29yeShqYXZhLmxhbmcuU3RyaW5nKSI+Z2V0QW5ub3RhdGlvbnNCeUNhdGVnb3J5PC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2NhdGVnb3J5TmFtZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgYSBsaXN0IG9mIGFsbCB0aGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj48Q09ERT5Bbm5vdGF0aW9uRGVmaW5pdGlvbjwvQ09ERT48L0E+IHdpdGggdGhlIGdpdmVuIGFubm90YXRpb24gY2F0ZWdvcnkgbmFtZS48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvXGNsYXNzLXVzZUFubm90YXRpb25EZWZpbml0aW9uLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iQW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9jbGFzcy11c2UvQW5ub3RhdGlvbnNDb3JlLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvY2xhc3MtdXNlL0Fubm90YXRpb25zQ29yZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzgzNzFkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9jbGFzcy11c2UvQW5ub3RhdGlvbnNDb3JlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjQ2OjIzIEJTVCAyMDEwIC0tPgotPFRJVExFPgotVXNlcyBvZiBDbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmUKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTAtMDQtMDciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZSI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9cY2xhc3MtdXNlQW5ub3RhdGlvbnNDb3JlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iQW5ub3RhdGlvbnNDb3JlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgQ2xhc3M8YnI+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlPC9CPjwvSDI+Ci08L0NFTlRFUj4KLU5vIHVzYWdlIG9mIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZQotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmUuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvXGNsYXNzLXVzZUFubm90YXRpb25zQ29yZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IkFubm90YXRpb25zQ29yZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2NsYXNzLXVzZS9Bbm5vdGF0aW9uc0NvcmVQbHVnaW4uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9jbGFzcy11c2UvQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNDRkOTYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2NsYXNzLXVzZS9Bbm5vdGF0aW9uc0NvcmVQbHVnaW4uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMTQpIG9uIFdlZCBBcHIgMDcgMDc6NDY6MjMgQlNUIDIwMTAgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZVBsdWdpbgotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMC0wNC0wNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlUGx1Z2luIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL1xjbGFzcy11c2VBbm5vdGF0aW9uc0NvcmVQbHVnaW4uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJBbm5vdGF0aW9uc0NvcmVQbHVnaW4uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBDbGFzczxicj5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmVQbHVnaW48L0I+PC9IMj4KLTwvQ0VOVEVSPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVBhY2thZ2VzIHRoYXQgdXNlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZVBsdWdpbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPkFubm90YXRpb25zQ29yZVBsdWdpbjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlPC9CPjwvQT48L1REPgotPFREPiZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSI+QW5ub3RhdGlvbnNDb3JlUGx1Z2luPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmU8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmU8L0E+IHRoYXQgcmV0dXJuIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZVBsdWdpbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPkFubm90YXRpb25zQ29yZVBsdWdpbjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZVBsdWdpbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPkFubm90YXRpb25zQ29yZVBsdWdpbjwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+QW5ub3RhdGlvbnNDb3JlUGx1Z2luLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmVQbHVnaW4uaHRtbCNnZXREZWZhdWx0KCkiPmdldERlZmF1bHQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL1xjbGFzcy11c2VBbm5vdGF0aW9uc0NvcmVQbHVnaW4uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJBbm5vdGF0aW9uc0NvcmVQbHVnaW4uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9jbGFzcy11c2UvQW5ub3RhdGlvbnNNYW5hZ2VyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvY2xhc3MtdXNlL0Fubm90YXRpb25zTWFuYWdlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWIyMmY3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9jbGFzcy11c2UvQW5ub3RhdGlvbnNNYW5hZ2VyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjQ2OjIzIEJTVCAyMDEwIC0tPgotPFRJVExFPgotVXNlcyBvZiBDbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc01hbmFnZXIKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTAtMDQtMDciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zTWFuYWdlciI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zTWFuYWdlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9cY2xhc3MtdXNlQW5ub3RhdGlvbnNNYW5hZ2VyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iQW5ub3RhdGlvbnNNYW5hZ2VyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgQ2xhc3M8YnI+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNNYW5hZ2VyPC9CPjwvSDI+Ci08L0NFTlRFUj4KLU5vIHVzYWdlIG9mIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zTWFuYWdlcgotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc01hbmFnZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvXGNsYXNzLXVzZUFubm90YXRpb25zTWFuYWdlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IkFubm90YXRpb25zTWFuYWdlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGM1MDZiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzMCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMTQpIG9uIFdlZCBBcHIgMDcgMDc6NDY6MjIgQlNUIDIwMTAgLS0+Ci08VElUTEU+Ci1Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTAtMDQtMDciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViBDTEFTUyZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vRGVmYXVsdHNBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNmaWVsZF9zdW1tYXJ5Ij5GSUVMRDwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX3N1bW1hcnkiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwOzxBIEhSRUY9IiNmaWVsZF9kZXRhaWwiPkZJRUxEPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3JfZGV0YWlsIj5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08IS0tID09PT09PT09IFNUQVJUIE9GIENMQVNTIERBVEEgPT09PT09PT0gLS0+Ci08SDI+Ci08Rk9OVCBTSVpFPSItMSI+Ci1vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbjwvRk9OVD4KLTxCUj4KLUNsYXNzIEFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjwvSDI+Ci08UFJFPgotamF2YS5sYW5nLk9iamVjdAotICA8SU1HIFNSQz0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vcmVzb3VyY2VzL2luaGVyaXQuZ2lmIiBBTFQ9ImV4dGVuZGVkIGJ5ICI+PEI+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24uQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9CPgotPC9QUkU+Ci08REw+Ci08RFQ+PEI+QWxsIEltcGxlbWVudGVkIEludGVyZmFjZXM6PC9CPiA8REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uIj5JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9BPjwvREQ+Ci08L0RMPgotPERMPgotPERUPjxCPkRpcmVjdCBLbm93biBTdWJjbGFzc2VzOjwvQj4gPEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0RlZmF1bHRzQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbiI+RGVmYXVsdHNBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI8L0E+PC9ERD4KLTwvREw+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgYWJzdHJhY3QgY2xhc3MgPEI+QW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9CPjxEVD5leHRlbmRzIGphdmEubGFuZy5PYmplY3Q8RFQ+aW1wbGVtZW50cyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24iPklBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI8L0E+PC9ETD4KLTwvUFJFPgotCi08UD4KLUFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGluaXRpYWxpemVycyBjb250cmlidXRlZCB0byB0aGUKLSA8Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uSW5pdGlhbGl6ZXI8L2NvZGU+IGV4dGVuc2lvbiBwb2ludC4KLSA8cD4KLSBQcm92aWRlcyBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBmb3IgYWxsIG1ldGhvZHMuCi0gPC9wPgotIDxwPgotIDxzdHJvbmc+UHJvdmlzaW9uYWwgQVBJOjwvc3Ryb25nPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kCi0gZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZQotIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwKLSBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotIDwvcD4KLTxQPgotCi08UD4KLTxIUj4KLQotPFA+Ci08IS0tID09PT09PT09PT09IEZJRUxEIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImZpZWxkX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5GaWVsZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHJvdGVjdGVkIHN0YXRpYyZuYnNwO2phdmEubGFuZy5TdHJpbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwjTUlTU0lOR19JREVOVElGRVIiPk1JU1NJTkdfSURFTlRJRkVSPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPCEtLSA9PT09PT09PSBDT05TVFJVQ1RPUiBTVU1NQVJZID09PT09PT09IC0tPgotCi08QSBOQU1FPSJjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnByb3RlY3RlZCA8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwjQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyKCkiPkFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHJvdGVjdGVkICZuYnNwO29yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zYWw8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwjY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsKGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uKSI+Y3JlYXRlQ29tcGxldGlvblByb3Bvc2FsPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO3Byb3Bvc2FsLAotICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uJm5ic3A7dmFsdWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHJvdGVjdGVkICZuYnNwO29yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zYWw8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwjY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsKGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uLCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2UsIGphdmEubGFuZy5TdHJpbmcpIj5jcmVhdGVDb21wbGV0aW9uUHJvcG9zYWw8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7cHJvcG9zYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb24mbmJzcDt2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2UmbmJzcDtpbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7ZGlzcGxheVN0cmluZyk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLnV0aWwuTGlzdCZsdDtvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCZndDs8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwjZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0Zvck1lbWJlclZhbHVlUGFpcihvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXIpIj5nZXRDb21wbGV0aW9uUHJvcG9zYWxzRm9yTWVtYmVyVmFsdWVQYWlyPC9BPjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Jm5ic3A7amF2YUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXImbmJzcDttZW1iZXJWYWx1ZVBhaXIpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtVc2VkIHRvIHByb3ZpZGUgYSBsaXN0IG9mIDxDT0RFPklDb21wbGV0aW9uUHJvcG9zYWw8L0NPREU+IGZvciBhIDxDT0RFPk1lbWJlclZhbHVlUGFpcjwvQ09ERT4gdmFsdWUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEudXRpbC5MaXN0Jmx0O29yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsJmd0OzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCNnZXRDb21wbGV0aW9uUHJvcG9zYWxzRm9yU2luZ2xlTWVtYmVyQW5ub3RhdGlvbihvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSI+Z2V0Q29tcGxldGlvblByb3Bvc2Fsc0ZvclNpbmdsZU1lbWJlckFubm90YXRpb248L0E+PC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQmbmJzcDtqYXZhRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uJm5ic3A7c2luZ2xlTWVtYmVyQW5ub3RhdGlvbik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1VzZWQgdG8gcHJvdmlkZSBhIGxpc3Qgb2YgPENPREU+SUNvbXBsZXRpb25Qcm9wb3NhbDwvQ09ERT4gZm9yIGEgPENPREU+U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjwvQ09ERT4gdmFsdWUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEudXRpbC5MaXN0Jmx0O29yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXImZ3Q7PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sI2dldE1lbWJlclZhbHVlUGFpcnMob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50LCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNULCBqYXZhLmxhbmcuQ2xhc3MpIj5nZXRNZW1iZXJWYWx1ZVBhaXJzPC9BPjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Jm5ic3A7amF2YUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QmbmJzcDthc3QsCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5DbGFzcyZsdDs/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbiZndDsmbmJzcDthbm5vdGF0aW9uQ2xhc3MpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIGEgbGlzdCBvZiA8Q09ERT5NZW1iZXJWYWx1ZVBhaXI8L0NPREU+IHRoYXQgbWF5IGJlIGFkZGVkIHRvIGEgPENPREU+Tm9ybWFsQW5ub3RhdGlvbjwvQ09ERT4uPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19qYXZhLmxhbmcuT2JqZWN0Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBqYXZhLmxhbmcuT2JqZWN0PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+Y2xvbmUsIGVxdWFscywgZmluYWxpemUsIGdldENsYXNzLCBoYXNoQ29kZSwgbm90aWZ5LCBub3RpZnlBbGwsIHRvU3RyaW5nLCB3YWl0LCB3YWl0LCB3YWl0PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTwhLS0gPT09PT09PT09PT09IEZJRUxEIERFVEFJTCA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0iZmllbGRfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+RmllbGQgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9Ik1JU1NJTkdfSURFTlRJRkVSIj48IS0tIC0tPjwvQT48SDM+Ci1NSVNTSU5HX0lERU5USUZFUjwvSDM+Ci08UFJFPgotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIDxCPk1JU1NJTkdfSURFTlRJRkVSPC9CPjwvUFJFPgotPERMPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29uc3RhbnQtdmFsdWVzLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24uQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLk1JU1NJTkdfSURFTlRJRkVSIj5Db25zdGFudCBGaWVsZCBWYWx1ZXM8L0E+PC9ETD4KLTwvREw+Ci0KLTwhLS0gPT09PT09PT09IENPTlNUUlVDVE9SIERFVEFJTCA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0iY29uc3RydWN0b3JfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9IkFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcigpIj48IS0tIC0tPjwvQT48SDM+Ci1Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI8L0gzPgotPFBSRT4KLXByb3RlY3RlZCA8Qj5Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI8L0I+KCk8L1BSRT4KLTxETD4KLTwvREw+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iZ2V0TWVtYmVyVmFsdWVQYWlycyhvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QsIGphdmEubGFuZy5DbGFzcykiPjwhLS0gLS0+PC9BPjxIMz4KLWdldE1lbWJlclZhbHVlUGFpcnM8L0gzPgotPFBSRT4KLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCZsdDtvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyJmd0OyA8Qj5nZXRNZW1iZXJWYWx1ZVBhaXJzPC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQmbmJzcDtqYXZhRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QmbmJzcDthc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuQ2xhc3MmbHQ7PyBleHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24mZ3Q7Jm5ic3A7YW5ub3RhdGlvbkNsYXNzKTwvUFJFPgotPERMPgotPEREPjxCPkRlc2NyaXB0aW9uIGNvcGllZCBmcm9tIGludGVyZmFjZTogPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sI2dldE1lbWJlclZhbHVlUGFpcnMob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50LCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNULCBqYXZhLmxhbmcuQ2xhc3MpIj5JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9BPjwvQ09ERT48L0I+PC9ERD4KLTxERD5SZXR1cm5zIGEgbGlzdCBvZiA8Q09ERT5NZW1iZXJWYWx1ZVBhaXI8L0NPREU+IHRoYXQgbWF5IGJlIGFkZGVkIHRvIGEgPENPREU+Tm9ybWFsQW5ub3RhdGlvbjwvQ09ERT4uCi08UD4KLTxERD48REw+Ci08RFQ+PEI+U3BlY2lmaWVkIGJ5OjwvQj48REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sI2dldE1lbWJlclZhbHVlUGFpcnMob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50LCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNULCBqYXZhLmxhbmcuQ2xhc3MpIj5nZXRNZW1iZXJWYWx1ZVBhaXJzPC9BPjwvQ09ERT4gaW4gaW50ZXJmYWNlIDxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0lBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbiI+SUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjwvQT48L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5qYXZhRWxlbWVudDwvQ09ERT4gLSB0aGUgamF2YSBlbGVtZW50IG9uIHdoaWNoIHRoZSBhbm5vdGF0aW9uIGlzIGRlY2xhcmVkLjxERD48Q09ERT5hc3Q8L0NPREU+IC0gdGhlIDxjb2RlPkFTVDwvY29kZT4gd2l0aCB3aGljaCB0byBjcmVhdGUgdGhlIG1lbWJlciB2YWx1ZSBwYWlycy48REQ+PENPREU+YW5ub3RhdGlvbkNsYXNzPC9DT0RFPiAtIHRoZSA8Q09ERT5Bbm5vdGF0aW9uPC9DT0RFPiBjbGFzcyB3aGljaCBtYXkgYmUKLSB1c2VkIHRvIHF1ZXJ5IHRoZSBkZWNsYXJlZCBtZW1iZXJzIG9mIHRoZSBhbm5vdGF0aW9uIHR5cGUgYW5kIHRoZSBtZW1iZXJzIGRlZmF1bHQgdmFsdWVzLgotPERUPjxCPlJldHVybnM6PC9CPjxERD5hIGxpc3Qgb2YgbWVtYmVyIHZhbHVlIHBhaXJzLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0Zvck1lbWJlclZhbHVlUGFpcihvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXIpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRDb21wbGV0aW9uUHJvcG9zYWxzRm9yTWVtYmVyVmFsdWVQYWlyPC9IMz4KLTxQUkU+Ci1wdWJsaWMgamF2YS51dGlsLkxpc3QmbHQ7b3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwmZ3Q7IDxCPmdldENvbXBsZXRpb25Qcm9wb3NhbHNGb3JNZW1iZXJWYWx1ZVBhaXI8L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCZuYnNwO2phdmFFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXImbmJzcDttZW1iZXJWYWx1ZVBhaXIpPC9QUkU+Ci08REw+Ci08REQ+PEI+RGVzY3JpcHRpb24gY29waWVkIGZyb20gaW50ZXJmYWNlOiA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwjZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0Zvck1lbWJlclZhbHVlUGFpcihvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXIpIj5JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9BPjwvQ09ERT48L0I+PC9ERD4KLTxERD5Vc2VkIHRvIHByb3ZpZGUgYSBsaXN0IG9mIDxDT0RFPklDb21wbGV0aW9uUHJvcG9zYWw8L0NPREU+IGZvciBhIDxDT0RFPk1lbWJlclZhbHVlUGFpcjwvQ09ERT4gdmFsdWUuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+U3BlY2lmaWVkIGJ5OjwvQj48REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sI2dldENvbXBsZXRpb25Qcm9wb3NhbHNGb3JNZW1iZXJWYWx1ZVBhaXIob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50LCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyKSI+Z2V0Q29tcGxldGlvblByb3Bvc2Fsc0Zvck1lbWJlclZhbHVlUGFpcjwvQT48L0NPREU+IGluIGludGVyZmFjZSA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24iPklBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI8L0E+PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+amF2YUVsZW1lbnQ8L0NPREU+IC0gdGhlIGphdmEgZWxlbWVudCBvbiB3aGljaCB0aGUgYW5ub3RhdGlvbiBpcyBkZWNsYXJlZC48REQ+PENPREU+bWVtYmVyVmFsdWVQYWlyPC9DT0RFPiAtIHRoZSBtZW1iZXIgdmFsdWUgcGFpciBpbiB3aGljaCBjb250ZW50IGFzc2lzdCB3YXMgaW52b2tlZC4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+YSBsaXN0IG9mIGNvbXBsZXRpb24gcHJvcG9zYWxzLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0ZvclNpbmdsZU1lbWJlckFubm90YXRpb24ob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50LCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikiPjwhLS0gLS0+PC9BPjxIMz4KLWdldENvbXBsZXRpb25Qcm9wb3NhbHNGb3JTaW5nbGVNZW1iZXJBbm5vdGF0aW9uPC9IMz4KLTxQUkU+Ci1wdWJsaWMgamF2YS51dGlsLkxpc3QmbHQ7b3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwmZ3Q7IDxCPmdldENvbXBsZXRpb25Qcm9wb3NhbHNGb3JTaW5nbGVNZW1iZXJBbm5vdGF0aW9uPC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQmbmJzcDtqYXZhRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb24mbmJzcDtzaW5nbGVNZW1iZXJBbm5vdGF0aW9uKTwvUFJFPgotPERMPgotPEREPjxCPkRlc2NyaXB0aW9uIGNvcGllZCBmcm9tIGludGVyZmFjZTogPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sI2dldENvbXBsZXRpb25Qcm9wb3NhbHNGb3JTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCwgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb24pIj5JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9BPjwvQ09ERT48L0I+PC9ERD4KLTxERD5Vc2VkIHRvIHByb3ZpZGUgYSBsaXN0IG9mIDxDT0RFPklDb21wbGV0aW9uUHJvcG9zYWw8L0NPREU+IGZvciBhIDxDT0RFPlNpbmdsZU1lbWJlckFubm90YXRpb248L0NPREU+IHZhbHVlLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlNwZWNpZmllZCBieTo8L0I+PEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0lBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCNnZXRDb21wbGV0aW9uUHJvcG9zYWxzRm9yU2luZ2xlTWVtYmVyQW5ub3RhdGlvbihvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSI+Z2V0Q29tcGxldGlvblByb3Bvc2Fsc0ZvclNpbmdsZU1lbWJlckFubm90YXRpb248L0E+PC9DT0RFPiBpbiBpbnRlcmZhY2UgPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uIj5JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9BPjwvQ09ERT48L0RMPgotPC9ERD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmphdmFFbGVtZW50PC9DT0RFPiAtIHRoZSBqYXZhIGVsZW1lbnQgb24gd2hpY2ggdGhlIGFubm90YXRpb24gaXMgZGVjbGFyZWQuPEREPjxDT0RFPnNpbmdsZU1lbWJlckFubm90YXRpb248L0NPREU+IC0gdGhlIHNpbmdsZSBtZW1iZXIgYW5ub3RhdGlvbiBpbiB3aGljaCBjb250ZW50IGFzc2lzdCB3YXMgaW52b2tlZC4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+YSBsaXN0IG9mIGNvbXBsZXRpb24gcHJvcG9zYWxzLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsKGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uKSI+PCEtLSAtLT48L0E+PEgzPgotY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsPC9IMz4KLTxQUkU+Ci1wcm90ZWN0ZWQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbCA8Qj5jcmVhdGVDb21wbGV0aW9uUHJvcG9zYWw8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtwcm9wb3NhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbiZuYnNwO3ZhbHVlKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsKGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uLCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2UsIGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1jcmVhdGVDb21wbGV0aW9uUHJvcG9zYWw8L0gzPgotPFBSRT4KLXByb3RlY3RlZCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuQ29tcGxldGlvblByb3Bvc2FsIDxCPmNyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbDwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO3Byb3Bvc2FsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uJm5ic3A7dmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlJm5ic3A7aW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO2Rpc3BsYXlTdHJpbmcpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIENMQVNTIERBVEEgPT09PT09PT09IC0tPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYgQ0xBU1MmbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0RlZmF1bHRzQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IkFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjZmllbGRfc3VtbWFyeSI+RklFTEQ8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDs8QSBIUkVGPSIjZmllbGRfZGV0YWlsIj5GSUVMRDwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vRGVmYXVsdHNBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9EZWZhdWx0c0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTQyYTczLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9EZWZhdWx0c0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8xNCkgb24gV2VkIEFwciAwNyAwNzo0NjoyMiBCU1QgMjAxMCAtLT4KLTxUSVRMRT4KLURlZmF1bHRzQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDEwLTA0LTA3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iRGVmYXVsdHNBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0RlZmF1bHRzQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0lBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0RlZmF1bHRzQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iRGVmYXVsdHNBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2ZpZWxkc19pbmhlcml0ZWRfZnJvbV9jbGFzc19vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbi5Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIiPkZJRUxEPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb248L0ZPTlQ+Ci08QlI+Ci1DbGFzcyBEZWZhdWx0c0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjwvSDI+Ci08UFJFPgotamF2YS5sYW5nLk9iamVjdAotICA8SU1HIFNSQz0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vcmVzb3VyY2VzL2luaGVyaXQuZ2lmIiBBTFQ9ImV4dGVuZGVkIGJ5ICI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbiI+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24uQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9BPgotICAgICAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uLkRlZmF1bHRzQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9CPgotPC9QUkU+Ci08REw+Ci08RFQ+PEI+QWxsIEltcGxlbWVudGVkIEludGVyZmFjZXM6PC9CPiA8REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uIj5JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9BPjwvREQ+Ci08L0RMPgotPEhSPgotPERMPgotPERUPjxQUkU+cHVibGljIGNsYXNzIDxCPkRlZmF1bHRzQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9CPjxEVD5leHRlbmRzIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24iPkFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjwvQT48L0RMPgotPC9QUkU+Ci0KLTxQPgotQ29uc3RydWN0cyA8Q09ERT5NZW1iZXJWYWx1ZVBhaXI8L0NPREU+IGZyb20gdGhlIGRlZmF1bHRzIGZvdW5kIGluIHRoZSBnaXZlbiA8Q09ERT5Bbm5vdGF0aW9uPC9DT0RFPi4KLSA8cD4KLSA8c3Ryb25nPlByb3Zpc2lvbmFsIEFQSTo8L3N0cm9uZz4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyCi0gZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0Ci0gdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcwotIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSA8L3A+Ci08UD4KLQotPFA+Ci08SFI+Ci0KLTxQPgotPCEtLSA9PT09PT09PT09PSBGSUVMRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJmaWVsZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+RmllbGQgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0iZmllbGRzX2luaGVyaXRlZF9mcm9tX2NsYXNzX29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uLkFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPkZpZWxkcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbi48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uIj5Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI8L0E+PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwjTUlTU0lOR19JREVOVElGRVIiPk1JU1NJTkdfSURFTlRJRkVSPC9BPjwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTwhLS0gPT09PT09PT0gQ09OU1RSVUNUT1IgU1VNTUFSWSA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0iY29uc3RydWN0b3Jfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNvbnN0cnVjdG9yIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vRGVmYXVsdHNBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCNEZWZhdWx0c0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcigpIj5EZWZhdWx0c0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS51dGlsLkxpc3QmbHQ7b3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpciZndDs8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vRGVmYXVsdHNBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCNnZXRNZW1iZXJWYWx1ZVBhaXJzKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCwgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVCwgamF2YS5sYW5nLkNsYXNzKSI+Z2V0TWVtYmVyVmFsdWVQYWlyczwvQT48L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCZuYnNwO2phdmFFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUJm5ic3A7YXN0LAotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuQ2xhc3MmbHQ7PyBleHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24mZ3Q7Jm5ic3A7YW5ub3RhdGlvbkNsYXNzKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q29uc3RydWN0cyBhIGxpc3Qgb2YgPENPREU+TWVtYmVyVmFsdWVQYWlyPC9DT0RFPiB1c2luZyB0aGUgZGVjbGFyZWQgbWV0aG9kIG5hbWVzIGFuZCBkZWZhdWx0IHZhbHVlcyBpbgotIHRoZSBnaXZlbiA8Q09ERT5Bbm5vdGF0aW9uPC9DT0RFPi48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDs8QSBOQU1FPSJtZXRob2RzX2luaGVyaXRlZF9mcm9tX2NsYXNzX29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uLkFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24uPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbiI+QW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9BPjwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sI2NyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbChqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbikiPmNyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbDwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sI2NyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbChqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbiwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlLCBqYXZhLmxhbmcuU3RyaW5nKSI+Y3JlYXRlQ29tcGxldGlvblByb3Bvc2FsPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwjZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0Zvck1lbWJlclZhbHVlUGFpcihvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXIpIj5nZXRDb21wbGV0aW9uUHJvcG9zYWxzRm9yTWVtYmVyVmFsdWVQYWlyPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwjZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0ZvclNpbmdsZU1lbWJlckFubm90YXRpb24ob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50LCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikiPmdldENvbXBsZXRpb25Qcm9wb3NhbHNGb3JTaW5nbGVNZW1iZXJBbm5vdGF0aW9uPC9BPjwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDs8QSBOQU1FPSJtZXRob2RzX2luaGVyaXRlZF9mcm9tX2NsYXNzX2phdmEubGFuZy5PYmplY3QiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGNsYXNzIGphdmEubGFuZy5PYmplY3Q8L0I+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT5jbG9uZSwgZXF1YWxzLCBmaW5hbGl6ZSwgZ2V0Q2xhc3MsIGhhc2hDb2RlLCBub3RpZnksIG5vdGlmeUFsbCwgdG9TdHJpbmcsIHdhaXQsIHdhaXQsIHdhaXQ8L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT0gQ09OU1RSVUNUT1IgREVUQUlMID09PT09PT09IC0tPgotCi08QSBOQU1FPSJjb25zdHJ1Y3Rvcl9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5Db25zdHJ1Y3RvciBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iRGVmYXVsdHNBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIoKSI+PCEtLSAtLT48L0E+PEgzPgotRGVmYXVsdHNBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI8L0gzPgotPFBSRT4KLXB1YmxpYyA8Qj5EZWZhdWx0c0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjwvQj4oKTwvUFJFPgotPERMPgotPC9ETD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJnZXRNZW1iZXJWYWx1ZVBhaXJzKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCwgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVCwgamF2YS5sYW5nLkNsYXNzKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0TWVtYmVyVmFsdWVQYWlyczwvSDM+Ci08UFJFPgotcHVibGljIGphdmEudXRpbC5MaXN0Jmx0O29yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXImZ3Q7IDxCPmdldE1lbWJlclZhbHVlUGFpcnM8L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCZuYnNwO2phdmFFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVCZuYnNwO2FzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5DbGFzcyZsdDs/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbiZndDsmbmJzcDthbm5vdGF0aW9uQ2xhc3MpPC9QUkU+Ci08REw+Ci08REQ+Q29uc3RydWN0cyBhIGxpc3Qgb2YgPENPREU+TWVtYmVyVmFsdWVQYWlyPC9DT0RFPiB1c2luZyB0aGUgZGVjbGFyZWQgbWV0aG9kIG5hbWVzIGFuZCBkZWZhdWx0IHZhbHVlcyBpbgotIHRoZSBnaXZlbiA8Q09ERT5Bbm5vdGF0aW9uPC9DT0RFPi4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5TcGVjaWZpZWQgYnk6PC9CPjxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwjZ2V0TWVtYmVyVmFsdWVQYWlycyhvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QsIGphdmEubGFuZy5DbGFzcykiPmdldE1lbWJlclZhbHVlUGFpcnM8L0E+PC9DT0RFPiBpbiBpbnRlcmZhY2UgPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uIj5JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9BPjwvQ09ERT48RFQ+PEI+T3ZlcnJpZGVzOjwvQj48REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwjZ2V0TWVtYmVyVmFsdWVQYWlycyhvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QsIGphdmEubGFuZy5DbGFzcykiPmdldE1lbWJlclZhbHVlUGFpcnM8L0E+PC9DT0RFPiBpbiBjbGFzcyA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uIj5Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI8L0E+PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+amF2YUVsZW1lbnQ8L0NPREU+IC0gdGhlIGphdmEgZWxlbWVudCBvbiB3aGljaCB0aGUgYW5ub3RhdGlvbiBpcyBkZWNsYXJlZC48REQ+PENPREU+YXN0PC9DT0RFPiAtIHRoZSA8Y29kZT5BU1Q8L2NvZGU+IHdpdGggd2hpY2ggdG8gY3JlYXRlIHRoZSBtZW1iZXIgdmFsdWUgcGFpcnMuPEREPjxDT0RFPmFubm90YXRpb25DbGFzczwvQ09ERT4gLSB0aGUgPENPREU+QW5ub3RhdGlvbjwvQ09ERT4gY2xhc3Mgd2hpY2ggbWF5IGJlCi0gdXNlZCB0byBxdWVyeSB0aGUgZGVjbGFyZWQgbWVtYmVycyBvZiB0aGUgYW5ub3RhdGlvbiB0eXBlIGFuZCB0aGUgbWVtYmVycyBkZWZhdWx0IHZhbHVlcy4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+YSBsaXN0IG9mIG1lbWJlciB2YWx1ZSBwYWlycy48RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwjZ2V0TWVtYmVyVmFsdWVQYWlycyhvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QsIGphdmEubGFuZy5DbGFzcykiPjxDT0RFPklBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuZ2V0TWVtYmVyVmFsdWVQYWlycyhvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QsIGphdmEubGFuZy5DbGFzcyk8L0NPREU+PC9BPjwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvRGVmYXVsdHNBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vRGVmYXVsdHNBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJEZWZhdWx0c0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjZmllbGRzX2luaGVyaXRlZF9mcm9tX2NsYXNzX29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uLkFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciI+RklFTEQ8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3JfZGV0YWlsIj5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmY0YmU4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjQ2OjIyIEJTVCAyMDEwIC0tPgotPFRJVExFPgotSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcgotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMC0wNC0wNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IklBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0lBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0RlZmF1bHRzQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbiI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDtORVhUIENMQVNTPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0lBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08IS0tID09PT09PT09IFNUQVJUIE9GIENMQVNTIERBVEEgPT09PT09PT0gLS0+Ci08SDI+Ci08Rk9OVCBTSVpFPSItMSI+Ci1vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbjwvRk9OVD4KLTxCUj4KLUludGVyZmFjZSBJQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9IMj4KLTxETD4KLTxEVD48Qj5BbGwgS25vd24gSW1wbGVtZW50aW5nIENsYXNzZXM6PC9CPiA8REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbiI+QW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vRGVmYXVsdHNBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uIj5EZWZhdWx0c0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjwvQT48L0REPgotPC9ETD4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBpbnRlcmZhY2UgPEI+SUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjwvQj48L0RMPgotPC9QUkU+Ci0KLTxQPgotQmFzZSBpbnRlcmZhY2UgZm9yIGFubm90YXRpb24gYXR0cmlidXRlIGluaXRpYWxpemVycy4KLSA8cD4KLSA8c3Ryb25nPlByb3Zpc2lvbmFsIEFQSTo8L3N0cm9uZz4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyCi0gZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0Ci0gdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcwotIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSA8L3A+Ci08UD4KLQotPFA+Ci08SFI+Ci0KLTxQPgotCi08IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLnV0aWwuTGlzdCZsdDtvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCZndDs8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sI2dldENvbXBsZXRpb25Qcm9wb3NhbHNGb3JNZW1iZXJWYWx1ZVBhaXIob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50LCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyKSI+Z2V0Q29tcGxldGlvblByb3Bvc2Fsc0Zvck1lbWJlclZhbHVlUGFpcjwvQT48L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCZuYnNwO2phdmFFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyJm5ic3A7bWVtYmVyVmFsdWVQYWlyKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VXNlZCB0byBwcm92aWRlIGEgbGlzdCBvZiA8Q09ERT5JQ29tcGxldGlvblByb3Bvc2FsPC9DT0RFPiBmb3IgYSA8Q09ERT5NZW1iZXJWYWx1ZVBhaXI8L0NPREU+IHZhbHVlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLnV0aWwuTGlzdCZsdDtvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCZndDs8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sI2dldENvbXBsZXRpb25Qcm9wb3NhbHNGb3JTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCwgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb24pIj5nZXRDb21wbGV0aW9uUHJvcG9zYWxzRm9yU2luZ2xlTWVtYmVyQW5ub3RhdGlvbjwvQT48L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCZuYnNwO2phdmFFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb24mbmJzcDtzaW5nbGVNZW1iZXJBbm5vdGF0aW9uKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VXNlZCB0byBwcm92aWRlIGEgbGlzdCBvZiA8Q09ERT5JQ29tcGxldGlvblByb3Bvc2FsPC9DT0RFPiBmb3IgYSA8Q09ERT5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uPC9DT0RFPiB2YWx1ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS51dGlsLkxpc3QmbHQ7b3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpciZndDs8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sI2dldE1lbWJlclZhbHVlUGFpcnMob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50LCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNULCBqYXZhLmxhbmcuQ2xhc3MpIj5nZXRNZW1iZXJWYWx1ZVBhaXJzPC9BPjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Jm5ic3A7amF2YUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QmbmJzcDthc3QsCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5DbGFzcyZsdDs/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbiZndDsmbmJzcDthbm5vdGF0aW9uQ2xhc3MpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIGEgbGlzdCBvZiA8Q09ERT5NZW1iZXJWYWx1ZVBhaXI8L0NPREU+IHRoYXQgbWF5IGJlIGFkZGVkIHRvIGEgPENPREU+Tm9ybWFsQW5ub3RhdGlvbjwvQ09ERT4uPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJnZXRNZW1iZXJWYWx1ZVBhaXJzKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCwgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVCwgamF2YS5sYW5nLkNsYXNzKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0TWVtYmVyVmFsdWVQYWlyczwvSDM+Ci08UFJFPgotamF2YS51dGlsLkxpc3QmbHQ7b3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpciZndDsgPEI+Z2V0TWVtYmVyVmFsdWVQYWlyczwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Jm5ic3A7amF2YUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QmbmJzcDthc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5DbGFzcyZsdDs/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbiZndDsmbmJzcDthbm5vdGF0aW9uQ2xhc3MpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyBhIGxpc3Qgb2YgPENPREU+TWVtYmVyVmFsdWVQYWlyPC9DT0RFPiB0aGF0IG1heSBiZSBhZGRlZCB0byBhIDxDT0RFPk5vcm1hbEFubm90YXRpb248L0NPREU+LgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5qYXZhRWxlbWVudDwvQ09ERT4gLSB0aGUgamF2YSBlbGVtZW50IG9uIHdoaWNoIHRoZSBhbm5vdGF0aW9uIGlzIGRlY2xhcmVkLjxERD48Q09ERT5hc3Q8L0NPREU+IC0gdGhlIDxjb2RlPkFTVDwvY29kZT4gd2l0aCB3aGljaCB0byBjcmVhdGUgdGhlIG1lbWJlciB2YWx1ZSBwYWlycy48REQ+PENPREU+YW5ub3RhdGlvbkNsYXNzPC9DT0RFPiAtIHRoZSA8Q09ERT5Bbm5vdGF0aW9uPC9DT0RFPiBjbGFzcyB3aGljaCBtYXkgYmUKLSB1c2VkIHRvIHF1ZXJ5IHRoZSBkZWNsYXJlZCBtZW1iZXJzIG9mIHRoZSBhbm5vdGF0aW9uIHR5cGUgYW5kIHRoZSBtZW1iZXJzIGRlZmF1bHQgdmFsdWVzLgotPERUPjxCPlJldHVybnM6PC9CPjxERD5hIGxpc3Qgb2YgbWVtYmVyIHZhbHVlIHBhaXJzLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0Zvck1lbWJlclZhbHVlUGFpcihvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXIpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRDb21wbGV0aW9uUHJvcG9zYWxzRm9yTWVtYmVyVmFsdWVQYWlyPC9IMz4KLTxQUkU+Ci1qYXZhLnV0aWwuTGlzdCZsdDtvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCZndDsgPEI+Z2V0Q29tcGxldGlvblByb3Bvc2Fsc0Zvck1lbWJlclZhbHVlUGFpcjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Jm5ic3A7amF2YUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyJm5ic3A7bWVtYmVyVmFsdWVQYWlyKTwvUFJFPgotPERMPgotPEREPlVzZWQgdG8gcHJvdmlkZSBhIGxpc3Qgb2YgPENPREU+SUNvbXBsZXRpb25Qcm9wb3NhbDwvQ09ERT4gZm9yIGEgPENPREU+TWVtYmVyVmFsdWVQYWlyPC9DT0RFPiB2YWx1ZS4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+amF2YUVsZW1lbnQ8L0NPREU+IC0gdGhlIGphdmEgZWxlbWVudCBvbiB3aGljaCB0aGUgYW5ub3RhdGlvbiBpcyBkZWNsYXJlZC48REQ+PENPREU+bWVtYmVyVmFsdWVQYWlyPC9DT0RFPiAtIHRoZSBtZW1iZXIgdmFsdWUgcGFpciBpbiB3aGljaCBjb250ZW50IGFzc2lzdCB3YXMgaW52b2tlZC4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+YSBsaXN0IG9mIGNvbXBsZXRpb24gcHJvcG9zYWxzLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0ZvclNpbmdsZU1lbWJlckFubm90YXRpb24ob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50LCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikiPjwhLS0gLS0+PC9BPjxIMz4KLWdldENvbXBsZXRpb25Qcm9wb3NhbHNGb3JTaW5nbGVNZW1iZXJBbm5vdGF0aW9uPC9IMz4KLTxQUkU+Ci1qYXZhLnV0aWwuTGlzdCZsdDtvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCZndDsgPEI+Z2V0Q29tcGxldGlvblByb3Bvc2Fsc0ZvclNpbmdsZU1lbWJlckFubm90YXRpb248L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCZuYnNwO2phdmFFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uJm5ic3A7c2luZ2xlTWVtYmVyQW5ub3RhdGlvbik8L1BSRT4KLTxETD4KLTxERD5Vc2VkIHRvIHByb3ZpZGUgYSBsaXN0IG9mIDxDT0RFPklDb21wbGV0aW9uUHJvcG9zYWw8L0NPREU+IGZvciBhIDxDT0RFPlNpbmdsZU1lbWJlckFubm90YXRpb248L0NPREU+IHZhbHVlLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5qYXZhRWxlbWVudDwvQ09ERT4gLSB0aGUgamF2YSBlbGVtZW50IG9uIHdoaWNoIHRoZSBhbm5vdGF0aW9uIGlzIGRlY2xhcmVkLjxERD48Q09ERT5zaW5nbGVNZW1iZXJBbm5vdGF0aW9uPC9DT0RFPiAtIHRoZSBzaW5nbGUgbWVtYmVyIGFubm90YXRpb24gaW4gd2hpY2ggY29udGVudCBhc3Npc3Qgd2FzIGludm9rZWQuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPmEgbGlzdCBvZiBjb21wbGV0aW9uIHByb3Bvc2Fscy48L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0lBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0RlZmF1bHRzQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbiI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDtORVhUIENMQVNTPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0lBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9jbGFzcy11c2UvQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vY2xhc3MtdXNlL0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTE1OTQ2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9jbGFzcy11c2UvQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjQ2OjIzIEJTVCAyMDEwIC0tPgotPFRJVExFPgotVXNlcyBvZiBDbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbi5Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTAtMDQtMDciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uLkFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9cY2xhc3MtdXNlQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgQ2xhc3M8YnI+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24uQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uIj5Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uIj48Qj5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbjwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24iPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24iPkFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPlN1YmNsYXNzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbiI+QW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb248L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtjbGFzczwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9EZWZhdWx0c0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24iPkRlZmF1bHRzQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NvbnN0cnVjdHMgPENPREU+TWVtYmVyVmFsdWVQYWlyPC9DT0RFPiBmcm9tIHRoZSBkZWZhdWx0cyBmb3VuZCBpbiB0aGUgZ2l2ZW4gPENPREU+QW5ub3RhdGlvbjwvQ09ERT4uPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9cY2xhc3MtdXNlQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vY2xhc3MtdXNlL0RlZmF1bHRzQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vY2xhc3MtdXNlL0RlZmF1bHRzQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMjNjZjYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL2NsYXNzLXVzZS9EZWZhdWx0c0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8xNCkgb24gV2VkIEFwciAwNyAwNzo0NjoyMyBCU1QgMjAxMCAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24uRGVmYXVsdHNBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTAtMDQtMDciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uLkRlZmF1bHRzQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vRGVmYXVsdHNBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vXGNsYXNzLXVzZURlZmF1bHRzQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iRGVmYXVsdHNBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBDbGFzczxicj5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbi5EZWZhdWx0c0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjwvQj48L0gyPgotPC9DRU5URVI+Ci1ObyB1c2FnZSBvZiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbi5EZWZhdWx0c0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcgotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9EZWZhdWx0c0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9cY2xhc3MtdXNlRGVmYXVsdHNBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJEZWZhdWx0c0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL2NsYXNzLXVzZS9JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vY2xhc3MtdXNlL0lBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY1ZDhjMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vY2xhc3MtdXNlL0lBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMTQpIG9uIFdlZCBBcHIgMDcgMDc6NDY6MjMgQlNUIDIwMTAgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIEludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbi5JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDEwLTA0LTA3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBJbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24uSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0lBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL1xjbGFzcy11c2VJQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIEludGVyZmFjZTxicj5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbi5JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24iPklBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj48Qj5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZTwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbiI+PEI+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb248L0I+PC9BPjwvVEQ+Ci08VEQ+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24iPklBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZTwvQT4gdGhhdCByZXR1cm4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uIj5JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uIj5JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5Bbm5vdGF0aW9uRGVmaW5pdGlvbi48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbCNnZXRBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIoKSI+Z2V0QW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgYW5ub3RhdGlvbnMgYXR0cmlidXRlIGluaXRpYWxpemVyIGFzIHNwZWNpZmllZCBpbiB0aGUKLSA8Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uSW5pdGlhbGl6ZXI8L2NvZGU+IGV4dGVuc2lvbiBwb2ludCBvciBudWxsIGlmIG5vCi0gaW5pdGlhbGl6ZXIgY2FuIGJlIGZvdW5kLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24iPklBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkFubm90YXRpb25zTWFuYWdlci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNNYW5hZ2VyLmh0bWwjZ2V0QW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyRm9yTmFtZShvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZSkiPmdldEFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplckZvck5hbWU8L0E+PC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZSZuYnNwO25hbWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24iPjxDT0RFPklBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI8L0NPREU+PC9BPiBmb3IgdGhlIGdpdmVuIDxDT0RFPk5hbWU8L0NPREU+Ci0gb3IgbnVsbCBpZiBub25lIGNhbiBiZSBmb3VuZC48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24iPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0lBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbiI+SUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPkNsYXNzZXMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uPC9BPiB0aGF0IGltcGxlbWVudCA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24iPklBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtjbGFzczwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uIj5Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgaW5pdGlhbGl6ZXJzIGNvbnRyaWJ1dGVkIHRvIHRoZQotIDxjb2RlPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25Jbml0aWFsaXplcjwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtjbGFzczwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9EZWZhdWx0c0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24iPkRlZmF1bHRzQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NvbnN0cnVjdHMgPENPREU+TWVtYmVyVmFsdWVQYWlyPC9DT0RFPiBmcm9tIHRoZSBkZWZhdWx0cyBmb3VuZCBpbiB0aGUgZ2l2ZW4gPENPREU+QW5ub3RhdGlvbjwvQ09ERT4uPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0lBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL1xjbGFzcy11c2VJQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL3BhY2thZ2UtZnJhbWUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9wYWNrYWdlLWZyYW1lLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZDQ2NzcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL3BhY2thZ2UtZnJhbWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8xNCkgb24gV2VkIEFwciAwNyAwNzo0NjoyMiBCU1QgMjAxMCAtLT4KLTxUSVRMRT4KLW9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDEwLTA0LTA3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiPgotPEZPTlQgc2l6ZT0iKzEiIENMQVNTPSJGcmFtZVRpdGxlRm9udCI+Ci08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbjwvQT48L0ZPTlQ+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBOT1dSQVA+PEZPTlQgc2l6ZT0iKzEiIENMQVNTPSJGcmFtZUhlYWRpbmdGb250Ij4KLUludGVyZmFjZXM8L0ZPTlQ+Jm5ic3A7Ci08Rk9OVCBDTEFTUz0iRnJhbWVJdGVtRm9udCI+Ci08QlI+Ci08QSBIUkVGPSJJQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24iIHRhcmdldD0iY2xhc3NGcmFtZSI+PEk+SUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjwvST48L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLQotCi08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBOT1dSQVA+PEZPTlQgc2l6ZT0iKzEiIENMQVNTPSJGcmFtZUhlYWRpbmdGb250Ij4KLUNsYXNzZXM8L0ZPTlQ+Jm5ic3A7Ci08Rk9OVCBDTEFTUz0iRnJhbWVJdGVtRm9udCI+Ci08QlI+Ci08QSBIUkVGPSJBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPkFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjwvQT4KLTxCUj4KLTxBIEhSRUY9IkRlZmF1bHRzQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5EZWZhdWx0c0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotCi0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcwOTk4MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjQ2OjIyIEJTVCAyMDEwIC0tPgotPFRJVExFPgotb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24KLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTAtMDQtMDciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbiI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlBhY2thZ2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXVzZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxCPlBSRVYgUEFDS0FHRTwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxCPk5FWFQgUEFDS0FHRTwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxIMj4KLVBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24KLTwvSDI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+SW50ZXJmYWNlIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uIj5JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9BPjwvQj48L1REPgotPFREPkJhc2UgaW50ZXJmYWNlIGZvciBhbm5vdGF0aW9uIGF0dHJpYnV0ZSBpbml0aWFsaXplcnMuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci0KLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNsYXNzIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbiI+QW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9BPjwvQj48L1REPgotPFREPkFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGluaXRpYWxpemVycyBjb250cmlidXRlZCB0byB0aGUKLSA8Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uSW5pdGlhbGl6ZXI8L2NvZGU+IGV4dGVuc2lvbiBwb2ludC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIxNSUiPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0RlZmF1bHRzQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbiI+RGVmYXVsdHNBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI8L0E+PC9CPjwvVEQ+Ci08VEQ+Q29uc3RydWN0cyA8Q09ERT5NZW1iZXJWYWx1ZVBhaXI8L0NPREU+IGZyb20gdGhlIGRlZmF1bHRzIGZvdW5kIGluIHRoZSBnaXZlbiA8Q09ERT5Bbm5vdGF0aW9uPC9DT0RFPi48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLQotPFA+Ci08REw+Ci08L0RMPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdXNlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEI+UFJFViBQQUNLQUdFPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEI+TkVYVCBQQUNLQUdFPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vcGFja2FnZS10cmVlLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vcGFja2FnZS10cmVlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMjcxNGEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL3BhY2thZ2UtdHJlZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8xNCkgb24gV2VkIEFwciAwNyAwNzo0NjoyMiBCU1QgMjAxMCAtLT4KLTxUSVRMRT4KLW9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uIENsYXNzIEhpZXJhcmNoeQotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMC0wNC0wNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9Im9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uIENsYXNzIEhpZXJhcmNoeSI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlRyZWU8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3BhY2thZ2UtdHJlZS5odG1sIj48Qj5QUkVWPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9wYWNrYWdlLXRyZWUuaHRtbCI+PEI+TkVYVDwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL3BhY2thZ2UtdHJlZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci1IaWVyYXJjaHkgRm9yIFBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24KLTwvSDI+Ci08L0NFTlRFUj4KLTxETD4KLTxEVD48Qj5QYWNrYWdlIEhpZXJhcmNoaWVzOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctdHJlZS5odG1sIj5BbGwgUGFja2FnZXM8L0E+PC9ETD4KLTxIUj4KLTxIMj4KLUNsYXNzIEhpZXJhcmNoeQotPC9IMj4KLTxVTD4KLTxMSSBUWVBFPSJjaXJjbGUiPmphdmEubGFuZy5PYmplY3Q8VUw+Ci08TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbi48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uIj48Qj5Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI8L0I+PC9BPiAoaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbi48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24iPklBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI8L0E+KQotPFVMPgotPExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24uPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vRGVmYXVsdHNBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uIj48Qj5EZWZhdWx0c0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjwvQj48L0E+PC9VTD4KLTwvVUw+Ci08L1VMPgotPEgyPgotSW50ZXJmYWNlIEhpZXJhcmNoeQotPC9IMj4KLTxVTD4KLTxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uLjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0lBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbiI+PEI+SUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjwvQj48L0E+PC9VTD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlRyZWU8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3BhY2thZ2UtdHJlZS5odG1sIj48Qj5QUkVWPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9wYWNrYWdlLXRyZWUuaHRtbCI+PEI+TkVYVDwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL3BhY2thZ2UtdHJlZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL3BhY2thZ2UtdXNlLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vcGFja2FnZS11c2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZhNWUxMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vcGFja2FnZS11c2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMTQpIG9uIFdlZCBBcHIgMDcgMDc6NDY6MjMgQlNUIDIwMTAgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIFBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24KLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTAtMDQtMDciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIFBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24iOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL3BhY2thZ2UtdXNlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0icGFja2FnZS11c2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBQYWNrYWdlPGJyPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uPC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb248L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj48Qj5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZTwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbiI+PEI+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb248L0I+PC9BPjwvVEQ+Ci08VEQ+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotQ2xhc3NlcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb248L0E+IHVzZWQgYnkgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL2NsYXNzLXVzZS9JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPjxCPklBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI8L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QmFzZSBpbnRlcmZhY2UgZm9yIGFubm90YXRpb24gYXR0cmlidXRlIGluaXRpYWxpemVycy48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24iPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1DbGFzc2VzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbjwvQT4gdXNlZCBieSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb248L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vY2xhc3MtdXNlL0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uIj48Qj5Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI8L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgaW5pdGlhbGl6ZXJzIGNvbnRyaWJ1dGVkIHRvIHRoZQotIDxjb2RlPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25Jbml0aWFsaXplcjwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vY2xhc3MtdXNlL0lBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbiI+PEI+SUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtCYXNlIGludGVyZmFjZSBmb3IgYW5ub3RhdGlvbiBhdHRyaWJ1dGUgaW5pdGlhbGl6ZXJzLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL3BhY2thZ2UtdXNlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0icGFja2FnZS11c2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wYWNrYWdlLWZyYW1lLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcGFja2FnZS1mcmFtZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDAzM2E2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wYWNrYWdlLWZyYW1lLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMTQpIG9uIFdlZCBBcHIgMDcgMDc6NDY6MjIgQlNUIDIwMTAgLS0+Ci08VElUTEU+Ci1vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZQotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMC0wNC0wNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIj4KLTxGT05UIHNpemU9IisxIiBDTEFTUz0iRnJhbWVUaXRsZUZvbnQiPgotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iY2xhc3NGcmFtZSI+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmU8L0E+PC9GT05UPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgTk9XUkFQPjxGT05UIHNpemU9IisxIiBDTEFTUz0iRnJhbWVIZWFkaW5nRm9udCI+Ci1DbGFzc2VzPC9GT05UPiZuYnNwOwotPEZPTlQgQ0xBU1M9IkZyYW1lSXRlbUZvbnQiPgotPEJSPgotPEEgSFJFRj0iQW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPkFubm90YXRpb25EZWZpbml0aW9uPC9BPgotPEJSPgotPEEgSFJFRj0iQW5ub3RhdGlvbnNDb3JlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5Bbm5vdGF0aW9uc0NvcmU8L0E+Ci08QlI+Ci08QSBIUkVGPSJBbm5vdGF0aW9uc0NvcmVQbHVnaW4uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPkFubm90YXRpb25zQ29yZVBsdWdpbjwvQT4KLTxCUj4KLTxBIEhSRUY9IkFubm90YXRpb25zTWFuYWdlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiIHRhcmdldD0iY2xhc3NGcmFtZSI+QW5ub3RhdGlvbnNNYW5hZ2VyPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3BhY2thZ2Utc3VtbWFyeS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3BhY2thZ2Utc3VtbWFyeS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWY5MzJmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wYWNrYWdlLXN1bW1hcnkuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMTQpIG9uIFdlZCBBcHIgMDcgMDc6NDY6MjIgQlNUIDIwMTAgLS0+Ci08VElUTEU+Ci1vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZQotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMC0wNC0wNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9Im9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdXNlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWIFBBQ0tBR0UmbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Qj5ORVhUIFBBQ0tBR0U8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08SDI+Ci1QYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlCi08L0gyPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNsYXNzIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj5Bbm5vdGF0aW9uRGVmaW5pdGlvbjwvQT48L0I+PC9URD4KLTxURD5BbiA8Y29kZT5Bbm5vdGF0aW9uRGVmaW5pdGlvbjwvY29kZT4gaXMgYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5mb3JtYXRpb24gY29udHJpYnV0ZWQgdGhyb3VnaCB0aGUKLSA8Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uRGVmaW5pdGlvbjwvY29kZT4sCi0gPGNvZGU+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkNhdGVnb3J5PC9jb2RlPiBhbmQKLSA8Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uSW5pdGlhbGl6ZXI8L2NvZGU+IGV4dGVuc2lvbiBwb2ludHMuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmUuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj5Bbm5vdGF0aW9uc0NvcmU8L0E+PC9CPjwvVEQ+Ci08VEQ+VXRpbGl0eSBjbGFzcyBmb3IgY3JlYXRpbmcgYW5ub3RhdGlvbnMgYW5kIG1lbWJlciB2YWx1ZSBwYWlycy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIxNSUiPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZVBsdWdpbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPkFubm90YXRpb25zQ29yZVBsdWdpbjwvQT48L0I+PC9URD4KLTxURD4KLSA8c3Ryb25nPlByb3Zpc2lvbmFsIEFQSTo8L3N0cm9uZz4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIAotIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNNYW5hZ2VyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSI+QW5ub3RhdGlvbnNNYW5hZ2VyPC9BPjwvQj48L1REPgotPFREPk1hbmFnZXMgdGhlIGFubm90YXRpb24gY2F0ZWdvcmllcywgZGVmaW5pdGlvbnMsIHByb2Nlc3NvcnMgYW5kIGluaXRpYWxpemVycyBjb250cmlidXRlZCB0aHJvdWdoIHRoZQotIDxjb2RlPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25EZWZpbml0aW9uPC9jb2RlPiwKLSA8Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uQ2F0ZWdvcnk8L2NvZGU+LAotIDxjb2RlPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25Jbml0aWFsaXplcjwvY29kZT4gYW5kCi0gPGNvZGU+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvblByb2Nlc3NvcjwvY29kZT4gZXh0ZW5zaW9uIHBvaW50cy48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLQotPFA+Ci08REw+Ci08L0RMPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdXNlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWIFBBQ0tBR0UmbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Qj5ORVhUIFBBQ0tBR0U8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wYWNrYWdlLXRyZWUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wYWNrYWdlLXRyZWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FkYWI4Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcGFja2FnZS10cmVlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjQ2OjIyIEJTVCAyMDEwIC0tPgotPFRJVExFPgotb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUgQ2xhc3MgSGllcmFyY2h5Ci08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDEwLTA0LTA3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0ib3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUgQ2xhc3MgSGllcmFyY2h5IjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VHJlZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vcGFja2FnZS10cmVlLmh0bWwiPjxCPk5FWFQ8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wYWNrYWdlLXRyZWUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgyPgotSGllcmFyY2h5IEZvciBQYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlCi08L0gyPgotPC9DRU5URVI+Ci08REw+Ci08RFQ+PEI+UGFja2FnZSBIaWVyYXJjaGllczo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+QWxsIFBhY2thZ2VzPC9BPjwvREw+Ci08SFI+Ci08SDI+Ci1DbGFzcyBIaWVyYXJjaHkKLTwvSDI+Ci08VUw+Ci08TEkgVFlQRT0iY2lyY2xlIj5qYXZhLmxhbmcuT2JqZWN0PFVMPgotPExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj48Qj5Bbm5vdGF0aW9uRGVmaW5pdGlvbjwvQj48L0E+PExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSI+PEI+QW5ub3RhdGlvbnNDb3JlPC9CPjwvQT48TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc01hbmFnZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj48Qj5Bbm5vdGF0aW9uc01hbmFnZXI8L0I+PC9BPjxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4gKGltcGxlbWVudHMgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcikKLTxVTD4KLTxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZVBsdWdpbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPjxCPkFubm90YXRpb25zQ29yZVBsdWdpbjwvQj48L0E+PC9VTD4KLTwvVUw+Ci08L1VMPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VHJlZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vcGFja2FnZS10cmVlLmh0bWwiPjxCPk5FWFQ8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wYWNrYWdlLXRyZWUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wYWNrYWdlLXVzZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3BhY2thZ2UtdXNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNGZjOGEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3BhY2thZ2UtdXNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjQ2OjIzIEJTVCAyMDEwIC0tPgotPFRJVExFPgotVXNlcyBvZiBQYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDEwLTA0LTA3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBQYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wYWNrYWdlLXVzZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9InBhY2thZ2UtdXNlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgUGFja2FnZTxicj5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZTwvQj48L0gyPgotPC9DRU5URVI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotUGFja2FnZXMgdGhhdCB1c2UgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSI+PEI+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmU8L0I+PC9BPjwvVEQ+Ci08VEQ+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotQ2xhc3NlcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmU8L0E+IHVzZWQgYnkgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2NsYXNzLXVzZS9Bbm5vdGF0aW9uRGVmaW5pdGlvbi5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj48Qj5Bbm5vdGF0aW9uRGVmaW5pdGlvbjwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbiA8Y29kZT5Bbm5vdGF0aW9uRGVmaW5pdGlvbjwvY29kZT4gaXMgYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5mb3JtYXRpb24gY29udHJpYnV0ZWQgdGhyb3VnaCB0aGUKLSA8Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uRGVmaW5pdGlvbjwvY29kZT4sCi0gPGNvZGU+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkNhdGVnb3J5PC9jb2RlPiBhbmQKLSA8Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uSW5pdGlhbGl6ZXI8L2NvZGU+IGV4dGVuc2lvbiBwb2ludHMuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9jbGFzcy11c2UvQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiPjxCPkFubm90YXRpb25zQ29yZVBsdWdpbjwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSA8c3Ryb25nPlByb3Zpc2lvbmFsIEFQSTo8L3N0cm9uZz4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIAotIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3BhY2thZ2UtdXNlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0icGFja2FnZS11c2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL0Fic3RyYWN0QW5ub3RhdGlvblByb2Nlc3Nvci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWM0YzkyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2ODQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjQ2OjIxIEJTVCAyMDEwIC0tPgotPFRJVExFPgotQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDEwLTA0LTA3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYgQ0xBU1MmbmJzcDsKLSZuYnNwO05FWFQgQ0xBU1M8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL0Fic3RyYWN0QW5ub3RhdGlvblByb2Nlc3Nvci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3Nvci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjZmllbGRfc3VtbWFyeSI+RklFTEQ8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDs8QSBIUkVGPSIjZmllbGRfZGV0YWlsIj5GSUVMRDwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yPC9GT05UPgotPEJSPgotQ2xhc3MgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yPC9IMj4KLTxQUkU+Ci1qYXZhLmxhbmcuT2JqZWN0Ci0gIDxJTUcgU1JDPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9yZXNvdXJjZXMvaW5oZXJpdC5naWYiIEFMVD0iZXh0ZW5kZWQgYnkgIj48Qj5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yPC9CPgotPC9QUkU+Ci08REw+Ci08RFQ+PEI+QWxsIEltcGxlbWVudGVkIEludGVyZmFjZXM6PC9CPiA8REQ+Y29tLnN1bi5taXJyb3IuYXB0LkFubm90YXRpb25Qcm9jZXNzb3I8L0REPgotPC9ETD4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBhYnN0cmFjdCBjbGFzcyA8Qj5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I8L0I+PERUPmV4dGVuZHMgamF2YS5sYW5nLk9iamVjdDxEVD5pbXBsZW1lbnRzIGNvbS5zdW4ubWlycm9yLmFwdC5Bbm5vdGF0aW9uUHJvY2Vzc29yPC9ETD4KLTwvUFJFPgotCi08UD4KLUFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHByb2Nlc3NvcnMgY29udHJpYnV0ZWQgdG8gdGhlCi0gPGNvZGU+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvblByb2Nlc3NvcjwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LgotCi0gPHA+Ci0gPHN0cm9uZz5Qcm92aXNpb25hbCBBUEk6PC9zdHJvbmc+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlcgotIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdAotIHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMKLSB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gPC9wPgotPFA+Ci0KLTxQPgotPEhSPgotCi08UD4KLTwhLS0gPT09PT09PT09PT0gRklFTEQgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0iZmllbGRfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkZpZWxkIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wcm90ZWN0ZWQgJm5ic3A7Y29tLnN1bi5taXJyb3IuYXB0LkFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yLmh0bWwjZW52aXJvbm1lbnQiPmVudmlyb25tZW50PC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPCEtLSA9PT09PT09PSBDT05TVFJVQ1RPUiBTVU1NQVJZID09PT09PT09IC0tPgotCi08QSBOQU1FPSJjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnByb3RlY3RlZCA8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL0Fic3RyYWN0QW5ub3RhdGlvblByb2Nlc3Nvci5odG1sI0Fic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcigpIj5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnByb3RlY3RlZCAmbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IuaHRtbCNwcmludEVycm9yKGNvbS5zdW4ubWlycm9yLnV0aWwuU291cmNlUG9zaXRpb24sIGphdmEubGFuZy5TdHJpbmcpIj5wcmludEVycm9yPC9BPjwvQj4oY29tLnN1bi5taXJyb3IudXRpbC5Tb3VyY2VQb3NpdGlvbiZuYnNwO3Bvc2l0aW9uLAotICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bWVzc2FnZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1ByaW50cyBhbiBlcnJvciBtZXNzYWdlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wcm90ZWN0ZWQgJm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yLmh0bWwjcHJpbnRFcnJvcihqYXZhLmxhbmcuU3RyaW5nKSI+cHJpbnRFcnJvcjwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDttZXNzYWdlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UHJpbnRzIGFuIGVycm9yIG1lc3NhZ2UuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnByb3RlY3RlZCAmbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IuaHRtbCNwcmludEZpeGFibGVFcnJvcihjb20uc3VuLm1pcnJvci51dGlsLlNvdXJjZVBvc2l0aW9uLCBqYXZhLmxhbmcuU3RyaW5nKSI+cHJpbnRGaXhhYmxlRXJyb3I8L0E+PC9CPihjb20uc3VuLm1pcnJvci51dGlsLlNvdXJjZVBvc2l0aW9uJm5ic3A7cG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bWVzc2FnZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1ByaW50IGFuIGVycm9yIGluY2x1ZGluZyB0aGUgZ2l2ZW4gYXJndW1lbnRzIGZvciB1c2UgaW4gcXVpY2stZml4ZXMuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnByb3RlY3RlZCAmbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IuaHRtbCNwcmludEZpeGFibGVFcnJvcihjb20uc3VuLm1pcnJvci51dGlsLlNvdXJjZVBvc2l0aW9uLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKSI+cHJpbnRGaXhhYmxlRXJyb3I8L0E+PC9CPihjb20uc3VuLm1pcnJvci51dGlsLlNvdXJjZVBvc2l0aW9uJm5ic3A7cG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtwbHVnaW5JZCwKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtlcnJvcklkKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UHJpbnQgYW4gZXJyb3IgaW5jbHVkaW5nIHRoZSBnaXZlbiBhcmd1bWVudHMgZm9yIHVzZSBpbiBxdWljay1maXhlcy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHJvdGVjdGVkICZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL0Fic3RyYWN0QW5ub3RhdGlvblByb2Nlc3Nvci5odG1sI3ByaW50Rml4YWJsZUVycm9yKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpIj5wcmludEZpeGFibGVFcnJvcjwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDttZXNzYWdlLAotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO3BsdWdpbklkLAotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO2Vycm9ySWQpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtQcmludCBhbiBlcnJvciBpbmNsdWRpbmcgdGhlIGdpdmVuIGFyZ3VtZW50cyBmb3IgdXNlIGluIHF1aWNrLWZpeGVzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wcm90ZWN0ZWQgJm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yLmh0bWwjcHJpbnRGaXhhYmxlTm90aWNlKGNvbS5zdW4ubWlycm9yLnV0aWwuU291cmNlUG9zaXRpb24sIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpIj5wcmludEZpeGFibGVOb3RpY2U8L0E+PC9CPihjb20uc3VuLm1pcnJvci51dGlsLlNvdXJjZVBvc2l0aW9uJm5ic3A7cG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO21lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO3BsdWdpbklkLAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtlcnJvcklkKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UHJpbnQgYSBub3RpY2UgaW5jbHVkaW5nIHRoZSBnaXZlbiBhcmd1bWVudHMgZm9yIHVzZSBpbiBxdWljay1maXhlcy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHJvdGVjdGVkICZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL0Fic3RyYWN0QW5ub3RhdGlvblByb2Nlc3Nvci5odG1sI3ByaW50Rml4YWJsZU5vdGljZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKSI+cHJpbnRGaXhhYmxlTm90aWNlPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO21lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO3BsdWdpbklkLAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtlcnJvcklkKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UHJpbnQgYSBub3RpY2UgaW5jbHVkaW5nIHRoZSBnaXZlbiBhcmd1bWVudHMgZm9yIHVzZSBpbiBxdWljay1maXhlcy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHJvdGVjdGVkICZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL0Fic3RyYWN0QW5ub3RhdGlvblByb2Nlc3Nvci5odG1sI3ByaW50Rml4YWJsZVdhcm5pbmcoY29tLnN1bi5taXJyb3IudXRpbC5Tb3VyY2VQb3NpdGlvbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykiPnByaW50Rml4YWJsZVdhcm5pbmc8L0E+PC9CPihjb20uc3VuLm1pcnJvci51dGlsLlNvdXJjZVBvc2l0aW9uJm5ic3A7cG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDttZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7cGx1Z2luSWQsCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtlcnJvcklkKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UHJpbnQgYSB3YXJuaW5nIGluY2x1ZGluZyB0aGUgZ2l2ZW4gYXJndW1lbnRzIGZvciB1c2UgaW4gcXVpY2stZml4ZXMuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnByb3RlY3RlZCAmbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IuaHRtbCNwcmludEZpeGFibGVXYXJuaW5nKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpIj5wcmludEZpeGFibGVXYXJuaW5nPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO21lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtwbHVnaW5JZCwKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO2Vycm9ySWQpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtQcmludCBhIHdhcm5pbmcgaW5jbHVkaW5nIHRoZSBnaXZlbiBhcmd1bWVudHMgZm9yIHVzZSBpbiBxdWljay1maXhlcy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHJvdGVjdGVkICZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL0Fic3RyYWN0QW5ub3RhdGlvblByb2Nlc3Nvci5odG1sI3ByaW50Tm90aWNlKGNvbS5zdW4ubWlycm9yLnV0aWwuU291cmNlUG9zaXRpb24sIGphdmEubGFuZy5TdHJpbmcpIj5wcmludE5vdGljZTwvQT48L0I+KGNvbS5zdW4ubWlycm9yLnV0aWwuU291cmNlUG9zaXRpb24mbmJzcDtwb3NpdGlvbiwKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDttZXNzYWdlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UHJpbnRzIGEgbm90aWNlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wcm90ZWN0ZWQgJm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yLmh0bWwjcHJpbnROb3RpY2UoamF2YS5sYW5nLlN0cmluZykiPnByaW50Tm90aWNlPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO21lc3NhZ2UpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtQcmludHMgYSBub3RpY2UuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnByb3RlY3RlZCAmbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IuaHRtbCNwcmludFdhcm5pbmcoY29tLnN1bi5taXJyb3IudXRpbC5Tb3VyY2VQb3NpdGlvbiwgamF2YS5sYW5nLlN0cmluZykiPnByaW50V2FybmluZzwvQT48L0I+KGNvbS5zdW4ubWlycm9yLnV0aWwuU291cmNlUG9zaXRpb24mbmJzcDtwb3NpdGlvbiwKLSAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bWVzc2FnZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1ByaW50cyBhIHdhcm5pbmcgbWVzc2FnZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHJvdGVjdGVkICZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL0Fic3RyYWN0QW5ub3RhdGlvblByb2Nlc3Nvci5odG1sI3ByaW50V2FybmluZyhqYXZhLmxhbmcuU3RyaW5nKSI+cHJpbnRXYXJuaW5nPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO21lc3NhZ2UpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtQcmludHMgYSB3YXJuaW5nIG1lc3NhZ2UuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPmFic3RyYWN0ICZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL0Fic3RyYWN0QW5ub3RhdGlvblByb2Nlc3Nvci5odG1sI3Byb2Nlc3MoKSI+cHJvY2VzczwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1Byb2Nlc3MgYWxsIHByb2dyYW0gZWxlbWVudHMgc3VwcG9ydGVkIGJ5IHRoaXMgYW5ub3RhdGlvbiBwcm9jZXNzb3IuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL0Fic3RyYWN0QW5ub3RhdGlvblByb2Nlc3Nvci5odG1sI3NldEFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudChjb20uc3VuLm1pcnJvci5hcHQuQW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50KSI+c2V0QW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50PC9BPjwvQj4oY29tLnN1bi5taXJyb3IuYXB0LkFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudCZuYnNwO2Vudmlyb25tZW50KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2V0IHRoZSA8Q09ERT5Bbm5vdGF0aW9uUHJvY2Vzc29yRW52aXJvbm1lbnQ8L0NPREU+IGVudmlyb25tZW50IHRvIHVzZSBkdXJpbmcgcHJvY2Vzc2luZy48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDs8QSBOQU1FPSJtZXRob2RzX2luaGVyaXRlZF9mcm9tX2NsYXNzX2phdmEubGFuZy5PYmplY3QiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGNsYXNzIGphdmEubGFuZy5PYmplY3Q8L0I+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT5jbG9uZSwgZXF1YWxzLCBmaW5hbGl6ZSwgZ2V0Q2xhc3MsIGhhc2hDb2RlLCBub3RpZnksIG5vdGlmeUFsbCwgdG9TdHJpbmcsIHdhaXQsIHdhaXQsIHdhaXQ8L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT09PT0gRklFTEQgREVUQUlMID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJmaWVsZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5GaWVsZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iZW52aXJvbm1lbnQiPjwhLS0gLS0+PC9BPjxIMz4KLWVudmlyb25tZW50PC9IMz4KLTxQUkU+Ci1wcm90ZWN0ZWQgY29tLnN1bi5taXJyb3IuYXB0LkFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudCA8Qj5lbnZpcm9ubWVudDwvQj48L1BSRT4KLTxETD4KLTxETD4KLTwvREw+Ci08L0RMPgotCi08IS0tID09PT09PT09PSBDT05TVFJVQ1RPUiBERVRBSUwgPT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImNvbnN0cnVjdG9yX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNvbnN0cnVjdG9yIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJBYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IoKSI+PCEtLSAtLT48L0E+PEgzPgotQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yPC9IMz4KLTxQUkU+Ci1wcm90ZWN0ZWQgPEI+QWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yPC9CPigpPC9QUkU+Ci08REw+Ci08L0RMPgotCi08IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9InNldEFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudChjb20uc3VuLm1pcnJvci5hcHQuQW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50KSI+PCEtLSAtLT48L0E+PEgzPgotc2V0QW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50PC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5zZXRBbm5vdGF0aW9uUHJvY2Vzc29yRW52aXJvbm1lbnQ8L0I+KGNvbS5zdW4ubWlycm9yLmFwdC5Bbm5vdGF0aW9uUHJvY2Vzc29yRW52aXJvbm1lbnQmbmJzcDtlbnZpcm9ubWVudCk8L1BSRT4KLTxETD4KLTxERD5TZXQgdGhlIDxDT0RFPkFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudDwvQ09ERT4gZW52aXJvbm1lbnQgdG8gdXNlIGR1cmluZyBwcm9jZXNzaW5nLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5lbnZpcm9ubWVudDwvQ09ERT4gLSB0aGUgYW5ub3RhdGlvbiBwcm9jZXNzb3IgZW52aXJvbm1lbnQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJwcm9jZXNzKCkiPjwhLS0gLS0+PC9BPjxIMz4KLXByb2Nlc3M8L0gzPgotPFBSRT4KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIDxCPnByb2Nlc3M8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5Qcm9jZXNzIGFsbCBwcm9ncmFtIGVsZW1lbnRzIHN1cHBvcnRlZCBieSB0aGlzIGFubm90YXRpb24gcHJvY2Vzc29yLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlNwZWNpZmllZCBieTo8L0I+PEREPjxDT0RFPnByb2Nlc3M8L0NPREU+IGluIGludGVyZmFjZSA8Q09ERT5jb20uc3VuLm1pcnJvci5hcHQuQW5ub3RhdGlvblByb2Nlc3NvcjwvQ09ERT48L0RMPgotPC9ERD4KLTxERD48REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48Q09ERT5Bbm5vdGF0aW9uUHJvY2Vzc29yPC9DT0RFPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0icHJpbnRFcnJvcihjb20uc3VuLm1pcnJvci51dGlsLlNvdXJjZVBvc2l0aW9uLCBqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotcHJpbnRFcnJvcjwvSDM+Ci08UFJFPgotcHJvdGVjdGVkIHZvaWQgPEI+cHJpbnRFcnJvcjwvQj4oY29tLnN1bi5taXJyb3IudXRpbC5Tb3VyY2VQb3NpdGlvbiZuYnNwO3Bvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bWVzc2FnZSk8L1BSRT4KLTxETD4KLTxERD5QcmludHMgYW4gZXJyb3IgbWVzc2FnZS4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cG9zaXRpb248L0NPREU+IC0gdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBlcnJvciBvY2N1cmVkLCBvciBudWxsIGlmIGl0IGlzIHVua25vd24gb3Igbm90IGFwcGxpY2FibGU8REQ+PENPREU+bWVzc2FnZTwvQ09ERT4gLSB0aGUgbWVzc2FnZSwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIG5vbmU8L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InByaW50RXJyb3IoamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLXByaW50RXJyb3I8L0gzPgotPFBSRT4KLXByb3RlY3RlZCB2b2lkIDxCPnByaW50RXJyb3I8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDttZXNzYWdlKTwvUFJFPgotPERMPgotPEREPlByaW50cyBhbiBlcnJvciBtZXNzYWdlLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5tZXNzYWdlPC9DT0RFPiAtIHRoZSBtZXNzYWdlLCBvciBhbiBlbXB0eSBzdHJpbmcgaWYgbm9uZTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0icHJpbnRXYXJuaW5nKGNvbS5zdW4ubWlycm9yLnV0aWwuU291cmNlUG9zaXRpb24sIGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1wcmludFdhcm5pbmc8L0gzPgotPFBSRT4KLXByb3RlY3RlZCB2b2lkIDxCPnByaW50V2FybmluZzwvQj4oY29tLnN1bi5taXJyb3IudXRpbC5Tb3VyY2VQb3NpdGlvbiZuYnNwO3Bvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDttZXNzYWdlKTwvUFJFPgotPERMPgotPEREPlByaW50cyBhIHdhcm5pbmcgbWVzc2FnZS4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cG9zaXRpb248L0NPREU+IC0gdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSB3YXJuaW5nIG9jY3VyZWQsIG9yIG51bGwgaWYgaXQgaXMgdW5rbm93biBvciBub3QgYXBwbGljYWJsZTxERD48Q09ERT5tZXNzYWdlPC9DT0RFPiAtIHRoZSBtZXNzYWdlLCBvciBhbiBlbXB0eSBzdHJpbmcgaWYgbm9uZTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0icHJpbnRXYXJuaW5nKGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1wcmludFdhcm5pbmc8L0gzPgotPFBSRT4KLXByb3RlY3RlZCB2b2lkIDxCPnByaW50V2FybmluZzwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO21lc3NhZ2UpPC9QUkU+Ci08REw+Ci08REQ+UHJpbnRzIGEgd2FybmluZyBtZXNzYWdlLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5tZXNzYWdlPC9DT0RFPiAtIHRoZSBtZXNzYWdlLCBvciBhbiBlbXB0eSBzdHJpbmcgaWYgbm9uZTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0icHJpbnROb3RpY2UoY29tLnN1bi5taXJyb3IudXRpbC5Tb3VyY2VQb3NpdGlvbiwgamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLXByaW50Tm90aWNlPC9IMz4KLTxQUkU+Ci1wcm90ZWN0ZWQgdm9pZCA8Qj5wcmludE5vdGljZTwvQj4oY29tLnN1bi5taXJyb3IudXRpbC5Tb3VyY2VQb3NpdGlvbiZuYnNwO3Bvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO21lc3NhZ2UpPC9QUkU+Ci08REw+Ci08REQ+UHJpbnRzIGEgbm90aWNlLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5wb3NpdGlvbjwvQ09ERT4gLSB0aGUgcG9zaXRpb24gd2hlcmUgdGhlIG5vdGljZSBvY2N1cmVkLCBvciBudWxsIGlmIGl0IGlzIHVua25vd24gb3Igbm90IGFwcGxpY2FibGU8REQ+PENPREU+bWVzc2FnZTwvQ09ERT4gLSB0aGUgbWVzc2FnZSwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIG5vbmU8L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InByaW50Tm90aWNlKGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1wcmludE5vdGljZTwvSDM+Ci08UFJFPgotcHJvdGVjdGVkIHZvaWQgPEI+cHJpbnROb3RpY2U8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDttZXNzYWdlKTwvUFJFPgotPERMPgotPEREPlByaW50cyBhIG5vdGljZS4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+bWVzc2FnZTwvQ09ERT4gLSB0aGUgbWVzc2FnZSwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIG5vbmU8L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InByaW50Rml4YWJsZUVycm9yKGNvbS5zdW4ubWlycm9yLnV0aWwuU291cmNlUG9zaXRpb24sIGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1wcmludEZpeGFibGVFcnJvcjwvSDM+Ci08UFJFPgotcHJvdGVjdGVkIHZvaWQgPEI+cHJpbnRGaXhhYmxlRXJyb3I8L0I+KGNvbS5zdW4ubWlycm9yLnV0aWwuU291cmNlUG9zaXRpb24mbmJzcDtwb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDttZXNzYWdlKTwvUFJFPgotPERMPgotPEREPlByaW50IGFuIGVycm9yIGluY2x1ZGluZyB0aGUgZ2l2ZW4gYXJndW1lbnRzIGZvciB1c2UgaW4gcXVpY2stZml4ZXMuCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnBvc2l0aW9uPC9DT0RFPiAtIHBvc2l0aW9uIG9mIHRoZSBlcnJvcjxERD48Q09ERT5tZXNzYWdlPC9DT0RFPiAtIG1lc3NhZ2UgdG8gZGlzcGxheSB0byB0aGUgdXNlcjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0icHJpbnRGaXhhYmxlRXJyb3IoY29tLnN1bi5taXJyb3IudXRpbC5Tb3VyY2VQb3NpdGlvbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLXByaW50Rml4YWJsZUVycm9yPC9IMz4KLTxQUkU+Ci1wcm90ZWN0ZWQgdm9pZCA8Qj5wcmludEZpeGFibGVFcnJvcjwvQj4oY29tLnN1bi5taXJyb3IudXRpbC5Tb3VyY2VQb3NpdGlvbiZuYnNwO3Bvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO21lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7cGx1Z2luSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7ZXJyb3JJZCk8L1BSRT4KLTxETD4KLTxERD5QcmludCBhbiBlcnJvciBpbmNsdWRpbmcgdGhlIGdpdmVuIGFyZ3VtZW50cyBmb3IgdXNlIGluIHF1aWNrLWZpeGVzLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5wb3NpdGlvbjwvQ09ERT4gLSBwb3NpdGlvbiBvZiB0aGUgZXJyb3I8REQ+PENPREU+bWVzc2FnZTwvQ09ERT4gLSBtZXNzYWdlIHRvIGRpc3BsYXkgdG8gdGhlIHVzZXI8REQ+PENPREU+cGx1Z2luSWQ8L0NPREU+IC0gcGx1Zy1pbiB3aGljaCB3aWxsIHByb3ZpZGUgYSBqYXZhIHF1aWNrIGZpeCBwcm9jZXNzb3IgZm9yIHRoaXMgZXJyb3IuIENhbm5vdCBiZSBudWxsLjxERD48Q09ERT5lcnJvcklkPC9DT0RFPiAtIGEgcGx1Zy1pbiBwcm92aWRlZCBlcnJvciBjb2RlIHdoaWNoIHdpbGwgYmUgbWVhbmluZ2Z1bCB0byB0aGUgamF2YSBxdWljayBmaXggcHJvY2Vzc29yLiBDYW5ub3QgYmUgbnVsbC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InByaW50Rml4YWJsZUVycm9yKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1wcmludEZpeGFibGVFcnJvcjwvSDM+Ci08UFJFPgotcHJvdGVjdGVkIHZvaWQgPEI+cHJpbnRGaXhhYmxlRXJyb3I8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDttZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO3BsdWdpbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO2Vycm9ySWQpPC9QUkU+Ci08REw+Ci08REQ+UHJpbnQgYW4gZXJyb3IgaW5jbHVkaW5nIHRoZSBnaXZlbiBhcmd1bWVudHMgZm9yIHVzZSBpbiBxdWljay1maXhlcy4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+bWVzc2FnZTwvQ09ERT4gLSBtZXNzYWdlIHRvIGRpc3BsYXkgdG8gdGhlIHVzZXI8REQ+PENPREU+cGx1Z2luSWQ8L0NPREU+IC0gcGx1Zy1pbiB3aGljaCB3aWxsIHByb3ZpZGUgYSBqYXZhIHF1aWNrIGZpeCBwcm9jZXNzb3IgZm9yIHRoaXMgZXJyb3IuIENhbm5vdCBiZSBudWxsLjxERD48Q09ERT5lcnJvcklkPC9DT0RFPiAtIGEgcGx1Zy1pbiBwcm92aWRlZCBlcnJvciBjb2RlIHdoaWNoIHdpbGwgYmUgbWVhbmluZ2Z1bCB0byB0aGUgamF2YSBxdWljayBmaXggcHJvY2Vzc29yLiBDYW5ub3QgYmUgbnVsbC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InByaW50Rml4YWJsZVdhcm5pbmcoY29tLnN1bi5taXJyb3IudXRpbC5Tb3VyY2VQb3NpdGlvbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLXByaW50Rml4YWJsZVdhcm5pbmc8L0gzPgotPFBSRT4KLXByb3RlY3RlZCB2b2lkIDxCPnByaW50Rml4YWJsZVdhcm5pbmc8L0I+KGNvbS5zdW4ubWlycm9yLnV0aWwuU291cmNlUG9zaXRpb24mbmJzcDtwb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO21lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtwbHVnaW5JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO2Vycm9ySWQpPC9QUkU+Ci08REw+Ci08REQ+UHJpbnQgYSB3YXJuaW5nIGluY2x1ZGluZyB0aGUgZ2l2ZW4gYXJndW1lbnRzIGZvciB1c2UgaW4gcXVpY2stZml4ZXMuCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnBvc2l0aW9uPC9DT0RFPiAtIHBvc2l0aW9uIG9mIHRoZSB3YXJuaW5nPEREPjxDT0RFPm1lc3NhZ2U8L0NPREU+IC0gbWVzc2FnZSB0byBkaXNwbGF5IHRvIHRoZSB1c2VyPEREPjxDT0RFPnBsdWdpbklkPC9DT0RFPiAtIHBsdWctaW4gd2hpY2ggd2lsbCBwcm92aWRlIGEgamF2YSBxdWljayBmaXggcHJvY2Vzc29yIGZvciB0aGlzIGVycm9yLiBDYW5ub3QgYmUgbnVsbC48REQ+PENPREU+ZXJyb3JJZDwvQ09ERT4gLSBhIHBsdWctaW4gcHJvdmlkZWQgZXJyb3IgY29kZSB3aGljaCB3aWxsIGJlIG1lYW5pbmdmdWwgdG8gdGhlIGphdmEgcXVpY2sgZml4IHByb2Nlc3Nvci4gQ2Fubm90IGJlIG51bGwuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJwcmludEZpeGFibGVXYXJuaW5nKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1wcmludEZpeGFibGVXYXJuaW5nPC9IMz4KLTxQUkU+Ci1wcm90ZWN0ZWQgdm9pZCA8Qj5wcmludEZpeGFibGVXYXJuaW5nPC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO3BsdWdpbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7ZXJyb3JJZCk8L1BSRT4KLTxETD4KLTxERD5QcmludCBhIHdhcm5pbmcgaW5jbHVkaW5nIHRoZSBnaXZlbiBhcmd1bWVudHMgZm9yIHVzZSBpbiBxdWljay1maXhlcy4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+bWVzc2FnZTwvQ09ERT4gLSBtZXNzYWdlIHRvIGRpc3BsYXkgdG8gdGhlIHVzZXI8REQ+PENPREU+cGx1Z2luSWQ8L0NPREU+IC0gcGx1Zy1pbiB3aGljaCB3aWxsIHByb3ZpZGUgYSBqYXZhIHF1aWNrIGZpeCBwcm9jZXNzb3IgZm9yIHRoaXMgZXJyb3IuIENhbm5vdCBiZSBudWxsLjxERD48Q09ERT5lcnJvcklkPC9DT0RFPiAtIGEgcGx1Zy1pbiBwcm92aWRlZCBlcnJvciBjb2RlIHdoaWNoIHdpbGwgYmUgbWVhbmluZ2Z1bCB0byB0aGUgamF2YSBxdWljayBmaXggcHJvY2Vzc29yLiBDYW5ub3QgYmUgbnVsbC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InByaW50Rml4YWJsZU5vdGljZShjb20uc3VuLm1pcnJvci51dGlsLlNvdXJjZVBvc2l0aW9uLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotcHJpbnRGaXhhYmxlTm90aWNlPC9IMz4KLTxQUkU+Ci1wcm90ZWN0ZWQgdm9pZCA8Qj5wcmludEZpeGFibGVOb3RpY2U8L0I+KGNvbS5zdW4ubWlycm9yLnV0aWwuU291cmNlUG9zaXRpb24mbmJzcDtwb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7cGx1Z2luSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO2Vycm9ySWQpPC9QUkU+Ci08REw+Ci08REQ+UHJpbnQgYSBub3RpY2UgaW5jbHVkaW5nIHRoZSBnaXZlbiBhcmd1bWVudHMgZm9yIHVzZSBpbiBxdWljay1maXhlcy4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cG9zaXRpb248L0NPREU+IC0gcG9zaXRpb24gb2YgdGhlIG5vdGljZTxERD48Q09ERT5tZXNzYWdlPC9DT0RFPiAtIG1lc3NhZ2UgdG8gZGlzcGxheSB0byB0aGUgdXNlcjxERD48Q09ERT5wbHVnaW5JZDwvQ09ERT4gLSBwbHVnLWluIHdoaWNoIHdpbGwgcHJvdmlkZSBhIGphdmEgcXVpY2sgZml4IHByb2Nlc3NvciBmb3IgdGhpcyBlcnJvci4gQ2Fubm90IGJlIG51bGwuPEREPjxDT0RFPmVycm9ySWQ8L0NPREU+IC0gYSBwbHVnLWluIHByb3ZpZGVkIGVycm9yIGNvZGUgd2hpY2ggd2lsbCBiZSBtZWFuaW5nZnVsIHRvIHRoZSBqYXZhIHF1aWNrIGZpeCBwcm9jZXNzb3IuIENhbm5vdCBiZSBudWxsLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0icHJpbnRGaXhhYmxlTm90aWNlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1wcmludEZpeGFibGVOb3RpY2U8L0gzPgotPFBSRT4KLXByb3RlY3RlZCB2b2lkIDxCPnByaW50Rml4YWJsZU5vdGljZTwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO21lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO3BsdWdpbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtlcnJvcklkKTwvUFJFPgotPERMPgotPEREPlByaW50IGEgbm90aWNlIGluY2x1ZGluZyB0aGUgZ2l2ZW4gYXJndW1lbnRzIGZvciB1c2UgaW4gcXVpY2stZml4ZXMuCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPm1lc3NhZ2U8L0NPREU+IC0gbWVzc2FnZSB0byBkaXNwbGF5IHRvIHRoZSB1c2VyPEREPjxDT0RFPnBsdWdpbklkPC9DT0RFPiAtIHBsdWctaW4gd2hpY2ggd2lsbCBwcm92aWRlIGEgamF2YSBxdWljayBmaXggcHJvY2Vzc29yIGZvciB0aGlzIGVycm9yLiBDYW5ub3QgYmUgbnVsbC48REQ+PENPREU+ZXJyb3JJZDwvQ09ERT4gLSBhIHBsdWctaW4gcHJvdmlkZWQgZXJyb3IgY29kZSB3aGljaCB3aWxsIGJlIG1lYW5pbmdmdWwgdG8gdGhlIGphdmEgcXVpY2sgZml4IHByb2Nlc3Nvci4gQ2Fubm90IGJlIG51bGwuPC9ETD4KLTwvREQ+Ci08L0RMPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIENMQVNTIERBVEEgPT09PT09PT09IC0tPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYgQ0xBU1MmbmJzcDsKLSZuYnNwO05FWFQgQ0xBU1M8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL0Fic3RyYWN0QW5ub3RhdGlvblByb2Nlc3Nvci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3Nvci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjZmllbGRfc3VtbWFyeSI+RklFTEQ8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDs8QSBIUkVGPSIjZmllbGRfZGV0YWlsIj5GSUVMRDwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL2NsYXNzLXVzZS9BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvY2xhc3MtdXNlL0Fic3RyYWN0QW5ub3RhdGlvblByb2Nlc3Nvci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGQ4ZGE4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvY2xhc3MtdXNlL0Fic3RyYWN0QW5ub3RhdGlvblByb2Nlc3Nvci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8xNCkgb24gV2VkIEFwciAwNyAwNzo0NjoyMyBCU1QgMjAxMCAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcgotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMC0wNC0wNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvciI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3NvciI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9cY2xhc3MtdXNlQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgQ2xhc3M8YnI+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcjwvQj48L0gyPgotPC9DRU5URVI+Ci1ObyB1c2FnZSBvZiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yCi08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3NvciI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9cY2xhc3MtdXNlQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL3BhY2thZ2UtZnJhbWUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvcGFja2FnZS1mcmFtZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWM2ZTcwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvcGFja2FnZS1mcmFtZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjQ2OjIyIEJTVCAyMDEwIC0tPgotPFRJVExFPgotb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDEwLTA0LTA3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiPgotPEZPTlQgc2l6ZT0iKzEiIENMQVNTPSJGcmFtZVRpdGxlRm9udCI+Ci08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iY2xhc3NGcmFtZSI+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yPC9BPjwvRk9OVD4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIE5PV1JBUD48Rk9OVCBzaXplPSIrMSIgQ0xBU1M9IkZyYW1lSGVhZGluZ0ZvbnQiPgotQ2xhc3NlczwvRk9OVD4mbmJzcDsKLTxGT05UIENMQVNTPSJGcmFtZUl0ZW1Gb250Ij4KLTxCUj4KLTxBIEhSRUY9IkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3Nvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcjwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotCi0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvcGFja2FnZS1zdW1tYXJ5Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL3BhY2thZ2Utc3VtbWFyeS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWMwMmYxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvcGFja2FnZS1zdW1tYXJ5Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjQ2OjIyIEJTVCAyMDEwIC0tPgotPFRJVExFPgotb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDEwLTA0LTA3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0ib3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdXNlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEI+UFJFViBQQUNLQUdFPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Qj5ORVhUIFBBQ0tBR0U8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPEgyPgotUGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IKLTwvSDI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q2xhc3MgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IiPkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcjwvQT48L0I+PC9URD4KLTxURD5BYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBwcm9jZXNzb3JzIGNvbnRyaWJ1dGVkIHRvIHRoZQotIDxjb2RlPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25Qcm9jZXNzb3I8L2NvZGU+IGV4dGVuc2lvbiBwb2ludC48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLQotPFA+Ci08REw+Ci08L0RMPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdXNlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEI+UFJFViBQQUNLQUdFPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Qj5ORVhUIFBBQ0tBR0U8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL3BhY2thZ2UtdHJlZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9wYWNrYWdlLXRyZWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU1ZTJhMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL3BhY2thZ2UtdHJlZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8xNCkgb24gV2VkIEFwciAwNyAwNzo0NjoyMiBCU1QgMjAxMCAtLT4KLTxUSVRMRT4KLW9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3NvciBDbGFzcyBIaWVyYXJjaHkKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTAtMDQtMDciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IgQ2xhc3MgSGllcmFyY2h5IjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VHJlZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vcGFja2FnZS10cmVlLmh0bWwiPjxCPlBSRVY8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvcGFja2FnZS10cmVlLmh0bWwiPjxCPk5FWFQ8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvcGFja2FnZS10cmVlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLUhpZXJhcmNoeSBGb3IgUGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IKLTwvSDI+Ci08L0NFTlRFUj4KLTxETD4KLTxEVD48Qj5QYWNrYWdlIEhpZXJhcmNoaWVzOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctdHJlZS5odG1sIj5BbGwgUGFja2FnZXM8L0E+PC9ETD4KLTxIUj4KLTxIMj4KLUNsYXNzIEhpZXJhcmNoeQotPC9IMj4KLTxVTD4KLTxMSSBUWVBFPSJjaXJjbGUiPmphdmEubGFuZy5PYmplY3Q8VUw+Ci08TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL0Fic3RyYWN0QW5ub3RhdGlvblByb2Nlc3Nvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yIj48Qj5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I8L0I+PC9BPiAoaW1wbGVtZW50cyBjb20uc3VuLm1pcnJvci5hcHQuQW5ub3RhdGlvblByb2Nlc3NvcikKLTwvVUw+Ci08L1VMPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VHJlZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vcGFja2FnZS10cmVlLmh0bWwiPjxCPlBSRVY8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvcGFja2FnZS10cmVlLmh0bWwiPjxCPk5FWFQ8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvcGFja2FnZS10cmVlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL3BhY2thZ2UtdXNlLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL3BhY2thZ2UtdXNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyM2U4ZWUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9wYWNrYWdlLXVzZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8xNCkgb24gV2VkIEFwciAwNyAwNzo0NjoyMyBCU1QgMjAxMCAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgUGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTAtMDQtMDciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIFBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvcGFja2FnZS11c2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXVzZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIFBhY2thZ2U8YnI+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yPC9CPjwvSDI+Ci08L0NFTlRFUj4KLU5vIHVzYWdlIG9mIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3NvcgotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9wYWNrYWdlLXVzZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9InBhY2thZ2UtdXNlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZjE1ODAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUxNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMTQpIG9uIFdlZCBBcHIgMDcgMDc6NDY6MjIgQlNUIDIwMTAgLS0+Ci08VElUTEU+Ci1Bbm5vdGF0aW9uVXRpbHMKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTAtMDQtMDciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJBbm5vdGF0aW9uVXRpbHMiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0Fubm90YXRpb25VdGlscy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViBDTEFTUyZuYnNwOwotJm5ic3A7TkVYVCBDTEFTUzwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJBbm5vdGF0aW9uVXRpbHMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTwhLS0gPT09PT09PT0gU1RBUlQgT0YgQ0xBU1MgREFUQSA9PT09PT09PSAtLT4KLTxIMj4KLTxGT05UIFNJWkU9Ii0xIj4KLW9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzPC9GT05UPgotPEJSPgotQ2xhc3MgQW5ub3RhdGlvblV0aWxzPC9IMj4KLTxQUkU+Ci1qYXZhLmxhbmcuT2JqZWN0Ci0gIDxJTUcgU1JDPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9yZXNvdXJjZXMvaW5oZXJpdC5naWYiIEFMVD0iZXh0ZW5kZWQgYnkgIj48Qj5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM8L0I+Ci08L1BSRT4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBmaW5hbCBjbGFzcyA8Qj5Bbm5vdGF0aW9uVXRpbHM8L0I+PERUPmV4dGVuZHMgamF2YS5sYW5nLk9iamVjdDwvREw+Ci08L1BSRT4KLQotPFA+Ci1VdGlsaXR5IGNsYXNzIGZvciBhZGRpbmcsIHJlbW92aW5nIGFuZCB1cGRhdGluZyBhbm5vdGF0aW9ucyBhbmQgbWVtYmVyIHZhbHVlIHBhaXJzLgotIDxwPgotIDxzdHJvbmc+UHJvdmlzaW9uYWwgQVBJOjwvc3Ryb25nPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIKLSBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQKLSB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzCi0gdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotIDwvcD4KLTxQPgotCi08UD4KLTxIUj4KLQotPFA+Ci0KLTwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwjYWRkQW5ub3RhdGlvbihvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uKSI+YWRkQW5ub3RhdGlvbjwvQT48L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCZuYnNwO2phdmFFbGVtZW50LAotICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiZuYnNwO2Fubm90YXRpb24pPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBZGRzIHRoZSBnaXZlbiA8Q09ERT5Bbm5vdGF0aW9uPC9DT0RFPiB0byB0aGUgPENPREU+SUphdmFFbGVtZW50PC9DT0RFPi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCNhZGRJbXBvcnQob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50LCBqYXZhLmxhbmcuU3RyaW5nKSI+YWRkSW1wb3J0PC9BPjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Jm5ic3A7amF2YUVsZW1lbnQsCi0gICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO3F1YWxpZmllZE5hbWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBZGRzIGFuIGltcG9ydCB0byB0aGUgY29tcGlsYXRpb24gdW5pdCBvZiB0aGUgZ2l2ZW4gPENPREU+SUphdmFFbGVtZW50PC9DT0RFPi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCNhZGRNZW1iZXJWYWx1ZVBhaXIob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb24sIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXIpIj5hZGRNZW1iZXJWYWx1ZVBhaXI8L0E+PC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbiZuYnNwO2Fubm90YXRpb24sCi0gICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpciZuYnNwO21lbWJlclZhbHVlUGFpcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0FkZHMgdGhlIDxDT0RFPk1lbWJlclZhbHVlUGFpcjwvQ09ERT4gdG8gdGhlIDxDT0RFPk5vcm1hbEFubm90YXRpb248L0NPREU+LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sI2NvbXBhcmVGaWVsZE5hbWVzKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5GaWVsZERlY2xhcmF0aW9uLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQpIj5jb21wYXJlRmllbGROYW1lczwvQT48L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5GaWVsZERlY2xhcmF0aW9uJm5ic3A7ZmllbGREZWNsYXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZCZuYnNwO2ZpZWxkKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q29tcGFyZXMgdGhlIDxDT0RFPkZpZWxkRGVjbGFyYXRpb248L0NPREU+IGFuZCA8Q09ERT5JRmllbGQ8L0NPREU+LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sI2NvbXBhcmVNZXRob2RzKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2REZWNsYXJhdGlvbiwgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZCkiPmNvbXBhcmVNZXRob2RzPC9BPjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZERlY2xhcmF0aW9uJm5ic3A7bWV0aG9kRGVjbGFyYXRpb24sCi0gICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kJm5ic3A7bWV0aG9kKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q29tcGFyZXMgdGhlIDxDT0RFPk1ldGhvZERlY2xhcmF0aW9uPC9DT0RFPiBhbmQgPENPREU+SU1ldGhvZDwvQ09ERT4uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwjY29tcGFyZU1ldGhvZHMob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZERlY2xhcmF0aW9uLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kRGVjbGFyYXRpb24pIj5jb21wYXJlTWV0aG9kczwvQT48L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2REZWNsYXJhdGlvbiZuYnNwO21ldGhvZE9uZSwKLSAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2REZWNsYXJhdGlvbiZuYnNwO21ldGhvZFR3byk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NvbXBhcmVzIHRoZSB0d28gPENPREU+TWV0aG9kRGVjbGFyYXRpb248L0NPREU+LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sI2NvbXBhcmVNZXRob2RzKGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1ldGhvZERlY2xhcmF0aW9uLCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5NZXRob2REZWNsYXJhdGlvbikiPmNvbXBhcmVNZXRob2RzPC9BPjwvQj4oY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb24mbmJzcDttZXRob2RPbmUsCi0gICAgICAgICAgICAgICBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5NZXRob2REZWNsYXJhdGlvbiZuYnNwO21ldGhvZFR3byk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NvbXBhcmVzIHRoZSB0d28gPENPREU+TWV0aG9kRGVjbGFyYXRpb248L0NPREU+LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sI2NvbXBhcmVUeXBlTmFtZXMob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFic3RyYWN0VHlwZURlY2xhcmF0aW9uLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZSkiPmNvbXBhcmVUeXBlTmFtZXM8L0E+PC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24mbmJzcDthYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGUmbmJzcDt0eXBlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q29tcGFyZXMgdGhlIDxDT0RFPkFic3RyYWN0VHlwZURlY2xhcmF0aW9uPC9DT0RFPiBhbmQgPENPREU+SVR5cGU8L0NPREU+LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sI2NyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uKSI+Y3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0PC9BPjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Jm5ic3A7amF2YUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24mbmJzcDthbm5vdGF0aW9uKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q3JlYXRlcyBhIDxDT0RFPlRleHRFZGl0PC9DT0RFPiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBhZGQgYW5ub3RhdGlvbiBjaGFuZ2UgdG8gdGhlIHNvdXJjZSBjb2RlIG9mIHRoZSBqYXZhIGVsZW1lbnRzIGNvbXBpbGF0aW9uIHVuaXQuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO29yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwjY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50LCBqYXZhLmxhbmcuU3RyaW5nKSI+Y3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQ8L0E+PC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQmbmJzcDtqYXZhRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtxdWFsaWZpZWROYW1lKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q3JlYXRlcyBhIDxDT0RFPlRleHRFZGl0PC9DT0RFPiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBhZGQgaW1wb3J0IGNoYW5nZSB0byB0aGUgc291cmNlIGNvZGUgb2YgdGhlIGphdmEgZWxlbWVudHMgY29tcGlsYXRpb24gdW5pdC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7b3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCNjcmVhdGVBZGRNZW1iZXJWYWx1ZVBhaXJUZXh0RWRpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbiwgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcikiPmNyZWF0ZUFkZE1lbWJlclZhbHVlUGFpclRleHRFZGl0PC9BPjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb24mbmJzcDthbm5vdGF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpciZuYnNwO21lbWJlclZhbHVlUGFpcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NyZWF0ZXMgYSA8Q09ERT5UZXh0RWRpdDwvQ09ERT4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY2hhbmdlIG9mIGFkZGluZyB0aGUgPENPREU+TWVtYmVyVmFsdWVQYWlyPC9DT0RFPiB0byB0aGUgPENPREU+Tm9ybWFsQW5ub3RhdGlvbjwvQ09ERT4uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO29yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwjY3JlYXRlUmVtb3ZlQW5ub3RhdGlvblRleHRFZGl0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCwgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24pIj5jcmVhdGVSZW1vdmVBbm5vdGF0aW9uVGV4dEVkaXQ8L0E+PC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQmbmJzcDtqYXZhRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiZuYnNwO2Fubm90YXRpb24pPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDcmVhdGVzIGEgPENPREU+VGV4dEVkaXQ8L0NPREU+IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHJlbW92ZSBhbm5vdGF0aW9uIGNoYW5nZSB0byB0aGUgc291cmNlIGNvZGUgb2YgdGhlIGphdmEgZWxlbWVudHMgY29tcGlsYXRpb24gdW5pdC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7b3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCNjcmVhdGVSZW1vdmVJbXBvcnRUZXh0RWRpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQsIGphdmEubGFuZy5TdHJpbmcpIj5jcmVhdGVSZW1vdmVJbXBvcnRUZXh0RWRpdDwvQT48L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCZuYnNwO2phdmFFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO3F1YWxpZmllZE5hbWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDcmVhdGVzIGEgPENPREU+VGV4dEVkaXQ8L0NPREU+IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHJlbW92ZSBpbXBvcnQgY2hhbmdlIHRvIHRoZSBzb3VyY2UgY29kZSBvZiB0aGUgamF2YSBlbGVtZW50cyBjb21waWxhdGlvbiB1bml0LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sI2NyZWF0ZVJlbW92ZU1lbWJlclZhbHVlUGFpclRleHRFZGl0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyKSI+Y3JlYXRlUmVtb3ZlTWVtYmVyVmFsdWVQYWlyVGV4dEVkaXQ8L0E+PC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbiZuYnNwO2Fubm90YXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyJm5ic3A7bWVtYmVyVmFsdWVQYWlyKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q3JlYXRlcyBhIDxDT0RFPlRleHRFZGl0PC9DT0RFPiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjaGFuZ2Ugb2YgcmVtb3ZpbmcgdGhlIDxDT0RFPk1lbWJlclZhbHVlUGFpcjwvQ09ERT4gZnJvbSB0aGUgPENPREU+Tm9ybWFsQW5ub3RhdGlvbjwvQ09ERT4uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO29yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwjY3JlYXRlVXBkYXRlTWVtYmVyVmFsdWVQYWlyVGV4dEVkaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpciwgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGUpIj5jcmVhdGVVcGRhdGVNZW1iZXJWYWx1ZVBhaXJUZXh0RWRpdDwvQT48L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXImbmJzcDttZW1iZXJWYWx1ZVBhaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZSZuYnNwO3ZhbHVlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q3JlYXRlcyBhIDxDT0RFPlRleHRFZGl0PC9DT0RFPiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjaGFuZ2Ugb2YgdXBkYXRpbmcgdGhlIDxDT0RFPk1lbWJlclZhbHVlUGFpcjwvQ09ERT4gd2l0aCB0aGUgPENPREU+QVNUTm9kZTwvQ09ERT4gdmFsdWUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO29yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwjY3JlYXRlVXBkYXRlU2luZ2xlTWVtYmVyQW5ub3RhdGlvblRleHRFZGl0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZSkiPmNyZWF0ZVVwZGF0ZVNpbmdsZU1lbWJlckFubm90YXRpb25UZXh0RWRpdDwvQT48L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uJm5ic3A7YW5ub3RhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZSZuYnNwO3ZhbHVlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q3JlYXRlcyBhIDxDT0RFPlRleHRFZGl0PC9DT0RFPiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjaGFuZ2Ugb2YgdXBkYXRpbmcgdGhlIDxDT0RFPlNpbmdsZU1lbWJlckFubm90YXRpb248L0NPREU+IHdpdGggdGhlIDxDT0RFPkFTVE5vZGU8L0NPREU+IHZhbHVlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCNnZXRBbm5vdGF0aW9uKGphdmEubGFuZy5DbGFzcywgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRhYmxlKSI+Z2V0QW5ub3RhdGlvbjwvQT48L0I+KGphdmEubGFuZy5DbGFzcyZsdDs/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbiZndDsmbmJzcDthbm5vdGF0aW9uLAotICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGFibGUmbmJzcDthbm5vdGF0YWJsZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIEpEVCA8Q09ERT5JQW5ub3RhdGlvbjwvQ09ERT4gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4gPENPREU+QW5ub3RhdGlvbjwvQ09ERT4gY2xhc3MKLSBvbiB0aGUgPENPREU+SUFubm90YXRhYmxlPC9DT0RFPiBlbGVtZW50LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sI2dldEFubm90YXRpb24oY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uRGVjbGFyYXRpb24sIGphdmEubGFuZy5DbGFzcykiPmdldEFubm90YXRpb248L0E+PC9CPihjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5EZWNsYXJhdGlvbiZuYnNwO2RlY2xhcmF0aW9uLAotICAgICAgICAgICAgICBqYXZhLmxhbmcuQ2xhc3MmbHQ7PyBleHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24mZ3Q7Jm5ic3A7YW5ub3RhdGlvbik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIDxDT0RFPkFubm90YXRpb25NaXJyb3I8L0NPREU+IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIDxDT0RFPkFubm90YXRpb248L0NPREU+IGNsYXNzCi0gb24gdGhlIDxDT0RFPkRlY2xhcmF0aW9uPC9DT0RFPi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7b3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb248L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwjZ2V0QW5ub3RhdGlvbihvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQsIGphdmEubGFuZy5DbGFzcykiPmdldEFubm90YXRpb248L0E+PC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQmbmJzcDtqYXZhRWxlbWVudCwKLSAgICAgICAgICAgICAgamF2YS5sYW5nLkNsYXNzJmx0Oz8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uJmd0OyZuYnNwO2Fubm90YXRpb24pPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBBU1QgPENPREU+QW5ub3RhdGlvbjwvQ09ERT4gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4gPENPREU+QW5ub3RhdGlvbjwvQ09ERT4gY2xhc3MKLSBvbiB0aGUgPENPREU+SUphdmFFbGVtZW50PC9DT0RFPi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCNnZXRBbm5vdGF0aW9uTmFtZShvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbikiPmdldEFubm90YXRpb25OYW1lPC9BPjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24mbmJzcDthbm5vdGF0aW9uKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgYW5ub3RhdGlvbnMgdHlwZSBuYW1lLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtqYXZhLnV0aWwuTGlzdCZsdDtvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiZndDs8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwjZ2V0QW5ub3RhdGlvbnMob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50KSI+Z2V0QW5ub3RhdGlvbnM8L0E+PC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQmbmJzcDtqYXZhRWxlbWVudCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgYSBsaXN0IG9mIGFsbCB0aGUgPENPREU+QW5ub3RhdGlvbjwvQ09ERT4gdGhhdCBhcmUgcHJlc2VudCBvbiB0aGUgZ2l2ZW4gPENPREU+SUphdmFFbGVtZW50PC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVmFsdWU8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwjZ2V0QW5ub3RhdGlvblZhbHVlKGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25NaXJyb3IsIGphdmEubGFuZy5TdHJpbmcpIj5nZXRBbm5vdGF0aW9uVmFsdWU8L0E+PC9CPihjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yJm5ic3A7bWlycm9yLAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDttZW1iZXJOYW1lKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgPENPREU+QW5ub3RhdGlvblZhbHVlPC9DT0RFPiB3aXRoIHRoZSBnaXZlbiBtZW1iZXIgbmFtZSB0aGF0IGlzIGRlY2xhcmVkIHdpdGhpbiB0aGUgPENPREU+QW5ub3RhdGlvbk1pcnJvcjwvQ09ERT4uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2phdmEubGFuZy5PYmplY3Q8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwjZ2V0QW5ub3RhdGlvblZhbHVlKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uLCBqYXZhLmxhbmcuU3RyaW5nKSI+Z2V0QW5ub3RhdGlvblZhbHVlPC9BPjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb24mbmJzcDthbm5vdGF0aW9uLAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDttZW1iZXJOYW1lKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgSkRUIDxDT0RFPklBbm5vdGF0aW9uPC9DT0RFPiBtZW1iZXIgdmFsdWUgcGFpciB2YWx1ZSB3aXRoIHRoZSBnaXZlbiBtZW1iZXIgbmFtZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7b3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb248L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwjZ2V0QW5ub3RhdGlvblZhbHVlKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uLCBqYXZhLmxhbmcuU3RyaW5nKSI+Z2V0QW5ub3RhdGlvblZhbHVlPC9BPjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb24mbmJzcDtub3JtYWxBbm5vdGF0aW9uLAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDttZW1iZXJOYW1lKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgPENPREU+Tm9ybWFsQW5ub3RhdGlvbjwvQ09ERT4gbWVtYmVyIHZhbHVlIHBhaXIgdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gbWVtYmVyIG5hbWUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2phdmEubGFuZy5Cb29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sI2dldEJvb2xlYW5WYWx1ZShjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yLCBqYXZhLmxhbmcuU3RyaW5nKSI+Z2V0Qm9vbGVhblZhbHVlPC9BPjwvQj4oY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvbk1pcnJvciZuYnNwO21pcnJvciwKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bWVtYmVyTmFtZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIG1lbWJlciB2YWx1ZSB3aXRoIHRoZSBnaXZlbiBtZW1iZXIgbmFtZSBmcm9tIHRoZSA8Q09ERT5Bbm5vdGF0aW9uTWlycm9yPC9DT0RFPiBhcyBhIDxDT0RFPkJvb2xlYW48L0NPREU+IHZhbHVlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtqYXZhLmxhbmcuQm9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCNnZXRCb29sZWFuVmFsdWUob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24sIGphdmEubGFuZy5TdHJpbmcpIj5nZXRCb29sZWFuVmFsdWU8L0E+PC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiZuYnNwO2Fubm90YXRpb24sCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO21lbWJlck5hbWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBtZW1iZXIgdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gbWVtYmVyIG5hbWUgZnJvbSB0aGUgPENPREU+QW5ub3RhdGlvbjwvQ09ERT4gYXMgYSA8Q09ERT5Cb29sZWFuPC9DT0RFPiB2YWx1ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7amF2YS5sYW5nLkJvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwjZ2V0Qm9vbGVhblZhbHVlKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uLCBqYXZhLmxhbmcuU3RyaW5nKSI+Z2V0Qm9vbGVhblZhbHVlPC9BPjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb24mbmJzcDthbm5vdGF0aW9uLAotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDttZW1iZXJOYW1lKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgIG1lbWJlciB2YWx1ZSB3aXRoIHRoZSBnaXZlbiBtZW1iZXIgbmFtZSBmcm9tIHRoZSA8Q09ERT5JQW5ub3RhdGlvbjwvQ09ERT4gYXMgYSA8Q09ERT5Cb29sZWFuPC9DT0RFPiB2YWx1ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7b3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCNnZXRDb21waWxhdGlvblVuaXRGcm9tSmF2YUVsZW1lbnQob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50KSI+Z2V0Q29tcGlsYXRpb25Vbml0RnJvbUphdmFFbGVtZW50PC9BPjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Jm5ic3A7amF2YUVsZW1lbnQpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIGEgPENPREU+SUNvbXBpbGF0aW9uVW5pdDwvQ09ERT4gZm9yIHRoZSBnaXZlbiA8Q09ERT5JSmF2YUVsZW1lbnQ8L0NPREU+LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sI2dldEVudW1WYWx1ZShvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiwgamF2YS5sYW5nLlN0cmluZykiPmdldEVudW1WYWx1ZTwvQT48L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uJm5ic3A7YW5ub3RhdGlvbiwKLSAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bWVtYmVyTmFtZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIG1lbWJlciB2YWx1ZSB3aXRoIHRoZSBnaXZlbiBtZW1iZXIgbmFtZSBmcm9tIHRoZSA8Q09ERT5Bbm5vdGF0aW9uPC9DT0RFPiBhcyBhIDxDT0RFPlN0cmluZzwvQ09ERT4gdmFsdWUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2phdmEubGFuZy5TdHJpbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwjZ2V0RW51bVZhbHVlKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uLCBqYXZhLmxhbmcuU3RyaW5nKSI+Z2V0RW51bVZhbHVlPC9BPjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb24mbmJzcDthbm5vdGF0aW9uLAotICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDttZW1iZXJOYW1lKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgbWVtYmVyIHZhbHVlIHdpdGggdGhlIGdpdmVuIG1lbWJlciBuYW1lIGZyb20gdGhlIDxDT0RFPklBbm5vdGF0aW9uPC9DT0RFPiBhcyBhIDxDT0RFPlN0cmluZzwvQ09ERT4gdmFsdWUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO29yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5GaWVsZERlY2xhcmF0aW9uPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sI2dldEZpZWxkRGVjbGFyYXRpb24ob3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkKSI+Z2V0RmllbGREZWNsYXJhdGlvbjwvQT48L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZCZuYnNwO2ZpZWxkKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgPENPREU+RmllbGREZWNsYXJhdGlvbjwvQ09ERT4gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4gPENPREU+SUZpZWxkPC9DT0RFPi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7b3JnLmVjbGlwc2UuamR0LmNvcmUuSUxvY2FsVmFyaWFibGU8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwjZ2V0TG9jYWxWYXJpYWJsZShvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kLCBpbnQpIj5nZXRMb2NhbFZhcmlhYmxlPC9BPjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZCZuYnNwO21ldGhvZCwKLSAgICAgICAgICAgICAgICAgaW50Jm5ic3A7b2Zmc2V0KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgPENPREU+SUxvY2FsVmFyaWFibGU8L0NPREU+IGF0IHRoZSBnaXZlbiBvZmZzZXQgcG9zaXRpb24gaW4gdGhlIHNvdXJjZSBmaWxlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtvcmcuZWNsaXBzZS5qZHQuY29yZS5JTG9jYWxWYXJpYWJsZTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCNnZXRMb2NhbFZhcmlhYmxlKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2QsIGphdmEubGFuZy5TdHJpbmcpIj5nZXRMb2NhbFZhcmlhYmxlPC9BPjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZCZuYnNwO21ldGhvZCwKLSAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO3BhcmFtTmFtZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIDxDT0RFPklMb2NhbFZhcmlhYmxlPC9DT0RFPiB3aXRoIHRoZSBnaXZlbiBuYW1lIHdpdGhpbiB0aGUgZGVjbGFyZWQgPENPREU+SU1ldGhvZDwvQ09ERT4uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO29yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwjZ2V0TWVtYmVyVmFsdWVQYWlyKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uLCBqYXZhLmxhbmcuU3RyaW5nKSI+Z2V0TWVtYmVyVmFsdWVQYWlyPC9BPjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb24mbmJzcDtub3JtYWxBbm5vdGF0aW9uLAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDttZW1iZXJOYW1lKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgPENPREU+TWVtYmVyVmFsdWVQYWlyPC9DT0RFPiB3aXRoIHRoZSBnaXZlbiBtZW1iZXIgbmFtZSBmcm9tIHRoZSA8Q09ERT5Ob3JtYWxBbm5vdGF0aW9uPC9DT0RFPi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7b3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZERlY2xhcmF0aW9uPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sI2dldE1ldGhvZERlY2xhcmF0aW9uKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2QpIj5nZXRNZXRob2REZWNsYXJhdGlvbjwvQT48L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2QmbmJzcDttZXRob2QpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSA8Q09ERT5NZXRob2REZWNsYXJhdGlvbjwvQ09ERT4gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4gPENPREU+SU1ldGhvZDwvQ09ERT4uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO29yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sI2dldFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24ob3JnLmVjbGlwc2UuamR0LmNvcmUuSUxvY2FsVmFyaWFibGUpIj5nZXRTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPC9BPjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuSUxvY2FsVmFyaWFibGUmbmJzcDtqYXZhRWxlbWVudCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIDxDT0RFPlNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb248L0NPREU+IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIDxDT0RFPklMb2NhbFZhcmlhYmxlPC9DT0RFPi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7amF2YS51dGlsLkxpc3QmbHQ7b3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24mZ3Q7PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sI2dldFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb25zKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2QpIj5nZXRTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uczwvQT48L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2QmbmJzcDttZXRob2QpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhlIDxDT0RFPlNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb248L0NPREU+IGZvciB0aGUgZ2l2ZW4gPENPREU+SU1ldGhvZDwvQ09ERT4uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2phdmEubGFuZy5TdHJpbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwjZ2V0U3RyaW5nVmFsdWUoY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvbk1pcnJvciwgamF2YS5sYW5nLlN0cmluZykiPmdldFN0cmluZ1ZhbHVlPC9BPjwvQj4oY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvbk1pcnJvciZuYnNwO21pcnJvciwKLSAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDttZW1iZXJOYW1lKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgbWVtYmVyIHZhbHVlIHdpdGggdGhlIGdpdmVuIG1lbWJlciBuYW1lIGZyb20gdGhlIDxDT0RFPkFubm90YXRpb25NaXJyb3I8L0NPREU+IGFzIGEgPENPREU+U3RyaW5nPC9DT0RFPiB2YWx1ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCNnZXRTdHJpbmdWYWx1ZShvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiwgamF2YS5sYW5nLlN0cmluZykiPmdldFN0cmluZ1ZhbHVlPC9BPjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24mbmJzcDthbm5vdGF0aW9uLAotICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO21lbWJlck5hbWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBtZW1iZXIgdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gbWVtYmVyIG5hbWUgZnJvbSB0aGUgPENPREU+QW5ub3RhdGlvbjwvQ09ERT4gYXMgYSA8Q09ERT5TdHJpbmc8L0NPREU+IHZhbHVlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sI2dldFN0cmluZ1ZhbHVlKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uLCBqYXZhLmxhbmcuU3RyaW5nKSI+Z2V0U3RyaW5nVmFsdWU8L0E+PC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbiZuYnNwO2Fubm90YXRpb24sCi0gICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bWVtYmVyTmFtZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIG1lbWJlciB2YWx1ZSB3aXRoIHRoZSBnaXZlbiBtZW1iZXIgbmFtZSBmcm9tIHRoZSA8Q09ERT5JQW5ub3RhdGlvbjwvQ09ERT4gYXMgYSA8Q09ERT5TdHJpbmc8L0NPREU+IHZhbHVlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQWJzdHJhY3RUeXBlRGVjbGFyYXRpb248L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwjZ2V0VHlwZURlY2xhcmF0aW9uKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlKSI+Z2V0VHlwZURlY2xhcmF0aW9uPC9BPjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGUmbmJzcDt0eXBlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgPENPREU+QWJzdHJhY3RUeXBlRGVjbGFyYXRpb248L0NPREU+IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIDxDT0RFPklUeXBlPC9DT0RFPi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCNpc0Fubm90YXRpb25QcmVzZW50KG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCwgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24pIj5pc0Fubm90YXRpb25QcmVzZW50PC9BPjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Jm5ic3A7amF2YUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uJm5ic3A7YW5ub3RhdGlvbik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NoZWNrcyBpZiB0aGUgZ2l2ZW4gPENPREU+QW5ub3RhdGlvbjwvQ09ERT4gaXMgcHJlc2VudCBvbiB0aGUgPENPREU+SUphdmFFbGVtZW50PC9DT0RFPi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCNpc0Fubm90YXRpb25QcmVzZW50KG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCwgamF2YS5sYW5nLlN0cmluZykiPmlzQW5ub3RhdGlvblByZXNlbnQ8L0E+PC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQmbmJzcDtqYXZhRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO2Fubm90YXRpb25OYW1lKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q2hlY2tzIGlmIHRoZSBhbm5vdGF0aW9uIHdpdGggdGhlIGdpdmVuIG5hbWUgaXMgcHJlc2VudCBvbiB0aGUgPENPREU+SUphdmFFbGVtZW50PC9DT0RFPi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCNyZW1vdmVBbm5vdGF0aW9uKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCwgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24pIj5yZW1vdmVBbm5vdGF0aW9uPC9BPjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Jm5ic3A7amF2YUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uJm5ic3A7YW5ub3RhdGlvbik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JlbW92ZXMgdGhlIGdpdmVuIDxDT0RFPkFubm90YXRpb248L0NPREU+IGZyb20gdGhlIDxDT0RFPklKYXZhRWxlbWVudDwvQ09ERT4uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwjcmVtb3ZlSW1wb3J0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCwgamF2YS5sYW5nLlN0cmluZykiPnJlbW92ZUltcG9ydDwvQT48L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCZuYnNwO2phdmFFbGVtZW50LAotICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtxdWFsaWZpZWROYW1lKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmVtb3ZlcyBhbiBpbXBvcnQgZnJvbSB0aGUgY29tcGlsYXRpb24gdW5pdCBvZiB0aGUgZ2l2ZW4gPENPREU+SUphdmFFbGVtZW50PC9DT0RFPi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCNyZW1vdmVNZW1iZXJWYWx1ZVBhaXIob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb24sIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXIpIj5yZW1vdmVNZW1iZXJWYWx1ZVBhaXI8L0E+PC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbiZuYnNwO2Fubm90YXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpciZuYnNwO21lbWJlclZhbHVlUGFpcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JlbW92ZXMgdGhlIDxDT0RFPk1lbWJlclZhbHVlUGFpcjwvQ09ERT4gZnJvbSB0aGUgPENPREU+Tm9ybWFsQW5ub3RhdGlvbjwvQ09ERT4uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwjdXBkYXRlTWVtYmVyVmFsdWVQYWlyKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXIsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlKSI+dXBkYXRlTWVtYmVyVmFsdWVQYWlyPC9BPjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpciZuYnNwO21lbWJlclZhbHVlUGFpciwKLSAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZSZuYnNwO3ZhbHVlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VXBkYXRlcyB0aGUgPENPREU+TWVtYmVyVmFsdWVQYWlyPC9DT0RFPiB2YWx1ZSB3aXRoIHRoZSBnaXZlbiA8Q09ERT5BU1ROb2RlPC9DT0RFPi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCN1cGRhdGVTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZSkiPnVwZGF0ZVNpbmdsZU1lbWJlckFubm90YXRpb248L0E+PC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiZuYnNwO2Fubm90YXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlJm5ic3A7dmFsdWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtVcGRhdGVzIHRoZSB2YWx1ZSBvZiB0aGUgPENPREU+U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjwvQ09ERT4gd2l0aCB0aGUgZ2l2ZW4gPENPREU+QVNUTm9kZTwvQ09ERT4uPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19qYXZhLmxhbmcuT2JqZWN0Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBqYXZhLmxhbmcuT2JqZWN0PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+Y2xvbmUsIGVxdWFscywgZmluYWxpemUsIGdldENsYXNzLCBoYXNoQ29kZSwgbm90aWZ5LCBub3RpZnlBbGwsIHRvU3RyaW5nLCB3YWl0LCB3YWl0LCB3YWl0PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iYWRkSW1wb3J0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCwgamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLWFkZEltcG9ydDwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyB2b2lkIDxCPmFkZEltcG9ydDwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Jm5ic3A7amF2YUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtxdWFsaWZpZWROYW1lKQotICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjwvUFJFPgotPERMPgotPEREPkFkZHMgYW4gaW1wb3J0IHRvIHRoZSBjb21waWxhdGlvbiB1bml0IG9mIHRoZSBnaXZlbiA8Q09ERT5JSmF2YUVsZW1lbnQ8L0NPREU+LgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5qYXZhRWxlbWVudDwvQ09ERT4gLSB0aGUgamF2YSBlbGVtZW50IHdoaWNoIGlzIHVzZWQgdG8gZ2V0IHRoZSBjb21waWxhdGlvbiB1bml0IHRvIGFkZCB0aGUgaW1wb3J0IHRvLgotIFRoZSBmb2xsb3dpbmcgdHlwZXMgb2YgamF2YSBlbGVtZW50cyBhcmUgc3VwcG9ydGVkOgotIDxsaT5JSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVDwvbGk+Ci0gPGxpPklKYXZhRWxlbWVudC5QQUNLQUdFX0RFQ0xBUkFUSU9OPC9saT4KLSA8bGk+SUphdmFFbGVtZW50LlRZUEU8L2xpPgotIDxsaT5JSmF2YUVsZW1lbnQuRklFTEQ8L2xpPgotIDxsaT5JSmF2YUVsZW1lbnQuTUVUSE9EPC9saT4KLSA8bGk+SUphdmFFbGVtZW50LkxPQ0FMX1ZBUklBQkxFPC9saT48REQ+PENPREU+cXVhbGlmaWVkTmFtZTwvQ09ERT4gLSB0aGUgaW1wb3J0IHRvIGFkZC4KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uPC9DT0RFPiAtIHRoZSBleGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBpbXBvcnQgcmV3cml0ZSBmYWlscy48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InJlbW92ZUltcG9ydChvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQsIGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1yZW1vdmVJbXBvcnQ8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgdm9pZCA8Qj5yZW1vdmVJbXBvcnQ8L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCZuYnNwO2phdmFFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7cXVhbGlmaWVkTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb248L1BSRT4KLTxETD4KLTxERD5SZW1vdmVzIGFuIGltcG9ydCBmcm9tIHRoZSBjb21waWxhdGlvbiB1bml0IG9mIHRoZSBnaXZlbiA8Q09ERT5JSmF2YUVsZW1lbnQ8L0NPREU+LiBUaGUgaW1wb3J0IHdpbGwgbm90IGJlIHJlbW92ZWQgaWYgdGhlCi0gaW1wb3J0IHR5cGUgaXMgcmVmZXJlbmNlZCBvbiBtb3JlIHRoYW4gb25lIGFubm90YXRhYmxlIGVsZW1lbnQgaW4gdGhlIHNvdXJjZSBjb2RlLiBUaGlzIG1ldGhvZAotIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCNyZW1vdmVBbm5vdGF0aW9uKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCwgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24pIj48Q09ERT5yZW1vdmVBbm5vdGF0aW9uKElKYXZhRWxlbWVudCwgQW5ub3RhdGlvbik8L0NPREU+PC9BPn0uCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmphdmFFbGVtZW50PC9DT0RFPiAtIHRoZSBqYXZhIGVsZW1lbnQgd2hpY2ggaXMgdXNlZCB0byBnZXQgdGhlIGNvbXBpbGF0aW9uIHVuaXQgdG8gcmVtb3ZlIHRoZSBpbXBvcnQgZnJvbS4KLSBUaGUgZm9sbG93aW5nIHR5cGVzIG9mIGphdmEgZWxlbWVudHMgYXJlIHN1cHBvcnRlZDoKLSA8bGk+SUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQ8L2xpPgotIDxsaT5JSmF2YUVsZW1lbnQuUEFDS0FHRV9ERUNMQVJBVElPTjwvbGk+Ci0gPGxpPklKYXZhRWxlbWVudC5UWVBFPC9saT4KLSA8bGk+SUphdmFFbGVtZW50LkZJRUxEPC9saT4KLSA8bGk+SUphdmFFbGVtZW50Lk1FVEhPRDwvbGk+Ci0gPGxpPklKYXZhRWxlbWVudC5MT0NBTF9WQVJJQUJMRTwvbGk+PEREPjxDT0RFPnF1YWxpZmllZE5hbWU8L0NPREU+IC0gdGhlIGltcG9ydCB0byByZW1vdmUuCi08RFQ+PEI+VGhyb3dzOjwvQj4KLTxERD48Q09ERT5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjwvQ09ERT4gLSB0aGUgZXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUgaW1wb3J0IHJld3JpdGUgZmFpbHMuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJhZGRBbm5vdGF0aW9uKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCwgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24pIj48IS0tIC0tPjwvQT48SDM+Ci1hZGRBbm5vdGF0aW9uPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIHZvaWQgPEI+YWRkQW5ub3RhdGlvbjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Jm5ic3A7amF2YUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiZuYnNwO2Fubm90YXRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb248L1BSRT4KLTxETD4KLTxERD5BZGRzIHRoZSBnaXZlbiA8Q09ERT5Bbm5vdGF0aW9uPC9DT0RFPiB0byB0aGUgPENPREU+SUphdmFFbGVtZW50PC9DT0RFPi4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+amF2YUVsZW1lbnQ8L0NPREU+IC0gdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBqYXZhIGVsZW1lbnRzIGFyZSBzdXBwb3J0ZWQ6Ci0gPGxpPklKYXZhRWxlbWVudC5QQUNLQUdFX0RFQ0xBUkFUSU9OPC9saT4KLSA8bGk+SUphdmFFbGVtZW50LlRZUEU8L2xpPgotIDxsaT5JSmF2YUVsZW1lbnQuRklFTEQ8L2xpPgotIDxsaT5JSmF2YUVsZW1lbnQuTUVUSE9EPC9saT4KLSA8bGk+SUphdmFFbGVtZW50LkxPQ0FMX1ZBUklBQkxFPC9saT48REQ+PENPREU+YW5ub3RhdGlvbjwvQ09ERT4gLSB0aGUgYW5ub3RhdGlvbiB0byBhZGQuCi08RFQ+PEI+VGhyb3dzOjwvQj4KLTxERD48Q09ERT5vcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb248L0NPREU+IC0gQSA8Q09ERT5KYXZhTW9kZWxFeGNlcHRpb248L0NPREU+IGlzIHRocm93biB3aGVuIHRoZSB1bmRlcmx5aW5nIGNvbXBpbGF0aW9uIHVuaXRzCi0gYnVmZmVyIGNvdWxkIG5vdCBiZSBhY2Nlc3NlZC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InJlbW92ZUFubm90YXRpb24ob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50LCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbikiPjwhLS0gLS0+PC9BPjxIMz4KLXJlbW92ZUFubm90YXRpb248L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgdm9pZCA8Qj5yZW1vdmVBbm5vdGF0aW9uPC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQmbmJzcDtqYXZhRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uJm5ic3A7YW5ub3RhdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjwvUFJFPgotPERMPgotPEREPlJlbW92ZXMgdGhlIGdpdmVuIDxDT0RFPkFubm90YXRpb248L0NPREU+IGZyb20gdGhlIDxDT0RFPklKYXZhRWxlbWVudDwvQ09ERT4uCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmphdmFFbGVtZW50PC9DT0RFPiAtIHRoZSBmb2xsb3dpbmcgdHlwZXMgb2YgamF2YSBlbGVtZW50cyBhcmUgc3VwcG9ydGVkOgotIDxsaT5JSmF2YUVsZW1lbnQuUEFDS0FHRV9ERUNMQVJBVElPTjwvbGk+Ci0gPGxpPklKYXZhRWxlbWVudC5UWVBFPC9saT4KLSA8bGk+SUphdmFFbGVtZW50LkZJRUxEPC9saT4KLSA8bGk+SUphdmFFbGVtZW50Lk1FVEhPRDwvbGk+Ci0gPGxpPklKYXZhRWxlbWVudC5MT0NBTF9WQVJJQUJMRTwvbGk+PEREPjxDT0RFPmFubm90YXRpb248L0NPREU+IC0gdGhlIGFubm90YXRpb24gdG8gcmVtb3ZlLgotPERUPjxCPlRocm93czo8L0I+Ci08REQ+PENPREU+b3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uPC9DT0RFPiAtIEEgPENPREU+SmF2YU1vZGVsRXhjZXB0aW9uPC9DT0RFPiBpcyB0aHJvd24gd2hlbiB0aGUgdW5kZXJseWluZyBjb21waWxhdGlvbiB1bml0cwotIGJ1ZmZlciBjb3VsZCBub3QgYmUgYWNjZXNzZWQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJhZGRNZW1iZXJWYWx1ZVBhaXIob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb24sIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXIpIj48IS0tIC0tPjwvQT48SDM+Ci1hZGRNZW1iZXJWYWx1ZVBhaXI8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgdm9pZCA8Qj5hZGRNZW1iZXJWYWx1ZVBhaXI8L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uJm5ic3A7YW5ub3RhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpciZuYnNwO21lbWJlclZhbHVlUGFpcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uPC9QUkU+Ci08REw+Ci08REQ+QWRkcyB0aGUgPENPREU+TWVtYmVyVmFsdWVQYWlyPC9DT0RFPiB0byB0aGUgPENPREU+Tm9ybWFsQW5ub3RhdGlvbjwvQ09ERT4uCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmFubm90YXRpb248L0NPREU+IC0gdGhlIG5vcm1hbCBhbm5vdGF0aW9uIHRvIGFkZCB0aGUgbWVtYmVyIHZhbHVlIHBhaXIgdG8uPEREPjxDT0RFPm1lbWJlclZhbHVlUGFpcjwvQ09ERT4gLSB0aGUgbWVtYmVyIHZhbHVlIHBhaXIgdG8gYWRkLgotPERUPjxCPlRocm93czo8L0I+Ci08REQ+PENPREU+b3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uPC9DT0RFPiAtIEEgPENPREU+SmF2YU1vZGVsRXhjZXB0aW9uPC9DT0RFPiBpcyB0aHJvd24gd2hlbiB0aGUgdW5kZXJseWluZyBjb21waWxhdGlvbiB1bml0cwotIGJ1ZmZlciBjb3VsZCBub3QgYmUgYWNjZXNzZWQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJyZW1vdmVNZW1iZXJWYWx1ZVBhaXIob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb24sIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXIpIj48IS0tIC0tPjwvQT48SDM+Ci1yZW1vdmVNZW1iZXJWYWx1ZVBhaXI8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgdm9pZCA8Qj5yZW1vdmVNZW1iZXJWYWx1ZVBhaXI8L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uJm5ic3A7YW5ub3RhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpciZuYnNwO21lbWJlclZhbHVlUGFpcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uPC9QUkU+Ci08REw+Ci08REQ+UmVtb3ZlcyB0aGUgPENPREU+TWVtYmVyVmFsdWVQYWlyPC9DT0RFPiBmcm9tIHRoZSA8Q09ERT5Ob3JtYWxBbm5vdGF0aW9uPC9DT0RFPi4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+YW5ub3RhdGlvbjwvQ09ERT4gLSB0aGUgbm9ybWFsIGFubm90YXRpb24gZnJvbSB3aGljaCB0byByZW1vdmUgdGhlIG1lbWJlciB2YWx1ZSBwYWlyLjxERD48Q09ERT5tZW1iZXJWYWx1ZVBhaXI8L0NPREU+IC0gdGhlIG1lbWJlciB2YWx1ZSBwYWlyIHRvIHJlbW92ZS4KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPm9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjwvQ09ERT4gLSBBIDxDT0RFPkphdmFNb2RlbEV4Y2VwdGlvbjwvQ09ERT4gaXMgdGhyb3duIHdoZW4gdGhlIHVuZGVybHlpbmcgY29tcGlsYXRpb24gdW5pdHMKLSBidWZmZXIgY291bGQgbm90IGJlIGFjY2Vzc2VkLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0idXBkYXRlTWVtYmVyVmFsdWVQYWlyKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXIsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlKSI+PCEtLSAtLT48L0E+PEgzPgotdXBkYXRlTWVtYmVyVmFsdWVQYWlyPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIHZvaWQgPEI+dXBkYXRlTWVtYmVyVmFsdWVQYWlyPC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyJm5ic3A7bWVtYmVyVmFsdWVQYWlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZSZuYnNwO3ZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb248L1BSRT4KLTxETD4KLTxERD5VcGRhdGVzIHRoZSA8Q09ERT5NZW1iZXJWYWx1ZVBhaXI8L0NPREU+IHZhbHVlIHdpdGggdGhlIGdpdmVuIDxDT0RFPkFTVE5vZGU8L0NPREU+LgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5tZW1iZXJWYWx1ZVBhaXI8L0NPREU+IC0gdGhlIG1lbWJlciB2YWx1ZSBwYWlyIHRvIHVwZGF0ZS48REQ+PENPREU+dmFsdWU8L0NPREU+IC0gdGhlIHZhbHVlIHRvIHNldC4KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPm9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjwvQ09ERT4gLSBBIDxDT0RFPkphdmFNb2RlbEV4Y2VwdGlvbjwvQ09ERT4gaXMgdGhyb3duIHdoZW4gdGhlIHVuZGVybHlpbmcgY29tcGlsYXRpb24gdW5pdHMKLSBidWZmZXIgY291bGQgbm90IGJlIGFjY2Vzc2VkLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0idXBkYXRlU2luZ2xlTWVtYmVyQW5ub3RhdGlvbihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiwgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGUpIj48IS0tIC0tPjwvQT48SDM+Ci11cGRhdGVTaW5nbGVNZW1iZXJBbm5vdGF0aW9uPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIHZvaWQgPEI+dXBkYXRlU2luZ2xlTWVtYmVyQW5ub3RhdGlvbjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb24mbmJzcDthbm5vdGF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGUmbmJzcDt2YWx1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjwvUFJFPgotPERMPgotPEREPlVwZGF0ZXMgdGhlIHZhbHVlIG9mIHRoZSA8Q09ERT5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uPC9DT0RFPiB3aXRoIHRoZSBnaXZlbiA8Q09ERT5BU1ROb2RlPC9DT0RFPi4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+YW5ub3RhdGlvbjwvQ09ERT4gLSB0aGUgc2luZ2xlIG1lbWJlciBhbm5vdGF0aW9uIHRvIHVwZGF0ZS48REQ+PENPREU+dmFsdWU8L0NPREU+IC0gdGhlIHZhbHVlIHRvIHNldC4KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPm9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjwvQ09ERT4gLSBBIDxDT0RFPkphdmFNb2RlbEV4Y2VwdGlvbjwvQ09ERT4gaXMgdGhyb3duIHdoZW4gdGhlIHVuZGVybHlpbmcgY29tcGlsYXRpb24gdW5pdHMKLSBidWZmZXIgY291bGQgbm90IGJlIGFjY2Vzc2VkLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50LCBqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQ8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdCA8Qj5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdDwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Jm5ic3A7amF2YUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO3F1YWxpZmllZE5hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb248L1BSRT4KLTxETD4KLTxERD5DcmVhdGVzIGEgPENPREU+VGV4dEVkaXQ8L0NPREU+IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGFkZCBpbXBvcnQgY2hhbmdlIHRvIHRoZSBzb3VyY2UgY29kZSBvZiB0aGUgamF2YSBlbGVtZW50cyBjb21waWxhdGlvbiB1bml0LgotIFRoZSBjb21waWxhdGlvbiB1bml0IGl0c2VsZiBpcyBub3QgbW9kaWZpZWQuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmphdmFFbGVtZW50PC9DT0RFPiAtIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR5cGVzIG9mIGphdmEgZWxlbWVudDoKLSA8bGk+SUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQ8L2xpPgotIDxsaT5JSmF2YUVsZW1lbnQuUEFDS0FHRV9ERUNMQVJBVElPTjwvbGk+Ci0gPGxpPklKYXZhRWxlbWVudC5UWVBFPC9saT4KLSA8bGk+SUphdmFFbGVtZW50LkZJRUxEPC9saT4KLSA8bGk+SUphdmFFbGVtZW50Lk1FVEhPRDwvbGk+Ci0gPGxpPklKYXZhRWxlbWVudC5MT0NBTF9WQVJJQUJMRTwvbGk+Ci0gPHA+Ci0gVGhlIGphdmEgZWxlbWVudCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgPENPREU+Q29tcGlsYXRpb25Vbml0PC9DT0RFPiB3aGljaCB3aWxsIGluIHR1cm4gYmUgdXNlZCB0byBjcmVhdGUgYW4gPENPREU+SW1wb3J0UmV3cml0ZTwvQ09ERT4uCi0gPC9wPjxERD48Q09ERT5xdWFsaWZpZWROYW1lPC9DT0RFPiAtIHRoZSBpbXBvcnQgdG8gYWRkLgotPERUPjxCPlJldHVybnM6PC9CPjxERD50ZXh0IGVkaXQgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIGFkZCBpbXBvcnQgY2hhbmdlcy4KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uPC9DT0RFPiAtIHRoZSBleGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBpbXBvcnQgcmV3cml0ZSBmYWlscy48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImNyZWF0ZVJlbW92ZUltcG9ydFRleHRFZGl0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCwgamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLWNyZWF0ZVJlbW92ZUltcG9ydFRleHRFZGl0PC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQgPEI+Y3JlYXRlUmVtb3ZlSW1wb3J0VGV4dEVkaXQ8L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCZuYnNwO2phdmFFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtxdWFsaWZpZWROYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uPC9QUkU+Ci08REw+Ci08REQ+Q3JlYXRlcyBhIDxDT0RFPlRleHRFZGl0PC9DT0RFPiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByZW1vdmUgaW1wb3J0IGNoYW5nZSB0byB0aGUgc291cmNlIGNvZGUgb2YgdGhlIGphdmEgZWxlbWVudHMgY29tcGlsYXRpb24gdW5pdC4KLSBUaGUgY29tcGlsYXRpb24gdW5pdCBpdHNlbGYgaXMgbm90IG1vZGlmaWVkLiBObyBjaGFuZ2Ugd2lsbCBiZSByZWNvcmRlZCBpZiB0aGUgaW1wb3J0IHR5cGUgaXMgcmVmZXJlbmNlZCBvbiBtb3JlIHRoYW4gb25lIGFuIGFubm90YXRhYmxlCi0gZWxlbWVudCBpbiB0aGUgc291cmNlIGNvZGUuIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgaW4gY29uanVuY3Rpb24gd2l0aCA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCNjcmVhdGVSZW1vdmVBbm5vdGF0aW9uVGV4dEVkaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50LCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbikiPjxDT0RFPmNyZWF0ZVJlbW92ZUFubm90YXRpb25UZXh0RWRpdChJSmF2YUVsZW1lbnQsIEFubm90YXRpb24pPC9DT0RFPjwvQT59LgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5qYXZhRWxlbWVudDwvQ09ERT4gLSBvbmUgb2YgdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBqYXZhIGVsZW1lbnQ6Ci0gPGxpPklKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUPC9saT4KLSA8bGk+SUphdmFFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT048L2xpPgotIDxsaT5JSmF2YUVsZW1lbnQuVFlQRTwvbGk+Ci0gPGxpPklKYXZhRWxlbWVudC5GSUVMRDwvbGk+Ci0gPGxpPklKYXZhRWxlbWVudC5NRVRIT0Q8L2xpPgotIDxsaT5JSmF2YUVsZW1lbnQuTE9DQUxfVkFSSUFCTEU8L2xpPgotIDxwPgotIFRoZSBqYXZhIGVsZW1lbnQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIDxDT0RFPkNvbXBpbGF0aW9uVW5pdDwvQ09ERT4gd2hpY2ggd2lsbCBpbiB0dXJuIGJlIHVzZWQgdG8gY3JlYXRlIGFuIDxDT0RFPkltcG9ydFJld3JpdGU8L0NPREU+LgotIDwvcD48REQ+PENPREU+cXVhbGlmaWVkTmFtZTwvQ09ERT4gLSB0aGUgYW5ub3RhdGlvbiBpbXBvcnQgdG8gcmVtb3ZlLgotPERUPjxCPlJldHVybnM6PC9CPjxERD50ZXh0IGVkaXQgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIHJlbW92ZSBpbXBvcnQgY2hhbmdlcy4KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uPC9DT0RFPiAtIHRoZSBleGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBpbXBvcnQgcmV3cml0ZSBmYWlscy48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uKSI+PCEtLSAtLT48L0E+PEgzPgotY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0PC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQgPEI+Y3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0PC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQmbmJzcDtqYXZhRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24mbmJzcDthbm5vdGF0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb248L1BSRT4KLTxETD4KLTxERD5DcmVhdGVzIGEgPENPREU+VGV4dEVkaXQ8L0NPREU+IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGFkZCBhbm5vdGF0aW9uIGNoYW5nZSB0byB0aGUgc291cmNlIGNvZGUgb2YgdGhlIGphdmEgZWxlbWVudHMgY29tcGlsYXRpb24gdW5pdC4KLSBUaGUgY29tcGlsYXRpb24gdW5pdCBpdHNlbGYgaXMgbm90IG1vZGlmaWVkLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5qYXZhRWxlbWVudDwvQ09ERT4gLSBvbmUgb2YgdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBqYXZhIGVsZW1lbnQ6Ci0gPGxpPklKYXZhRWxlbWVudC5QQUNLQUdFX0RFQ0xBUkFUSU9OPC9saT4KLSA8bGk+SUphdmFFbGVtZW50LlRZUEU8L2xpPgotIDxsaT5JSmF2YUVsZW1lbnQuRklFTEQ8L2xpPgotIDxsaT5JSmF2YUVsZW1lbnQuTUVUSE9EPC9saT4KLSA8bGk+SUphdmFFbGVtZW50LkxPQ0FMX1ZBUklBQkxFPC9saT48REQ+PENPREU+YW5ub3RhdGlvbjwvQ09ERT4gLSB0aGUgYW5ub3RhdGlvbiB0byBhZGQuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRleHQgZWRpdCBvYmplY3QgZGVzY3JpYmluZyB0aGUgYWRkIGFubm90YXRpb24gY2hhbmdlcy4gUmV0dXJucyBhIDxDT0RFPk11bHRpVGV4dEVkaXQ8L0NPREU+IGlmIHRoZSBnaXZlbiBqYXZhIGVsZW1lbnQgaXNuJ3Qgc3VwcG9ydGVkLgotPERUPjxCPlRocm93czo8L0I+Ci08REQ+PENPREU+b3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uPC9DT0RFPiAtIEEgPENPREU+SmF2YU1vZGVsRXhjZXB0aW9uPC9DT0RFPiBpcyB0aHJvd24gd2hlbiB0aGUgdW5kZXJseWluZyBjb21waWxhdGlvbiB1bml0cwotIGJ1ZmZlciBjb3VsZCBub3QgYmUgYWNjZXNzZWQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJjcmVhdGVSZW1vdmVBbm5vdGF0aW9uVGV4dEVkaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50LCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbikiPjwhLS0gLS0+PC9BPjxIMz4KLWNyZWF0ZVJlbW92ZUFubm90YXRpb25UZXh0RWRpdDwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0IDxCPmNyZWF0ZVJlbW92ZUFubm90YXRpb25UZXh0RWRpdDwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Jm5ic3A7amF2YUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uJm5ic3A7YW5ub3RhdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uPC9QUkU+Ci08REw+Ci08REQ+Q3JlYXRlcyBhIDxDT0RFPlRleHRFZGl0PC9DT0RFPiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByZW1vdmUgYW5ub3RhdGlvbiBjaGFuZ2UgdG8gdGhlIHNvdXJjZSBjb2RlIG9mIHRoZSBqYXZhIGVsZW1lbnRzIGNvbXBpbGF0aW9uIHVuaXQuCi0gVGhlIGNvbXBpbGF0aW9uIHVuaXQgaXRzZWxmIGlzIG5vdCBtb2RpZmllZC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+amF2YUVsZW1lbnQ8L0NPREU+IC0gb25lIG9mIHRoZSBmb2xsb3dpbmcgdHlwZXMgb2YgamF2YSBlbGVtZW50OgotIDxsaT5JSmF2YUVsZW1lbnQuUEFDS0FHRV9ERUNMQVJBVElPTjwvbGk+Ci0gPGxpPklKYXZhRWxlbWVudC5UWVBFPC9saT4KLSA8bGk+SUphdmFFbGVtZW50LkZJRUxEPC9saT4KLSA8bGk+SUphdmFFbGVtZW50Lk1FVEhPRDwvbGk+Ci0gPGxpPklKYXZhRWxlbWVudC5MT0NBTF9WQVJJQUJMRTwvbGk+PEREPjxDT0RFPmFubm90YXRpb248L0NPREU+IC0gdGhlIGFubm90YXRpb24gdG8gYWRkLgotPERUPjxCPlJldHVybnM6PC9CPjxERD50ZXh0IGVkaXQgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIGFkZCBhbm5vdGF0aW9uIGNoYW5nZXMuIFJldHVybnMgYSA8Q09ERT5NdWx0aVRleHRFZGl0PC9DT0RFPiBpZiB0aGUgZ2l2ZW4gamF2YSBlbGVtZW50IGlzbid0IHN1cHBvcnRlZC4KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPm9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjwvQ09ERT4gLSBBIDxDT0RFPkphdmFNb2RlbEV4Y2VwdGlvbjwvQ09ERT4gaXMgdGhyb3duIHdoZW4gdGhlIHVuZGVybHlpbmcgY29tcGlsYXRpb24gdW5pdHMKLSBidWZmZXIgY291bGQgbm90IGJlIGFjY2Vzc2VkLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iY3JlYXRlQWRkTWVtYmVyVmFsdWVQYWlyVGV4dEVkaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb24sIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXIpIj48IS0tIC0tPjwvQT48SDM+Ci1jcmVhdGVBZGRNZW1iZXJWYWx1ZVBhaXJUZXh0RWRpdDwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0IDxCPmNyZWF0ZUFkZE1lbWJlclZhbHVlUGFpclRleHRFZGl0PC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbiZuYnNwO2Fubm90YXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpciZuYnNwO21lbWJlclZhbHVlUGFpcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb248L1BSRT4KLTxETD4KLTxERD5DcmVhdGVzIGEgPENPREU+VGV4dEVkaXQ8L0NPREU+IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGNoYW5nZSBvZiBhZGRpbmcgdGhlIDxDT0RFPk1lbWJlclZhbHVlUGFpcjwvQ09ERT4gdG8gdGhlIDxDT0RFPk5vcm1hbEFubm90YXRpb248L0NPREU+LgotIFRoZSB1bmRlcmx5aW5nIGNvbXBpbGF0aW9uIHVuaXQgaXRzZWxmIGlzIG5vdCBtb2RpZmllZC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+YW5ub3RhdGlvbjwvQ09ERT4gLSB0aGUgbm9ybWFsIGFubm90YXRpb24gdG8gYWRkIHRoZSBtZW1iZXIgdmFsdWUgcGFpciB0by48REQ+PENPREU+bWVtYmVyVmFsdWVQYWlyPC9DT0RFPiAtIHRoZSBtZW1iZXIgdmFsdWUgcGFpciB0byBhZGQuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRleHQgZWRpdCBvYmplY3QgZGVzY3JpYmluZyB0aGUgYWRkIG1lbWJlciB2YWx1ZSBwYWlyIGNoYW5nZS4KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPm9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjwvQ09ERT4gLSBBIDxDT0RFPkphdmFNb2RlbEV4Y2VwdGlvbjwvQ09ERT4gaXMgdGhyb3duIHdoZW4KLSB0aGUgdW5kZXJseWluZyBjb21waWxhdGlvbiB1bml0cyBidWZmZXIgY291bGQgbm90IGJlIGFjY2Vzc2VkLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iY3JlYXRlUmVtb3ZlTWVtYmVyVmFsdWVQYWlyVGV4dEVkaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb24sIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXIpIj48IS0tIC0tPjwvQT48SDM+Ci1jcmVhdGVSZW1vdmVNZW1iZXJWYWx1ZVBhaXJUZXh0RWRpdDwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0IDxCPmNyZWF0ZVJlbW92ZU1lbWJlclZhbHVlUGFpclRleHRFZGl0PC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbiZuYnNwO2Fubm90YXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpciZuYnNwO21lbWJlclZhbHVlUGFpcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb248L1BSRT4KLTxETD4KLTxERD5DcmVhdGVzIGEgPENPREU+VGV4dEVkaXQ8L0NPREU+IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGNoYW5nZSBvZiByZW1vdmluZyB0aGUgPENPREU+TWVtYmVyVmFsdWVQYWlyPC9DT0RFPiBmcm9tIHRoZSA8Q09ERT5Ob3JtYWxBbm5vdGF0aW9uPC9DT0RFPi4KLSBUaGUgdW5kZXJseWluZyBjb21waWxhdGlvbiB1bml0IGl0c2VsZiBpcyBub3QgbW9kaWZpZWQuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmFubm90YXRpb248L0NPREU+IC0gdGhlIG5vcm1hbCBhbm5vdGF0aW9uIHRvIHJlbW92ZSB0aGUgbWVtYmVyIHZhbHVlIHBhaXIgZnJvbS48REQ+PENPREU+bWVtYmVyVmFsdWVQYWlyPC9DT0RFPiAtIHRoZSBtZW1iZXIgdmFsdWUgcGFpciB0byByZW1vdmUuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRleHQgZWRpdCBvYmplY3QgZGVzY3JpYmluZyB0aGUgcmVtb3ZlIG1lbWJlciB2YWx1ZSBwYWlyIGNoYW5nZS4KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPm9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjwvQ09ERT4gLSBBIDxDT0RFPkphdmFNb2RlbEV4Y2VwdGlvbjwvQ09ERT4gaXMgdGhyb3duIHdoZW4KLSB0aGUgdW5kZXJseWluZyBjb21waWxhdGlvbiB1bml0cyBidWZmZXIgY291bGQgbm90IGJlIGFjY2Vzc2VkLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iY3JlYXRlVXBkYXRlTWVtYmVyVmFsdWVQYWlyVGV4dEVkaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpciwgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGUpIj48IS0tIC0tPjwvQT48SDM+Ci1jcmVhdGVVcGRhdGVNZW1iZXJWYWx1ZVBhaXJUZXh0RWRpdDwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0IDxCPmNyZWF0ZVVwZGF0ZU1lbWJlclZhbHVlUGFpclRleHRFZGl0PC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyJm5ic3A7bWVtYmVyVmFsdWVQYWlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlJm5ic3A7dmFsdWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uPC9QUkU+Ci08REw+Ci08REQ+Q3JlYXRlcyBhIDxDT0RFPlRleHRFZGl0PC9DT0RFPiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjaGFuZ2Ugb2YgdXBkYXRpbmcgdGhlIDxDT0RFPk1lbWJlclZhbHVlUGFpcjwvQ09ERT4gd2l0aCB0aGUgPENPREU+QVNUTm9kZTwvQ09ERT4gdmFsdWUuCi0gVGhlIHVuZGVybHlpbmcgY29tcGlsYXRpb24gdW5pdCBpdHNlbGYgaXMgbm90IG1vZGlmaWVkLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5tZW1iZXJWYWx1ZVBhaXI8L0NPREU+IC0gdGhlIG1lbWJlciB2YWx1ZSBwYWlyIHRvIHVwZGF0ZS48REQ+PENPREU+dmFsdWU8L0NPREU+IC0gdGhlIHZhbHVlIHRvIHNldC4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGV4dCBlZGl0IG9iamVjdCBkZXNjcmliaW5nIHRoZSB1cGRhdGUgbWVtYmVyIHZhbHVlIHBhaXIgY2hhbmdlLgotPERUPjxCPlRocm93czo8L0I+Ci08REQ+PENPREU+b3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uPC9DT0RFPiAtIEEgPENPREU+SmF2YU1vZGVsRXhjZXB0aW9uPC9DT0RFPiBpcyB0aHJvd24gd2hlbgotIHRoZSB1bmRlcmx5aW5nIGNvbXBpbGF0aW9uIHVuaXRzIGJ1ZmZlciBjb3VsZCBub3QgYmUgYWNjZXNzZWQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJjcmVhdGVVcGRhdGVTaW5nbGVNZW1iZXJBbm5vdGF0aW9uVGV4dEVkaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb24sIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlKSI+PCEtLSAtLT48L0E+PEgzPgotY3JlYXRlVXBkYXRlU2luZ2xlTWVtYmVyQW5ub3RhdGlvblRleHRFZGl0PC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQgPEI+Y3JlYXRlVXBkYXRlU2luZ2xlTWVtYmVyQW5ub3RhdGlvblRleHRFZGl0PC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiZuYnNwO2Fubm90YXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlJm5ic3A7dmFsdWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjwvUFJFPgotPERMPgotPEREPkNyZWF0ZXMgYSA8Q09ERT5UZXh0RWRpdDwvQ09ERT4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY2hhbmdlIG9mIHVwZGF0aW5nIHRoZSA8Q09ERT5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uPC9DT0RFPiB3aXRoIHRoZSA8Q09ERT5BU1ROb2RlPC9DT0RFPiB2YWx1ZS4KLSBUaGUgdW5kZXJseWluZyBjb21waWxhdGlvbiB1bml0IGl0c2VsZiBpcyBub3QgbW9kaWZpZWQuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmFubm90YXRpb248L0NPREU+IC0gdGhlIHNpbmdsZSBtZW1lYmVyIGFubm90YXRpb24gdG8gdXBkYXRlLjxERD48Q09ERT52YWx1ZTwvQ09ERT4gLSB0aGUgdmFsdWUgdG8gc2V0LgotPERUPjxCPlJldHVybnM6PC9CPjxERD50ZXh0IGVkaXQgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIHVwZGF0ZSBzaW5nbGUgbWVtYmVyIGFubm90YXRpb24gY2hhbmdlLgotPERUPjxCPlRocm93czo8L0I+Ci08REQ+PENPREU+b3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uPC9DT0RFPiAtIEEgPENPREU+SmF2YU1vZGVsRXhjZXB0aW9uPC9DT0RFPiBpcyB0aHJvd24gd2hlbgotIHRoZSB1bmRlcmx5aW5nIGNvbXBpbGF0aW9uIHVuaXRzIGJ1ZmZlciBjb3VsZCBub3QgYmUgYWNjZXNzZWQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRDb21waWxhdGlvblVuaXRGcm9tSmF2YUVsZW1lbnQob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50KSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0Q29tcGlsYXRpb25Vbml0RnJvbUphdmFFbGVtZW50PC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQgPEI+Z2V0Q29tcGlsYXRpb25Vbml0RnJvbUphdmFFbGVtZW50PC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQmbmJzcDtqYXZhRWxlbWVudCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIGEgPENPREU+SUNvbXBpbGF0aW9uVW5pdDwvQ09ERT4gZm9yIHRoZSBnaXZlbiA8Q09ERT5JSmF2YUVsZW1lbnQ8L0NPREU+LgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5qYXZhRWxlbWVudDwvQ09ERT4gLSBvbmUgb2YgdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBqYXZhIGVsZW1lbnQ6Ci0gPGxpPklKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUPC9saT4KLSA8bGk+SUphdmFFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT048L2xpPgotIDxsaT5JSmF2YUVsZW1lbnQuVFlQRTwvbGk+Ci0gPGxpPklKYXZhRWxlbWVudC5GSUVMRDwvbGk+Ci0gPGxpPklKYXZhRWxlbWVudC5NRVRIT0Q8L2xpPgotIDxsaT5JSmF2YUVsZW1lbnQuTE9DQUxfVkFSSUFCTEU8L2xpPgotPERUPjxCPlJldHVybnM6PC9CPjxERD5hIGNvbXBpbGF0aW9uIHVuaXQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRUeXBlRGVjbGFyYXRpb24ob3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGUpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRUeXBlRGVjbGFyYXRpb248L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFic3RyYWN0VHlwZURlY2xhcmF0aW9uIDxCPmdldFR5cGVEZWNsYXJhdGlvbjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGUmbmJzcDt0eXBlKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgdGhlIDxDT0RFPkFic3RyYWN0VHlwZURlY2xhcmF0aW9uPC9DT0RFPiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiA8Q09ERT5JVHlwZTwvQ09ERT4uCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnR5cGU8L0NPREU+IC0gdGhlIHR5cGUuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPmEgdHlwZSBkZWNsYXJhdGlvbiBvciBudWxsIGlmIG5vdCBmb3VuZC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldE1ldGhvZERlY2xhcmF0aW9uKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2QpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRNZXRob2REZWNsYXJhdGlvbjwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kRGVjbGFyYXRpb24gPEI+Z2V0TWV0aG9kRGVjbGFyYXRpb248L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2QmbmJzcDttZXRob2QpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgPENPREU+TWV0aG9kRGVjbGFyYXRpb248L0NPREU+IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIDxDT0RFPklNZXRob2Q8L0NPREU+LgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5tZXRob2Q8L0NPREU+IC0gdGhlIG1ldGhvZAotPERUPjxCPlJldHVybnM6PC9CPjxERD5hIG1ldGhvZCBkZWNsYXJhdGlvbiBvciBudWxsIGlmIG5vdCBmb3VuZC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldEZpZWxkRGVjbGFyYXRpb24ob3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0RmllbGREZWNsYXJhdGlvbjwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRmllbGREZWNsYXJhdGlvbiA8Qj5nZXRGaWVsZERlY2xhcmF0aW9uPC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQmbmJzcDtmaWVsZCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSA8Q09ERT5GaWVsZERlY2xhcmF0aW9uPC9DT0RFPiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiA8Q09ERT5JRmllbGQ8L0NPREU+LgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5maWVsZDwvQ09ERT4gLSB0aGUgZmllbGQKLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+YSBmaWVsZCBkZWNsYXJhdGlvbiBvciBudWxsIGlmIG5vdCBmb3VuZC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24ob3JnLmVjbGlwc2UuamR0LmNvcmUuSUxvY2FsVmFyaWFibGUpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIDxCPmdldFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb248L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLklMb2NhbFZhcmlhYmxlJm5ic3A7amF2YUVsZW1lbnQpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgPENPREU+U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbjwvQ09ERT4gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4gPENPREU+SUxvY2FsVmFyaWFibGU8L0NPREU+LgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5qYXZhRWxlbWVudDwvQ09ERT4gLSB0aGUgbG9jYWwgdmFyaWFibGUKLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+YSBzaW5nbGUgdmFyaWFibGUgZGVjbGFyYXRpb24gb3IgbnVsbCBpZiBub3QgZm91bmQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRBbm5vdGF0aW9uTmFtZShvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbikiPjwhLS0gLS0+PC9BPjxIMz4KLWdldEFubm90YXRpb25OYW1lPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgPEI+Z2V0QW5ub3RhdGlvbk5hbWU8L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uJm5ic3A7YW5ub3RhdGlvbik8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSBhbm5vdGF0aW9ucyB0eXBlIG5hbWUuIElmIHRoZSBhbm5vdGF0aW9uIG5hbWUgaXMgYSBzaW1wbGUgbmFtZSwgdGhlIHJlc3VsdCBpcyB0aGUKLSBuYW1lJ3MgaWRlbnRpZmllci4gSWYgdGhlIG5hbWUgaXMgYSBxdWFsaWZpZWQgbmFtZSwgdGhlIHJlc3VsdCBpcyB0aGUgbmFtZSBvZiB0aGUgcXVhbGlmaWVyCi0gZm9sbG93ZWQgYnkgIi4iIGZvbGxvd2VkIGJ5IHRoZSBuYW1lJ3MgaWRlbnRpZmllci4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+YW5ub3RhdGlvbjwvQ09ERT4gLSB0aGUgYW5ub3RhdGlvbi4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIGFubm90YXRpb24gbmFtZS4gVGhlIHNpbXBsZSBuYW1lIG9yIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImNvbXBhcmVUeXBlTmFtZXMob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFic3RyYWN0VHlwZURlY2xhcmF0aW9uLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZSkiPjwhLS0gLS0+PC9BPjxIMz4KLWNvbXBhcmVUeXBlTmFtZXM8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiA8Qj5jb21wYXJlVHlwZU5hbWVzPC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24mbmJzcDthYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlJm5ic3A7dHlwZSk8L1BSRT4KLTxETD4KLTxERD5Db21wYXJlcyB0aGUgPENPREU+QWJzdHJhY3RUeXBlRGVjbGFyYXRpb248L0NPREU+IGFuZCA8Q09ERT5JVHlwZTwvQ09ERT4uCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmFic3RyYWN0VHlwZURlY2xhcmF0aW9uPC9DT0RFPiAtIHRoZSB0eXBlIGRlY2xhcmF0aW9uLjxERD48Q09ERT50eXBlPC9DT0RFPiAtIHRoZSB0eXBlLgotPERUPjxCPlJldHVybnM6PC9CPjxERD48Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbmFtZXMgbWF0Y2guPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJjb21wYXJlTWV0aG9kcyhvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kRGVjbGFyYXRpb24sIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2QpIj48IS0tIC0tPjwvQT48SDM+Ci1jb21wYXJlTWV0aG9kczwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyBib29sZWFuIDxCPmNvbXBhcmVNZXRob2RzPC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kRGVjbGFyYXRpb24mbmJzcDttZXRob2REZWNsYXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kJm5ic3A7bWV0aG9kKTwvUFJFPgotPERMPgotPEREPkNvbXBhcmVzIHRoZSA8Q09ERT5NZXRob2REZWNsYXJhdGlvbjwvQ09ERT4gYW5kIDxDT0RFPklNZXRob2Q8L0NPREU+LgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5tZXRob2REZWNsYXJhdGlvbjwvQ09ERT4gLSB0aGUgbWV0aG9kIGRlY2xhcmF0aW9uLjxERD48Q09ERT5tZXRob2Q8L0NPREU+IC0gdGhlIG1ldGhvZC4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+PGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1ldGhvZCBuYW1lcyBhbmQgcGFyYW1ldGVyIHR5cGVzIG1hdGNoLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iY29tcGFyZU1ldGhvZHMob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZERlY2xhcmF0aW9uLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kRGVjbGFyYXRpb24pIj48IS0tIC0tPjwvQT48SDM+Ci1jb21wYXJlTWV0aG9kczwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyBib29sZWFuIDxCPmNvbXBhcmVNZXRob2RzPC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kRGVjbGFyYXRpb24mbmJzcDttZXRob2RPbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZERlY2xhcmF0aW9uJm5ic3A7bWV0aG9kVHdvKTwvUFJFPgotPERMPgotPEREPkNvbXBhcmVzIHRoZSB0d28gPENPREU+TWV0aG9kRGVjbGFyYXRpb248L0NPREU+LgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5tZXRob2RPbmU8L0NPREU+IC0gdGhlIGZpcnN0IG1ldGhvZCBkZWNsYXJhdGlvbi48REQ+PENPREU+bWV0aG9kVHdvPC9DT0RFPiAtIHRoZSBzZWNvbmQgbWV0aG9kIGRlY2xhcmF0aW9uLgotPERUPjxCPlJldHVybnM6PC9CPjxERD48Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWV0aG9kIG5hbWVzIGFuZCBwYXJhbWV0ZXIgdHlwZXMgbWF0Y2guPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJjb21wYXJlTWV0aG9kcyhjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5NZXRob2REZWNsYXJhdGlvbiwgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb24pIj48IS0tIC0tPjwvQT48SDM+Ci1jb21wYXJlTWV0aG9kczwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyBib29sZWFuIDxCPmNvbXBhcmVNZXRob2RzPC9CPihjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5NZXRob2REZWNsYXJhdGlvbiZuYnNwO21ldGhvZE9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5NZXRob2REZWNsYXJhdGlvbiZuYnNwO21ldGhvZFR3byk8L1BSRT4KLTxETD4KLTxERD5Db21wYXJlcyB0aGUgdHdvIDxDT0RFPk1ldGhvZERlY2xhcmF0aW9uPC9DT0RFPi4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+bWV0aG9kT25lPC9DT0RFPiAtIHRoZSBmaXJzdCBtZXRob2QgZGVjbGFyYXRpb24uPEREPjxDT0RFPm1ldGhvZFR3bzwvQ09ERT4gLSB0aGUgc2Vjb25kIG1ldGhvZCBkZWNsYXJhdGlvbi4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+PGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1ldGhvZCBuYW1lcyBhbmQgcGFyYW1ldGVyIHR5cGVzIG1hdGNoLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iY29tcGFyZUZpZWxkTmFtZXMob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkZpZWxkRGVjbGFyYXRpb24sIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZCkiPjwhLS0gLS0+PC9BPjxIMz4KLWNvbXBhcmVGaWVsZE5hbWVzPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIGJvb2xlYW4gPEI+Y29tcGFyZUZpZWxkTmFtZXM8L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5GaWVsZERlY2xhcmF0aW9uJm5ic3A7ZmllbGREZWNsYXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQmbmJzcDtmaWVsZCk8L1BSRT4KLTxETD4KLTxERD5Db21wYXJlcyB0aGUgPENPREU+RmllbGREZWNsYXJhdGlvbjwvQ09ERT4gYW5kIDxDT0RFPklGaWVsZDwvQ09ERT4uCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmZpZWxkRGVjbGFyYXRpb248L0NPREU+IC0gdGhlIGZpZWxkIGRlY2xhcmF0aW9uLjxERD48Q09ERT5maWVsZDwvQ09ERT4gLSB0aGUgZmllbGQuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPjxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmaWVsZCBuYW1lcyBtYXRjaC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImlzQW5ub3RhdGlvblByZXNlbnQob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50LCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbikiPjwhLS0gLS0+PC9BPjxIMz4KLWlzQW5ub3RhdGlvblByZXNlbnQ8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiA8Qj5pc0Fubm90YXRpb25QcmVzZW50PC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQmbmJzcDtqYXZhRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uJm5ic3A7YW5ub3RhdGlvbik8L1BSRT4KLTxETD4KLTxERD5DaGVja3MgaWYgdGhlIGdpdmVuIDxDT0RFPkFubm90YXRpb248L0NPREU+IGlzIHByZXNlbnQgb24gdGhlIDxDT0RFPklKYXZhRWxlbWVudDwvQ09ERT4uCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmphdmFFbGVtZW50PC9DT0RFPiAtIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR5cGVzIG9mIGphdmEgZWxlbWVudDoKLSA8bGk+SUphdmFFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT048L2xpPgotIDxsaT5JSmF2YUVsZW1lbnQuVFlQRTwvbGk+Ci0gPGxpPklKYXZhRWxlbWVudC5GSUVMRDwvbGk+Ci0gPGxpPklKYXZhRWxlbWVudC5NRVRIT0Q8L2xpPgotIDxsaT5JSmF2YUVsZW1lbnQuTE9DQUxfVkFSSUFCTEU8L2xpPjxERD48Q09ERT5hbm5vdGF0aW9uPC9DT0RFPiAtIHRoZSBhbm5vdGF0aW9uLgotPERUPjxCPlJldHVybnM6PC9CPjxERD48Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYW5ub3RhdGlvbiBpcyBwcmVzZW50LjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iaXNBbm5vdGF0aW9uUHJlc2VudChvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQsIGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1pc0Fubm90YXRpb25QcmVzZW50PC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIGJvb2xlYW4gPEI+aXNBbm5vdGF0aW9uUHJlc2VudDwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Jm5ic3A7amF2YUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7YW5ub3RhdGlvbk5hbWUpPC9QUkU+Ci08REw+Ci08REQ+Q2hlY2tzIGlmIHRoZSBhbm5vdGF0aW9uIHdpdGggdGhlIGdpdmVuIG5hbWUgaXMgcHJlc2VudCBvbiB0aGUgPENPREU+SUphdmFFbGVtZW50PC9DT0RFPi4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+amF2YUVsZW1lbnQ8L0NPREU+IC0gb25lIG9mIHRoZSBmb2xsb3dpbmcgdHlwZXMgb2YgamF2YSBlbGVtZW50OgotIDxsaT5JSmF2YUVsZW1lbnQuUEFDS0FHRV9ERUNMQVJBVElPTjwvbGk+Ci0gPGxpPklKYXZhRWxlbWVudC5UWVBFPC9saT4KLSA8bGk+SUphdmFFbGVtZW50LkZJRUxEPC9saT4KLSA8bGk+SUphdmFFbGVtZW50Lk1FVEhPRDwvbGk+Ci0gPGxpPklKYXZhRWxlbWVudC5MT0NBTF9WQVJJQUJMRTwvbGk+PEREPjxDT0RFPmFubm90YXRpb25OYW1lPC9DT0RFPiAtIHRoZSBhbm5vdGF0aW9uIG5hbWUuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPjxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhbm5vdGF0aW9uIGlzIHByZXNlbnQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRBbm5vdGF0aW9ucyhvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRBbm5vdGF0aW9uczwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuTGlzdCZsdDtvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiZndDsgPEI+Z2V0QW5ub3RhdGlvbnM8L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCZuYnNwO2phdmFFbGVtZW50KTwvUFJFPgotPERMPgotPEREPlJldHVybnMgYSBsaXN0IG9mIGFsbCB0aGUgPENPREU+QW5ub3RhdGlvbjwvQ09ERT4gdGhhdCBhcmUgcHJlc2VudCBvbiB0aGUgZ2l2ZW4gPENPREU+SUphdmFFbGVtZW50PC9DT0RFPgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5qYXZhRWxlbWVudDwvQ09ERT4gLSBvbmUgb2YgdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBqYXZhIGVsZW1lbnQ6Ci0gPGxpPklKYXZhRWxlbWVudC5QQUNLQUdFX0RFQ0xBUkFUSU9OPC9saT4KLSA8bGk+SUphdmFFbGVtZW50LlRZUEU8L2xpPgotIDxsaT5JSmF2YUVsZW1lbnQuRklFTEQ8L2xpPgotIDxsaT5JSmF2YUVsZW1lbnQuTUVUSE9EPC9saT4KLSA8bGk+SUphdmFFbGVtZW50LkxPQ0FMX1ZBUklBQkxFPC9saT4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+YSBsaXN0IG9mIGFubm90YXRpb25zLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbnMob3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb25zPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5MaXN0Jmx0O29yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uJmd0OyA8Qj5nZXRTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uczwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZCZuYnNwO21ldGhvZCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhlIDxDT0RFPlNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb248L0NPREU+IGZvciB0aGUgZ2l2ZW4gPENPREU+SU1ldGhvZDwvQ09ERT4uCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPm1ldGhvZDwvQ09ERT4gLSB0aGUgbWV0aG9kLgotPERUPjxCPlJldHVybnM6PC9CPjxERD5hIGxpc3Qgb2Ygc2luZ2xlIHZhcmlhYmxlIGRlY2xhcmF0aW9ucy48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldExvY2FsVmFyaWFibGUob3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZCwgaW50KSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0TG9jYWxWYXJpYWJsZTwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTG9jYWxWYXJpYWJsZSA8Qj5nZXRMb2NhbFZhcmlhYmxlPC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kJm5ic3A7bWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCZuYnNwO29mZnNldCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSA8Q09ERT5JTG9jYWxWYXJpYWJsZTwvQ09ERT4gYXQgdGhlIGdpdmVuIG9mZnNldCBwb3NpdGlvbiBpbiB0aGUgc291cmNlIGZpbGUuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPm1ldGhvZDwvQ09ERT4gLSB0aGUgbWV0aG9kIGluIHdoaWNoIHRoZSBsb2NhbCB2YXJpYWJsZSBpcyBkZWNsYXJlZC48REQ+PENPREU+b2Zmc2V0PC9DT0RFPiAtIHRoZSBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlIGxvY2FsIHZhcmlhYmxlIGluIHRoZSBzb3VyY2UgZmlsZS4KLSBUaGUgb2Zmc2V0IG11c3QgYmUgPj0gdG8gdGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBub2RlIHJlcHJlc2VudGluZyB0aGUgbG9jYWwgdmFyaWFibGUgYW5kCi0gPD0gdGhlIG5vZGVzIHN0YXJ0IHBvc2l0aW9uIHBsdXMgbGVuZ3RoLgotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgbG9jYWwgdmFyaWFibGUgb3IgbnVsbCBpZiBub3QgZm91bmQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRMb2NhbFZhcmlhYmxlKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2QsIGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRMb2NhbFZhcmlhYmxlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklMb2NhbFZhcmlhYmxlIDxCPmdldExvY2FsVmFyaWFibGU8L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2QmbmJzcDttZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO3BhcmFtTmFtZSk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSA8Q09ERT5JTG9jYWxWYXJpYWJsZTwvQ09ERT4gd2l0aCB0aGUgZ2l2ZW4gbmFtZSB3aXRoaW4gdGhlIGRlY2xhcmVkIDxDT0RFPklNZXRob2Q8L0NPREU+LgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5tZXRob2Q8L0NPREU+IC0gdGhlIG1ldGhvZCBpbiB3aGljaCB0aGUgbG9jYWwgdmFyaWFibGUgaXMgZGVjbGFyZWQuPEREPjxDT0RFPnBhcmFtTmFtZTwvQ09ERT4gLSB0aGUgbG9jYWwgdmFyaWFibGUgbmFtZS4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIGxvY2FsIHZhcmlhYmxlIG9yIG51bGwgaWYgbm90IGZvdW5kLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0QW5ub3RhdGlvbihvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQsIGphdmEubGFuZy5DbGFzcykiPjwhLS0gLS0+PC9BPjxIMz4KLWdldEFubm90YXRpb248L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gPEI+Z2V0QW5ub3RhdGlvbjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Jm5ic3A7amF2YUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLkNsYXNzJmx0Oz8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uJmd0OyZuYnNwO2Fubm90YXRpb24pPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgQVNUIDxDT0RFPkFubm90YXRpb248L0NPREU+IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIDxDT0RFPkFubm90YXRpb248L0NPREU+IGNsYXNzCi0gb24gdGhlIDxDT0RFPklKYXZhRWxlbWVudDwvQ09ERT4uCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmphdmFFbGVtZW50PC9DT0RFPiAtIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR5cGVzIG9mIGphdmEgZWxlbWVudDoKLSA8bGk+SUphdmFFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT048L2xpPgotIDxsaT5JSmF2YUVsZW1lbnQuVFlQRTwvbGk+Ci0gPGxpPklKYXZhRWxlbWVudC5GSUVMRDwvbGk+Ci0gPGxpPklKYXZhRWxlbWVudC5NRVRIT0Q8L2xpPgotIDxsaT5JSmF2YUVsZW1lbnQuTE9DQUxfVkFSSUFCTEU8L2xpPjxERD48Q09ERT5hbm5vdGF0aW9uPC9DT0RFPiAtIHRoZSA8Q09ERT5Bbm5vdGF0aW9uPC9DT0RFPiBjbGFzcy4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIEFTVCBhbm5vdGF0aW9uIG9yIG51bGwgaWYgbm90IGZvdW5kLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0QW5ub3RhdGlvbihjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5EZWNsYXJhdGlvbiwgamF2YS5sYW5nLkNsYXNzKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0QW5ub3RhdGlvbjwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yIDxCPmdldEFubm90YXRpb248L0I+KGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uJm5ic3A7ZGVjbGFyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuQ2xhc3MmbHQ7PyBleHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24mZ3Q7Jm5ic3A7YW5ub3RhdGlvbik8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSA8Q09ERT5Bbm5vdGF0aW9uTWlycm9yPC9DT0RFPiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiA8Q09ERT5Bbm5vdGF0aW9uPC9DT0RFPiBjbGFzcwotIG9uIHRoZSA8Q09ERT5EZWNsYXJhdGlvbjwvQ09ERT4uCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmRlY2xhcmF0aW9uPC9DT0RFPiAtIHRoZSBkZWNsYXJhdGlvbjxERD48Q09ERT5hbm5vdGF0aW9uPC9DT0RFPiAtIHRoZSA8Q09ERT5Bbm5vdGF0aW9uPC9DT0RFPiBjbGFzcy4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIGFubm90YXRpb24gbWlycm9yIG9yIG51bGwgaWYgbm90IGZvdW5kLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0QW5ub3RhdGlvbihqYXZhLmxhbmcuQ2xhc3MsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0YWJsZSkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldEFubm90YXRpb248L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb24gPEI+Z2V0QW5ub3RhdGlvbjwvQj4oamF2YS5sYW5nLkNsYXNzJmx0Oz8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uJmd0OyZuYnNwO2Fubm90YXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRhYmxlJm5ic3A7YW5ub3RhdGFibGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgSkRUIDxDT0RFPklBbm5vdGF0aW9uPC9DT0RFPiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiA8Q09ERT5Bbm5vdGF0aW9uPC9DT0RFPiBjbGFzcwotIG9uIHRoZSA8Q09ERT5JQW5ub3RhdGFibGU8L0NPREU+IGVsZW1lbnQuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmFubm90YXRpb248L0NPREU+IC0gdGhlIDxDT0RFPkFubm90YXRpb248L0NPREU+IGNsYXNzLjxERD48Q09ERT5hbm5vdGF0YWJsZTwvQ09ERT4gLSBhIHBhY2thZ2UgZGVjbGFyYXRpb24sIGEgdHlwZSwgYSBtZXRob2QsIGEgZmllbGQgb3IgYSBsb2NhbCB2YXJpYWJsZSBpbiBhIGNvbXBpbGF0aW9uIHVuaXQuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBhbm5vdGF0aW9uIG9yIG51bGwgaWYgbm90IGZvdW5kLgotPERUPjxCPlRocm93czo8L0I+Ci08REQ+PENPREU+b3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uPC9DT0RFPiAtIGlmIHRoZSBhbm5vdGF0YWJsZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0QW5ub3RhdGlvblZhbHVlKGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25NaXJyb3IsIGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRBbm5vdGF0aW9uVmFsdWU8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblZhbHVlIDxCPmdldEFubm90YXRpb25WYWx1ZTwvQj4oY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvbk1pcnJvciZuYnNwO21pcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bWVtYmVyTmFtZSk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSA8Q09ERT5Bbm5vdGF0aW9uVmFsdWU8L0NPREU+IHdpdGggdGhlIGdpdmVuIG1lbWJlciBuYW1lIHRoYXQgaXMgZGVjbGFyZWQgd2l0aGluIHRoZSA8Q09ERT5Bbm5vdGF0aW9uTWlycm9yPC9DT0RFPi4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+bWlycm9yPC9DT0RFPiAtIHRoZSBhbm5vdGF0aW9uIG1pcnJvci48REQ+PENPREU+bWVtYmVyTmFtZTwvQ09ERT4gLSB0aGUgbWVtYmVyIG5hbWUuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBhbm5vdGF0aW9uIHZhbHVlIG9yIG51bGwgaWYgbm90IGZvdW5kLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0QW5ub3RhdGlvblZhbHVlKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uLCBqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0QW5ub3RhdGlvblZhbHVlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uIDxCPmdldEFubm90YXRpb25WYWx1ZTwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb24mbmJzcDtub3JtYWxBbm5vdGF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO21lbWJlck5hbWUpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgPENPREU+Tm9ybWFsQW5ub3RhdGlvbjwvQ09ERT4gbWVtYmVyIHZhbHVlIHBhaXIgdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gbWVtYmVyIG5hbWUuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPm5vcm1hbEFubm90YXRpb248L0NPREU+IC0gdGhlIG5vcm1hbCBhbm5vdGF0aW9uLjxERD48Q09ERT5tZW1iZXJOYW1lPC9DT0RFPiAtIHRoZSBtZW1iZXIgdmFsdWUgcGFpciBtZW1iZXIgbmFtZS4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIHZhbHVlIGV4cHJlc3Npb24gb3IgbnVsbCBpZiBub3QgZm91bmQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRBbm5vdGF0aW9uVmFsdWUob3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb24sIGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRBbm5vdGF0aW9uVmFsdWU8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLk9iamVjdCA8Qj5nZXRBbm5vdGF0aW9uVmFsdWU8L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uJm5ic3A7YW5ub3RhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO21lbWJlck5hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjwvUFJFPgotPERMPgotPEREPlJldHVybnMgdGhlIEpEVCA8Q09ERT5JQW5ub3RhdGlvbjwvQ09ERT4gbWVtYmVyIHZhbHVlIHBhaXIgdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gbWVtYmVyIG5hbWUuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmFubm90YXRpb248L0NPREU+IC0gdGhlIGFubm90YXRpb24uPEREPjxDT0RFPm1lbWJlck5hbWU8L0NPREU+IC0gdGhlIG1lbWJlciBuYW1lLgotPERUPjxCPlJldHVybnM6PC9CPjxERD5hbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBtZW1iZXIgdmFsdWUgcGFpcnMgdmFsdWUuCi08RFQ+PEI+VGhyb3dzOjwvQj4KLTxERD48Q09ERT5vcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb248L0NPREU+IC0gaWYgdGhlIGFubm90YXRpb24gZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRNZW1iZXJWYWx1ZVBhaXIob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb24sIGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRNZW1iZXJWYWx1ZVBhaXI8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpciA8Qj5nZXRNZW1iZXJWYWx1ZVBhaXI8L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uJm5ic3A7bm9ybWFsQW5ub3RhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO21lbWJlck5hbWUpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgPENPREU+TWVtYmVyVmFsdWVQYWlyPC9DT0RFPiB3aXRoIHRoZSBnaXZlbiBtZW1iZXIgbmFtZSBmcm9tIHRoZSA8Q09ERT5Ob3JtYWxBbm5vdGF0aW9uPC9DT0RFPi4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+bm9ybWFsQW5ub3RhdGlvbjwvQ09ERT4gLSB0aGUgbm9ybWFsIGFubm90YXRpb24uPEREPjxDT0RFPm1lbWJlck5hbWU8L0NPREU+IC0gdGhlIG1lbWJlciBuYW1lIG9mIHRoZSBtZW1iZXIgdmFsdWUgcGFpciB0byByZXR1cm4uCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPmEgbWVtYmVyIHZhbHVlIHBhaXIgb3IgbnVsbCBpZiBubyBtZW1iZXIgdmFsdWUgcGFpciB3aXRoIHRoZSBnaXZlbiBtZW1iZXIgbmFtZSBjYW4gYmUgZm91bmQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRTdHJpbmdWYWx1ZShjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yLCBqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0U3RyaW5nVmFsdWU8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyA8Qj5nZXRTdHJpbmdWYWx1ZTwvQj4oY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvbk1pcnJvciZuYnNwO21pcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bWVtYmVyTmFtZSk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSBtZW1iZXIgdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gbWVtYmVyIG5hbWUgZnJvbSB0aGUgPENPREU+QW5ub3RhdGlvbk1pcnJvcjwvQ09ERT4gYXMgYSA8Q09ERT5TdHJpbmc8L0NPREU+IHZhbHVlLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5taXJyb3I8L0NPREU+IC0gdGhlIGFubm90YXRpb24gbWlycm9yLjxERD48Q09ERT5tZW1iZXJOYW1lPC9DT0RFPiAtIHRoZSBtZW1iZXIgbmFtZS4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIG1lbWJlciB2YWx1ZSBhcyBhIFN0cmluZyBvciBudWxsIGlmIG5vIG1lbWJlciB3aXRoIHRoZSBtZW1iZXIgbmFtZSBjYW4gYmUgZm91bmQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRTdHJpbmdWYWx1ZShvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiwgamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFN0cmluZ1ZhbHVlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgPEI+Z2V0U3RyaW5nVmFsdWU8L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uJm5ic3A7YW5ub3RhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bWVtYmVyTmFtZSk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSBtZW1iZXIgdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gbWVtYmVyIG5hbWUgZnJvbSB0aGUgPENPREU+QW5ub3RhdGlvbjwvQ09ERT4gYXMgYSA8Q09ERT5TdHJpbmc8L0NPREU+IHZhbHVlLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5hbm5vdGF0aW9uPC9DT0RFPiAtIHRoZSBBU1QgYW5ub3RhdGlvbi48REQ+PENPREU+bWVtYmVyTmFtZTwvQ09ERT4gLSB0aGUgbWVtYmVyIG5hbWUuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBtZW1iZXIgdmFsdWUgYXMgYSBTdHJpbmcgb3IgbnVsbCBpZiBubyBtZW1iZXIgd2l0aCB0aGUgbWVtYmVyIG5hbWUgY2FuIGJlIGZvdW5kLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0U3RyaW5nVmFsdWUob3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb24sIGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRTdHJpbmdWYWx1ZTwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIDxCPmdldFN0cmluZ1ZhbHVlPC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbiZuYnNwO2Fubm90YXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO21lbWJlck5hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgbWVtYmVyIHZhbHVlIHdpdGggdGhlIGdpdmVuIG1lbWJlciBuYW1lIGZyb20gdGhlIDxDT0RFPklBbm5vdGF0aW9uPC9DT0RFPiBhcyBhIDxDT0RFPlN0cmluZzwvQ09ERT4gdmFsdWUuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmFubm90YXRpb248L0NPREU+IC0gdGhlIEpEVCBhbm5vdGF0aW9uLjxERD48Q09ERT5tZW1iZXJOYW1lPC9DT0RFPiAtIHRoZSBtZW1iZXIgbmFtZS4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIG1lbWJlciB2YWx1ZSBhcyBhIFN0cmluZyBvciBudWxsIGlmIG5vIG1lbWJlciB3aXRoIHRoZSBtZW1iZXIgbmFtZSBjYW4gYmUgZm91bmQuCi08RFQ+PEI+VGhyb3dzOjwvQj4KLTxERD48Q09ERT5vcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb248L0NPREU+IC0gaWYgdGhlIGFubm90YXRpb24gZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcKLSBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldEJvb2xlYW5WYWx1ZShjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yLCBqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0Qm9vbGVhblZhbHVlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5Cb29sZWFuIDxCPmdldEJvb2xlYW5WYWx1ZTwvQj4oY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvbk1pcnJvciZuYnNwO21pcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDttZW1iZXJOYW1lKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgdGhlIG1lbWJlciB2YWx1ZSB3aXRoIHRoZSBnaXZlbiBtZW1iZXIgbmFtZSBmcm9tIHRoZSA8Q09ERT5Bbm5vdGF0aW9uTWlycm9yPC9DT0RFPiBhcyBhIDxDT0RFPkJvb2xlYW48L0NPREU+IHZhbHVlLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5taXJyb3I8L0NPREU+IC0gdGhlIGFubm90YXRpb24gbWlycm9yLjxERD48Q09ERT5tZW1iZXJOYW1lPC9DT0RFPiAtIHRoZSBtZW1iZXIgbmFtZS4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIG1lbWJlciB2YWx1ZSBhcyBhIEJvb2xlYW4gb3IgbnVsbCBpZiBubyBtZW1iZXIgd2l0aCB0aGUgbWVtYmVyIG5hbWUgY2FuIGJlIGZvdW5kLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0Qm9vbGVhblZhbHVlKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uLCBqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0Qm9vbGVhblZhbHVlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5Cb29sZWFuIDxCPmdldEJvb2xlYW5WYWx1ZTwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24mbmJzcDthbm5vdGF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO21lbWJlck5hbWUpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgbWVtYmVyIHZhbHVlIHdpdGggdGhlIGdpdmVuIG1lbWJlciBuYW1lIGZyb20gdGhlIDxDT0RFPkFubm90YXRpb248L0NPREU+IGFzIGEgPENPREU+Qm9vbGVhbjwvQ09ERT4gdmFsdWUuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmFubm90YXRpb248L0NPREU+IC0gdGhlIEFTVCBhbm5vdGF0aW9uLjxERD48Q09ERT5tZW1iZXJOYW1lPC9DT0RFPiAtIHRoZSBtZW1iZXIgbmFtZS4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIG1lbWJlciB2YWx1ZSBhcyBhIEJvb2xlYW4gb3IgbnVsbCBpZiBubyBtZW1iZXIgd2l0aCB0aGUgbWVtYmVyIG5hbWUgY2FuIGJlIGZvdW5kLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0Qm9vbGVhblZhbHVlKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uLCBqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0Qm9vbGVhblZhbHVlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5Cb29sZWFuIDxCPmdldEJvb2xlYW5WYWx1ZTwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb24mbmJzcDthbm5vdGF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO21lbWJlck5hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb248L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSAgbWVtYmVyIHZhbHVlIHdpdGggdGhlIGdpdmVuIG1lbWJlciBuYW1lIGZyb20gdGhlIDxDT0RFPklBbm5vdGF0aW9uPC9DT0RFPiBhcyBhIDxDT0RFPkJvb2xlYW48L0NPREU+IHZhbHVlLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5hbm5vdGF0aW9uPC9DT0RFPiAtIHRoZSBKRFQgYW5ub3RhdGlvbi48REQ+PENPREU+bWVtYmVyTmFtZTwvQ09ERT4gLSB0aGUgbWVtYmVyIG5hbWUuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBtZW1iZXIgdmFsdWUgYXMgYSBCb29sZWFuIG9yIG51bGwgaWYgbm8gbWVtYmVyIHdpdGggdGhlIG1lbWJlciBuYW1lIGNhbiBiZSBmb3VuZC4KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPm9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjwvQ09ERT4gLSBpZiB0aGUgYW5ub3RhdGlvbiBkb2VzIG5vdCBleGlzdCBvciBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZwotIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0RW51bVZhbHVlKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uLCBqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0RW51bVZhbHVlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgPEI+Z2V0RW51bVZhbHVlPC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiZuYnNwO2Fubm90YXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDttZW1iZXJOYW1lKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgdGhlIG1lbWJlciB2YWx1ZSB3aXRoIHRoZSBnaXZlbiBtZW1iZXIgbmFtZSBmcm9tIHRoZSA8Q09ERT5Bbm5vdGF0aW9uPC9DT0RFPiBhcyBhIDxDT0RFPlN0cmluZzwvQ09ERT4gdmFsdWUuCi0gVGhlIHJldHVybmVkIFN0cmluZyB2YWx1ZSBpcyB0aGUgbmFtZSBvZiB0aGUgZW51bSBjb25zdGFudC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+YW5ub3RhdGlvbjwvQ09ERT4gLSB0aGUgQVNUIGFubm90YXRpb24uPEREPjxDT0RFPm1lbWJlck5hbWU8L0NPREU+IC0gdGhlIG1lbWJlciBuYW1lLgotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgbWVtYmVyIHZhbHVlIGFzIGEgU3RyaW5nIG9yIG51bGwgaWYgbm8gbWVtYmVyIHdpdGggdGhlIG1lbWJlciBuYW1lIGNhbiBiZSBmb3VuZC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldEVudW1WYWx1ZShvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbiwgamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLWdldEVudW1WYWx1ZTwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIDxCPmdldEVudW1WYWx1ZTwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb24mbmJzcDthbm5vdGF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bWVtYmVyTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgbWVtYmVyIHZhbHVlIHdpdGggdGhlIGdpdmVuIG1lbWJlciBuYW1lIGZyb20gdGhlIDxDT0RFPklBbm5vdGF0aW9uPC9DT0RFPiBhcyBhIDxDT0RFPlN0cmluZzwvQ09ERT4gdmFsdWUuCi0gVGhlIHJldHVybmVkIFN0cmluZyB2YWx1ZSBpcyB0aGUgbmFtZSBvZiB0aGUgZW51bSBjb25zdGFudC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+YW5ub3RhdGlvbjwvQ09ERT4gLSB0aGUgSkRUIGFubm90YXRpb24uPEREPjxDT0RFPm1lbWJlck5hbWU8L0NPREU+IC0gdGhlIG1lbWJlciBuYW1lLgotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgbWVtYmVyIHZhbHVlIGFzIGEgU3RyaW5nIG9yIG51bGwgaWYgbm8gbWVtYmVyIHdpdGggdGhlIG1lbWJlciBuYW1lIGNhbiBiZSBmb3VuZC4KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPm9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjwvQ09ERT4gLSBpZiB0aGUgYW5ub3RhdGlvbiBkb2VzIG5vdCBleGlzdCBvciBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZwotIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlLjwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvQW5ub3RhdGlvblV0aWxzLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWIENMQVNTJm5ic3A7Ci0mbmJzcDtORVhUIENMQVNTPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IkFubm90YXRpb25VdGlscy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvY2xhc3MtdXNlL0Fubm90YXRpb25VdGlscy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL2NsYXNzLXVzZS9Bbm5vdGF0aW9uVXRpbHMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlmMTQyNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvY2xhc3MtdXNlL0Fubm90YXRpb25VdGlscy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8xNCkgb24gV2VkIEFwciAwNyAwNzo0NjoyMyBCU1QgMjAxMCAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDEwLTA0LTA3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBDbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHMiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvXGNsYXNzLXVzZUFubm90YXRpb25VdGlscy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IkFubm90YXRpb25VdGlscy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIENsYXNzPGJyPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczwvQj48L0gyPgotPC9DRU5URVI+Ci1ObyB1c2FnZSBvZiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHMKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscyI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL1xjbGFzcy11c2VBbm5vdGF0aW9uVXRpbHMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJBbm5vdGF0aW9uVXRpbHMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9wYWNrYWdlLWZyYW1lLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvcGFja2FnZS1mcmFtZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2QzMGMwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9wYWNrYWdlLWZyYW1lLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMTQpIG9uIFdlZCBBcHIgMDcgMDc6NDY6MjIgQlNUIDIwMTAgLS0+Ci08VElUTEU+Ci1vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscwotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMC0wNC0wNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIj4KLTxGT05UIHNpemU9IisxIiBDTEFTUz0iRnJhbWVUaXRsZUZvbnQiPgotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iY2xhc3NGcmFtZSI+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHM8L0E+PC9GT05UPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgTk9XUkFQPjxGT05UIHNpemU9IisxIiBDTEFTUz0iRnJhbWVIZWFkaW5nRm9udCI+Ci1DbGFzc2VzPC9GT05UPiZuYnNwOwotPEZPTlQgQ0xBU1M9IkZyYW1lSXRlbUZvbnQiPgotPEJSPgotPEEgSFJFRj0iQW5ub3RhdGlvblV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscyIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5Bbm5vdGF0aW9uVXRpbHM8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLQotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvcGFja2FnZS1zdW1tYXJ5Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvcGFja2FnZS1zdW1tYXJ5Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNDU1NDUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL3BhY2thZ2Utc3VtbWFyeS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8xNCkgb24gV2VkIEFwciAwNyAwNzo0NjoyMiBCU1QgMjAxMCAtLT4KLTxUSVRMRT4KLW9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDEwLTA0LTA3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0ib3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5QYWNrYWdlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS11c2UuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEI+UFJFViBQQUNLQUdFPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Qj5ORVhUIFBBQ0tBR0U8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9wYWNrYWdlLXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08SDI+Ci1QYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzCi08L0gyPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNsYXNzIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscyI+QW5ub3RhdGlvblV0aWxzPC9BPjwvQj48L1REPgotPFREPlV0aWxpdHkgY2xhc3MgZm9yIGFkZGluZywgcmVtb3ZpbmcgYW5kIHVwZGF0aW5nIGFubm90YXRpb25zIGFuZCBtZW1iZXIgdmFsdWUgcGFpcnMuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci0KLTxQPgotPERMPgotPC9ETD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlBhY2thZ2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXVzZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Qj5QUkVWIFBBQ0tBR0U8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxCPk5FWFQgUEFDS0FHRTwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL3BhY2thZ2Utc3VtbWFyeS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL3BhY2thZ2UtdHJlZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL3BhY2thZ2UtdHJlZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2I5MDcyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9wYWNrYWdlLXRyZWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMTQpIG9uIFdlZCBBcHIgMDcgMDc6NDY6MjIgQlNUIDIwMTAgLS0+Ci08VElUTEU+Ci1vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscyBDbGFzcyBIaWVyYXJjaHkKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTAtMDQtMDciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscyBDbGFzcyBIaWVyYXJjaHkiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5UcmVlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvcGFja2FnZS10cmVlLmh0bWwiPjxCPlBSRVY8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvcGFja2FnZS10cmVlLmh0bWwiPjxCPk5FWFQ8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9wYWNrYWdlLXRyZWUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgyPgotSGllcmFyY2h5IEZvciBQYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzCi08L0gyPgotPC9DRU5URVI+Ci08REw+Ci08RFQ+PEI+UGFja2FnZSBIaWVyYXJjaGllczo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+QWxsIFBhY2thZ2VzPC9BPjwvREw+Ci08SFI+Ci08SDI+Ci1DbGFzcyBIaWVyYXJjaHkKLTwvSDI+Ci08VUw+Ci08TEkgVFlQRT0iY2lyY2xlIj5qYXZhLmxhbmcuT2JqZWN0PFVMPgotPExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscyI+PEI+QW5ub3RhdGlvblV0aWxzPC9CPjwvQT48L1VMPgotPC9VTD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlRyZWU8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9wYWNrYWdlLXRyZWUuaHRtbCI+PEI+UFJFVjwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9wYWNrYWdlLXRyZWUuaHRtbCI+PEI+TkVYVDwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL3BhY2thZ2UtdHJlZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL3BhY2thZ2UtdXNlLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvcGFja2FnZS11c2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFmNDQ2Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvcGFja2FnZS11c2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMTQpIG9uIFdlZCBBcHIgMDcgMDc6NDY6MjMgQlNUIDIwMTAgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIFBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTAtMDQtMDciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIFBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL3BhY2thZ2UtdXNlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0icGFja2FnZS11c2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBQYWNrYWdlPGJyPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzPC9CPjwvSDI+Ci08L0NFTlRFUj4KLU5vIHVzYWdlIG9mIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzCi08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvcGFja2FnZS11c2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXVzZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL0pEVFV0aWxzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvSkRUVXRpbHMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q4MzhiNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvSkRUVXRpbHMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYzMSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMTQpIG9uIFdlZCBBcHIgMDcgMDc6NDY6MjIgQlNUIDIwMTAgLS0+Ci08VElUTEU+Ci1KRFRVdGlscwotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMC0wNC0wNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IkpEVFV0aWxzIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9KRFRVdGlscy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViBDTEFTUyZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvV1NETFV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscyI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL0pEVFV0aWxzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSkRUVXRpbHMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTwhLS0gPT09PT09PT0gU1RBUlQgT0YgQ0xBU1MgREFUQSA9PT09PT09PSAtLT4KLTxIMj4KLTxGT05UIFNJWkU9Ii0xIj4KLW9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzPC9GT05UPgotPEJSPgotQ2xhc3MgSkRUVXRpbHM8L0gyPgotPFBSRT4KLWphdmEubGFuZy5PYmplY3QKLSAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzPC9CPgotPC9QUkU+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgZmluYWwgY2xhc3MgPEI+SkRUVXRpbHM8L0I+PERUPmV4dGVuZHMgamF2YS5sYW5nLk9iamVjdDwvREw+Ci08L1BSRT4KLQotPFA+Ci1KRFQgVXRpbGl0eSBjbGFzcy4KLSA8cD4KLSA8c3Ryb25nPlByb3Zpc2lvbmFsIEFQSTo8L3N0cm9uZz4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyCi0gZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0Ci0gdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcwotIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSA8L3A+Ci08UD4KLQotPFA+Ci08SFI+Ci0KLTxQPgotCi08IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL0pEVFV0aWxzLmh0bWwjYWRkVG9DbGFzc3BhdGgob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0LCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnkpIj5hZGRUb0NsYXNzcGF0aDwvQT48L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdCZuYnNwO2phdmFQcm9qZWN0LAotICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5Jm5ic3A7Y2xhc3NwYXRoRW50cnkpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBZGQgYSA8Y29kZT5JQ2xhc3NwYXRoRW50cnk8L2NvZGU+IHRvIGEgPGNvZGU+SUphdmFQcm9qZWN0PC9jb2RlPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9KRFRVdGlscy5odG1sI2ZpbmRUeXBlKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdCwgamF2YS5sYW5nLlN0cmluZykiPmZpbmRUeXBlPC9BPjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Jm5ic3A7amF2YVByb2plY3QsCi0gICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7ZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBmaXJzdCB0eXBlIGZvdW5kIGZvbGxvd2luZyB0aGUgZ2l2ZW4gamF2YSBwcm9qZWN0J3MgY2xhc3NwYXRoIHdpdGggdGhlIGdpdmVuIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9yIG51bGwgaWYgbm9uZSBpcyBmb3VuZC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7b3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvSkRUVXRpbHMuaHRtbCNmaW5kVHlwZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKSI+ZmluZFR5cGU8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7cHJvamVjdE5hbWUsCi0gICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7ZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBmaXJzdCB0eXBlIGZvdW5kIHdpdGggdGhlIGdpdmVuIGZ1bGx5IHF1YWxpZmllZCBuYW1lIGZvbGxvd2luZyB0aGUgY2xhc3NwYXRoIG9mIHRoZSBqYXZhIHByb2plY3Qgd2l0aAotIHRoZSBnaXZlIHByb2plY3QgbmFtZSBvciBudWxsIGlmIG5vbmUgaXMgZm91bmQuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO29yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9KRFRVdGlscy5odG1sI2dldEphdmFQcm9qZWN0KGphdmEubGFuZy5TdHJpbmcpIj5nZXRKYXZhUHJvamVjdDwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtwcm9qZWN0TmFtZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIEphdmEgcHJvamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBwcm9qZWN0IG5hbWUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9KRFRVdGlscy5odG1sI2dldEphdmFQcm9qZWN0T3V0cHV0RGlyZWN0b3J5UGF0aChvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3QpIj5nZXRKYXZhUHJvamVjdE91dHB1dERpcmVjdG9yeVBhdGg8L0E+PC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3QmbmJzcDtqYXZhUHJvamVjdCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIGFic29sdXRlIHBhdGggaW4gdGhlIGxvY2FsIGZpbGUgc3lzdGVtIG9mIHRoZSBkZWZhdWx0IG91dHB1dCBsb2NhdGlvbiBmb3IgdGhlIGdpdmVuIGphdmEgcHJvamVjdC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL0pEVFV0aWxzLmh0bWwjZ2V0SmF2YVByb2plY3RPdXRwdXREaXJlY3RvcnlQYXRoKGphdmEubGFuZy5TdHJpbmcpIj5nZXRKYXZhUHJvamVjdE91dHB1dERpcmVjdG9yeVBhdGg8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7cHJvamVjdE5hbWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIGluIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSBvZiB0aGUgZGVmYXVsdCBvdXRwdXQgbG9jYXRpb24gZm9yIHRoZSBnaXZlbiBqYXZhIHByb2plY3QgbmFtZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL0pEVFV0aWxzLmh0bWwjZ2V0SmF2YVByb2plY3RTb3VyY2VEaXJlY3RvcnlQYXRoKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdCkiPmdldEphdmFQcm9qZWN0U291cmNlRGlyZWN0b3J5UGF0aDwvQT48L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdCZuYnNwO2phdmFQcm9qZWN0KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgZnVsbCwgYWJzb2x1dGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgd29ya3NwYWNlIG9mIHRoZSBmaXJzdCBzb3VyY2UgZm9sZGVyIGZvdW5kIGluIHRoZSBnaXZlbiBqYXZhIHByb2plY3QuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9KRFRVdGlscy5odG1sI2dldEphdmFQcm9qZWN0U291cmNlRGlyZWN0b3J5UGF0aChvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZSkiPmdldEphdmFQcm9qZWN0U291cmNlRGlyZWN0b3J5UGF0aDwvQT48L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlJm5ic3A7dHlwZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIGZ1bGwsIGFic29sdXRlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHdvcmtzcGFjZSBvZiB0aGUgc291cmNlIGZvbGRlciB0aGF0IGNvbnRhaW5zIHRoZSBnaXZlbiB0eXBlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvSkRUVXRpbHMuaHRtbCNnZXRKYXZhUHJvamVjdFNvdXJjZURpcmVjdG9yeVBhdGgoamF2YS5sYW5nLlN0cmluZykiPmdldEphdmFQcm9qZWN0U291cmNlRGlyZWN0b3J5UGF0aDwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtwcm9qZWN0TmFtZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIGZ1bGwsIGFic29sdXRlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHdvcmtzcGFjZSBvZiB0aGUgZmlyc3Qgc291cmNlIGZvbGRlciBmb3VuZCBpbiB0aGUgamF2YSBwcm9qZWN0IHdpdGggdGhlIGdpdmVuIG5hbWUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO29yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2RbXTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9KRFRVdGlscy5odG1sI2dldFB1YmxpY01ldGhvZHMob3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGUpIj5nZXRQdWJsaWNNZXRob2RzPC9BPjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGUmbmJzcDt0eXBlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7SWYgdGhlIGdpdmVuIDxjb2RlPklUeXBlPC9jb2RlPiBpcyBhbiBpbnRlcmZhY2UgYWxsIG1ldGhvZHMgZGVjbGFyZWQgaW4gdGhhdCBpbnRlcmZhY2UgYXJlIHJldHVybmVkLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL0pEVFV0aWxzLmh0bWwjZ2V0VGFyZ2V0TmFtZXNwYWNlRnJvbVBhY2thZ2VOYW1lKGphdmEubGFuZy5TdHJpbmcpIj5nZXRUYXJnZXROYW1lc3BhY2VGcm9tUGFja2FnZU5hbWU8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7cGFja2FnZU5hbWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDb25zdHJ1Y3RzIGEgdGFyZ2V0IG5hbWVzcGFjZSBzdHJpbmcgZnJvbSB0aGUgZ2l2ZW4gcGFja2FnZSBuYW1lIGJ5IHNwbGl0dGluZyB0aGUgZG90ICcuJyBzZXBhcmF0ZWQKLSBwYWNrYWdlIG5hbWUsIHJldmVyc2luZyB0aGUgb3JkZXIgb2YgdGhlIHBhY2thZ2UgbmFtZSBzZWdtZW50cyBmb2xsb3dlZCBieSBwcmVmaXhpbmcgdGhlIHN0cmluZyB3aXRoCi0gJ2h0dHA6Ly8nIGFuZCBhcHBlbmRpbmcgYSBmb3J3YXJkIHNsYXNoICcvJyB0byB0aGUgZW5kLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL0pEVFV0aWxzLmh0bWwjaXNKYXZhUHJvamVjdChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCkiPmlzSmF2YVByb2plY3Q8L0E+PC9CPihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCZuYnNwO3Byb2plY3QpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIHByb2plY3QgaGFzIHRoZSBqYXZhIG5hdHVyZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9KRFRVdGlscy5odG1sI2lzUHVibGljTWV0aG9kKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2QpIj5pc1B1YmxpY01ldGhvZDwvQT48L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2QmbmJzcDttZXRob2QpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIG1ldGhvZCBpc24ndCBhIG1haW4gbWV0aG9kIG9yIGNvbnN0cnVjdG9yIGFuZCBpZiBpdCBoYXMgdGhlIHB1YmxpYyBtb2RpZmllci48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9KRFRVdGlscy5odG1sI3JlbW92ZUZyb21DbGFzc3BhdGgob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0LCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnkpIj5yZW1vdmVGcm9tQ2xhc3NwYXRoPC9BPjwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Jm5ic3A7amF2YVByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeSZuYnNwO2NsYXNzcGF0aEVudHJ5KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmVtb3ZlIGEgPGNvZGU+SUNsYXNzcGF0aEVudHJ5PC9jb2RlPiBmcm9tIGEgPGNvZGU+SUphdmFQcm9qZWN0PC9jb2RlPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9KRFRVdGlscy5odG1sI3ZhbGlkYXRlSWRlbnRpZmllcihqYXZhLmxhbmcuU3RyaW5nKSI+dmFsaWRhdGVJZGVudGlmaWVyPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2lkKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VmFsaWRhdGVzIHRoZSBnaXZlbiBKYXZhIGlkZW50aWZpZXIgd2l0aCB0aGUgd29ya3NwYWNlIHNvdXJjZSBhbmQgY29tcGxpYW5jZSBsZXZlbHMuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL0pEVFV0aWxzLmh0bWwjdmFsaWRhdGVKYXZhVHlwZU5hbWUoamF2YS5sYW5nLlN0cmluZykiPnZhbGlkYXRlSmF2YVR5cGVOYW1lPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO25hbWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtWYWxpZGF0ZXMgdGhlIGdpdmVuIEphdmEgdHlwZSBuYW1lLCBlaXRoZXIgc2ltcGxlIG9yIHF1YWxpZmllZCwgdXNpbmcgdGhlIHdvcmtzcGFjZSBzb3VyY2UgYW5kIGNvbXBsaWFuY2UgbGV2ZWxzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9KRFRVdGlscy5odG1sI3ZhbGlkYXRlSmF2YVR5cGVOYW1lKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpIj52YWxpZGF0ZUphdmFUeXBlTmFtZTwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtwcm9qZWN0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtuYW1lKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VmFsaWRhdGVzIHRoZSBnaXZlbiBKYXZhIHR5cGUgbmFtZSwgZWl0aGVyIHNpbXBsZSBvciBxdWFsaWZpZWQsIHVzaW5nIHRoZSBnaXZlbiBwcm9qZWN0cyBzb3VyY2UgYW5kIGNvbXBsaWFuY2UgbGV2ZWxzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9KRFRVdGlscy5odG1sI3ZhbGlkYXRlUGFja2FnZU5hbWUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykiPnZhbGlkYXRlUGFja2FnZU5hbWU8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7cHJvamVjdE5hbWUsCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtwYWNrYWdlTmFtZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1ZhbGlkYXRlIHRoZSBnaXZlbiBwYWNrYWdlIG5hbWUgdXNpbmcgdGhlIGdpdmVuIHByb2plY3RzIHNvdXJjZSBhbmQgY29tcGxpYW5jZSBsZXZlbHMuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19qYXZhLmxhbmcuT2JqZWN0Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBqYXZhLmxhbmcuT2JqZWN0PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+Y2xvbmUsIGVxdWFscywgZmluYWxpemUsIGdldENsYXNzLCBoYXNoQ29kZSwgbm90aWZ5LCBub3RpZnlBbGwsIHRvU3RyaW5nLCB3YWl0LCB3YWl0LCB3YWl0PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iYWRkVG9DbGFzc3BhdGgob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0LCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnkpIj48IS0tIC0tPjwvQT48SDM+Ci1hZGRUb0NsYXNzcGF0aDwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyB2b2lkIDxCPmFkZFRvQ2xhc3NwYXRoPC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3QmbmJzcDtqYXZhUHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnkmbmJzcDtjbGFzc3BhdGhFbnRyeSk8L1BSRT4KLTxETD4KLTxERD5BZGQgYSA8Y29kZT5JQ2xhc3NwYXRoRW50cnk8L2NvZGU+IHRvIGEgPGNvZGU+SUphdmFQcm9qZWN0PC9jb2RlPgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5qYXZhUHJvamVjdDwvQ09ERT4gLSB0aGUgPGNvZGU+SUphdmFQcm9qZWN0PC9jb2RlPiB0byBhZGQgdGhlIGNsYXNzcGF0aCBlbnRyeSB0bzxERD48Q09ERT5jbGFzc3BhdGhFbnRyeTwvQ09ERT4gLSB0aGUgPGNvZGU+SUNsYXNzcGF0aEVudHJ5PC9jb2RlPiB0byBhZGQ8L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InJlbW92ZUZyb21DbGFzc3BhdGgob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0LCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnkpIj48IS0tIC0tPjwvQT48SDM+Ci1yZW1vdmVGcm9tQ2xhc3NwYXRoPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIHZvaWQgPEI+cmVtb3ZlRnJvbUNsYXNzcGF0aDwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Jm5ic3A7amF2YVByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnkmbmJzcDtjbGFzc3BhdGhFbnRyeSk8L1BSRT4KLTxETD4KLTxERD5SZW1vdmUgYSA8Y29kZT5JQ2xhc3NwYXRoRW50cnk8L2NvZGU+IGZyb20gYSA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+Ci08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmphdmFQcm9qZWN0PC9DT0RFPiAtIHRoZSA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+IHRvIHJlbW92ZSB0aGUgY2xhc3NwYXRoIGVudHJ5IGZyb208REQ+PENPREU+Y2xhc3NwYXRoRW50cnk8L0NPREU+IC0gdGhlIDxjb2RlPklDbGFzc3BhdGhFbnRyeTwvY29kZT4gdG8gcmVtb3ZlPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRKYXZhUHJvamVjdChqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0SmF2YVByb2plY3Q8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0IDxCPmdldEphdmFQcm9qZWN0PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7cHJvamVjdE5hbWUpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgSmF2YSBwcm9qZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHByb2plY3QgbmFtZS4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cHJvamVjdE5hbWU8L0NPREU+IC0gdGhlIHByb2plY3QgbmFtZQotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgSmF2YSBwcm9qZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHByb2plY3QgbmFtZTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0SmF2YVByb2plY3RPdXRwdXREaXJlY3RvcnlQYXRoKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldEphdmFQcm9qZWN0T3V0cHV0RGlyZWN0b3J5UGF0aDwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGggPEI+Z2V0SmF2YVByb2plY3RPdXRwdXREaXJlY3RvcnlQYXRoPC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3QmbmJzcDtqYXZhUHJvamVjdCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIGluIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSBvZiB0aGUgZGVmYXVsdCBvdXRwdXQgbG9jYXRpb24gZm9yIHRoZSBnaXZlbiBqYXZhIHByb2plY3QuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmphdmFQcm9qZWN0PC9DT0RFPiAtIHRoZSBqYXZhIHByb2plY3QKLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGRlZmF1bHQgb3V0cHV0IGZvbGRlciBmb3IgdGhlIGdpdmVuIGphdmEgcHJvamVjdDwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0SmF2YVByb2plY3RPdXRwdXREaXJlY3RvcnlQYXRoKGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRKYXZhUHJvamVjdE91dHB1dERpcmVjdG9yeVBhdGg8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoIDxCPmdldEphdmFQcm9qZWN0T3V0cHV0RGlyZWN0b3J5UGF0aDwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO3Byb2plY3ROYW1lKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgdGhlIGFic29sdXRlIHBhdGggaW4gdGhlIGxvY2FsIGZpbGUgc3lzdGVtIG9mIHRoZSBkZWZhdWx0IG91dHB1dCBsb2NhdGlvbiBmb3IgdGhlIGdpdmVuIGphdmEgcHJvamVjdCBuYW1lLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5wcm9qZWN0TmFtZTwvQ09ERT4gLSB0aGUgbmFtZSBvZiB0aGUgamF2YSBwcm9qZWN0Ci08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBkZWZhdWx0IG91dHB1dCBmb2xkZXIgZm9yIHRoZSBnaXZlbiBqYXZhIHByb2plY3QgbmFtZTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0SmF2YVByb2plY3RTb3VyY2VEaXJlY3RvcnlQYXRoKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0SmF2YVByb2plY3RTb3VyY2VEaXJlY3RvcnlQYXRoPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCA8Qj5nZXRKYXZhUHJvamVjdFNvdXJjZURpcmVjdG9yeVBhdGg8L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlJm5ic3A7dHlwZSk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSBmdWxsLCBhYnNvbHV0ZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSB3b3Jrc3BhY2Ugb2YgdGhlIHNvdXJjZSBmb2xkZXIgdGhhdCBjb250YWlucyB0aGUgZ2l2ZW4gdHlwZS4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+dHlwZTwvQ09ERT4gLSB0aGUgPGNvZGU+SVR5cGU8L2NvZGU+Ci08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBnaXZlbiA8Y29kZT5JVHlwZTwvY29kZT4gc291cmNlIGZvbGRlcjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0SmF2YVByb2plY3RTb3VyY2VEaXJlY3RvcnlQYXRoKGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRKYXZhUHJvamVjdFNvdXJjZURpcmVjdG9yeVBhdGg8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoIDxCPmdldEphdmFQcm9qZWN0U291cmNlRGlyZWN0b3J5UGF0aDwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO3Byb2plY3ROYW1lKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgdGhlIGZ1bGwsIGFic29sdXRlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHdvcmtzcGFjZSBvZiB0aGUgZmlyc3Qgc291cmNlIGZvbGRlciBmb3VuZCBpbiB0aGUgamF2YSBwcm9qZWN0IHdpdGggdGhlIGdpdmVuIG5hbWUuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnByb2plY3ROYW1lPC9DT0RFPiAtIHRoZSBuYW1lIG9mIHRoZSBqYXZhIHByb2plY3QKLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGZpcnN0IHNvdXJjZSBmb2xkZXIgZm91bmQgaW4gdGhlIGphdmEgcHJvamVjdCB3aXRoIHRoZSBnaXZlbiBuYW1lLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0SmF2YVByb2plY3RTb3VyY2VEaXJlY3RvcnlQYXRoKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldEphdmFQcm9qZWN0U291cmNlRGlyZWN0b3J5UGF0aDwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGggPEI+Z2V0SmF2YVByb2plY3RTb3VyY2VEaXJlY3RvcnlQYXRoPC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3QmbmJzcDtqYXZhUHJvamVjdCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSBmdWxsLCBhYnNvbHV0ZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSB3b3Jrc3BhY2Ugb2YgdGhlIGZpcnN0IHNvdXJjZSBmb2xkZXIgZm91bmQgaW4gdGhlIGdpdmVuIGphdmEgcHJvamVjdC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+amF2YVByb2plY3Q8L0NPREU+IC0gdGhlIDxjb2RlPklKYXZhUHJvamVjdDwvY29kZT4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGZpcnN0IHNvdXJjZSBmb2xkZXIgZm91bmQgaW4gdGhlIGdpdmVuIGphdmEgcHJvamVjdC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFB1YmxpY01ldGhvZHMob3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGUpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRQdWJsaWNNZXRob2RzPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2RbXSA8Qj5nZXRQdWJsaWNNZXRob2RzPC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZSZuYnNwO3R5cGUpPC9QUkU+Ci08REw+Ci08REQ+SWYgdGhlIGdpdmVuIDxjb2RlPklUeXBlPC9jb2RlPiBpcyBhbiBpbnRlcmZhY2UgYWxsIG1ldGhvZHMgZGVjbGFyZWQgaW4gdGhhdCBpbnRlcmZhY2UgYXJlIHJldHVybmVkLgotIDxwPgotIEFsdGVybmF0aXZlbHkgaWYgdGhlIGdpdmVuIGdpdmVuIDxjb2RlPklUeXBlPC9jb2RlPiBpcyBhIGNsYXNzLCBvbmx5IG1ldGhvZHMgdGhhdCBhcmUgZXhwbGljaXRseSBtYXJrZWQKLSBwdWJsaWMgYXJlIHJldHVybmVkLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT50eXBlPC9DT0RFPiAtIHRoZSA8Y29kZT5JVHlwZTwvY29kZT4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIHB1YmxpYyBtZXRob2RzIGRlY2xhcmVkIGluIHRoaXMgdHlwZTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0VGFyZ2V0TmFtZXNwYWNlRnJvbVBhY2thZ2VOYW1lKGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRUYXJnZXROYW1lc3BhY2VGcm9tUGFja2FnZU5hbWU8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyA8Qj5nZXRUYXJnZXROYW1lc3BhY2VGcm9tUGFja2FnZU5hbWU8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtwYWNrYWdlTmFtZSk8L1BSRT4KLTxETD4KLTxERD5Db25zdHJ1Y3RzIGEgdGFyZ2V0IG5hbWVzcGFjZSBzdHJpbmcgZnJvbSB0aGUgZ2l2ZW4gcGFja2FnZSBuYW1lIGJ5IHNwbGl0dGluZyB0aGUgZG90ICcuJyBzZXBhcmF0ZWQKLSBwYWNrYWdlIG5hbWUsIHJldmVyc2luZyB0aGUgb3JkZXIgb2YgdGhlIHBhY2thZ2UgbmFtZSBzZWdtZW50cyBmb2xsb3dlZCBieSBwcmVmaXhpbmcgdGhlIHN0cmluZyB3aXRoCi0gJ2h0dHA6Ly8nIGFuZCBhcHBlbmRpbmcgYSBmb3J3YXJkIHNsYXNoICcvJyB0byB0aGUgZW5kLgotIDxwPkUuZy4sIHRoZSBKYXZhIHBhY2thZ2Ug0mNvbS5leGFtcGxlLndz0yB3b3VsZCByZXR1cm4gdGhlIHRhcmdldCBuYW1lc3BhY2Ug0mh0dHA6Ly93cy5leGFtcGxlLmNvbS/TLjwvcD4KLSA8cD5JZiB0aGUgcGFja2FnZSBuYW1lIGlzIG51bGwgb3IgaXMgb2YgemVybyBsZW5ndGggICJodHRwOi8vZGVmYXVsdF9wYWNrYWdlLyIgaXMgcmV0dXJuZWQuPC9wPgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5wYWNrYWdlTmFtZTwvQ09ERT4gLSB0aGUgcGFja2FnZSBuYW1lCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBkZXJpdmVkIHRhcmdldCBuYW1lc3BhY2U8L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImZpbmRUeXBlKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdCwgamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLWZpbmRUeXBlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlIDxCPmZpbmRUeXBlPC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3QmbmJzcDtqYXZhUHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO2Z1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgdGhlIGZpcnN0IHR5cGUgZm91bmQgZm9sbG93aW5nIHRoZSBnaXZlbiBqYXZhIHByb2plY3QncyBjbGFzc3BhdGggd2l0aCB0aGUgZ2l2ZW4gZnVsbHkgcXVhbGlmaWVkIG5hbWUgb3IgbnVsbCBpZiBub25lIGlzIGZvdW5kLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5qYXZhUHJvamVjdDwvQ09ERT4gLSB0aGUgZ2l2ZW4gPGNvZGU+SUphdmFQcm9qZWN0PC9jb2RlPjxERD48Q09ERT5mdWxseVF1YWxpZmllZENsYXNzTmFtZTwvQ09ERT4gLSB0aGUgZ2l2ZW4gZnVsbHkgcXVhbGlmaWVkIG5hbWUKLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIGZpcnN0IHR5cGUgZm91bmQgZm9sbG93aW5nIHRoZSBqYXZhIHByb2plY3QncyBjbGFzc3BhdGggd2l0aCB0aGUgZ2l2ZW4gZnVsbHkgcXVhbGlmaWVkIG5hbWUgb3IgbnVsbCBpZiBub25lIGlzIGZvdW5kPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJmaW5kVHlwZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotZmluZFR5cGU8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGUgPEI+ZmluZFR5cGU8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtwcm9qZWN0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO2Z1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgdGhlIGZpcnN0IHR5cGUgZm91bmQgd2l0aCB0aGUgZ2l2ZW4gZnVsbHkgcXVhbGlmaWVkIG5hbWUgZm9sbG93aW5nIHRoZSBjbGFzc3BhdGggb2YgdGhlIGphdmEgcHJvamVjdCB3aXRoCi0gdGhlIGdpdmUgcHJvamVjdCBuYW1lIG9yIG51bGwgaWYgbm9uZSBpcyBmb3VuZC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cHJvamVjdE5hbWU8L0NPREU+IC0gdGhlIG5hbWUgb2YgdGhlIGphdmEgcHJvamVjdDxERD48Q09ERT5mdWxseVF1YWxpZmllZENsYXNzTmFtZTwvQ09ERT4gLSB0aGUgZ2l2ZW4gZnVsbHkgcXVhbGlmaWVkIG5hbWUKLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIGZpcnN0IHR5cGUgZm91bmQgZm9sbG93aW5nIHRoZSBqYXZhIHByb2plY3QncyBjbGFzc3BhdGggd2l0aCB0aGUgZ2l2ZW4gZnVsbHkgcXVhbGlmaWVkIG5hbWUgb3IgbnVsbCBpZiBub25lIGlzIGZvdW5kPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJpc0phdmFQcm9qZWN0KG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0KSI+PCEtLSAtLT48L0E+PEgzPgotaXNKYXZhUHJvamVjdDwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyBib29sZWFuIDxCPmlzSmF2YVByb2plY3Q8L0I+KG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Jm5ic3A7cHJvamVjdCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIHByb2plY3QgaGFzIHRoZSBqYXZhIG5hdHVyZS4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cHJvamVjdDwvQ09ERT4gLSB0aGUgZ2l2ZW4gcHJvamVjdAotPERUPjxCPlJldHVybnM6PC9CPjxERD48Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJvamVjdCBoYXMgdGhlIGphdmEgbmF0dXJlPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJpc1B1YmxpY01ldGhvZChvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kKSI+PCEtLSAtLT48L0E+PEgzPgotaXNQdWJsaWNNZXRob2Q8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiA8Qj5pc1B1YmxpY01ldGhvZDwvQj4ob3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZCZuYnNwO21ldGhvZCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIG1ldGhvZCBpc24ndCBhIG1haW4gbWV0aG9kIG9yIGNvbnN0cnVjdG9yIGFuZCBpZiBpdCBoYXMgdGhlIHB1YmxpYyBtb2RpZmllci4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+bWV0aG9kPC9DT0RFPiAtIHRoZSBnaXZlbiBtZXRob2QKLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+PGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIG1ldGhvZCBpcyBwdWJsaWM8L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InZhbGlkYXRlSmF2YVR5cGVOYW1lKGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci12YWxpZGF0ZUphdmFUeXBlTmFtZTwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyA8Qj52YWxpZGF0ZUphdmFUeXBlTmFtZTwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO25hbWUpPC9QUkU+Ci08REw+Ci08REQ+VmFsaWRhdGVzIHRoZSBnaXZlbiBKYXZhIHR5cGUgbmFtZSwgZWl0aGVyIHNpbXBsZSBvciBxdWFsaWZpZWQsIHVzaW5nIHRoZSB3b3Jrc3BhY2Ugc291cmNlIGFuZCBjb21wbGlhbmNlIGxldmVscy4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+bmFtZTwvQ09ERT4gLSB0aGUgbmFtZSBvZiBhIHR5cGUKLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+YSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSBJU3RhdHVzLk9LIGlmIHRoZSBnaXZlbiBuYW1lIGlzIHZhbGlkIGFzIGEgSmF2YSB0eXBlIG5hbWUsIGEgc3RhdHVzIHdpdGgKLSBjb2RlIElTdGF0dXMuV0FSTklORyBpbmRpY2F0aW5nIHdoeSB0aGUgZ2l2ZW4gbmFtZSBpcyBkaXNjb3VyYWdlZCwgb3RoZXJ3aXNlIGEgc3RhdHVzIG9iamVjdCBpbmRpY2F0aW5nIHdoYXQgaXMgd3Jvbmcgd2l0aCB0aGUgbmFtZTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0idmFsaWRhdGVKYXZhVHlwZU5hbWUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLXZhbGlkYXRlSmF2YVR5cGVOYW1lPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzIDxCPnZhbGlkYXRlSmF2YVR5cGVOYW1lPC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7cHJvamVjdE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtuYW1lKTwvUFJFPgotPERMPgotPEREPlZhbGlkYXRlcyB0aGUgZ2l2ZW4gSmF2YSB0eXBlIG5hbWUsIGVpdGhlciBzaW1wbGUgb3IgcXVhbGlmaWVkLCB1c2luZyB0aGUgZ2l2ZW4gcHJvamVjdHMgc291cmNlIGFuZCBjb21wbGlhbmNlIGxldmVscy4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cHJvamVjdE5hbWU8L0NPREU+IC0gdGhlIG5hbWUgb2YgdGhlIGphdmEgcHJvamVjdDxERD48Q09ERT5uYW1lPC9DT0RFPiAtIHRoZSBuYW1lIG9mIGEgdHlwZQotPERUPjxCPlJldHVybnM6PC9CPjxERD5hIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIElTdGF0dXMuT0sgaWYgdGhlIGdpdmVuIG5hbWUgaXMgdmFsaWQgYXMgYSBKYXZhIHR5cGUgbmFtZSwgYSBzdGF0dXMgd2l0aAotIGNvZGUgSVN0YXR1cy5XQVJOSU5HIGluZGljYXRpbmcgd2h5IHRoZSBnaXZlbiBuYW1lIGlzIGRpc2NvdXJhZ2VkLCBvdGhlcndpc2UgYSBzdGF0dXMgb2JqZWN0IGluZGljYXRpbmcgd2hhdCBpcyB3cm9uZyB3aXRoIHRoZSBuYW1lPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJ2YWxpZGF0ZVBhY2thZ2VOYW1lKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci12YWxpZGF0ZVBhY2thZ2VOYW1lPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzIDxCPnZhbGlkYXRlUGFja2FnZU5hbWU8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtwcm9qZWN0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7cGFja2FnZU5hbWUpPC9QUkU+Ci08REw+Ci08REQ+VmFsaWRhdGUgdGhlIGdpdmVuIHBhY2thZ2UgbmFtZSB1c2luZyB0aGUgZ2l2ZW4gcHJvamVjdHMgc291cmNlIGFuZCBjb21wbGlhbmNlIGxldmVscy4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cHJvamVjdE5hbWU8L0NPREU+IC0gdGhlIG5hbWUgb2YgdGhlIGphdmEgcHJvamVjdDxERD48Q09ERT5wYWNrYWdlTmFtZTwvQ09ERT4gLSB0aGUgbmFtZSBvZiBhIHBhY2thZ2UKLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+YSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSBJU3RhdHVzLk9LIGlmIHRoZSBnaXZlbiBuYW1lIGlzIHZhbGlkIGFzIGEgcGFja2FnZSBuYW1lLCBvdGhlcndpc2UgYSBzdGF0dXMKLSBvYmplY3QgaW5kaWNhdGluZyB3aGF0IGlzIHdyb25nIHdpdGggdGhlIG5hbWU8L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InZhbGlkYXRlSWRlbnRpZmllcihqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotdmFsaWRhdGVJZGVudGlmaWVyPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzIDxCPnZhbGlkYXRlSWRlbnRpZmllcjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2lkKTwvUFJFPgotPERMPgotPEREPlZhbGlkYXRlcyB0aGUgZ2l2ZW4gSmF2YSBpZGVudGlmaWVyIHdpdGggdGhlIHdvcmtzcGFjZSBzb3VyY2UgYW5kIGNvbXBsaWFuY2UgbGV2ZWxzLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5pZDwvQ09ERT4gLSB0aGUgSmF2YSBpZGVudGlmaWVyCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPmEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgSVN0YXR1cy5PSyBpZiB0aGUgZ2l2ZW4gaWRlbnRpZmllciBpcyBhIHZhbGlkIEphdmEgaWRlbnRpZmllciwgb3RoZXJ3aXNlCi0gYSBzdGF0dXMgb2JqZWN0IGluZGljYXRpbmcgd2hhdCBpcyB3cm9uZyB3aXRoIHRoZSBpZGVudGlmaWVyPC9ETD4KLTwvREQ+Ci08L0RMPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIENMQVNTIERBVEEgPT09PT09PT09IC0tPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9KRFRVdGlscy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViBDTEFTUyZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvV1NETFV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscyI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL0pEVFV0aWxzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSkRUVXRpbHMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL1dTRExVdGlscy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL1dTRExVdGlscy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTI4NjQ4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9XU0RMVXRpbHMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMTQpIG9uIFdlZCBBcHIgMDcgMDc6NDY6MjIgQlNUIDIwMTAgLS0+Ci08VElUTEU+Ci1XU0RMVXRpbHMKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTAtMDQtMDciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJXU0RMVXRpbHMiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL1dTRExVdGlscy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvSkRUVXRpbHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwO05FWFQgQ0xBU1M8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvV1NETFV0aWxzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iV1NETFV0aWxzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNmaWVsZF9zdW1tYXJ5Ij5GSUVMRDwvQT4mbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDs8QSBIUkVGPSIjZmllbGRfZGV0YWlsIj5GSUVMRDwvQT4mbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08IS0tID09PT09PT09IFNUQVJUIE9GIENMQVNTIERBVEEgPT09PT09PT0gLS0+Ci08SDI+Ci08Rk9OVCBTSVpFPSItMSI+Ci1vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlsczwvRk9OVD4KLTxCUj4KLUNsYXNzIFdTRExVdGlsczwvSDI+Ci08UFJFPgotamF2YS5sYW5nLk9iamVjdAotICA8SU1HIFNSQz0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vcmVzb3VyY2VzL2luaGVyaXQuZ2lmIiBBTFQ9ImV4dGVuZGVkIGJ5ICI+PEI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuV1NETFV0aWxzPC9CPgotPC9QUkU+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgZmluYWwgY2xhc3MgPEI+V1NETFV0aWxzPC9CPjxEVD5leHRlbmRzIGphdmEubGFuZy5PYmplY3Q8L0RMPgotPC9QUkU+Ci0KLTxQPgotV1NETCBVdGlsaXR5IGNsYXNzLgotIDxwPgotIDxzdHJvbmc+UHJvdmlzaW9uYWwgQVBJOjwvc3Ryb25nPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIKLSBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQKLSB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzCi0gdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotIDwvcD4KLTxQPgotCi08UD4KLTxIUj4KLQotPFA+Ci08IS0tID09PT09PT09PT09IEZJRUxEIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImZpZWxkX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5GaWVsZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9XU0RMVXRpbHMuaHRtbCNXU0RMX0ZJTEVfRVhURU5TSU9OIj5XU0RMX0ZJTEVfRVhURU5TSU9OPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7amF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL1dTRExVdGlscy5odG1sI2dldEVuZHBvaW50QWRkcmVzcyhqYXZheC53c2RsLkRlZmluaXRpb24pIj5nZXRFbmRwb2ludEFkZHJlc3M8L0E+PC9CPihqYXZheC53c2RsLkRlZmluaXRpb24mbmJzcDtkZWZpbml0aW9uKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgZmlyc3QgPGNvZGU+U09BUEFkZHJlc3M8L2NvZGU+IG9yIDxjb2RlPlNPQVAxMkFkZHJlc3M8L2NvZGU+IGZvdW5kIGluIHRoZSBnaXZlbgotIDxjb2RlPkRlZmluaXRpb248L2NvZGU+IG9yIG51bGwgaWYgbm9uZSBpcyBmb3VuZC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9XU0RMVXRpbHMuaHRtbCNnZXRQYWNrYWdlTmFtZUZyb21OYW1lc3BhY2UoamF2YS5sYW5nLlN0cmluZykiPmdldFBhY2thZ2VOYW1lRnJvbU5hbWVzcGFjZTwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtuYW1lc3BhY2UpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDb25zdHJ1Y3RzIGEgZG90IHNlcGFyYXRlZCBwYWNrYWdlIG5hbWUgZnJvbSBhIGdpdmVuIG5hbWVzcGFjZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7b3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9XU0RMVXRpbHMuaHRtbCNnZXRXZWJDb250ZW50Rm9sZGVyKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0KSI+Z2V0V2ViQ29udGVudEZvbGRlcjwvQT48L0I+KG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Jm5ic3A7cHJvamVjdCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIFdlYiBDb250ZW50IGZvbGRlciBvZiB0aGUgZ2l2ZW4gcHJvamVjdC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7b3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9XU0RMVXRpbHMuaHRtbCNnZXRXU0RMRm9sZGVyKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0KSI+Z2V0V1NETEZvbGRlcjwvQT48L0I+KG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Jm5ic3A7cHJvamVjdCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIFdTREwgZm9sZGVyIG9mIHRoZSBnaXZlbiBwcm9qZWN0LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL1dTRExVdGlscy5odG1sI2dldFdTRExGb2xkZXIoamF2YS5sYW5nLlN0cmluZykiPmdldFdTRExGb2xkZXI8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7cHJvamVjdE5hbWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBXU0RMIGZvbGRlciBvZiB0aGUgcHJvamVjdCB3aXRoIHRoZSBnaXZlbiBuYW1lLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL1dTRExVdGlscy5odG1sI2dldFdTRExMb2NhdGlvbihqYXZheC53c2RsLkRlZmluaXRpb24pIj5nZXRXU0RMTG9jYXRpb248L0E+PC9CPihqYXZheC53c2RsLkRlZmluaXRpb24mbmJzcDtkZWZpbml0aW9uKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgbG9jYXRpb24gVVJJIGZyb20gdGhlIGZpcnN0IDxjb2RlPlNPQVBBZGRyZXNzPC9jb2RlPiBvciA8Y29kZT5TT0FQMTJBZGRyZXNzPC9jb2RlPiBmb3VuZAotIGluIHRoZSBnaXZlbiA8Y29kZT5EZWZpbml0aW9uPC9jb2RlPiBvciBudWxsIGlmIG5vbmUgaXMgZm91bmQuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvV1NETFV0aWxzLmh0bWwjaXNWYWxpZFdTRExGaWxlTmFtZShqYXZhLmxhbmcuU3RyaW5nKSI+aXNWYWxpZFdTRExGaWxlTmFtZTwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDt3c2RsRmlsZU5hbWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBmaWxlIG5hbWUgY29udGFpbnMgQWxwaGFudW1lcmljIGNoYXJhY3RlcnMsIHVuZGVyc2NvcmUgJ18nLAotIGRhc2hlcyAnLScgYW5kIGVuZHMgd2l0aCB0aGUgJy53c2RsJyBleHRlbnNpb24uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2phdmF4LndzZGwuRGVmaW5pdGlvbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9XU0RMVXRpbHMuaHRtbCNyZWFkV1NETChqYXZhLm5ldC5VUkwpIj5yZWFkV1NETDwvQT48L0I+KGphdmEubmV0LlVSTCZuYnNwO3dzZGxVUkwpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIGEgPGNvZGU+amF2YXgud3NkbC5EZWZpbml0aW9uPC9jb2RlPiBieSByZWFkaW5nIHRoZSBXU0RMIGRvY3VtZW50IGF0IHRoZSBnaXZlbiBVUkwgb3IgbnVsbCBpZiBub25lIGNhbiBiZSBmb3VuZAotIG9yIGlmIHRoZSBjb25uZWN0aW9uIHRpbWVzIG91dC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9XU0RMVXRpbHMuaHRtbCN3cml0ZVdTREwoamF2YS5uZXQuVVJMLCBqYXZheC53c2RsLkRlZmluaXRpb24pIj53cml0ZVdTREw8L0E+PC9CPihqYXZhLm5ldC5VUkwmbmJzcDt3c2RsVVJMLAotICAgICAgICAgIGphdmF4LndzZGwuRGVmaW5pdGlvbiZuYnNwO2RlZmluaXRpb24pPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtXcml0ZXMgdGhlIGdpdmVuIDxjb2RlPmphdmF4LndzZGwuRGVmaW5pdGlvbjwvY29kZT4gdG8gdGhlIHdzZGwgZG9jdW1lbnQgYXQgdGhlIGdpdmVuIFVSTC48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDs8QSBOQU1FPSJtZXRob2RzX2luaGVyaXRlZF9mcm9tX2NsYXNzX2phdmEubGFuZy5PYmplY3QiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGNsYXNzIGphdmEubGFuZy5PYmplY3Q8L0I+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT5jbG9uZSwgZXF1YWxzLCBmaW5hbGl6ZSwgZ2V0Q2xhc3MsIGhhc2hDb2RlLCBub3RpZnksIG5vdGlmeUFsbCwgdG9TdHJpbmcsIHdhaXQsIHdhaXQsIHdhaXQ8L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT09PT0gRklFTEQgREVUQUlMID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJmaWVsZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5GaWVsZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iV1NETF9GSUxFX0VYVEVOU0lPTiI+PCEtLSAtLT48L0E+PEgzPgotV1NETF9GSUxFX0VYVEVOU0lPTjwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIDxCPldTRExfRklMRV9FWFRFTlNJT048L0I+PC9QUkU+Ci08REw+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9jb25zdGFudC12YWx1ZXMuaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5XU0RMVXRpbHMuV1NETF9GSUxFX0VYVEVOU0lPTiI+Q29uc3RhbnQgRmllbGQgVmFsdWVzPC9BPjwvREw+Ci08L0RMPgotCi08IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9InJlYWRXU0RMKGphdmEubmV0LlVSTCkiPjwhLS0gLS0+PC9BPjxIMz4KLXJlYWRXU0RMPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIGphdmF4LndzZGwuRGVmaW5pdGlvbiA8Qj5yZWFkV1NETDwvQj4oamF2YS5uZXQuVVJMJm5ic3A7d3NkbFVSTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb248L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIGEgPGNvZGU+amF2YXgud3NkbC5EZWZpbml0aW9uPC9jb2RlPiBieSByZWFkaW5nIHRoZSBXU0RMIGRvY3VtZW50IGF0IHRoZSBnaXZlbiBVUkwgb3IgbnVsbCBpZiBub25lIGNhbiBiZSBmb3VuZAotIG9yIGlmIHRoZSBjb25uZWN0aW9uIHRpbWVzIG91dC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+d3NkbFVSTDwvQ09ERT4gLSB0aGUgdXJsIG9mIHRoZSB3c2RsIGRvY3VtZW50IHRvIHJlYWQuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBkZWZpbml0aW9uIGRlc2NyaWJlZCBpbiB0aGUgd3NkbCBkb2N1bWVudCBwb2ludGVkIHRvIGJ5IHRoZSBnaXZlbiBVUkwuCi08RFQ+PEI+VGhyb3dzOjwvQj4KLTxERD48Q09ERT5qYXZhLmlvLklPRXhjZXB0aW9uPC9DT0RFPiAtIGlmIGFuIEkvTyBleGNlcHRpb24gb2NjdXJzLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0id3JpdGVXU0RMKGphdmEubmV0LlVSTCwgamF2YXgud3NkbC5EZWZpbml0aW9uKSI+PCEtLSAtLT48L0E+PEgzPgotd3JpdGVXU0RMPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIHZvaWQgPEI+d3JpdGVXU0RMPC9CPihqYXZhLm5ldC5VUkwmbmJzcDt3c2RsVVJMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC53c2RsLkRlZmluaXRpb24mbmJzcDtkZWZpbml0aW9uKQotICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjwvUFJFPgotPERMPgotPEREPldyaXRlcyB0aGUgZ2l2ZW4gPGNvZGU+amF2YXgud3NkbC5EZWZpbml0aW9uPC9jb2RlPiB0byB0aGUgd3NkbCBkb2N1bWVudCBhdCB0aGUgZ2l2ZW4gVVJMLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT53c2RsVVJMPC9DT0RFPiAtIHRoZSB1cmwgb2YgdGhlIHdzZGwgZG9jdW1lbnQgdG8gd3JpdGUgdG8uPEREPjxDT0RFPmRlZmluaXRpb248L0NPREU+IC0gdGhlIFdTREwgZGVmaW5pdGlvbiB0byBiZSB3cml0dGVuLgotPERUPjxCPlRocm93czo8L0I+Ci08REQ+PENPREU+amF2YS5pby5JT0V4Y2VwdGlvbjwvQ09ERT4gLSBpZiBhbiBJL08gZXhjZXB0aW9uIG9jY3Vycy4KLTxERD48Q09ERT5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjwvQ09ERT4gLSBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHJlZnJlc2hpbmcgdGhlIGZpbGUgaW4gdGhlIHdvcmtzcGFjZSBpZiBpdCBleGlzdHMuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJpc1ZhbGlkV1NETEZpbGVOYW1lKGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1pc1ZhbGlkV1NETEZpbGVOYW1lPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIGJvb2xlYW4gPEI+aXNWYWxpZFdTRExGaWxlTmFtZTwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO3dzZGxGaWxlTmFtZSk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBmaWxlIG5hbWUgY29udGFpbnMgQWxwaGFudW1lcmljIGNoYXJhY3RlcnMsIHVuZGVyc2NvcmUgJ18nLAotIGRhc2hlcyAnLScgYW5kIGVuZHMgd2l0aCB0aGUgJy53c2RsJyBleHRlbnNpb24uIE90aGVyd2lzZSByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPi4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+d3NkbEZpbGVOYW1lPC9DT0RFPiAtIHRoZSB3c2RsIGZpbGUgbmFtZQotPERUPjxCPlJldHVybnM6PC9CPjxERD48Y29kZT50cnVlPC9jb2RlPiBpZiB2YWxpZCwgY29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0V2ViQ29udGVudEZvbGRlcihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFdlYkNvbnRlbnRGb2xkZXI8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlciA8Qj5nZXRXZWJDb250ZW50Rm9sZGVyPC9CPihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCZuYnNwO3Byb2plY3QpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgV2ViIENvbnRlbnQgZm9sZGVyIG9mIHRoZSBnaXZlbiBwcm9qZWN0LiBUaGUgcmV0dXJuZWQgcmVzb3VyY2UgbWF5IG5vdCBleGlzdC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cHJvamVjdDwvQ09ERT4gLSB0aGUgbmFtZSBvZiB0aGUgd2ViIHByb2plY3QKLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIHdlYiBjb250ZW50IGZvbGRlcjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0V1NETEZvbGRlcihqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0V1NETEZvbGRlcjwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyIDxCPmdldFdTRExGb2xkZXI8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtwcm9qZWN0TmFtZSk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSBXU0RMIGZvbGRlciBvZiB0aGUgcHJvamVjdCB3aXRoIHRoZSBnaXZlbiBuYW1lLiBUaGUgV1NETCBmb2xkZXIgcGF0aCBpcyB0aGUgcHJvamVjdHMgd2ViIGNvbnRlbnQgZm9sZGVyCi0gcGF0aCBhcHBlbmRlZCB3aXRoIHRoZSAnV1NETCcgZGlyZWN0b3J5LiBUaGUgcmV0dXJuZWQgcmVzb3VyY2UgbWF5IG5vdCBleGlzdC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cHJvamVjdE5hbWU8L0NPREU+IC0gdGhlIG5hbWUgb2YgdGhlIHdlYiBwcm9qZWN0Ci08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSB3c2RsIGZvbGRlcjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0V1NETEZvbGRlcihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFdTRExGb2xkZXI8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlciA8Qj5nZXRXU0RMRm9sZGVyPC9CPihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCZuYnNwO3Byb2plY3QpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgV1NETCBmb2xkZXIgb2YgdGhlIGdpdmVuIHByb2plY3QuIFRoZSBXU0RMIGZvbGRlciBwYXRoIGlzIHRoZSBwcm9qZWN0cyB3ZWIgY29udGVudCBmb2xkZXIKLSBwYXRoIGFwcGVuZGVkIHdpdGggdGhlICdXU0RMJyBkaXJlY3RvcnkuIFRoZSByZXR1cm5lZCByZXNvdXJjZSBtYXkgbm90IGV4aXN0LgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5wcm9qZWN0TmFtZTwvQ09ERT4gLSB0aGUgbmFtZSBvZiB0aGUgd2ViIHByb2plY3QKLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIHdzZGwgZm9sZGVyPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRFbmRwb2ludEFkZHJlc3MoamF2YXgud3NkbC5EZWZpbml0aW9uKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0RW5kcG9pbnRBZGRyZXNzPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudCA8Qj5nZXRFbmRwb2ludEFkZHJlc3M8L0I+KGphdmF4LndzZGwuRGVmaW5pdGlvbiZuYnNwO2RlZmluaXRpb24pPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgZmlyc3QgPGNvZGU+U09BUEFkZHJlc3M8L2NvZGU+IG9yIDxjb2RlPlNPQVAxMkFkZHJlc3M8L2NvZGU+IGZvdW5kIGluIHRoZSBnaXZlbgotIDxjb2RlPkRlZmluaXRpb248L2NvZGU+IG9yIG51bGwgaWYgbm9uZSBpcyBmb3VuZC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+ZGVmaW5pdGlvbjwvQ09ERT4gLSB0aGUgZ2l2ZW4gZGVmaW5pdGlvbi4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+cmV0dXJuIG9uZSBvZjoKLSA8bGk+U09BUEFkZHJlc3M8bGk+U09BUDEyQWRkcmVzczxsaT5udWxsIGlmIGl0IGNhbiBub3QgZmluZCBhIHNvYXAgYWRkcmVzczwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0V1NETExvY2F0aW9uKGphdmF4LndzZGwuRGVmaW5pdGlvbikiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFdTRExMb2NhdGlvbjwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIDxCPmdldFdTRExMb2NhdGlvbjwvQj4oamF2YXgud3NkbC5EZWZpbml0aW9uJm5ic3A7ZGVmaW5pdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgbG9jYXRpb24gVVJJIGZyb20gdGhlIGZpcnN0IDxjb2RlPlNPQVBBZGRyZXNzPC9jb2RlPiBvciA8Y29kZT5TT0FQMTJBZGRyZXNzPC9jb2RlPiBmb3VuZAotIGluIHRoZSBnaXZlbiA8Y29kZT5EZWZpbml0aW9uPC9jb2RlPiBvciBudWxsIGlmIG5vbmUgaXMgZm91bmQuIFRoZSByZXR1cm5lZCBsb2NhdGlvbiBVUkkgaXMgYXBwZW5kZWQgd2l0aAotIHRoZSAnP3dzZGwnIHF1ZXJ5IGlmIHRoZSBxdWVyeSB3YXMgbm90IHByZXNlbnQgaW4gdGhlIDxjb2RlPlNPQVBBZGRyZXNzPC9jb2RlPiBvciA8Y29kZT5TT0FQMTJBZGRyZXNzPC9jb2RlPiBsb2NhdGlvbiBVUkkuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmRlZmluaXRpb248L0NPREU+IC0gdGhlIGdpdmVuIGRlZmludGlvbi4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIGxvY2F0aW9uIFVSSSBvciB0aGUgZmlyc3QgPGNvZGU+U09BUEFkZHJlc3M8L2NvZGU+IG9yIDxjb2RlPlNPQVAxMkFkZHJlc3M8L2NvZGU+IGZvdW5kIGluIHRoZSBnaXZlbiBkZWZpbml0aW9uLgotPERUPjxCPlRocm93czo8L0I+Ci08REQ+PENPREU+amF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uPC9DT0RFPiAtIGlmIGFuIGVycm9yIG9jY3VycyB0ZXN0aW5nIHRoZSBsb2NhdGlvbiBVUkkgZm9yIGEgcXVlcnkgcGFydC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFBhY2thZ2VOYW1lRnJvbU5hbWVzcGFjZShqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0UGFja2FnZU5hbWVGcm9tTmFtZXNwYWNlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgPEI+Z2V0UGFja2FnZU5hbWVGcm9tTmFtZXNwYWNlPC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bmFtZXNwYWNlKTwvUFJFPgotPERMPgotPEREPkNvbnN0cnVjdHMgYSBkb3Qgc2VwYXJhdGVkIHBhY2thZ2UgbmFtZSBmcm9tIGEgZ2l2ZW4gbmFtZXNwYWNlLgotIDxwPkUuZy4sIHRoZSBuYW1lc3BhY2Ug0mh0dHA6Ly93cy5leGFtcGxlLmNvbS/TIHdvdWxkIHJldHVybiB0aGUgSmF2YSBwYWNrYWdlIG5hbWUg0mNvbS5leGFtcGxlLndz0y48L3A+Ci0gPHA+Ti5CLiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBwcmVzZXJ2ZSAnd3d3JyBpbiB0aGUgcmV0dXJuZWQgcGFja2FnZSBuYW1lIGlmIGl0IGV4aXN0cyBpbiB0aGUgZ2l2ZW4gbmFtZXNwYWNlLjwvcD4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+bmFtZXNwYWNlPC9DT0RFPiAtIHRoZSBnaXZlbiBuYW1lLgotPERUPjxCPlJldHVybnM6PC9CPjxERD5hIHBhY2thZ2UgbmFtZS48L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL1dTRExVdGlscy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvSkRUVXRpbHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwO05FWFQgQ0xBU1M8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvV1NETFV0aWxzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iV1NETFV0aWxzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNmaWVsZF9zdW1tYXJ5Ij5GSUVMRDwvQT4mbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDs8QSBIUkVGPSIjZmllbGRfZGV0YWlsIj5GSUVMRDwvQT4mbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9jbGFzcy11c2UvSkRUVXRpbHMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9jbGFzcy11c2UvSkRUVXRpbHMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU1MWJmZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvY2xhc3MtdXNlL0pEVFV0aWxzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjQ2OjIzIEJTVCAyMDEwIC0tPgotPFRJVExFPgotVXNlcyBvZiBDbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5KRFRVdGlscwotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMC0wNC0wNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHMiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9KRFRVdGlscy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9cY2xhc3MtdXNlSkRUVXRpbHMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJKRFRVdGlscy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIENsYXNzPGJyPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzPC9CPjwvSDI+Ci08L0NFTlRFUj4KLU5vIHVzYWdlIG9mIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzCi08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL0pEVFV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscyI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL1xjbGFzcy11c2VKRFRVdGlscy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IkpEVFV0aWxzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvY2xhc3MtdXNlL1dTRExVdGlscy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL2NsYXNzLXVzZS9XU0RMVXRpbHMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIzNzkwZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvY2xhc3MtdXNlL1dTRExVdGlscy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8xNCkgb24gV2VkIEFwciAwNyAwNzo0NjoyMyBCU1QgMjAxMCAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuV1NETFV0aWxzCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDEwLTA0LTA3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBDbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5XU0RMVXRpbHMiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9XU0RMVXRpbHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvXGNsYXNzLXVzZVdTRExVdGlscy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IldTRExVdGlscy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIENsYXNzPGJyPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLldTRExVdGlsczwvQj48L0gyPgotPC9DRU5URVI+Ci1ObyB1c2FnZSBvZiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5XU0RMVXRpbHMKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvV1NETFV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscyI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL1xjbGFzcy11c2VXU0RMVXRpbHMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJXU0RMVXRpbHMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9wYWNrYWdlLWZyYW1lLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvcGFja2FnZS1mcmFtZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2QxMWE1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9wYWNrYWdlLWZyYW1lLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMTQpIG9uIFdlZCBBcHIgMDcgMDc6NDY6MjIgQlNUIDIwMTAgLS0+Ci08VElUTEU+Ci1vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscwotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMC0wNC0wNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIj4KLTxGT05UIHNpemU9IisxIiBDTEFTUz0iRnJhbWVUaXRsZUZvbnQiPgotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iY2xhc3NGcmFtZSI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHM8L0E+PC9GT05UPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgTk9XUkFQPjxGT05UIHNpemU9IisxIiBDTEFTUz0iRnJhbWVIZWFkaW5nRm9udCI+Ci1DbGFzc2VzPC9GT05UPiZuYnNwOwotPEZPTlQgQ0xBU1M9IkZyYW1lSXRlbUZvbnQiPgotPEJSPgotPEEgSFJFRj0iSkRUVXRpbHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPkpEVFV0aWxzPC9BPgotPEJSPgotPEEgSFJFRj0iV1NETFV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscyIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5XU0RMVXRpbHM8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLQotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvcGFja2FnZS1zdW1tYXJ5Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvcGFja2FnZS1zdW1tYXJ5Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1OTM4NzkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL3BhY2thZ2Utc3VtbWFyeS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8xNCkgb24gV2VkIEFwciAwNyAwNzo0NjoyMiBCU1QgMjAxMCAtLT4KLTxUSVRMRT4KLW9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDEwLTA0LTA3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5QYWNrYWdlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS11c2UuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Qj5QUkVWIFBBQ0tBR0U8L0I+PC9BPiZuYnNwOwotJm5ic3A7TkVYVCBQQUNLQUdFPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL3BhY2thZ2Utc3VtbWFyeS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxIMj4KLVBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMKLTwvSDI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q2xhc3MgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9KRFRVdGlscy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMiPkpEVFV0aWxzPC9BPjwvQj48L1REPgotPFREPkpEVCBVdGlsaXR5IGNsYXNzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvV1NETFV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscyI+V1NETFV0aWxzPC9BPjwvQj48L1REPgotPFREPldTREwgVXRpbGl0eSBjbGFzcy48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLQotPFA+Ci08REw+Ci08L0RMPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdXNlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEI+UFJFViBQQUNLQUdFPC9CPjwvQT4mbmJzcDsKLSZuYnNwO05FWFQgUEFDS0FHRTwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9wYWNrYWdlLXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9wYWNrYWdlLXRyZWUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9wYWNrYWdlLXRyZWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ5OGMwZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvcGFja2FnZS10cmVlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjQ2OjIyIEJTVCAyMDEwIC0tPgotPFRJVExFPgotb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMgQ2xhc3MgSGllcmFyY2h5Ci08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDEwLTA0LTA3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMgQ2xhc3MgSGllcmFyY2h5IjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VHJlZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvcGFja2FnZS10cmVlLmh0bWwiPjxCPlBSRVY8L0I+PC9BPiZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9wYWNrYWdlLXRyZWUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgyPgotSGllcmFyY2h5IEZvciBQYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzCi08L0gyPgotPC9DRU5URVI+Ci08REw+Ci08RFQ+PEI+UGFja2FnZSBIaWVyYXJjaGllczo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+QWxsIFBhY2thZ2VzPC9BPjwvREw+Ci08SFI+Ci08SDI+Ci1DbGFzcyBIaWVyYXJjaHkKLTwvSDI+Ci08VUw+Ci08TEkgVFlQRT0iY2lyY2xlIj5qYXZhLmxhbmcuT2JqZWN0PFVMPgotPExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvSkRUVXRpbHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzIj48Qj5KRFRVdGlsczwvQj48L0E+PExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvV1NETFV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscyI+PEI+V1NETFV0aWxzPC9CPjwvQT48L1VMPgotPC9VTD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlRyZWU8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL3BhY2thZ2UtdHJlZS5odG1sIj48Qj5QUkVWPC9CPjwvQT4mbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvcGFja2FnZS10cmVlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvcGFja2FnZS11c2UuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9wYWNrYWdlLXVzZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmIzNTI2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9wYWNrYWdlLXVzZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8xNCkgb24gV2VkIEFwciAwNyAwNzo0NjoyMyBCU1QgMjAxMCAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgUGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscwotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMC0wNC0wNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgUGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscyI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvcGFja2FnZS11c2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXVzZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIFBhY2thZ2U8YnI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHM8L0I+PC9IMj4KLTwvQ0VOVEVSPgotTm8gdXNhZ2Ugb2Ygb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9wYWNrYWdlLXVzZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9InBhY2thZ2UtdXNlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3ZlcnZpZXctZnJhbWUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vdmVydmlldy1mcmFtZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTYzM2M4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vdmVydmlldy1mcmFtZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjQ2OjIyIEJTVCAyMDEwIC0tPgotPFRJVExFPgotT3ZlcnZpZXcgTGlzdAotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMC0wNC0wNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSJzdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIj4KLQotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEggQUxJR049ImxlZnQiIE5PV1JBUD48Rk9OVCBzaXplPSIrMSIgQ0xBU1M9IkZyYW1lVGl0bGVGb250Ij4KLTxCPjwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBOT1dSQVA+PEZPTlQgQ0xBU1M9IkZyYW1lSXRlbUZvbnQiPjxBIEhSRUY9ImFsbGNsYXNzZXMtZnJhbWUuaHRtbCIgdGFyZ2V0PSJwYWNrYWdlRnJhbWUiPkFsbCBDbGFzc2VzPC9BPjwvRk9OVD4KLTxQPgotPEZPTlQgc2l6ZT0iKzEiIENMQVNTPSJGcmFtZUhlYWRpbmdGb250Ij4KLVBhY2thZ2VzPC9GT05UPgotPEJSPgotPEZPTlQgQ0xBU1M9IkZyYW1lSXRlbUZvbnQiPjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3BhY2thZ2UtZnJhbWUuaHRtbCIgdGFyZ2V0PSJwYWNrYWdlRnJhbWUiPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlPC9BPjwvRk9OVD4KLTxCUj4KLTxGT05UIENMQVNTPSJGcmFtZUl0ZW1Gb250Ij48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9wYWNrYWdlLWZyYW1lLmh0bWwiIHRhcmdldD0icGFja2FnZUZyYW1lIj5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbjwvQT48L0ZPTlQ+Ci08QlI+Ci08Rk9OVCBDTEFTUz0iRnJhbWVJdGVtRm9udCI+PEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL3BhY2thZ2UtZnJhbWUuaHRtbCIgdGFyZ2V0PSJwYWNrYWdlRnJhbWUiPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3NvcjwvQT48L0ZPTlQ+Ci08QlI+Ci08Rk9OVCBDTEFTUz0iRnJhbWVJdGVtRm9udCI+PEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvcGFja2FnZS1mcmFtZS5odG1sIiB0YXJnZXQ9InBhY2thZ2VGcmFtZSI+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHM8L0E+PC9GT05UPgotPEJSPgotPEZPTlQgQ0xBU1M9IkZyYW1lSXRlbUZvbnQiPjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL3BhY2thZ2UtZnJhbWUuaHRtbCIgdGFyZ2V0PSJwYWNrYWdlRnJhbWUiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzPC9BPjwvRk9OVD4KLTxCUj4KLTwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLQotPFA+Ci0mbmJzcDsKLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vdmVydmlldy1zdW1tYXJ5Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3ZlcnZpZXctc3VtbWFyeS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTQ5OGM0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vdmVydmlldy1zdW1tYXJ5Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjQ2OjIzIEJTVCAyMDEwIC0tPgotPFRJVExFPgotT3ZlcnZpZXcKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTAtMDQtMDciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0ic3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJPdmVydmlldyI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJvdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJkZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImluZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJoZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9ImluZGV4Lmh0bWw/b3ZlcnZpZXctc3VtbWFyeS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSJhbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+UGFja2FnZXM8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjIwJSI+PEI+PEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlPC9BPjwvQj48L1REPgotPFREPiZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjIwJSI+PEI+PEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uPC9BPjwvQj48L1REPgotPFREPiZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjIwJSI+PEI+PEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3I8L0E+PC9CPjwvVEQ+Ci08VEQ+Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMjAlIj48Qj48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHM8L0E+PC9CPjwvVEQ+Ci08VEQ+Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMjAlIj48Qj48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHM8L0E+PC9CPjwvVEQ+Ci08VEQ+Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotCi08UD4KLSZuYnNwOzxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJvdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJkZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImluZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJoZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9ImluZGV4Lmh0bWw/b3ZlcnZpZXctc3VtbWFyeS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSJhbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vdmVydmlldy10cmVlLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3ZlcnZpZXctdHJlZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODM3YThlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vdmVydmlldy10cmVlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjQ2OjIzIEJTVCAyMDEwIC0tPgotPFRJVExFPgotQ2xhc3MgSGllcmFyY2h5Ci08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDEwLTA0LTA3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9InN0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iQ2xhc3MgSGllcmFyY2h5IjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VHJlZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImRlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImhlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iaW5kZXguaHRtbD9vdmVydmlldy10cmVlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0ib3ZlcnZpZXctdHJlZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSJhbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci1IaWVyYXJjaHkgRm9yIEFsbCBQYWNrYWdlczwvSDI+Ci08L0NFTlRFUj4KLTxETD4KLTxEVD48Qj5QYWNrYWdlIEhpZXJhcmNoaWVzOjwvQj48REQ+PEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcGFja2FnZS10cmVlLmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlPC9BPiwgPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vcGFja2FnZS10cmVlLmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uPC9BPiwgPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL3BhY2thZ2UtdHJlZS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3I8L0E+LCA8QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9wYWNrYWdlLXRyZWUuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHM8L0E+LCA8QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9wYWNrYWdlLXRyZWUuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHM8L0E+PC9ETD4KLTxIUj4KLTxIMj4KLUNsYXNzIEhpZXJhcmNoeQotPC9IMj4KLTxVTD4KLTxMSSBUWVBFPSJjaXJjbGUiPmphdmEubGFuZy5PYmplY3Q8VUw+Ci08TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL0Fic3RyYWN0QW5ub3RhdGlvblByb2Nlc3Nvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yIj48Qj5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I8L0I+PC9BPiAoaW1wbGVtZW50cyBjb20uc3VuLm1pcnJvci5hcHQuQW5ub3RhdGlvblByb2Nlc3NvcikKLTxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uLjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24iPjxCPkFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjwvQj48L0E+IChpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uLjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0lBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbiI+SUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjwvQT4pCi08VUw+Ci08TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbi48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9EZWZhdWx0c0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24iPjxCPkRlZmF1bHRzQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9CPjwvQT48L1VMPgotPExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj48Qj5Bbm5vdGF0aW9uRGVmaW5pdGlvbjwvQj48L0E+PExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSI+PEI+QW5ub3RhdGlvbnNDb3JlPC9CPjwvQT48TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc01hbmFnZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIj48Qj5Bbm5vdGF0aW9uc01hbmFnZXI8L0I+PC9BPjxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMiPjxCPkFubm90YXRpb25VdGlsczwvQj48L0E+PExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvSkRUVXRpbHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzIj48Qj5KRFRVdGlsczwvQj48L0E+PExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiAoaW1wbGVtZW50cyBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yKQotPFVMPgotPExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSI+PEI+QW5ub3RhdGlvbnNDb3JlUGx1Z2luPC9CPjwvQT48L1VMPgotPExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvV1NETFV0aWxzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscyI+PEI+V1NETFV0aWxzPC9CPjwvQT48L1VMPgotPC9VTD4KLTxIMj4KLUludGVyZmFjZSBIaWVyYXJjaHkKLTwvSDI+Ci08VUw+Ci08TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbi48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24iPjxCPklBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI8L0I+PC9BPjwvVUw+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJvdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5UcmVlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJpbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSJpbmRleC5odG1sP292ZXJ2aWV3LXRyZWUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJvdmVydmlldy10cmVlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvcGFja2FnZS1saXN0IGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL3BhY2thZ2UtbGlzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ2N2E5OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvcGFja2FnZS1saXN0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZQotb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24KLW9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvcgotb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMKLW9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvcmVzb3VyY2VzL2luaGVyaXQuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL3Jlc291cmNlcy9pbmhlcml0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgxNDg2Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvcmVzb3VyY2VzL2luaGVyaXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL3N0eWxlc2hlZXQuY3NzIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvYXBpL3N0eWxlc2hlZXQuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWE5ZTUxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9zdHlsZXNoZWV0LmNzcworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qIEphdmFkb2Mgc3R5bGUgc2hlZXQgKi8KLQotLyogRGVmaW5lIGNvbG9ycywgZm9udHMgYW5kIG90aGVyIHN0eWxlIGF0dHJpYnV0ZXMgaGVyZSB0byBvdmVycmlkZSB0aGUgZGVmYXVsdHMgKi8KLQotLyogUGFnZSBiYWNrZ3JvdW5kIGNvbG9yICovCi1ib2R5IHsgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjsgY29sb3I6IzAwMDAwMCB9Ci0KLS8qIEhlYWRpbmdzICovCi1oMSB7IGZvbnQtc2l6ZTogMTQ1JSB9Ci0KLS8qIFRhYmxlIGNvbG9ycyAqLwotLlRhYmxlSGVhZGluZ0NvbG9yICAgICB7IGJhY2tncm91bmQ6ICNDQ0NDRkY7IGNvbG9yOiMwMDAwMDAgfSAvKiBEYXJrIG1hdXZlICovCi0uVGFibGVTdWJIZWFkaW5nQ29sb3IgIHsgYmFja2dyb3VuZDogI0VFRUVGRjsgY29sb3I6IzAwMDAwMCB9IC8qIExpZ2h0IG1hdXZlICovCi0uVGFibGVSb3dDb2xvciAgICAgICAgIHsgYmFja2dyb3VuZDogI0ZGRkZGRjsgY29sb3I6IzAwMDAwMCB9IC8qIFdoaXRlICovCi0KLS8qIEZvbnQgdXNlZCBpbiBsZWZ0LWhhbmQgZnJhbWUgbGlzdHMgKi8KLS5GcmFtZVRpdGxlRm9udCAgIHsgZm9udC1zaXplOiAxMDAlOyBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsgY29sb3I6IzAwMDAwMCB9Ci0uRnJhbWVIZWFkaW5nRm9udCB7IGZvbnQtc2l6ZTogIDkwJTsgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7IGNvbG9yOiMwMDAwMDAgfQotLkZyYW1lSXRlbUZvbnQgICAgeyBmb250LXNpemU6ICA5MCU7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOyBjb2xvcjojMDAwMDAwIH0KLQotLyogTmF2aWdhdGlvbiBiYXIgZm9udHMgYW5kIGNvbG9ycyAqLwotLk5hdkJhckNlbGwxICAgIHsgYmFja2dyb3VuZC1jb2xvcjojRUVFRUZGOyBjb2xvcjojMDAwMDAwfSAvKiBMaWdodCBtYXV2ZSAqLwotLk5hdkJhckNlbGwxUmV2IHsgYmFja2dyb3VuZC1jb2xvcjojMDAwMDhCOyBjb2xvcjojRkZGRkZGfSAvKiBEYXJrIEJsdWUgKi8KLS5OYXZCYXJGb250MSAgICB7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBjb2xvcjojMDAwMDAwO2NvbG9yOiMwMDAwMDA7fQotLk5hdkJhckZvbnQxUmV2IHsgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGNvbG9yOiNGRkZGRkY7Y29sb3I6I0ZGRkZGRjt9Ci0KLS5OYXZCYXJDZWxsMiAgICB7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBiYWNrZ3JvdW5kLWNvbG9yOiNGRkZGRkY7IGNvbG9yOiMwMDAwMDB9Ci0uTmF2QmFyQ2VsbDMgICAgeyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgYmFja2dyb3VuZC1jb2xvcjojRkZGRkZGOyBjb2xvcjojMDAwMDAwfQotCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9leHRlbnNpb24tcG9pbnRzL2luZGV4Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9leHRlbnNpb24tcG9pbnRzL2luZGV4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMWE0MzAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvZXh0ZW5zaW9uLXBvaW50cy9pbmRleC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIFNoYW5lIENsYXJrZSAyMDEwLiIgPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+QW5ub3RhdGlvbnMgRnJhbWV3b3JrIEV4dGVuc2lvbiBQb2ludHM8L3RpdGxlPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vYm9vay5jc3MiPgotPC9oZWFkPgotPGJvZHk+Ci08aDE+QW5ub3RhdGlvbnMgRnJhbWV3b3JrIEV4dGVuc2lvbiBQb2ludHM8L2gxPgotPHA+VGhlIGZvbGxvd2luZyBleHRlbnNpb24gcG9pbnRzIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhbm5vdGF0aW9uIGNhdGVnb3JpZXMsIGFubm90YXRpb25zLAotcHJvY2Vzc29ycyBhbmQgaW5pdGlhbGl6ZXJzOiA8L3A+Ci08dWw+Ci0gIDxsaT48YSBocmVmPSJvcmdfZWNsaXBzZV9qc3Rfd3NfYW5ub3RhdGlvbnNfY29yZV9hbm5vdGF0aW9uQ2F0ZWdvcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkNhdGVnb3J5PC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSJvcmdfZWNsaXBzZV9qc3Rfd3NfYW5ub3RhdGlvbnNfY29yZV9hbm5vdGF0aW9uRGVmaW5pdGlvbi5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uRGVmaW5pdGlvbjwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0ib3JnX2VjbGlwc2VfanN0X3dzX2Fubm90YXRpb25zX2NvcmVfYW5ub3RhdGlvbkluaXRpYWxpemVyLmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25Jbml0aWFsaXplcjwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0ib3JnX2VjbGlwc2VfanN0X3dzX2Fubm90YXRpb25zX2NvcmVfYW5ub3RhdGlvblByb2Nlc3Nvci5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uUHJvY2Vzc29yPC9hPjwvbGk+Ci08L3VsPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9leHRlbnNpb24tcG9pbnRzL29yZ19lY2xpcHNlX2pzdF93c19hbm5vdGF0aW9uc19jb3JlX2Fubm90YXRpb25DYXRlZ29yeS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvZXh0ZW5zaW9uLXBvaW50cy9vcmdfZWNsaXBzZV9qc3Rfd3NfYW5ub3RhdGlvbnNfY29yZV9hbm5vdGF0aW9uQ2F0ZWdvcnkuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY2YThjZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9leHRlbnNpb24tcG9pbnRzL29yZ19lY2xpcHNlX2pzdF93c19hbm5vdGF0aW9uc19jb3JlX2Fubm90YXRpb25DYXRlZ29yeS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+QW5ub3RhdGlvbiBDYXRlZ29yeTwvdGl0bGU+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPkBpbXBvcnQgdXJsKCIuLi8uLi9ib29rLmNzcyIpOzwvc3R5bGU+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPkBpbXBvcnQgdXJsKCIuLi8uLi9zY2hlbWEuY3NzIik7PC9zdHlsZT4KLTwvSEVBRD4KLTxCT0RZPgotPEgxIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlciI+QW5ub3RhdGlvbiBDYXRlZ29yeTwvSDE+Ci08cD48L3A+Ci08aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5JZGVudGlmaWVyOiA8L2g2Pm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25DYXRlZ29yeTxwPjwvcD4KLTxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPlNpbmNlOiA8L2g2PjEuMAotPHA+PC9wPgotCi08aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5EZXNjcmlwdGlvbjogPC9oNj5UaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIGNvbnRyaWJ1dGUgYW4gYW5ub3RhdGlvbiBjYXRlZ29yeS48cD48L3A+Ci08aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5Db25maWd1cmF0aW9uIE1hcmt1cDo8L2g2PgotPHA+PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5leHRlbnNpb24iPmV4dGVuc2lvbjwvYT4gKDxhIGhyZWY9IiNlLmNhdGVnb3J5Ij5jYXRlZ29yeTwvYT4qKSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCBleHRlbnNpb248L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5wb2ludCZuYnNwO0NEQVRBICNSRVFVSVJFRDwvcD48cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5pZCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNJTVBMSUVEPC9wPjxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPm5hbWUmbmJzcDsmbmJzcDtDREFUQSAjSU1QTElFRDwvcD4mZ3Q7PC9wPgotPHA+PC9wPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08L3VsPgotPGJyPjxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUuY2F0ZWdvcnkiPmNhdGVnb3J5PC9hPiBFTVBUWSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCBjYXRlZ29yeTwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmlkJm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPC9wPjxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPm5hbWUmbmJzcDtDREFUQSAjUkVRVUlSRUQ8L3A+Jmd0OzwvcD4KLTxwPjwvcD4KLTxwIGNsYXNzPSJDb25maWdNYXJrdXBFbGVtZW50RGVzYyI+Ci1BbiBhbm5vdGF0aW9uIGNhdGVnb3J5IGNvbnRyaWJ1dGlvbiBkZWZpbmVzIGNhdGVnb3JpZXMgb2YgYW5ub3RhdGlvbnMgdXNlZCB0byBncm91cCB0aGVtIGluIHRoZSBVSS48L3A+Ci08YnI+Ci08dWwgY2xhc3M9IkNvbmZpZ01hcmt1cEF0dGxpc3REZXNjIj4KLTxsaT48Yj5pZDwvYj4gLSBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYW5ub3RhdGlvbiBjYXRlZ29yeS48L2xpPgotPGxpPjxiPm5hbWU8L2I+IC0gQSB1bmlxdXJlIGFubm90YXRpb24gY2F0ZW9nb3J5IG5hbWUuPC9saT4KLTwvdWw+Ci08YnI+PGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+RXhhbXBsZXM6IDwvaDY+VGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGFuIGFubm90YXRpb24gY2F0ZWdvcnkgY29udHJpYnV0aW9uOgotCi08cD4KLTxwcmUgY2xhc3M9IkV4YW1wbGUiPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYVRhZyI+Ci0gICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PTwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFDc3RyaW5nIj4mcXVvdDtvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uQ2F0ZWdvcnkmcXVvdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hVGFnIj4mZ3Q7Ci0gICAgICAmbHQ7Y2F0ZWdvcnkKLSAgICAgICAgICAgIGlkPTwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFDc3RyaW5nIj4mcXVvdDtqYXh3cy5jYXRlZ29yeSZxdW90Ozwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFUYWciPgotICAgICAgICAgICAgbmFtZT08L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hQ3N0cmluZyI+JnF1b3Q7SkFYLVdTJnF1b3Q7PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYVRhZyI+Jmd0OwotICAgICAgJmx0Oy9jYXRlZ29yeSZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotPC9zcGFuPjwvcHJlPgotPC9wPgotPHA+PC9wPgotCi08YnI+Ci08cCBjbGFzcz0ibm90ZSBTY2hlbWFDb3B5cmlnaHQiPgotQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4gPGJyPgotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgPGFocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+Ci0KLTwvcD4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2V4dGVuc2lvbi1wb2ludHMvb3JnX2VjbGlwc2VfanN0X3dzX2Fubm90YXRpb25zX2NvcmVfYW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2V4dGVuc2lvbi1wb2ludHMvb3JnX2VjbGlwc2VfanN0X3dzX2Fubm90YXRpb25zX2NvcmVfYW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZiMTJjZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3JlZmVyZW5jZS9leHRlbnNpb24tcG9pbnRzL29yZ19lY2xpcHNlX2pzdF93c19hbm5vdGF0aW9uc19jb3JlX2Fubm90YXRpb25EZWZpbml0aW9uLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5Bbm5vdGF0aW9uIERlZmluaXRpb248L3RpdGxlPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj5AaW1wb3J0IHVybCgiLi4vLi4vYm9vay5jc3MiKTs8L3N0eWxlPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj5AaW1wb3J0IHVybCgiLi4vLi4vc2NoZW1hLmNzcyIpOzwvc3R5bGU+Ci08L0hFQUQ+Ci08Qk9EWT4KLTxIMSBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiPkFubm90YXRpb24gRGVmaW5pdGlvbjwvSDE+Ci08cD48L3A+Ci08aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5JZGVudGlmaWVyOiA8L2g2Pm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25EZWZpbml0aW9uPHA+PC9wPgotPGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+U2luY2U6IDwvaDY+MS4wCi08cD48L3A+Ci0KLTxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPkRlc2NyaXB0aW9uOiA8L2g2PlRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBjbGllbnRzIHRvIGNvbnRyaWJ1dGUgYW5ub3RhdGlvbnMgPD8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPiB3aGljaCBhcmUgaW4gdHVybiBjb25zdW1lZCBieSB0aGUgVUkuPHA+PC9wPgotPGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+Q29uZmlndXJhdGlvbiBNYXJrdXA6PC9oNj4KLTxwPjwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUuZXh0ZW5zaW9uIj5leHRlbnNpb248L2E+ICg8YSBocmVmPSIjZS5hbm5vdGF0aW9uIj5hbm5vdGF0aW9uPC9hPiopJmd0OzwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFBVFRMSVNUIGV4dGVuc2lvbjwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPnBvaW50Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPC9wPjxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmlkJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI0lNUExJRUQ8L3A+PHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+bmFtZSZuYnNwOyZuYnNwO0NEQVRBICNJTVBMSUVEPC9wPiZndDs8L3A+Ci08cD48L3A+Ci08dWwgY2xhc3M9IkNvbmZpZ01hcmt1cEF0dGxpc3REZXNjIj4KLTwvdWw+Ci08YnI+PHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5hbm5vdGF0aW9uIj5hbm5vdGF0aW9uPC9hPiAoPGEgaHJlZj0iI2UudGFyZ2V0RmlsdGVyIj50YXJnZXRGaWx0ZXI8L2E+KikmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgYW5ub3RhdGlvbjwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmNsYXNzJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPC9wPjxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmNhdGVnb3J5Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7SURSRUYgI1JFUVVJUkVEPC9wPjxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPm5hbWUmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjUkVRVUlSRUQ8L3A+PHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+cmVzdHJpY3RlZFRvJm5ic3A7KENMQVNTX09OTFl8SU5URVJGQUNFX09OTFl8RU5VTV9PTkxZKSA8L3A+Jmd0OzwvcD4KLTxwPjwvcD4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPmNsYXNzPC9iPiAtIHRoZSBmdWxseSBxdWFsaWZpZWQgYW5ub3RhdGlvbiBjbGFzcyBuYW1lIHRoYXQgZXh0ZW5kcyA8Y29kZT5qYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPC9jb2RlPjwvbGk+Ci08bGk+PGI+Y2F0ZWdvcnk8L2I+IC0gdGhlIGlkIG9mIGEgPHR0PmFubm90YXRpb25DYXRlZ29yeTwvdHQ+PC9saT4KLTxsaT48Yj5uYW1lPC9iPiAtIFRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgYW5ub3RhdGlvbiBjbGFzcy48L2xpPgotPGxpPjxiPnJlc3RyaWN0ZWRUbzwvYj4gLSBVc2VkIGluIGFkZGl0aW9uIHRvIHRoZSBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZShzKSB0aGF0IGFyZSBzcGVjaWZpZWQgaW4gdGhlIHZhbHVlIGVsZW1lbnQgb2YgdGhlICBAVGFyZ2V0IGFubm90YXRpb24gb24gdGhlIGNvbnRyaWJ1dGVkIGFubm90YXRpb24gdG8gYWRkIGZ1cnRoZXIgcmVzdHJpY3Rpb25zLjwvbGk+Ci08L3VsPgotPGJyPjxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUudGFyZ2V0RmlsdGVyIj50YXJnZXRGaWx0ZXI8L2E+IEVNUFRZJmd0OzwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFBVFRMSVNUIHRhcmdldEZpbHRlcjwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPnRhcmdldCZuYnNwOyhUWVBFfEZJRUxEfE1FVEhPRHxQQVJBTUVURVJ8Q09OU1RSVUNUT1J8TE9DQUxfVkFSSUFCTEV8QU5OT1RBVElPTl9UWVBFfFBBQ0tBR0UpIDwvcD4mZ3Q7PC9wPgotPHA+PC9wPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08bGk+PGI+dGFyZ2V0PC9iPiAtIFRoZSBhbm5vdGF0aW9ucyBjb3JlIGF1dG9tYXRpY2FsbHkga25vd3Mgd2hlcmUgdG8gcGVybWl0IGFubm90YXRpb25zIGFzIGl0IGluc3BlY3RzIHRoZSBjb250cmlidXRlZCBhbm5vdGF0aW9uIGFuZAotICAgICAgICAgICAgICAgICAgcmVhZHMgdGhlIEBUYXJnZXQgdGhhdCBoYXMgYmVlbiBkZWZpbmVkIGZvciBpdC4gVGhlc2UgZmlsdGVycyBhcmUgb25seSB1c2VkIHdoZW4gdGhlcmUgbWlnaHQgYmUgYW4gZXh0cmEgcmVzdHJpY3Rpb24KLSAgICAgICAgICAgICAgICAgIHlvdSB3YW50IHRvIGFkZCwgZm9yIGV4YW1wbGUsIGlmIHZlcnNpb24gMiBvZiBhbiBhbm5vdGF0aW9uIGFsbG93cyBhZGRpbmcgdGhlIGFubm90YXRpb24gdG8gYSBmaWVsZCwgYW5kIHRoZW4gdmVyc2lvbgotICAgICAgICAgICAgICAgICAgMyBkZXByZWNhdGVzIHRoYXQgdXNhZ2UsIHlvdSBjYW4gYWRkIGEgZmlsdGVyIGhlcmUgdG8gZGlzYWxsb3cgdGhlIHVzYWdlIGluIHRoZSBVSS48L2xpPgotPC91bD4KLTxicj48aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5FeGFtcGxlczogPC9oNj5UaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYW4gYW5ub3RhdGlvbiBkZWZpbml0aW9uIGNvbnRyaWJ1dGlvbjoKLQotPHA+Ci08cHJlIGNsYXNzPSJFeGFtcGxlIj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFUYWciPgotICAgJmx0O2V4dGVuc2lvbiBwb2ludD08L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hQ3N0cmluZyI+JnF1b3Q7b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkRlZmluaXRpb24mcXVvdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hVGFnIj4mZ3Q7Ci0gICAgICAmbHQ7YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYUNzdHJpbmciPiZxdW90O2pheHdzLmNhdGVnb3J5JnF1b3Q7PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYVRhZyI+Ci0gICAgICAgICAgICBjbGFzcz08L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hQ3N0cmluZyI+JnF1b3Q7amF2YXguandzLldlYlNlcnZpY2UmcXVvdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hVGFnIj4KLSAgICAgICAgICAgIG5hbWU9PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYUNzdHJpbmciPiZxdW90O1dlYlNlcnZpY2UmcXVvdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hVGFnIj4mZ3Q7Ci0gICAgICAmbHQ7L2Fubm90YXRpb24mZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLTwvc3Bhbj48L3ByZT4KLTwvcD4KLTxwPjwvcD4KLQotPGJyPgotPHAgY2xhc3M9Im5vdGUgU2NoZW1hQ29weXJpZ2h0Ij4KLUNvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuIDxicj4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4KLQotPC9wPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvZXh0ZW5zaW9uLXBvaW50cy9vcmdfZWNsaXBzZV9qc3Rfd3NfYW5ub3RhdGlvbnNfY29yZV9hbm5vdGF0aW9uSW5pdGlhbGl6ZXIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2V4dGVuc2lvbi1wb2ludHMvb3JnX2VjbGlwc2VfanN0X3dzX2Fubm90YXRpb25zX2NvcmVfYW5ub3RhdGlvbkluaXRpYWxpemVyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5OWRiMGEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvZXh0ZW5zaW9uLXBvaW50cy9vcmdfZWNsaXBzZV9qc3Rfd3NfYW5ub3RhdGlvbnNfY29yZV9hbm5vdGF0aW9uSW5pdGlhbGl6ZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkFubm90YXRpb24gSW5pdGlhbGl6ZXI8L3RpdGxlPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj5AaW1wb3J0IHVybCgiLi4vLi4vYm9vay5jc3MiKTs8L3N0eWxlPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj5AaW1wb3J0IHVybCgiLi4vLi4vc2NoZW1hLmNzcyIpOzwvc3R5bGU+Ci08L0hFQUQ+Ci08Qk9EWT4KLTxIMSBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiPkFubm90YXRpb24gSW5pdGlhbGl6ZXI8L0gxPgotPHA+PC9wPgotPGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+SWRlbnRpZmllcjogPC9oNj5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uSW5pdGlhbGl6ZXI8cD48L3A+Ci08aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5TaW5jZTogPC9oNj4xLjAKLTxwPjwvcD4KLQotPGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+RGVzY3JpcHRpb246IDwvaDY+VGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIGNsaWVudHMgdG8gYXNzb2NpYXRlIGFuIGFubm90YXRpb24gaW5pdGlhbGl6ZXIgd2l0aCBhbiBhbm5vdGF0aW9uIGRlZmluaXRpb24uCi0KLVRoZSBhbm5vdGF0aW9uIGluaXRpYWxpemVycyByb2xlIGlzIHRvIGNvbnN0cnVjdCB2YWx1ZXMgZm9yIHRoZSBhbm5vdGF0aW9ucyBtZW1iZXIgdmFsdWUgcGFpcnMuPHA+PC9wPgotPGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+Q29uZmlndXJhdGlvbiBNYXJrdXA6PC9oNj4KLTxwPjwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUuZXh0ZW5zaW9uIj5leHRlbnNpb248L2E+ICg8YSBocmVmPSIjZS5pbml0aWFsaXplciI+aW5pdGlhbGl6ZXI8L2E+KikmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgZXh0ZW5zaW9uPC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+cG9pbnQmbmJzcDtDREFUQSAjUkVRVUlSRUQ8L3A+PHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+aWQmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjSU1QTElFRDwvcD48cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5uYW1lJm5ic3A7Jm5ic3A7Q0RBVEEgI0lNUExJRUQ8L3A+Jmd0OzwvcD4KLTxwPjwvcD4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPC91bD4KLTxicj48cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLmluaXRpYWxpemVyIj5pbml0aWFsaXplcjwvYT4gRU1QVFkmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgaW5pdGlhbGl6ZXI8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5hbm5vdGF0aW9uJm5ic3A7SURSRUYgI1JFUVVJUkVEPC9wPjxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmNsYXNzJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPC9wPiZndDs8L3A+Ci08cD48L3A+Ci08dWwgY2xhc3M9IkNvbmZpZ01hcmt1cEF0dGxpc3REZXNjIj4KLTxsaT48Yj5hbm5vdGF0aW9uPC9iPiAtIHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBhbm5vdGF0aW9uIGRlZmluaXRpb24gdGhhdCB0aGlzIGluaXRpYWxpemVycyBoYW5kbGVzLjwvbGk+Ci08bGk+PGI+Y2xhc3M8L2I+IC0gdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgY29udHJpYnV0ZWQgaW5pdGlhbGl6ZXIuIFRoZQotY2xhc3MgbXVzdCBiZSBhIHB1YmxpYyBhbmQgZXh0ZW5kCi08Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbi5Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI8L2NvZGU+IHdpdGggYSBwdWJsaWMgMC1hcmd1bWVudCBjb25zdHJ1Y3Rvci48L2xpPgotPC91bD4KLTxicj48aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5FeGFtcGxlczogPC9oNj5UaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYW4gYW5ub3RhdGlvbiBpbml0aWFsaXplciBjb250cmlidXRpb246Ci0KLTxwPgotPHByZSBjbGFzcz0iRXhhbXBsZSI+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hVGFnIj4KLSAgICZsdDtleHRlbnNpb24gcG9pbnQ9PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYUNzdHJpbmciPiZxdW90O29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25Jbml0aWFsaXplciZxdW90Ozwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFUYWciPiZndDsKLSAgICAgICZsdDtpbml0aWFsaXplcgotICAgICAgICAgICAgYW5ub3RhdGlvbj08L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hQ3N0cmluZyI+JnF1b3Q7amF2YXguandzLldlYlNlcnZpY2UmcXVvdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hVGFnIj4KLSAgICAgICAgICAgIGNsYXNzPTwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFDc3RyaW5nIj4mcXVvdDtvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy5pbml0aWFsaXphdGlvbi5XZWJTZXJ2aWNlQXR0cmlidXRlSW5pdGlhbGl6ZXImcXVvdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hVGFnIj4mZ3Q7Ci0gICAgICAmbHQ7L2luaXRpYWxpemVyJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci08L3NwYW4+PC9wcmU+Ci08L3A+Ci08cD48L3A+Ci0KLTxicj4KLTxwIGNsYXNzPSJub3RlIFNjaGVtYUNvcHlyaWdodCI+Ci1Db3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLiA8YnI+Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+Ci0KLTwvcD4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvcmVmZXJlbmNlL2V4dGVuc2lvbi1wb2ludHMvb3JnX2VjbGlwc2VfanN0X3dzX2Fubm90YXRpb25zX2NvcmVfYW5ub3RhdGlvblByb2Nlc3Nvci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvZXh0ZW5zaW9uLXBvaW50cy9vcmdfZWNsaXBzZV9qc3Rfd3NfYW5ub3RhdGlvbnNfY29yZV9hbm5vdGF0aW9uUHJvY2Vzc29yLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZGQ4ZTUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9yZWZlcmVuY2UvZXh0ZW5zaW9uLXBvaW50cy9vcmdfZWNsaXBzZV9qc3Rfd3NfYW5ub3RhdGlvbnNfY29yZV9hbm5vdGF0aW9uUHJvY2Vzc29yLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5Bbm5vdGF0aW9uIFByb2Nlc3NvcjwvdGl0bGU+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPkBpbXBvcnQgdXJsKCIuLi8uLi9ib29rLmNzcyIpOzwvc3R5bGU+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPkBpbXBvcnQgdXJsKCIuLi8uLi9zY2hlbWEuY3NzIik7PC9zdHlsZT4KLTwvSEVBRD4KLTxCT0RZPgotPEgxIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlciI+QW5ub3RhdGlvbiBQcm9jZXNzb3I8L0gxPgotPHA+PC9wPgotPGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+SWRlbnRpZmllcjogPC9oNj5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uUHJvY2Vzc29yPHA+PC9wPgotPGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+U2luY2U6IDwvaDY+MS4wCi08cD48L3A+Ci0KLTxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPkRlc2NyaXB0aW9uOiA8L2g2PlRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBjbGllbnRzIHRvIGNvbnRyaWJ1dGUgYW5ub3RhdGlvbiBwcm9jZXNvb3JzLiBUaGVzZSBwcm9jZXNzb3JzIGFyZSBhc3NvY2lhdGVkIHdpdGggY29udHJpYnV0ZWQgYW5ub3RhdGlvbiBkZWZpbml0aW9ucy4KLQotVGhlIGdvYWwgb2YgdGhlIHByb2Nlc3NvciBpcyB0byB2YWxpZGF0ZSBhbm5vdGF0aW9uIHJ1bGVzLjxwPjwvcD4KLTxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPkNvbmZpZ3VyYXRpb24gTWFya3VwOjwvaDY+Ci08cD48L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLmV4dGVuc2lvbiI+ZXh0ZW5zaW9uPC9hPiAoPGEgaHJlZj0iI2UucHJvY2Vzc29yIj5wcm9jZXNzb3I8L2E+KikmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgZXh0ZW5zaW9uPC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+cG9pbnQmbmJzcDtDREFUQSAjUkVRVUlSRUQ8L3A+PHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+aWQmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjSU1QTElFRDwvcD48cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5uYW1lJm5ic3A7Jm5ic3A7Q0RBVEEgI0lNUExJRUQ8L3A+Jmd0OzwvcD4KLTxwPjwvcD4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPC91bD4KLTxicj48cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLnByb2Nlc3NvciI+cHJvY2Vzc29yPC9hPiAoPGEgaHJlZj0iI2UuZGVzY3JpcHRpb24iPmRlc2NyaXB0aW9uPC9hPj8pJmd0OzwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFBVFRMSVNUIHByb2Nlc3NvcjwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmFubm90YXRpb24mbmJzcDtJRFJFRiAjUkVRVUlSRUQ8L3A+PHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+Y2xhc3MmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjUkVRVUlSRUQ8L3A+Jmd0OzwvcD4KLTxwPjwvcD4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPmFubm90YXRpb248L2I+IC0gdGhlIGNsYXNzIG5hbWUgb2YgdGhlIGFubm90YXRpb24gZGVmaW5pdGlvbiB0aGF0IHRoaXMgcHJvY2Vzc29yIGhhbmRsZXMuPC9saT4KLTxsaT48Yj5jbGFzczwvYj4gLSB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBjb250cmlidXRlZCBwcm9jZXNvci4gVGhlCi1jbGFzcyBtdXN0IGJlIGEgcHVibGljIHN1YmNsYXNzIG9mCi08Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yPC9jb2RlPmFuZCBtdXN0IGhhdmUgYSBwdWJsaWMgMC1hcmd1bWVudCBjb25zdHJ1Y3Rvci48L2xpPgotPC91bD4KLTxicj48cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLmRlc2NyaXB0aW9uIj5kZXNjcmlwdGlvbjwvYT4gKCNQQ0RBVEEpJmd0OzwvcD4KLTxwPjwvcD4KLTxwIGNsYXNzPSJDb25maWdNYXJrdXBFbGVtZW50RGVzYyI+Ci1BbiBvcHRpb25hbCBhdHRyaWJ1dGUgdG8gaG9sZCBhIHNob3J0IHRleHQgZGVzY3JpYmluZyB3aGF0ICJydWxlIiB0aGUgcHJvY2Vzc29yIGhhbmRsZXMuPC9wPgotPGJyPjxicj4KLTxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPkV4YW1wbGVzOiA8L2g2PlRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhbiBhbm5vdGF0aW9uIHByb2Nlc3NvciBjb250cmlidXRpb246Ci0KLTxwPgotPHByZSBjbGFzcz0iRXhhbXBsZSI+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hVGFnIj4KLSAgICZsdDtleHRlbnNpb24gcG9pbnQ9PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYUNzdHJpbmciPiZxdW90O29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25Qcm9jZXNzb3ImcXVvdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hVGFnIj4mZ3Q7Ci0gICAgICAmbHQ7cHJvY2Vzc29yCi0gICAgICAgICAgICBhbm5vdGF0aW9uPTwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFDc3RyaW5nIj4mcXVvdDtqYXZheC5qd3MuV2ViU2VydmljZSZxdW90Ozwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFUYWciPgotICAgICAgICAgICAgY2xhc3M9PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYUNzdHJpbmciPiZxdW90O29yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb24uV2ViU2VydmljZVNFSVByZXNlbnROb1dlYk1ldGhvZFJ1bGUmcXVvdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hVGFnIj4mZ3Q7Ci0gICAgICAgICAmbHQ7ZGVzY3JpcHRpb24mZ3Q7Ci0gICAgICAgICAgICAlV0VCU0VSVklDRV9TRUlfTk9fV0VCTUVUSE9TX1JVTEUKLSAgICAgICAgICZsdDsvZGVzY3JpcHRpb24mZ3Q7Ci0gICAgICAmbHQ7L3Byb2Nlc3NvciZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotPC9zcGFuPjwvcHJlPgotPC9wPgotPHA+PC9wPgotCi08YnI+Ci08cCBjbGFzcz0ibm90ZSBTY2hlbWFDb3B5cmlnaHQiPgotQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4gPGJyPgotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPgotCi08L3A+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3NjaGVtYS5jc3MgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3NjaGVtYS5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMjViYTIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi9zY2hlbWEuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi1INi5TY2hlbWFIZWFkZXIgew0KLQlmb250LXNpemU6MTZweDsgDQotCWRpc3BsYXk6aW5saW5lDQotfQ0KLQ0KLVAuU2NoZW1hQ29weXJpZ2h0IHsNCi0JZm9udC1zaXplOiBzbWFsbGVyOyANCi0JZm9udC1zdHlsZTogbm9ybWFsOw0KLQljb2xvcjogIzMzNjY5OTsgDQotCWRpc3BsYXk6aW5saW5lOw0KLQltYXJnaW4tdG9wOiAzLjAwMDAwMHB0Ow0KLQltYXJnaW4tYm90dG9tOiAxMS4wMDAwMDBwdDsNCi0JbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tbGVmdDogMC4wMDAwMDBwdDsNCi19DQotDQotUC5TY2hlbWFEdGQgew0KLQljb2xvcjogIzgwMDAwMDsgDQotCW1hcmdpbi10b3A6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1ib3R0b206IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWxlZnQ6IDEwLjAwMDAwMHB0Ow0KLX0NCi0NCi1QLlNjaGVtYUR0ZEF0dGxpc3Qgew0KLQljb2xvcjogIzgwMDAwMDsgDQotCW1hcmdpbi10b3A6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1ib3R0b206IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWxlZnQ6IDIwLjAwMDAwMHB0Ow0KLX0NCi0NCi1zcGFuLlNjaGVtYVRhZyB7DQotCWNvbG9yOiAjMDAwMDgwOw0KLX0NCi0NCi1zcGFuLlNjaGVtYUNzdHJpbmcgew0KLQljb2xvcjogIzAwODAwMDsNCi19DQotDQotcHJlLkV4YW1wbGUgew0KLQltYXJnaW4tdG9wOiAwLjAwMDAwMHB0Ow0KLX0NCi0NCi0uQ29uZmlnTWFya3VwRWxlbWVudERlc2Mgew0KLQljb2xvcjogYmxhY2s7DQotCW1hcmdpbi10b3A6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1ib3R0b206IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWxlZnQ6IDEwLjAwMDAwMHB0Ow0KLX0NCi0NCi0uQ29uZmlnTWFya3VwQXR0bGlzdERlc2Mgew0KLQljb2xvcjogYmxhY2s7DQotCW1hcmdpbi10b3A6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1ib3R0b206IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWxlZnQ6IDMyLjAwMDAwMHB0Ow0KLX0NCi0NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3RvcGljc19hcGlfcmVmZXJlbmNlLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvdG9waWNzX2FwaV9yZWZlcmVuY2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTJhMDAzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy5pc3YvdG9waWNzX2FwaV9yZWZlcmVuY2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci0KLTx0b2MgbGFiZWw9IlJlZmVyZW5jZSIgbGlua190bz0iLi4vb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3RvY3JlZmVyZW5jZS54bWwjYXBpX3JlZmVyZW5jZSI+Ci0JPHRvcGljIGxhYmVsPSJBbm5vdGF0aW9ucyBGcmFtZXdvcmsgQVBJIFJlZmVyZW5jZSIgaHJlZj0icmVmZXJlbmNlL2FwaS9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPgotICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3BhY2thZ2Utc3VtbWFyeS5odG1sIiBsYWJlbD0ib3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiLz4KLSAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCIgbGFiZWw9Im9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uIi8+Ci0gICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL3BhY2thZ2Utc3VtbWFyeS5odG1sIiBsYWJlbD0ib3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yIi8+Ci0gICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiIGxhYmVsPSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscyIvPgotCTwvdG9waWM+Ci0gICAgPHRvcGljIGxhYmVsPSJVdGlsaXR5IENsYXNzZXMiPgotICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL3BhY2thZ2Utc3VtbWFyeS5odG1sIiBsYWJlbD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMiLz4KLSAgICA8L3RvcGljPgotPC90b2M+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3RvcGljc19leHRlbnNpb25fcG9pbnRzX3JlZmVyZW5jZS54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MuaXN2L3RvcGljc19leHRlbnNpb25fcG9pbnRzX3JlZmVyZW5jZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MGIwNWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLmlzdi90b3BpY3NfZXh0ZW5zaW9uX3BvaW50c19yZWZlcmVuY2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci0KLTx0b2MgbGFiZWw9IlJlZmVyZW5jZSIgbGlua190bz0iLi4vb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3RvY3JlZmVyZW5jZS54bWwjZXh0ZW5zaW9uX3BvaW50c19yZWZlcmVuY2UiPgotCi0JPHRvcGljIGxhYmVsPSJBbm5vdGF0aW9ucyBGcmFtZXdvcmsgRXh0ZW5zaW9uIFBvaW50cyBSZWZlcmVuY2UiIGhyZWY9InJlZmVyZW5jZS9leHRlbnNpb24tcG9pbnRzL2luZGV4Lmh0bWwiPgotCSAgPHRvcGljIGhyZWY9InJlZmVyZW5jZS9leHRlbnNpb24tcG9pbnRzL29yZ19lY2xpcHNlX2pzdF93c19hbm5vdGF0aW9uc19jb3JlX2Fubm90YXRpb25DYXRlZ29yeS5odG1sIiBsYWJlbD0ib3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkNhdGVnb3J5Ii8+Ci0gICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlL2V4dGVuc2lvbi1wb2ludHMvb3JnX2VjbGlwc2VfanN0X3dzX2Fubm90YXRpb25zX2NvcmVfYW5ub3RhdGlvbkRlZmluaXRpb24uaHRtbCIgbGFiZWw9Im9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25EZWZpbml0aW9uIi8+Ci0gICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlL2V4dGVuc2lvbi1wb2ludHMvb3JnX2VjbGlwc2VfanN0X3dzX2Fubm90YXRpb25zX2NvcmVfYW5ub3RhdGlvbkluaXRpYWxpemVyLmh0bWwiIGxhYmVsPSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uSW5pdGlhbGl6ZXIiLz4KLSAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UvZXh0ZW5zaW9uLXBvaW50cy9vcmdfZWNsaXBzZV9qc3Rfd3NfYW5ub3RhdGlvbnNfY29yZV9hbm5vdGF0aW9uUHJvY2Vzc29yLmh0bWwiIGxhYmVsPSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uUHJvY2Vzc29yIi8+Ci0JPC90b3BpYz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvLnByb2plY3QgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg5ODcyYy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L01FVEEtSU5GL01BTklGRVNULk1GIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliOTQ1OTAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdjtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvYWJvdXQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NDgzZTUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5BcHJpbCA5LCAyMDEwPC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvYm9vay5jc3MgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9ib29rLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRkODg4MC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9ib29rLmNzcworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUBpbXBvcnQgIi4uL1BST0RVQ1RfUExVR0lOL2Jvb2suY3NzIjsKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L2J1aWxkLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODIxYjhhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGJvb2suY3NzLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZS8sXAotICAgICAgICAgICAgICAgdG9waWNzX2FwaV9yZWZlcmVuY2UueG1sLFwKLSAgICAgICAgICAgICAgIHRvcGljc19leHRlbnNpb25fcG9pbnRzX3JlZmVyZW5jZS54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBzY2hlbWEuY3NzCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9wbHVnaW4ucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWI0NWEzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAgU2hhbmUgQ2xhcmtlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1KQVgtV1MgRE9NIFRvb2xzIERldmVsb3BlciBHdWlkZQotcGx1Z2luUHJvdmlkZXI9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3BsdWdpbi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmM2ZmFlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuNCI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPgotICAgICAgPHRvYyBmaWxlPSJ0b3BpY3NfYXBpX3JlZmVyZW5jZS54bWwiLz4KLSAgICAgIDx0b2MgZmlsZT0idG9waWNzX2V4dGVuc2lvbl9wb2ludHNfcmVmZXJlbmNlLnhtbCIvPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLmphdmFkb2MiPgotICAgICAgIDxqYXZhZG9jIHBhdGg9InJlZmVyZW5jZS9hcGkiPgotICAgICAgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUiLz4KLSAgICAgICA8L2phdmFkb2M+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2FsbGNsYXNzZXMtZnJhbWUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvYWxsY2xhc3Nlcy1mcmFtZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDlhMDg4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvYWxsY2xhc3Nlcy1mcmFtZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wXzIyKSBvbiBTYXQgQXByIDE3IDE4OjQ2OjM2IElTVCAyMDEwIC0tPgotPFRJVExFPgotQWxsIENsYXNzZXMKLTwvVElUTEU+Ci0KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9InN0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiPgotPEZPTlQgc2l6ZT0iKzEiIENMQVNTPSJGcmFtZUhlYWRpbmdGb250Ij4KLTxCPkFsbCBDbGFzc2VzPC9CPjwvRk9OVD4KLTxCUj4KLQotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgTk9XUkFQPjxGT05UIENMQVNTPSJGcmFtZUl0ZW1Gb250Ij48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbUZhY3RvcnkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjxJPkRvbUZhY3Rvcnk8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5Eb21QYWNrYWdlPC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiIHRhcmdldD0iY2xhc3NGcmFtZSI+PEk+RG9tUGFja2FnZS5MaXRlcmFsczwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lET00uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjxJPklET008L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JSmF2YVdlYlNlcnZpY2VFbGVtZW50Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5JSmF2YVdlYlNlcnZpY2VFbGVtZW50PC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JTmFtZWRFeHRlbnNpb25JbmZvLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjxJPklOYW1lZEV4dGVuc2lvbkluZm88L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL0lQcm9wZXJ0eURlZmF1bHRzLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjxJPklQcm9wZXJ0eURlZmF1bHRzPC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JUHJvcGVydHlTdGF0ZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5JUHJvcGVydHlTdGF0ZTwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjxJPklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5JV2ViTWV0aG9kPC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5JV2ViUGFyYW08L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiIHRhcmdldD0iY2xhc3NGcmFtZSI+PEk+SVdlYlNlcnZpY2U8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZVByb2plY3QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjxJPklXZWJTZXJ2aWNlUHJvamVjdDwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJUeXBlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5JV2ViVHlwZTwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RvbUxvYWRMaXN0ZW5lci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiIHRhcmdldD0iY2xhc3NGcmFtZSI+PEk+SVdzRG9tTG9hZExpc3RlbmVyPC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRE9NUnVudGltZUV4dGVuc2lvbi5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiIHRhcmdldD0iY2xhc3NGcmFtZSI+PEk+SVdzRE9NUnVudGltZUV4dGVuc2lvbjwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXU0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5JV1NET01SdW50aW1lTWFuYWdlcjwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiIHRhcmdldD0iY2xhc3NGcmFtZSI+U09BUEJpbmRpbmdTdHlsZTwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5TT0FQQmluZGluZ1VzZTwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiIHRhcmdldD0iY2xhc3NGcmFtZSI+V2ViUGFyYW1LaW5kPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV3NET01SdW50aW1lTWFuYWdlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5Xc0RPTVJ1bnRpbWVNYW5hZ2VyPC9BPgotPEJSPgotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYjYwNDAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMF8yMikgb24gU2F0IEFwciAxNyAxODo0NjozNiBJU1QgMjAxMCAtLT4KLTxUSVRMRT4KLUFsbCBDbGFzc2VzCi08L1RJVExFPgotCi0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSJzdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIj4KLTxGT05UIHNpemU9IisxIiBDTEFTUz0iRnJhbWVIZWFkaW5nRm9udCI+Ci08Qj5BbGwgQ2xhc3NlczwvQj48L0ZPTlQ+Ci08QlI+Ci0KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIE5PV1JBUD48Rk9OVCBDTEFTUz0iRnJhbWVJdGVtRm9udCI+PEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21GYWN0b3J5Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEk+RG9tRmFjdG9yeTwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48ST5Eb21QYWNrYWdlPC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxJPkRvbVBhY2thZ2UuTGl0ZXJhbHM8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JRE9NLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEk+SURPTTwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48ST5JSmF2YVdlYlNlcnZpY2VFbGVtZW50PC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JTmFtZWRFeHRlbnNpb25JbmZvLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lIj48ST5JTmFtZWRFeHRlbnNpb25JbmZvPC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JUHJvcGVydHlEZWZhdWx0cy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSI+PEk+SVByb3BlcnR5RGVmYXVsdHM8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL0lQcm9wZXJ0eVN0YXRlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lIj48ST5JUHJvcGVydHlTdGF0ZTwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48ST5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxJPklXZWJNZXRob2Q8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48ST5JV2ViUGFyYW08L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxJPklXZWJTZXJ2aWNlPC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEk+SVdlYlNlcnZpY2VQcm9qZWN0PC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlR5cGUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48ST5JV2ViVHlwZTwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RvbUxvYWRMaXN0ZW5lci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxJPklXc0RvbUxvYWRMaXN0ZW5lcjwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48ST5JV3NET01SdW50aW1lRXh0ZW5zaW9uPC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdTRE9NUnVudGltZU1hbmFnZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48ST5JV1NET01SdW50aW1lTWFuYWdlcjwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1N0eWxlPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1VzZTwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPldlYlBhcmFtS2luZDwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPldzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Xc0RPTVJ1bnRpbWVNYW5hZ2VyPC9BPgotPEJSPgotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9jb25zdGFudC12YWx1ZXMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvY29uc3RhbnQtdmFsdWVzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MDhjZmQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9jb25zdGFudC12YWx1ZXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYyNiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjBfMjIpIG9uIFNhdCBBcHIgMTcgMTg6NDY6MzYgSVNUIDIwMTAgLS0+Ci08VElUTEU+Ci1Db25zdGFudCBGaWVsZCBWYWx1ZXMKLTwvVElUTEU+Ci0KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9InN0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJDb25zdGFudCBGaWVsZCBWYWx1ZXMiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJvdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJkZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImluZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJoZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9ImluZGV4Lmh0bWw/Y29uc3RhbnQtdmFsdWVzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iY29uc3RhbnQtdmFsdWVzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMT4KLUNvbnN0YW50IEZpZWxkIFZhbHVlczwvSDE+Ci08L0NFTlRFUj4KLTxIUiBTSVpFPSI0IiBOT1NIQURFPgotPEI+Q29udGVudHM8L0I+PFVMPgotPExJPjxBIEhSRUY9IiNvcmcuZWNsaXBzZSI+b3JnLmVjbGlwc2UuKjwvQT4KLTwvVUw+Ci0KLTxBIE5BTUU9Im9yZy5lY2xpcHNlIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEZPTlQgU0laRT0iKzIiPgotb3JnLmVjbGlwc2UuKjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMyI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlPC9BPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuZU5BTUUiPjwhLS0gLS0+PC9BPjxURCBBTElHTj0icmlnaHQiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnB1YmxpYyZuYnNwO3N0YXRpYyZuYnNwO2ZpbmFsJm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURCBBTElHTj0ibGVmdCI+PENPREU+PEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZU5BTUUiPmVOQU1FPC9BPjwvQ09ERT48L1REPgotPFREIEFMSUdOPSJyaWdodCI+PENPREU+ImRvbSI8L0NPREU+PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZS5lTlNfUFJFRklYIj48IS0tIC0tPjwvQT48VEQgQUxJR049InJpZ2h0Ij48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wdWJsaWMmbmJzcDtzdGF0aWMmbmJzcDtmaW5hbCZuYnNwO2phdmEubGFuZy5TdHJpbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQgQUxJR049ImxlZnQiPjxDT0RFPjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI2VOU19QUkVGSVgiPmVOU19QUkVGSVg8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lIjwvQ09ERT48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPEEgTkFNRT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlLmVOU19VUkkiPjwhLS0gLS0+PC9BPjxURCBBTElHTj0icmlnaHQiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnB1YmxpYyZuYnNwO3N0YXRpYyZuYnNwO2ZpbmFsJm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURCBBTElHTj0ibGVmdCI+PENPREU+PEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZU5TX1VSSSI+ZU5TX1VSSTwvQT48L0NPREU+PC9URD4KLTxURCBBTElHTj0icmlnaHQiPjxDT0RFPiJodHRwOi8vL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9kb20uZWNvcmUiPC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSURPTSI+PCEtLSAtLT48L0E+PFREIEFMSUdOPSJyaWdodCI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHVibGljJm5ic3A7c3RhdGljJm5ic3A7ZmluYWwmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQgQUxJR049ImxlZnQiPjxDT0RFPjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lET00iPklET008L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4wPC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSURPTV9fV0VCX1NFUlZJQ0VfUFJPSkVDVFMiPjwhLS0gLS0+PC9BPjxURCBBTElHTj0icmlnaHQiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnB1YmxpYyZuYnNwO3N0YXRpYyZuYnNwO2ZpbmFsJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREIEFMSUdOPSJsZWZ0Ij48Q09ERT48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJRE9NX19XRUJfU0VSVklDRV9QUk9KRUNUUyI+SURPTV9fV0VCX1NFUlZJQ0VfUFJPSkVDVFM8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4wPC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSURPTV9GRUFUVVJFX0NPVU5UIj48IS0tIC0tPjwvQT48VEQgQUxJR049InJpZ2h0Ij48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wdWJsaWMmbmJzcDtzdGF0aWMmbmJzcDtmaW5hbCZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURCBBTElHTj0ibGVmdCI+PENPREU+PEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSURPTV9GRUFUVVJFX0NPVU5UIj5JRE9NX0ZFQVRVUkVfQ09VTlQ8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4xPC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVCI+PCEtLSAtLT48L0E+PFREIEFMSUdOPSJyaWdodCI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHVibGljJm5ic3A7c3RhdGljJm5ic3A7ZmluYWwmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQgQUxJR049ImxlZnQiPjxDT0RFPjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlQiPklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlQ8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4xPC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT04iPjwhLS0gLS0+PC9BPjxURCBBTElHTj0icmlnaHQiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnB1YmxpYyZuYnNwO3N0YXRpYyZuYnNwO2ZpbmFsJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREIEFMSUdOPSJsZWZ0Ij48Q09ERT48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTiI+SUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT048L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4wPC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRSI+PCEtLSAtLT48L0E+PFREIEFMSUdOPSJyaWdodCI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHVibGljJm5ic3A7c3RhdGljJm5ic3A7ZmluYWwmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQgQUxJR049ImxlZnQiPjxDT0RFPjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUiPklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUU8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4xPC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UIj48IS0tIC0tPjwvQT48VEQgQUxJR049InJpZ2h0Ij48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wdWJsaWMmbmJzcDtzdGF0aWMmbmJzcDtmaW5hbCZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURCBBTElHTj0ibGVmdCI+PENPREU+PEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UIj5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQ8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4yPC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFIj48IS0tIC0tPjwvQT48VEQgQUxJR049InJpZ2h0Ij48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wdWJsaWMmbmJzcDtzdGF0aWMmbmJzcDtmaW5hbCZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURCBBTElHTj0ibGVmdCI+PENPREU+PEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFIj5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0U8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4yPC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRBVElPTiI+PCEtLSAtLT48L0E+PFREIEFMSUdOPSJyaWdodCI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHVibGljJm5ic3A7c3RhdGljJm5ic3A7ZmluYWwmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQgQUxJR049ImxlZnQiPjxDT0RFPjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5UQVRJT04iPklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5UQVRJT048L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4wPC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRJTkdfV0VCX1NFUlZJQ0VTIj48IS0tIC0tPjwvQT48VEQgQUxJR049InJpZ2h0Ij48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wdWJsaWMmbmJzcDtzdGF0aWMmbmJzcDtmaW5hbCZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURCBBTElHTj0ibGVmdCI+PENPREU+PEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRJTkdfV0VCX1NFUlZJQ0VTIj5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExFTUVOVElOR19XRUJfU0VSVklDRVM8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4zPC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVCI+PCEtLSAtLT48L0E+PFREIEFMSUdOPSJyaWdodCI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHVibGljJm5ic3A7c3RhdGljJm5ic3A7ZmluYWwmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQgQUxJR049ImxlZnQiPjxDT0RFPjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTElDSVQiPklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTElDSVQ8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4yPC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19OQU1FIj48IS0tIC0tPjwvQT48VEQgQUxJR049InJpZ2h0Ij48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wdWJsaWMmbmJzcDtzdGF0aWMmbmJzcDtmaW5hbCZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURCBBTElHTj0ibGVmdCI+PENPREU+PEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19OQU1FIj5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX05BTUU8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4xPC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFIj48IS0tIC0tPjwvQT48VEQgQUxJR049InJpZ2h0Ij48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wdWJsaWMmbmJzcDtzdGF0aWMmbmJzcDtmaW5hbCZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURCBBTElHTj0ibGVmdCI+PENPREU+PEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFIj5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEU8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT44PC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfU1RZTEUiPjwhLS0gLS0+PC9BPjxURCBBTElHTj0icmlnaHQiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnB1YmxpYyZuYnNwO3N0YXRpYyZuYnNwO2ZpbmFsJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREIEFMSUdOPSJsZWZ0Ij48Q09ERT48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19TVFlMRSI+SVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfU1RZTEU8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT42PC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfVVNFIj48IS0tIC0tPjwvQT48VEQgQUxJR049InJpZ2h0Ij48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wdWJsaWMmbmJzcDtzdGF0aWMmbmJzcDtmaW5hbCZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURCBBTElHTj0ibGVmdCI+PENPREU+PEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfVVNFIj5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19VU0U8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT43PC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19UQVJHRVRfTkFNRVNQQUNFIj48IS0tIC0tPjwvQT48VEQgQUxJR049InJpZ2h0Ij48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wdWJsaWMmbmJzcDtzdGF0aWMmbmJzcDtmaW5hbCZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURCBBTElHTj0ibGVmdCI+PENPREU+PEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19UQVJHRVRfTkFNRVNQQUNFIj5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1RBUkdFVF9OQU1FU1BBQ0U8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT41PC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19XRUJfTUVUSE9EUyI+PCEtLSAtLT48L0E+PFREIEFMSUdOPSJyaWdodCI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHVibGljJm5ic3A7c3RhdGljJm5ic3A7ZmluYWwmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQgQUxJR049ImxlZnQiPjxDT0RFPjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fV0VCX01FVEhPRFMiPklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fV0VCX01FVEhPRFM8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT40PC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX0ZFQVRVUkVfQ09VTlQiPjwhLS0gLS0+PC9BPjxURCBBTElHTj0icmlnaHQiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnB1YmxpYyZuYnNwO3N0YXRpYyZuYnNwO2ZpbmFsJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREIEFMSUdOPSJsZWZ0Ij48Q09ERT48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfRkVBVFVSRV9DT1VOVCI+SVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX0ZFQVRVUkVfQ09VTlQ8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT45PC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9NRVRIT0QiPjwhLS0gLS0+PC9BPjxURCBBTElHTj0icmlnaHQiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnB1YmxpYyZuYnNwO3N0YXRpYyZuYnNwO2ZpbmFsJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREIEFMSUdOPSJsZWZ0Ij48Q09ERT48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJV0VCX01FVEhPRCI+SVdFQl9NRVRIT0Q8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4zPC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX0VYQ0xVREVEIj48IS0tIC0tPjwvQT48VEQgQUxJR049InJpZ2h0Ij48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wdWJsaWMmbmJzcDtzdGF0aWMmbmJzcDtmaW5hbCZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURCBBTElHTj0ibGVmdCI+PENPREU+PEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVdFQl9NRVRIT0RfX0VYQ0xVREVEIj5JV0VCX01FVEhPRF9fRVhDTFVERUQ8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4zPC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX0lNUExFTUVOVEFUSU9OIj48IS0tIC0tPjwvQT48VEQgQUxJR049InJpZ2h0Ij48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wdWJsaWMmbmJzcDtzdGF0aWMmbmJzcDtmaW5hbCZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURCBBTElHTj0ibGVmdCI+PENPREU+PEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVdFQl9NRVRIT0RfX0lNUExFTUVOVEFUSU9OIj5JV0VCX01FVEhPRF9fSU1QTEVNRU5UQVRJT048L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4wPC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX05BTUUiPjwhLS0gLS0+PC9BPjxURCBBTElHTj0icmlnaHQiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnB1YmxpYyZuYnNwO3N0YXRpYyZuYnNwO2ZpbmFsJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREIEFMSUdOPSJsZWZ0Ij48Q09ERT48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJV0VCX01FVEhPRF9fTkFNRSI+SVdFQl9NRVRIT0RfX05BTUU8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4xPC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1BBUkFNRVRFUlMiPjwhLS0gLS0+PC9BPjxURCBBTElHTj0icmlnaHQiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnB1YmxpYyZuYnNwO3N0YXRpYyZuYnNwO2ZpbmFsJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREIEFMSUdOPSJsZWZ0Ij48Q09ERT48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJV0VCX01FVEhPRF9fUEFSQU1FVEVSUyI+SVdFQl9NRVRIT0RfX1BBUkFNRVRFUlM8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4yPC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEUiPjwhLS0gLS0+PC9BPjxURCBBTElHTj0icmlnaHQiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnB1YmxpYyZuYnNwO3N0YXRpYyZuYnNwO2ZpbmFsJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREIEFMSUdOPSJsZWZ0Ij48Q09ERT48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRSI+SVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEU8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT42PC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19TVFlMRSI+PCEtLSAtLT48L0E+PFREIEFMSUdOPSJyaWdodCI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHVibGljJm5ic3A7c3RhdGljJm5ic3A7ZmluYWwmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQgQUxJR049ImxlZnQiPjxDT0RFPjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfU1RZTEUiPklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfU1RZTEU8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT40PC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19VU0UiPjwhLS0gLS0+PC9BPjxURCBBTElHTj0icmlnaHQiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnB1YmxpYyZuYnNwO3N0YXRpYyZuYnNwO2ZpbmFsJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREIEFMSUdOPSJsZWZ0Ij48Q09ERT48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1VTRSI+SVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19VU0U8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT41PC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9NRVRIT0RfRkVBVFVSRV9DT1VOVCI+PCEtLSAtLT48L0E+PFREIEFMSUdOPSJyaWdodCI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHVibGljJm5ic3A7c3RhdGljJm5ic3A7ZmluYWwmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQgQUxJR049ImxlZnQiPjxDT0RFPjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lXRUJfTUVUSE9EX0ZFQVRVUkVfQ09VTlQiPklXRUJfTUVUSE9EX0ZFQVRVUkVfQ09VTlQ8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT43PC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9QQVJBTSI+PCEtLSAtLT48L0E+PFREIEFMSUdOPSJyaWdodCI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHVibGljJm5ic3A7c3RhdGljJm5ic3A7ZmluYWwmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQgQUxJR049ImxlZnQiPjxDT0RFPjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lXRUJfUEFSQU0iPklXRUJfUEFSQU08L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT40PC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9QQVJBTV9fSEVBREVSIj48IS0tIC0tPjwvQT48VEQgQUxJR049InJpZ2h0Ij48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wdWJsaWMmbmJzcDtzdGF0aWMmbmJzcDtmaW5hbCZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURCBBTElHTj0ibGVmdCI+PENPREU+PEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVdFQl9QQVJBTV9fSEVBREVSIj5JV0VCX1BBUkFNX19IRUFERVI8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT42PC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9QQVJBTV9fSU1QTEVNRU5UQVRJT04iPjwhLS0gLS0+PC9BPjxURCBBTElHTj0icmlnaHQiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnB1YmxpYyZuYnNwO3N0YXRpYyZuYnNwO2ZpbmFsJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREIEFMSUdOPSJsZWZ0Ij48Q09ERT48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJV0VCX1BBUkFNX19JTVBMRU1FTlRBVElPTiI+SVdFQl9QQVJBTV9fSU1QTEVNRU5UQVRJT048L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4wPC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9QQVJBTV9fS0lORCI+PCEtLSAtLT48L0E+PFREIEFMSUdOPSJyaWdodCI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHVibGljJm5ic3A7c3RhdGljJm5ic3A7ZmluYWwmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQgQUxJR049ImxlZnQiPjxDT0RFPjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lXRUJfUEFSQU1fX0tJTkQiPklXRUJfUEFSQU1fX0tJTkQ8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4yPC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9QQVJBTV9fTkFNRSI+PCEtLSAtLT48L0E+PFREIEFMSUdOPSJyaWdodCI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHVibGljJm5ic3A7c3RhdGljJm5ic3A7ZmluYWwmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQgQUxJR049ImxlZnQiPjxDT0RFPjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lXRUJfUEFSQU1fX05BTUUiPklXRUJfUEFSQU1fX05BTUU8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4xPC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9QQVJBTV9fUEFSVF9OQU1FIj48IS0tIC0tPjwvQT48VEQgQUxJR049InJpZ2h0Ij48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wdWJsaWMmbmJzcDtzdGF0aWMmbmJzcDtmaW5hbCZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURCBBTElHTj0ibGVmdCI+PENPREU+PEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVdFQl9QQVJBTV9fUEFSVF9OQU1FIj5JV0VCX1BBUkFNX19QQVJUX05BTUU8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT40PC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRSI+PCEtLSAtLT48L0E+PFREIEFMSUdOPSJyaWdodCI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHVibGljJm5ic3A7c3RhdGljJm5ic3A7ZmluYWwmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQgQUxJR049ImxlZnQiPjxDT0RFPjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0UiPklXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0U8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT41PC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9QQVJBTV9fVFlQRV9OQU1FIj48IS0tIC0tPjwvQT48VEQgQUxJR049InJpZ2h0Ij48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wdWJsaWMmbmJzcDtzdGF0aWMmbmJzcDtmaW5hbCZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURCBBTElHTj0ibGVmdCI+PENPREU+PEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVdFQl9QQVJBTV9fVFlQRV9OQU1FIj5JV0VCX1BBUkFNX19UWVBFX05BTUU8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4zPC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9QQVJBTV9GRUFUVVJFX0NPVU5UIj48IS0tIC0tPjwvQT48VEQgQUxJR049InJpZ2h0Ij48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wdWJsaWMmbmJzcDtzdGF0aWMmbmJzcDtmaW5hbCZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURCBBTElHTj0ibGVmdCI+PENPREU+PEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVdFQl9QQVJBTV9GRUFUVVJFX0NPVU5UIj5JV0VCX1BBUkFNX0ZFQVRVUkVfQ09VTlQ8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT43PC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9TRVJWSUNFIj48IS0tIC0tPjwvQT48VEQgQUxJR049InJpZ2h0Ij48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wdWJsaWMmbmJzcDtzdGF0aWMmbmJzcDtmaW5hbCZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURCBBTElHTj0ibGVmdCI+PENPREU+PEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVdFQl9TRVJWSUNFIj5JV0VCX1NFUlZJQ0U8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT41PC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19JTVBMRU1FTlRBVElPTiI+PCEtLSAtLT48L0E+PFREIEFMSUdOPSJyaWdodCI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHVibGljJm5ic3A7c3RhdGljJm5ic3A7ZmluYWwmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQgQUxJR049ImxlZnQiPjxDT0RFPjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lXRUJfU0VSVklDRV9fSU1QTEVNRU5UQVRJT04iPklXRUJfU0VSVklDRV9fSU1QTEVNRU5UQVRJT048L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4wPC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19OQU1FIj48IS0tIC0tPjwvQT48VEQgQUxJR049InJpZ2h0Ij48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wdWJsaWMmbmJzcDtzdGF0aWMmbmJzcDtmaW5hbCZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURCBBTElHTj0ibGVmdCI+PENPREU+PEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVdFQl9TRVJWSUNFX19OQU1FIj5JV0VCX1NFUlZJQ0VfX05BTUU8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4xPC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19QT1JUX05BTUUiPjwhLS0gLS0+PC9BPjxURCBBTElHTj0icmlnaHQiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnB1YmxpYyZuYnNwO3N0YXRpYyZuYnNwO2ZpbmFsJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREIEFMSUdOPSJsZWZ0Ij48Q09ERT48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJV0VCX1NFUlZJQ0VfX1BPUlRfTkFNRSI+SVdFQl9TRVJWSUNFX19QT1JUX05BTUU8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT40PC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19TRVJWSUNFX0VORFBPSU5UIj48IS0tIC0tPjwvQT48VEQgQUxJR049InJpZ2h0Ij48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wdWJsaWMmbmJzcDtzdGF0aWMmbmJzcDtmaW5hbCZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURCBBTElHTj0ibGVmdCI+PENPREU+PEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVdFQl9TRVJWSUNFX19TRVJWSUNFX0VORFBPSU5UIj5JV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQ8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4yPC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19UQVJHRVRfTkFNRVNQQUNFIj48IS0tIC0tPjwvQT48VEQgQUxJR049InJpZ2h0Ij48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wdWJsaWMmbmJzcDtzdGF0aWMmbmJzcDtmaW5hbCZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURCBBTElHTj0ibGVmdCI+PENPREU+PEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVdFQl9TRVJWSUNFX19UQVJHRVRfTkFNRVNQQUNFIj5JV0VCX1NFUlZJQ0VfX1RBUkdFVF9OQU1FU1BBQ0U8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4zPC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19XU0RMX0xPQ0FUSU9OIj48IS0tIC0tPjwvQT48VEQgQUxJR049InJpZ2h0Ij48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wdWJsaWMmbmJzcDtzdGF0aWMmbmJzcDtmaW5hbCZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURCBBTElHTj0ibGVmdCI+PENPREU+PEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVdFQl9TRVJWSUNFX19XU0RMX0xPQ0FUSU9OIj5JV0VCX1NFUlZJQ0VfX1dTRExfTE9DQVRJT048L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT41PC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX0ZFQVRVUkVfQ09VTlQiPjwhLS0gLS0+PC9BPjxURCBBTElHTj0icmlnaHQiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnB1YmxpYyZuYnNwO3N0YXRpYyZuYnNwO2ZpbmFsJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREIEFMSUdOPSJsZWZ0Ij48Q09ERT48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJV0VCX1NFUlZJQ0VfRkVBVFVSRV9DT1VOVCI+SVdFQl9TRVJWSUNFX0ZFQVRVUkVfQ09VTlQ8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT42PC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1QiPjwhLS0gLS0+PC9BPjxURCBBTElHTj0icmlnaHQiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnB1YmxpYyZuYnNwO3N0YXRpYyZuYnNwO2ZpbmFsJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREIEFMSUdOPSJsZWZ0Ij48Q09ERT48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJV0VCX1NFUlZJQ0VfUFJPSkVDVCI+SVdFQl9TRVJWSUNFX1BST0pFQ1Q8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT42PC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX05BTUUiPjwhLS0gLS0+PC9BPjxURCBBTElHTj0icmlnaHQiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnB1YmxpYyZuYnNwO3N0YXRpYyZuYnNwO2ZpbmFsJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREIEFMSUdOPSJsZWZ0Ij48Q09ERT48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJV0VCX1NFUlZJQ0VfUFJPSkVDVF9fTkFNRSI+SVdFQl9TRVJWSUNFX1BST0pFQ1RfX05BTUU8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4yPC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFUyI+PCEtLSAtLT48L0E+PFREIEFMSUdOPSJyaWdodCI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHVibGljJm5ic3A7c3RhdGljJm5ic3A7ZmluYWwmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQgQUxJR049ImxlZnQiPjxDT0RFPjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lXRUJfU0VSVklDRV9QUk9KRUNUX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRVMiPklXRUJfU0VSVklDRV9QUk9KRUNUX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRVM8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4xPC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX1dFQl9TRVJWSUNFUyI+PCEtLSAtLT48L0E+PFREIEFMSUdOPSJyaWdodCI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHVibGljJm5ic3A7c3RhdGljJm5ic3A7ZmluYWwmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQgQUxJR049ImxlZnQiPjxDT0RFPjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lXRUJfU0VSVklDRV9QUk9KRUNUX19XRUJfU0VSVklDRVMiPklXRUJfU0VSVklDRV9QUk9KRUNUX19XRUJfU0VSVklDRVM8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4wPC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1RfRkVBVFVSRV9DT1VOVCI+PCEtLSAtLT48L0E+PFREIEFMSUdOPSJyaWdodCI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHVibGljJm5ic3A7c3RhdGljJm5ic3A7ZmluYWwmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQgQUxJR049ImxlZnQiPjxDT0RFPjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lXRUJfU0VSVklDRV9QUk9KRUNUX0ZFQVRVUkVfQ09VTlQiPklXRUJfU0VSVklDRV9QUk9KRUNUX0ZFQVRVUkVfQ09VTlQ8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4zPC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9UWVBFIj48IS0tIC0tPjwvQT48VEQgQUxJR049InJpZ2h0Ij48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wdWJsaWMmbmJzcDtzdGF0aWMmbmJzcDtmaW5hbCZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURCBBTElHTj0ibGVmdCI+PENPREU+PEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVdFQl9UWVBFIj5JV0VCX1RZUEU8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT43PC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9UWVBFX19JTVBMRU1FTlRBVElPTiI+PCEtLSAtLT48L0E+PFREIEFMSUdOPSJyaWdodCI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHVibGljJm5ic3A7c3RhdGljJm5ic3A7ZmluYWwmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQgQUxJR049ImxlZnQiPjxDT0RFPjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lXRUJfVFlQRV9fSU1QTEVNRU5UQVRJT04iPklXRUJfVFlQRV9fSU1QTEVNRU5UQVRJT048L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4wPC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9UWVBFX19OQU1FIj48IS0tIC0tPjwvQT48VEQgQUxJR049InJpZ2h0Ij48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wdWJsaWMmbmJzcDtzdGF0aWMmbmJzcDtmaW5hbCZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURCBBTElHTj0ibGVmdCI+PENPREU+PEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVdFQl9UWVBFX19OQU1FIj5JV0VCX1RZUEVfX05BTUU8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4xPC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9UWVBFX0ZFQVRVUkVfQ09VTlQiPjwhLS0gLS0+PC9BPjxURCBBTElHTj0icmlnaHQiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnB1YmxpYyZuYnNwO3N0YXRpYyZuYnNwO2ZpbmFsJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREIEFMSUdOPSJsZWZ0Ij48Q09ERT48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJV0VCX1RZUEVfRkVBVFVSRV9DT1VOVCI+SVdFQl9UWVBFX0ZFQVRVUkVfQ09VTlQ8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4yPC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRSI+PCEtLSAtLT48L0E+PFREIEFMSUdOPSJyaWdodCI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHVibGljJm5ic3A7c3RhdGljJm5ic3A7ZmluYWwmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQgQUxJR049ImxlZnQiPjxDT0RFPjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEUiPlNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEU8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4xMTwvQ09ERT48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPEEgTkFNRT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlLlNPQVBfQklORElOR19TVFlMRSI+PCEtLSAtLT48L0E+PFREIEFMSUdOPSJyaWdodCI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHVibGljJm5ic3A7c3RhdGljJm5ic3A7ZmluYWwmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQgQUxJR049ImxlZnQiPjxDT0RFPjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI1NPQVBfQklORElOR19TVFlMRSI+U09BUF9CSU5ESU5HX1NUWUxFPC9BPjwvQ09ERT48L1REPgotPFREIEFMSUdOPSJyaWdodCI+PENPREU+OTwvQ09ERT48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPEEgTkFNRT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlLlNPQVBfQklORElOR19VU0UiPjwhLS0gLS0+PC9BPjxURCBBTElHTj0icmlnaHQiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnB1YmxpYyZuYnNwO3N0YXRpYyZuYnNwO2ZpbmFsJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREIEFMSUdOPSJsZWZ0Ij48Q09ERT48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNTT0FQX0JJTkRJTkdfVVNFIj5TT0FQX0JJTkRJTkdfVVNFPC9BPjwvQ09ERT48L1REPgotPFREIEFMSUdOPSJyaWdodCI+PENPREU+MTA8L0NPREU+PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZS5XRUJfUEFSQU1fS0lORCI+PCEtLSAtLT48L0E+PFREIEFMSUdOPSJyaWdodCI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHVibGljJm5ic3A7c3RhdGljJm5ic3A7ZmluYWwmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQgQUxJR049ImxlZnQiPjxDT0RFPjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI1dFQl9QQVJBTV9LSU5EIj5XRUJfUEFSQU1fS0lORDwvQT48L0NPREU+PC9URD4KLTxURCBBTElHTj0icmlnaHQiPjxDT0RFPjg8L0NPREU+PC9URD4KLTwvVFI+Ci08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotCi08UD4KLQotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIzIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlPC9BPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuQkFSRV9WQUxVRSI+PCEtLSAtLT48L0E+PFREIEFMSUdOPSJyaWdodCI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHVibGljJm5ic3A7c3RhdGljJm5ic3A7ZmluYWwmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQgQUxJR049ImxlZnQiPjxDT0RFPjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sI0JBUkVfVkFMVUUiPkJBUkVfVkFMVUU8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4xPC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuV1JBUFBFRF9WQUxVRSI+PCEtLSAtLT48L0E+PFREIEFMSUdOPSJyaWdodCI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHVibGljJm5ic3A7c3RhdGljJm5ic3A7ZmluYWwmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQgQUxJR049ImxlZnQiPjxDT0RFPjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sI1dSQVBQRURfVkFMVUUiPldSQVBQRURfVkFMVUU8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4wPC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLQotPFA+Ci0KLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMyI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdTdHlsZTwvQT48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPEEgTkFNRT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlLkRPQ1VNRU5UX1ZBTFVFIj48IS0tIC0tPjwvQT48VEQgQUxJR049InJpZ2h0Ij48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wdWJsaWMmbmJzcDtzdGF0aWMmbmJzcDtmaW5hbCZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURCBBTElHTj0ibGVmdCI+PENPREU+PEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwjRE9DVU1FTlRfVkFMVUUiPkRPQ1VNRU5UX1ZBTFVFPC9BPjwvQ09ERT48L1REPgotPFREIEFMSUdOPSJyaWdodCI+PENPREU+MDwvQ09ERT48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPEEgTkFNRT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlLlJQQ19WQUxVRSI+PCEtLSAtLT48L0E+PFREIEFMSUdOPSJyaWdodCI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHVibGljJm5ic3A7c3RhdGljJm5ic3A7ZmluYWwmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQgQUxJR049ImxlZnQiPjxDT0RFPjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sI1JQQ19WQUxVRSI+UlBDX1ZBTFVFPC9BPjwvQ09ERT48L1REPgotPFREIEFMSUdOPSJyaWdodCI+PENPREU+MTwvQ09ERT48L1REPgotPC9UUj4KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxQPgotCi08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjMiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1VzZTwvQT48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPEEgTkFNRT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZS5FTkNPREVEX1ZBTFVFIj48IS0tIC0tPjwvQT48VEQgQUxJR049InJpZ2h0Ij48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wdWJsaWMmbmJzcDtzdGF0aWMmbmJzcDtmaW5hbCZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURCBBTElHTj0ibGVmdCI+PENPREU+PEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sI0VOQ09ERURfVkFMVUUiPkVOQ09ERURfVkFMVUU8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4xPC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlLkxJVEVSQUxfVkFMVUUiPjwhLS0gLS0+PC9BPjxURCBBTElHTj0icmlnaHQiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnB1YmxpYyZuYnNwO3N0YXRpYyZuYnNwO2ZpbmFsJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREIEFMSUdOPSJsZWZ0Ij48Q09ERT48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwjTElURVJBTF9WQUxVRSI+TElURVJBTF9WQUxVRTwvQT48L0NPREU+PC9URD4KLTxURCBBTElHTj0icmlnaHQiPjxDT0RFPjA8L0NPREU+PC9URD4KLTwvVFI+Ci08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotCi08UD4KLQotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIzIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPldlYlBhcmFtS2luZDwvQT48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPEEgTkFNRT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5XZWJQYXJhbUtpbmQuSU5fVkFMVUUiPjwhLS0gLS0+PC9BPjxURCBBTElHTj0icmlnaHQiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnB1YmxpYyZuYnNwO3N0YXRpYyZuYnNwO2ZpbmFsJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREIEFMSUdOPSJsZWZ0Ij48Q09ERT48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sI0lOX1ZBTFVFIj5JTl9WQUxVRTwvQT48L0NPREU+PC9URD4KLTxURCBBTElHTj0icmlnaHQiPjxDT0RFPjA8L0NPREU+PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV2ViUGFyYW1LaW5kLklOT1VUX1ZBTFVFIj48IS0tIC0tPjwvQT48VEQgQUxJR049InJpZ2h0Ij48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wdWJsaWMmbmJzcDtzdGF0aWMmbmJzcDtmaW5hbCZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURCBBTElHTj0ibGVmdCI+PENPREU+PEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuaHRtbCNJTk9VVF9WQUxVRSI+SU5PVVRfVkFMVUU8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4xPC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldlYlBhcmFtS2luZC5PVVRfVkFMVUUiPjwhLS0gLS0+PC9BPjxURCBBTElHTj0icmlnaHQiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnB1YmxpYyZuYnNwO3N0YXRpYyZuYnNwO2ZpbmFsJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREIEFMSUdOPSJsZWZ0Ij48Q09ERT48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sI09VVF9WQUxVRSI+T1VUX1ZBTFVFPC9BPjwvQ09ERT48L1REPgotPFREIEFMSUdOPSJyaWdodCI+PENPREU+MjwvQ09ERT48L1REPgotPC9UUj4KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxQPgotCi08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJvdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJkZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImluZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJoZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9ImluZGV4Lmh0bWw/Y29uc3RhbnQtdmFsdWVzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iY29uc3RhbnQtdmFsdWVzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2RlcHJlY2F0ZWQtbGlzdC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9kZXByZWNhdGVkLWxpc3QuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJjN2I4Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2RlcHJlY2F0ZWQtbGlzdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMF8yMikgb24gU2F0IEFwciAxNyAxODo0NjozNiBJU1QgMjAxMCAtLT4KLTxUSVRMRT4KLURlcHJlY2F0ZWQgTGlzdAotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0ic3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IkRlcHJlY2F0ZWQgTGlzdCI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Im92ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImluZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJoZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9ImluZGV4Lmh0bWw/ZGVwcmVjYXRlZC1saXN0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iZGVwcmVjYXRlZC1saXN0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPkRlcHJlY2F0ZWQgQVBJPC9CPjwvSDI+Ci08L0NFTlRFUj4KLTxIUiBTSVpFPSI0IiBOT1NIQURFPgotPEI+Q29udGVudHM8L0I+PFVMPgotPC9VTD4KLQotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Im92ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImluZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJoZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9ImluZGV4Lmh0bWw/ZGVwcmVjYXRlZC1saXN0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iZGVwcmVjYXRlZC1saXN0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2hlbHAtZG9jLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2hlbHAtZG9jLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlOWQxZDcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9oZWxwLWRvYy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMF8yMikgb24gU2F0IEFwciAxNyAxODo0NjozNiBJU1QgMjAxMCAtLT4KLTxUSVRMRT4KLUFQSSBIZWxwCi08L1RJVExFPgotCi0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSJzdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iQVBJIEhlbHAiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJvdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJkZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImluZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkhlbHA8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iaW5kZXguaHRtbD9oZWxwLWRvYy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImhlbHAtZG9jLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMT4KLUhvdyBUaGlzIEFQSSBEb2N1bWVudCBJcyBPcmdhbml6ZWQ8L0gxPgotPC9DRU5URVI+Ci1UaGlzIEFQSSAoQXBwbGljYXRpb24gUHJvZ3JhbW1pbmcgSW50ZXJmYWNlKSBkb2N1bWVudCBoYXMgcGFnZXMgY29ycmVzcG9uZGluZyB0byB0aGUgaXRlbXMgaW4gdGhlIG5hdmlnYXRpb24gYmFyLCBkZXNjcmliZWQgYXMgZm9sbG93cy48SDM+Ci1PdmVydmlldzwvSDM+Ci08QkxPQ0tRVU9URT4KLQotPFA+Ci1UaGUgPEEgSFJFRj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIj5PdmVydmlldzwvQT4gcGFnZSBpcyB0aGUgZnJvbnQgcGFnZSBvZiB0aGlzIEFQSSBkb2N1bWVudCBhbmQgcHJvdmlkZXMgYSBsaXN0IG9mIGFsbCBwYWNrYWdlcyB3aXRoIGEgc3VtbWFyeSBmb3IgZWFjaC4gIFRoaXMgcGFnZSBjYW4gYWxzbyBjb250YWluIGFuIG92ZXJhbGwgZGVzY3JpcHRpb24gb2YgdGhlIHNldCBvZiBwYWNrYWdlcy48L0JMT0NLUVVPVEU+Ci08SDM+Ci1QYWNrYWdlPC9IMz4KLTxCTE9DS1FVT1RFPgotCi08UD4KLUVhY2ggcGFja2FnZSBoYXMgYSBwYWdlIHRoYXQgY29udGFpbnMgYSBsaXN0IG9mIGl0cyBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzLCB3aXRoIGEgc3VtbWFyeSBmb3IgZWFjaC4gVGhpcyBwYWdlIGNhbiBjb250YWluIGZvdXIgY2F0ZWdvcmllczo8VUw+Ci08TEk+SW50ZXJmYWNlcyAoaXRhbGljKTxMST5DbGFzc2VzPExJPkVudW1zPExJPkV4Y2VwdGlvbnM8TEk+RXJyb3JzPExJPkFubm90YXRpb24gVHlwZXM8L1VMPgotPC9CTE9DS1FVT1RFPgotPEgzPgotQ2xhc3MvSW50ZXJmYWNlPC9IMz4KLTxCTE9DS1FVT1RFPgotCi08UD4KLUVhY2ggY2xhc3MsIGludGVyZmFjZSwgbmVzdGVkIGNsYXNzIGFuZCBuZXN0ZWQgaW50ZXJmYWNlIGhhcyBpdHMgb3duIHNlcGFyYXRlIHBhZ2UuIEVhY2ggb2YgdGhlc2UgcGFnZXMgaGFzIHRocmVlIHNlY3Rpb25zIGNvbnNpc3Rpbmcgb2YgYSBjbGFzcy9pbnRlcmZhY2UgZGVzY3JpcHRpb24sIHN1bW1hcnkgdGFibGVzLCBhbmQgZGV0YWlsZWQgbWVtYmVyIGRlc2NyaXB0aW9uczo8VUw+Ci08TEk+Q2xhc3MgaW5oZXJpdGFuY2UgZGlhZ3JhbTxMST5EaXJlY3QgU3ViY2xhc3NlczxMST5BbGwgS25vd24gU3ViaW50ZXJmYWNlczxMST5BbGwgS25vd24gSW1wbGVtZW50aW5nIENsYXNzZXM8TEk+Q2xhc3MvaW50ZXJmYWNlIGRlY2xhcmF0aW9uPExJPkNsYXNzL2ludGVyZmFjZSBkZXNjcmlwdGlvbgotPFA+Ci08TEk+TmVzdGVkIENsYXNzIFN1bW1hcnk8TEk+RmllbGQgU3VtbWFyeTxMST5Db25zdHJ1Y3RvciBTdW1tYXJ5PExJPk1ldGhvZCBTdW1tYXJ5Ci08UD4KLTxMST5GaWVsZCBEZXRhaWw8TEk+Q29uc3RydWN0b3IgRGV0YWlsPExJPk1ldGhvZCBEZXRhaWw8L1VMPgotRWFjaCBzdW1tYXJ5IGVudHJ5IGNvbnRhaW5zIHRoZSBmaXJzdCBzZW50ZW5jZSBmcm9tIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBmb3IgdGhhdCBpdGVtLiBUaGUgc3VtbWFyeSBlbnRyaWVzIGFyZSBhbHBoYWJldGljYWwsIHdoaWxlIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbnMgYXJlIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiB0aGUgc291cmNlIGNvZGUuIFRoaXMgcHJlc2VydmVzIHRoZSBsb2dpY2FsIGdyb3VwaW5ncyBlc3RhYmxpc2hlZCBieSB0aGUgcHJvZ3JhbW1lci48L0JMT0NLUVVPVEU+Ci08L0JMT0NLUVVPVEU+Ci08SDM+Ci1Bbm5vdGF0aW9uIFR5cGU8L0gzPgotPEJMT0NLUVVPVEU+Ci0KLTxQPgotRWFjaCBhbm5vdGF0aW9uIHR5cGUgaGFzIGl0cyBvd24gc2VwYXJhdGUgcGFnZSB3aXRoIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnM6PFVMPgotPExJPkFubm90YXRpb24gVHlwZSBkZWNsYXJhdGlvbjxMST5Bbm5vdGF0aW9uIFR5cGUgZGVzY3JpcHRpb248TEk+UmVxdWlyZWQgRWxlbWVudCBTdW1tYXJ5PExJPk9wdGlvbmFsIEVsZW1lbnQgU3VtbWFyeTxMST5FbGVtZW50IERldGFpbDwvVUw+Ci08L0JMT0NLUVVPVEU+Ci08L0JMT0NLUVVPVEU+Ci08SDM+Ci1FbnVtPC9IMz4KLTxCTE9DS1FVT1RFPgotCi08UD4KLUVhY2ggZW51bSBoYXMgaXRzIG93biBzZXBhcmF0ZSBwYWdlIHdpdGggdGhlIGZvbGxvd2luZyBzZWN0aW9uczo8VUw+Ci08TEk+RW51bSBkZWNsYXJhdGlvbjxMST5FbnVtIGRlc2NyaXB0aW9uPExJPkVudW0gQ29uc3RhbnQgU3VtbWFyeTxMST5FbnVtIENvbnN0YW50IERldGFpbDwvVUw+Ci08L0JMT0NLUVVPVEU+Ci08SDM+Ci1Vc2U8L0gzPgotPEJMT0NLUVVPVEU+Ci1FYWNoIGRvY3VtZW50ZWQgcGFja2FnZSwgY2xhc3MgYW5kIGludGVyZmFjZSBoYXMgaXRzIG93biBVc2UgcGFnZS4gIFRoaXMgcGFnZSBkZXNjcmliZXMgd2hhdCBwYWNrYWdlcywgY2xhc3NlcywgbWV0aG9kcywgY29uc3RydWN0b3JzIGFuZCBmaWVsZHMgdXNlIGFueSBwYXJ0IG9mIHRoZSBnaXZlbiBjbGFzcyBvciBwYWNrYWdlLiBHaXZlbiBhIGNsYXNzIG9yIGludGVyZmFjZSBBLCBpdHMgVXNlIHBhZ2UgaW5jbHVkZXMgc3ViY2xhc3NlcyBvZiBBLCBmaWVsZHMgZGVjbGFyZWQgYXMgQSwgbWV0aG9kcyB0aGF0IHJldHVybiBBLCBhbmQgbWV0aG9kcyBhbmQgY29uc3RydWN0b3JzIHdpdGggcGFyYW1ldGVycyBvZiB0eXBlIEEuICBZb3UgY2FuIGFjY2VzcyB0aGlzIHBhZ2UgYnkgZmlyc3QgZ29pbmcgdG8gdGhlIHBhY2thZ2UsIGNsYXNzIG9yIGludGVyZmFjZSwgdGhlbiBjbGlja2luZyBvbiB0aGUgIlVzZSIgbGluayBpbiB0aGUgbmF2aWdhdGlvbiBiYXIuPC9CTE9DS1FVT1RFPgotPEgzPgotVHJlZSAoQ2xhc3MgSGllcmFyY2h5KTwvSDM+Ci08QkxPQ0tRVU9URT4KLVRoZXJlIGlzIGEgPEEgSFJFRj0ib3ZlcnZpZXctdHJlZS5odG1sIj5DbGFzcyBIaWVyYXJjaHk8L0E+IHBhZ2UgZm9yIGFsbCBwYWNrYWdlcywgcGx1cyBhIGhpZXJhcmNoeSBmb3IgZWFjaCBwYWNrYWdlLiBFYWNoIGhpZXJhcmNoeSBwYWdlIGNvbnRhaW5zIGEgbGlzdCBvZiBjbGFzc2VzIGFuZCBhIGxpc3Qgb2YgaW50ZXJmYWNlcy4gVGhlIGNsYXNzZXMgYXJlIG9yZ2FuaXplZCBieSBpbmhlcml0YW5jZSBzdHJ1Y3R1cmUgc3RhcnRpbmcgd2l0aCA8Y29kZT5qYXZhLmxhbmcuT2JqZWN0PC9jb2RlPi4gVGhlIGludGVyZmFjZXMgZG8gbm90IGluaGVyaXQgZnJvbSA8Y29kZT5qYXZhLmxhbmcuT2JqZWN0PC9jb2RlPi48VUw+Ci08TEk+V2hlbiB2aWV3aW5nIHRoZSBPdmVydmlldyBwYWdlLCBjbGlja2luZyBvbiAiVHJlZSIgZGlzcGxheXMgdGhlIGhpZXJhcmNoeSBmb3IgYWxsIHBhY2thZ2VzLjxMST5XaGVuIHZpZXdpbmcgYSBwYXJ0aWN1bGFyIHBhY2thZ2UsIGNsYXNzIG9yIGludGVyZmFjZSBwYWdlLCBjbGlja2luZyAiVHJlZSIgZGlzcGxheXMgdGhlIGhpZXJhcmNoeSBmb3Igb25seSB0aGF0IHBhY2thZ2UuPC9VTD4KLTwvQkxPQ0tRVU9URT4KLTxIMz4KLURlcHJlY2F0ZWQgQVBJPC9IMz4KLTxCTE9DS1FVT1RFPgotVGhlIDxBIEhSRUY9ImRlcHJlY2F0ZWQtbGlzdC5odG1sIj5EZXByZWNhdGVkIEFQSTwvQT4gcGFnZSBsaXN0cyBhbGwgb2YgdGhlIEFQSSB0aGF0IGhhdmUgYmVlbiBkZXByZWNhdGVkLiBBIGRlcHJlY2F0ZWQgQVBJIGlzIG5vdCByZWNvbW1lbmRlZCBmb3IgdXNlLCBnZW5lcmFsbHkgZHVlIHRvIGltcHJvdmVtZW50cywgYW5kIGEgcmVwbGFjZW1lbnQgQVBJIGlzIHVzdWFsbHkgZ2l2ZW4uIERlcHJlY2F0ZWQgQVBJcyBtYXkgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgaW1wbGVtZW50YXRpb25zLjwvQkxPQ0tRVU9URT4KLTxIMz4KLUluZGV4PC9IMz4KLTxCTE9DS1FVT1RFPgotVGhlIDxBIEhSRUY9ImluZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+SW5kZXg8L0E+IGNvbnRhaW5zIGFuIGFscGhhYmV0aWMgbGlzdCBvZiBhbGwgY2xhc3NlcywgaW50ZXJmYWNlcywgY29uc3RydWN0b3JzLCBtZXRob2RzLCBhbmQgZmllbGRzLjwvQkxPQ0tRVU9URT4KLTxIMz4KLVByZXYvTmV4dDwvSDM+Ci1UaGVzZSBsaW5rcyB0YWtlIHlvdSB0byB0aGUgbmV4dCBvciBwcmV2aW91cyBjbGFzcywgaW50ZXJmYWNlLCBwYWNrYWdlLCBvciByZWxhdGVkIHBhZ2UuPEgzPgotRnJhbWVzL05vIEZyYW1lczwvSDM+Ci1UaGVzZSBsaW5rcyBzaG93IGFuZCBoaWRlIHRoZSBIVE1MIGZyYW1lcy4gIEFsbCBwYWdlcyBhcmUgYXZhaWxhYmxlIHdpdGggb3Igd2l0aG91dCBmcmFtZXMuCi08UD4KLTxIMz4KLVNlcmlhbGl6ZWQgRm9ybTwvSDM+Ci1FYWNoIHNlcmlhbGl6YWJsZSBvciBleHRlcm5hbGl6YWJsZSBjbGFzcyBoYXMgYSBkZXNjcmlwdGlvbiBvZiBpdHMgc2VyaWFsaXphdGlvbiBmaWVsZHMgYW5kIG1ldGhvZHMuIFRoaXMgaW5mb3JtYXRpb24gaXMgb2YgaW50ZXJlc3QgdG8gcmUtaW1wbGVtZW50b3JzLCBub3QgdG8gZGV2ZWxvcGVycyB1c2luZyB0aGUgQVBJLiBXaGlsZSB0aGVyZSBpcyBubyBsaW5rIGluIHRoZSBuYXZpZ2F0aW9uIGJhciwgeW91IGNhbiBnZXQgdG8gdGhpcyBpbmZvcm1hdGlvbiBieSBnb2luZyB0byBhbnkgc2VyaWFsaXplZCBjbGFzcyBhbmQgY2xpY2tpbmcgIlNlcmlhbGl6ZWQgRm9ybSIgaW4gdGhlICJTZWUgYWxzbyIgc2VjdGlvbiBvZiB0aGUgY2xhc3MgZGVzY3JpcHRpb24uCi08UD4KLTxIMz4KLUNvbnN0YW50IEZpZWxkIFZhbHVlczwvSDM+Ci1UaGUgPGEgaHJlZj0iY29uc3RhbnQtdmFsdWVzLmh0bWwiPkNvbnN0YW50IEZpZWxkIFZhbHVlczwvYT4gcGFnZSBsaXN0cyB0aGUgc3RhdGljIGZpbmFsIGZpZWxkcyBhbmQgdGhlaXIgdmFsdWVzLgotPFA+Ci08Rk9OVCBTSVpFPSItMSI+Ci08RU0+Ci1UaGlzIGhlbHAgZmlsZSBhcHBsaWVzIHRvIEFQSSBkb2N1bWVudGF0aW9uIGdlbmVyYXRlZCB1c2luZyB0aGUgc3RhbmRhcmQgZG9jbGV0LjwvRU0+Ci08L0ZPTlQ+Ci08QlI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJvdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0ib3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJpbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5IZWxwPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9ImluZGV4Lmh0bWw/aGVscC1kb2MuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJoZWxwLWRvYy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSJhbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY5MWRiZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjBfMjIpIG9uIFNhdCBBcHIgMTcgMTg6NDY6MzYgSVNUIDIwMTAgLS0+Ci08VElUTEU+Ci1BLUluZGV4Ci08L1RJVExFPgotCi0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iQS1JbmRleCI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5JbmRleDwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViBMRVRURVImbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTIuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTEuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEEgSFJFRj0iaW5kZXgtMS5odG1sIj5BPC9BPiA8QSBIUkVGPSJpbmRleC0yLmh0bWwiPkI8L0E+IDxBIEhSRUY9ImluZGV4LTMuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtNC5odG1sIj5EPC9BPiA8QSBIUkVGPSJpbmRleC01Lmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTYuaHRtbCI+RjwvQT4gPEEgSFJFRj0iaW5kZXgtNy5odG1sIj5HPC9BPiA8QSBIUkVGPSJpbmRleC04Lmh0bWwiPkk8L0E+IDxBIEhSRUY9ImluZGV4LTkuaHRtbCI+TDwvQT4gPEEgSFJFRj0iaW5kZXgtMTAuaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+UjwvQT4gPEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+UzwvQT4gPEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+VDwvQT4gPEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+VjwvQT4gPEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+VzwvQT4gPEhSPgotPEEgTkFNRT0iX0FfIj48IS0tIC0tPjwvQT48SDI+Ci08Qj5BPC9CPjwvSDI+Ci08REw+Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV3NET01SdW50aW1lRXh0ZW5zaW9uLmh0bWwjYWRkTG9hZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdzRG9tTG9hZExpc3RlbmVyKSI+PEI+YWRkTG9hZExpc3RlbmVyKElXc0RvbUxvYWRMaXN0ZW5lcik8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRE9NUnVudGltZUV4dGVuc2lvbi5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXc0RPTVJ1bnRpbWVFeHRlbnNpb248L0E+Ci08REQ+QWRkcyBhIGxvYWQgbGlzdGVuZXIgdG8gYmUgbm90aWZpZWQgaW4gbG9hZCBldmVudHMuCi08L0RMPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5JbmRleDwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViBMRVRURVImbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTIuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTEuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEEgSFJFRj0iaW5kZXgtMS5odG1sIj5BPC9BPiA8QSBIUkVGPSJpbmRleC0yLmh0bWwiPkI8L0E+IDxBIEhSRUY9ImluZGV4LTMuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtNC5odG1sIj5EPC9BPiA8QSBIUkVGPSJpbmRleC01Lmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTYuaHRtbCI+RjwvQT4gPEEgSFJFRj0iaW5kZXgtNy5odG1sIj5HPC9BPiA8QSBIUkVGPSJpbmRleC04Lmh0bWwiPkk8L0E+IDxBIEhSRUY9ImluZGV4LTkuaHRtbCI+TDwvQT4gPEEgSFJFRj0iaW5kZXgtMTAuaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+UjwvQT4gPEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+UzwvQT4gPEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+VDwvQT4gPEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+VjwvQT4gPEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+VzwvQT4gPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2luZGV4LWZpbGVzL2luZGV4LTEwLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2luZGV4LWZpbGVzL2luZGV4LTEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MWFiY2MuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9pbmRleC1maWxlcy9pbmRleC0xMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMF8yMikgb24gU2F0IEFwciAxNyAxODo0NjozNiBJU1QgMjAxMCAtLT4KLTxUSVRMRT4KLU8tSW5kZXgKLTwvVElUTEU+Ci0KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJPLUluZGV4IjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC05Lmh0bWwiPjxCPlBSRVYgTEVUVEVSPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTExLmh0bWwiPjxCPk5FWFQgTEVUVEVSPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uL2luZGV4Lmh0bWw/aW5kZXgtZmlsZXNpbmRleC0xMC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTEwLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEEgSFJFRj0iaW5kZXgtMS5odG1sIj5BPC9BPiA8QSBIUkVGPSJpbmRleC0yLmh0bWwiPkI8L0E+IDxBIEhSRUY9ImluZGV4LTMuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtNC5odG1sIj5EPC9BPiA8QSBIUkVGPSJpbmRleC01Lmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTYuaHRtbCI+RjwvQT4gPEEgSFJFRj0iaW5kZXgtNy5odG1sIj5HPC9BPiA8QSBIUkVGPSJpbmRleC04Lmh0bWwiPkk8L0E+IDxBIEhSRUY9ImluZGV4LTkuaHRtbCI+TDwvQT4gPEEgSFJFRj0iaW5kZXgtMTAuaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+UjwvQT4gPEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+UzwvQT4gPEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+VDwvQT4gPEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+VjwvQT4gPEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+VzwvQT4gPEhSPgotPEEgTkFNRT0iX09fIj48IS0tIC0tPjwvQT48SDI+Ci08Qj5PPC9CPjwvSDI+Ci08REw+Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvQj48L0E+IC0gcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpPEREPiZuYnNwOzxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sI09VVF9WQUxVRSI+PEI+T1VUX1ZBTFVFPC9CPjwvQT4gLSAKLVN0YXRpYyB2YXJpYWJsZSBpbiBlbnVtIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+V2ViUGFyYW1LaW5kPC9BPgotPEREPlRoZSAnPGVtPjxiPk9VVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLTwvREw+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC05Lmh0bWwiPjxCPlBSRVYgTEVUVEVSPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTExLmh0bWwiPjxCPk5FWFQgTEVUVEVSPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uL2luZGV4Lmh0bWw/aW5kZXgtZmlsZXNpbmRleC0xMC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTEwLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEEgSFJFRj0iaW5kZXgtMS5odG1sIj5BPC9BPiA8QSBIUkVGPSJpbmRleC0yLmh0bWwiPkI8L0E+IDxBIEhSRUY9ImluZGV4LTMuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtNC5odG1sIj5EPC9BPiA8QSBIUkVGPSJpbmRleC01Lmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTYuaHRtbCI+RjwvQT4gPEEgSFJFRj0iaW5kZXgtNy5odG1sIj5HPC9BPiA8QSBIUkVGPSJpbmRleC04Lmh0bWwiPkk8L0E+IDxBIEhSRUY9ImluZGV4LTkuaHRtbCI+TDwvQT4gPEEgSFJFRj0iaW5kZXgtMTAuaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+UjwvQT4gPEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+UzwvQT4gPEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+VDwvQT4gPEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+VjwvQT4gPEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+VzwvQT4gPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2luZGV4LWZpbGVzL2luZGV4LTExLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2luZGV4LWZpbGVzL2luZGV4LTExLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZTk5YjcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9pbmRleC1maWxlcy9pbmRleC0xMS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMF8yMikgb24gU2F0IEFwciAxNyAxODo0NjozNiBJU1QgMjAxMCAtLT4KLTxUSVRMRT4KLVItSW5kZXgKLTwvVElUTEU+Ci0KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJSLUluZGV4IjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xMC5odG1sIj48Qj5QUkVWIExFVFRFUjwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xMi5odG1sIj48Qj5ORVhUIExFVFRFUjwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi9pbmRleC5odG1sP2luZGV4LWZpbGVzaW5kZXgtMTEuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xMS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxBIEhSRUY9ImluZGV4LTEuaHRtbCI+QTwvQT4gPEEgSFJFRj0iaW5kZXgtMi5odG1sIj5CPC9BPiA8QSBIUkVGPSJpbmRleC0zLmh0bWwiPkM8L0E+IDxBIEhSRUY9ImluZGV4LTQuaHRtbCI+RDwvQT4gPEEgSFJFRj0iaW5kZXgtNS5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC02Lmh0bWwiPkY8L0E+IDxBIEhSRUY9ImluZGV4LTcuaHRtbCI+RzwvQT4gPEEgSFJFRj0iaW5kZXgtOC5odG1sIj5JPC9BPiA8QSBIUkVGPSJpbmRleC05Lmh0bWwiPkw8L0E+IDxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPk88L0E+IDxBIEhSRUY9ImluZGV4LTExLmh0bWwiPlI8L0E+IDxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPlM8L0E+IDxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPlQ8L0E+IDxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPlY8L0E+IDxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPlc8L0E+IDxIUj4KLTxBIE5BTUU9Il9SXyI+PCEtLSAtLT48L0E+PEgyPgotPEI+UjwvQj48L0gyPgotPERMPgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdTRE9NUnVudGltZU1hbmFnZXIuaHRtbCNyZWxvYWRET01SdW50aW1lcyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikiPjxCPnJlbG9hZERPTVJ1bnRpbWVzKElQcm9ncmVzc01vbml0b3IpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXU0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdTRE9NUnVudGltZU1hbmFnZXI8L0E+Ci08REQ+VGhpcyBtZXRob2Qgc2hvdWxkIHJlbG9hZCBhbGwgaW5zdGFuY2VzIG9mIERPTSBSdW50aW1lcy4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dzRE9NUnVudGltZU1hbmFnZXIuaHRtbCNyZWxvYWRET01SdW50aW1lcyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikiPjxCPnJlbG9hZERPTVJ1bnRpbWVzKElQcm9ncmVzc01vbml0b3IpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV3NET01SdW50aW1lTWFuYWdlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+V3NET01SdW50aW1lTWFuYWdlcjwvQT4KLTxERD5UaGlzIG1ldGhvZCBzaG91bGQgcmVsb2FkIGFsbCBpbnN0YW5jZXMgb2YgRE9NIFJ1bnRpbWVzLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRE9NUnVudGltZUV4dGVuc2lvbi5odG1sI3JlbW92ZUxvYWRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXc0RvbUxvYWRMaXN0ZW5lcikiPjxCPnJlbW92ZUxvYWRMaXN0ZW5lcihJV3NEb21Mb2FkTGlzdGVuZXIpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV3NET01SdW50aW1lRXh0ZW5zaW9uPC9BPgotPEREPlJlbW92ZXMgdGhlIGxpc3RlbmVyIGZyb20gRE9NIGxvYWRpbmcgbGlzdGVuZXJzIGxpc3QKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuaHRtbCNSUENfVkFMVUUiPjxCPlJQQ19WQUxVRTwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gZW51bSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1N0eWxlPC9BPgotPEREPlRoZSAnPGVtPjxiPlJQQzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLTwvREw+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xMC5odG1sIj48Qj5QUkVWIExFVFRFUjwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xMi5odG1sIj48Qj5ORVhUIExFVFRFUjwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi9pbmRleC5odG1sP2luZGV4LWZpbGVzaW5kZXgtMTEuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xMS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxBIEhSRUY9ImluZGV4LTEuaHRtbCI+QTwvQT4gPEEgSFJFRj0iaW5kZXgtMi5odG1sIj5CPC9BPiA8QSBIUkVGPSJpbmRleC0zLmh0bWwiPkM8L0E+IDxBIEhSRUY9ImluZGV4LTQuaHRtbCI+RDwvQT4gPEEgSFJFRj0iaW5kZXgtNS5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC02Lmh0bWwiPkY8L0E+IDxBIEhSRUY9ImluZGV4LTcuaHRtbCI+RzwvQT4gPEEgSFJFRj0iaW5kZXgtOC5odG1sIj5JPC9BPiA8QSBIUkVGPSJpbmRleC05Lmh0bWwiPkw8L0E+IDxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPk88L0E+IDxBIEhSRUY9ImluZGV4LTExLmh0bWwiPlI8L0E+IDxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPlM8L0E+IDxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPlQ8L0E+IDxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPlY8L0E+IDxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPlc8L0E+IDxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9pbmRleC1maWxlcy9pbmRleC0xMi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9pbmRleC1maWxlcy9pbmRleC0xMi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2FkMTIwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvaW5kZXgtZmlsZXMvaW5kZXgtMTIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjBfMjIpIG9uIFNhdCBBcHIgMTcgMTg6NDY6MzYgSVNUIDIwMTAgLS0+Ci08VElUTEU+Ci1TLUluZGV4Ci08L1RJVExFPgotCi0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iUy1JbmRleCI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5JbmRleDwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTEyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QjwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkQ8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+RTwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5GPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5UPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5XPC9BPiA8SFI+Ci08QSBOQU1FPSJfU18iPjwhLS0gLS0+PC9BPjxIMj4KLTxCPlM8L0I+PC9IMj4KLTxETD4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCNzZXRFeGNsdWRlZChib29sZWFuKSI+PEI+c2V0RXhjbHVkZWQoYm9vbGVhbik8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJNZXRob2Q8L0E+Ci08REQ+U2V0cyB0aGUgdmFsdWUgb2YgdGhlICc8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCNpc0V4Y2x1ZGVkKCkiPjxDT0RFPjxlbT5FeGNsdWRlZDwvZW0+PC9DT0RFPjwvQT4nIGF0dHJpYnV0ZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sI3NldEhlYWRlcihib29sZWFuKSI+PEI+c2V0SGVhZGVyKGJvb2xlYW4pPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJQYXJhbTwvQT4KLTxERD5TZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJzxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwjaXNIZWFkZXIoKSI+PENPREU+PGVtPkhlYWRlcjwvZW0+PC9DT0RFPjwvQT4nIGF0dHJpYnV0ZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sI3NldEtpbmQob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5XZWJQYXJhbUtpbmQpIj48Qj5zZXRLaW5kKFdlYlBhcmFtS2luZCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlBhcmFtPC9BPgotPEREPlNldHMgdGhlIHZhbHVlIG9mIHRoZSAnPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCNnZXRLaW5kKCkiPjxDT0RFPjxlbT5LaW5kPC9lbT48L0NPREU+PC9BPicgYXR0cmlidXRlLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5odG1sI3NldE5hbWUoamF2YS5sYW5nLlN0cmluZykiPjxCPnNldE5hbWUoU3RyaW5nKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JSmF2YVdlYlNlcnZpY2VFbGVtZW50Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SUphdmFXZWJTZXJ2aWNlRWxlbWVudDwvQT4KLTxERD5TZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJzxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5odG1sI2dldE5hbWUoKSI+PENPREU+PGVtPk5hbWU8L2VtPjwvQ09ERT48L0E+JyBhdHRyaWJ1dGUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCNzZXRQYXJ0TmFtZShqYXZhLmxhbmcuU3RyaW5nKSI+PEI+c2V0UGFydE5hbWUoU3RyaW5nKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViUGFyYW08L0E+Ci08REQ+U2V0cyB0aGUgdmFsdWUgb2YgdGhlICc8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sI2dldFBhcnROYW1lKCkiPjxDT0RFPjxlbT5QYXJ0IE5hbWU8L2VtPjwvQ09ERT48L0E+JyBhdHRyaWJ1dGUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sI3NldFBvcnROYW1lKGphdmEubGFuZy5TdHJpbmcpIj48Qj5zZXRQb3J0TmFtZShTdHJpbmcpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlNlcnZpY2U8L0E+Ci08REQ+U2V0cyB0aGUgdmFsdWUgb2YgdGhlICc8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwjZ2V0UG9ydE5hbWUoKSI+PENPREU+PGVtPlBvcnQgTmFtZTwvZW0+PC9DT0RFPjwvQT4nIGF0dHJpYnV0ZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCNzZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSkiPjxCPnNldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U8L0E+Ci08REQ+U2V0cyB0aGUgdmFsdWUgb2YgdGhlICc8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkiPjxDT0RFPjxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT48L0NPREU+PC9BPicgYXR0cmlidXRlLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sI3NldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlKSI+PEI+c2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZShTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYk1ldGhvZDwvQT4KLTxERD5TZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJzxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sI2dldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSI+PENPREU+PGVtPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPjwvQ09ERT48L0E+JyBhdHRyaWJ1dGUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwjc2V0U29hcEJpbmRpbmdTdHlsZShvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGUpIj48Qj5zZXRTb2FwQmluZGluZ1N0eWxlKFNPQVBCaW5kaW5nU3R5bGUpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9BPgotPEREPlNldHMgdGhlIHZhbHVlIG9mIHRoZSAnPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwjZ2V0U29hcEJpbmRpbmdTdHlsZSgpIj48Q09ERT48ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT48L0NPREU+PC9BPicgYXR0cmlidXRlLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sI3NldFNvYXBCaW5kaW5nU3R5bGUob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlKSI+PEI+c2V0U29hcEJpbmRpbmdTdHlsZShTT0FQQmluZGluZ1N0eWxlKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYk1ldGhvZDwvQT4KLTxERD5TZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJzxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sI2dldFNvYXBCaW5kaW5nU3R5bGUoKSI+PENPREU+PGVtPlNvYXAgQmluZGluZyBTdHlsZTwvZW0+PC9DT0RFPjwvQT4nIGF0dHJpYnV0ZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCNzZXRTb2FwQmluZGluZ1VzZShvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlKSI+PEI+c2V0U29hcEJpbmRpbmdVc2UoU09BUEJpbmRpbmdVc2UpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9BPgotPEREPlNldHMgdGhlIHZhbHVlIG9mIHRoZSAnPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwjZ2V0U29hcEJpbmRpbmdVc2UoKSI+PENPREU+PGVtPlNvYXAgQmluZGluZyBVc2U8L2VtPjwvQ09ERT48L0E+JyBhdHRyaWJ1dGUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmh0bWwjc2V0U29hcEJpbmRpbmdVc2Uob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZSkiPjxCPnNldFNvYXBCaW5kaW5nVXNlKFNPQVBCaW5kaW5nVXNlKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYk1ldGhvZDwvQT4KLTxERD5TZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJzxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sI2dldFNvYXBCaW5kaW5nVXNlKCkiPjxDT0RFPjxlbT5Tb2FwIEJpbmRpbmcgVXNlPC9lbT48L0NPREU+PC9BPicgYXR0cmlidXRlLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sI3NldFRhcmdldE5hbWVzcGFjZShqYXZhLmxhbmcuU3RyaW5nKSI+PEI+c2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U8L0E+Ci08REQ+U2V0cyB0aGUgdmFsdWUgb2YgdGhlICc8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCNnZXRUYXJnZXROYW1lc3BhY2UoKSI+PENPREU+PGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPjwvQ09ERT48L0E+JyBhdHRyaWJ1dGUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCNzZXRUYXJnZXROYW1lc3BhY2UoamF2YS5sYW5nLlN0cmluZykiPjxCPnNldFRhcmdldE5hbWVzcGFjZShTdHJpbmcpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJQYXJhbTwvQT4KLTxERD5TZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJzxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkiPjxDT0RFPjxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT48L0NPREU+PC9BPicgYXR0cmlidXRlLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2UuaHRtbCNzZXRUYXJnZXROYW1lc3BhY2UoamF2YS5sYW5nLlN0cmluZykiPjxCPnNldFRhcmdldE5hbWVzcGFjZShTdHJpbmcpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlNlcnZpY2U8L0E+Ci08REQ+U2V0cyB0aGUgdmFsdWUgb2YgdGhlICc8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkiPjxDT0RFPjxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT48L0NPREU+PC9BPicgYXR0cmlidXRlLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2UuaHRtbCNzZXRXc2RsTG9jYXRpb24oamF2YS5sYW5nLlN0cmluZykiPjxCPnNldFdzZGxMb2NhdGlvbihTdHJpbmcpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlNlcnZpY2U8L0E+Ci08REQ+U2V0cyB0aGUgdmFsdWUgb2YgdGhlICc8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwjZ2V0V3NkbExvY2F0aW9uKCkiPjxDT0RFPjxlbT5Xc2RsIExvY2F0aW9uPC9lbT48L0NPREU+PC9BPicgYXR0cmlidXRlLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sI1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEUiPjxCPlNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEU8L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2UuTGl0ZXJhbHM8L0E+Ci08REQ+VGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxDT0RFPjxlbT5TT0FQIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT48L0NPREU+PC9BPicgZW51bS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNTT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFIj48Qj5TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFPC9CPjwvQT4gLSAKLVN0YXRpYyB2YXJpYWJsZSBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlPC9BPgotPEREPlRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PENPREU+PGVtPlNPQVAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPjwvQ09ERT48L0E+JyBlbnVtLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sI1NPQVBfQklORElOR19TVFlMRSI+PEI+U09BUF9CSU5ESU5HX1NUWUxFPC9CPjwvQT4gLSAKLVN0YXRpYyB2YXJpYWJsZSBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlLkxpdGVyYWxzPC9BPgotPEREPlRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT48ZW0+U09BUCBCaW5kaW5nIFN0eWxlPC9lbT48L0NPREU+PC9BPicgZW51bS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNTT0FQX0JJTkRJTkdfU1RZTEUiPjxCPlNPQVBfQklORElOR19TVFlMRTwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZTwvQT4KLTxERD5UaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxDT0RFPjxlbT5TT0FQIEJpbmRpbmcgU3R5bGU8L2VtPjwvQ09ERT48L0E+JyBlbnVtLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sI1NPQVBfQklORElOR19VU0UiPjxCPlNPQVBfQklORElOR19VU0U8L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2UuTGl0ZXJhbHM8L0E+Ci08REQ+VGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT48ZW0+U09BUCBCaW5kaW5nIFVzZTwvZW0+PC9DT0RFPjwvQT4nIGVudW0uCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjU09BUF9CSU5ESU5HX1VTRSI+PEI+U09BUF9CSU5ESU5HX1VTRTwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZTwvQT4KLTxERD5UaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT48ZW0+U09BUCBCaW5kaW5nIFVzZTwvZW0+PC9DT0RFPjwvQT4nIGVudW0uCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU8L0I+PC9BPiAtIEVudW0gaW4gPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvQT48REQ+QSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+U09BUCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicsCi0gYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5TT0FQQmluZGluZ1N0eWxlPC9CPjwvQT4gLSBFbnVtIGluIDxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0E+PEREPkEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlNPQVAgQmluZGluZyBTdHlsZTwvYj48L2VtPicsCi0gYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+U09BUEJpbmRpbmdVc2U8L0I+PC9BPiAtIEVudW0gaW4gPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvQT48REQ+QSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+U09BUCBCaW5kaW5nIFVzZTwvYj48L2VtPicsCi0gYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRG9tTG9hZExpc3RlbmVyLmh0bWwjc3RhcnRlZCgpIj48Qj5zdGFydGVkKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRG9tTG9hZExpc3RlbmVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdzRG9tTG9hZExpc3RlbmVyPC9BPgotPEREPkNhbGxlZCBieSA8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT5JV3NET01SdW50aW1lRXh0ZW5zaW9uPC9DT0RFPjwvQT4ganVzdCBiZWZvcmUgdGhlIERPTSBsb2FkIHN0YXJ0Ci08L0RMPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5JbmRleDwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTEyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QjwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkQ8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+RTwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5GPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5UPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5XPC9BPiA8SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvaW5kZXgtZmlsZXMvaW5kZXgtMTMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvaW5kZXgtZmlsZXMvaW5kZXgtMTMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJkYzBlZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2luZGV4LWZpbGVzL2luZGV4LTEzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wXzIyKSBvbiBTYXQgQXByIDE3IDE4OjQ2OjM2IElTVCAyMDEwIC0tPgotPFRJVExFPgotVC1JbmRleAotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlQtSW5kZXgiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPjxCPlBSRVYgTEVUVEVSPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPjxCPk5FWFQgTEVUVEVSPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uL2luZGV4Lmh0bWw/aW5kZXgtZmlsZXNpbmRleC0xMy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTEzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEEgSFJFRj0iaW5kZXgtMS5odG1sIj5BPC9BPiA8QSBIUkVGPSJpbmRleC0yLmh0bWwiPkI8L0E+IDxBIEhSRUY9ImluZGV4LTMuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtNC5odG1sIj5EPC9BPiA8QSBIUkVGPSJpbmRleC01Lmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTYuaHRtbCI+RjwvQT4gPEEgSFJFRj0iaW5kZXgtNy5odG1sIj5HPC9BPiA8QSBIUkVGPSJpbmRleC04Lmh0bWwiPkk8L0E+IDxBIEhSRUY9ImluZGV4LTkuaHRtbCI+TDwvQT4gPEEgSFJFRj0iaW5kZXgtMTAuaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+UjwvQT4gPEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+UzwvQT4gPEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+VDwvQT4gPEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+VjwvQT4gPEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+VzwvQT4gPEhSPgotPEEgTkFNRT0iX1RfIj48IS0tIC0tPjwvQT48SDI+Ci08Qj5UPC9CPjwvSDI+Ci08REw+Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwjdG9TdHJpbmcoKSI+PEI+dG9TdHJpbmcoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gZW51bSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlPC9BPgotPEREPlJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwjdG9TdHJpbmcoKSI+PEI+dG9TdHJpbmcoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gZW51bSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1N0eWxlPC9BPgotPEREPlJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sI3RvU3RyaW5nKCkiPjxCPnRvU3RyaW5nKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGVudW0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nVXNlPC9BPgotPEREPlJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuaHRtbCN0b1N0cmluZygpIj48Qj50b1N0cmluZygpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBlbnVtIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+V2ViUGFyYW1LaW5kPC9BPgotPEREPlJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi08L0RMPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5JbmRleDwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTEzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QjwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkQ8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+RTwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5GPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5UPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5XPC9BPiA8SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvaW5kZXgtZmlsZXMvaW5kZXgtMTQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvaW5kZXgtZmlsZXMvaW5kZXgtMTQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VmYTg0OS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2luZGV4LWZpbGVzL2luZGV4LTE0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wXzIyKSBvbiBTYXQgQXByIDE3IDE4OjQ2OjM2IElTVCAyMDEwIC0tPgotPFRJVExFPgotVi1JbmRleAotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlYtSW5kZXgiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPjxCPlBSRVYgTEVUVEVSPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPjxCPk5FWFQgTEVUVEVSPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uL2luZGV4Lmh0bWw/aW5kZXgtZmlsZXNpbmRleC0xNC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEEgSFJFRj0iaW5kZXgtMS5odG1sIj5BPC9BPiA8QSBIUkVGPSJpbmRleC0yLmh0bWwiPkI8L0E+IDxBIEhSRUY9ImluZGV4LTMuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtNC5odG1sIj5EPC9BPiA8QSBIUkVGPSJpbmRleC01Lmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTYuaHRtbCI+RjwvQT4gPEEgSFJFRj0iaW5kZXgtNy5odG1sIj5HPC9BPiA8QSBIUkVGPSJpbmRleC04Lmh0bWwiPkk8L0E+IDxBIEhSRUY9ImluZGV4LTkuaHRtbCI+TDwvQT4gPEEgSFJFRj0iaW5kZXgtMTAuaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+UjwvQT4gPEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+UzwvQT4gPEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+VDwvQT4gPEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+VjwvQT4gPEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+VzwvQT4gPEhSPgotPEEgTkFNRT0iX1ZfIj48IS0tIC0tPjwvQT48SDI+Ci08Qj5WPC9CPjwvSDI+Ci08REw+Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwjdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKSI+PEI+dmFsdWVPZihTdHJpbmcpPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gZW51bSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlPC9BPgotPEREPlJldHVybnMgdGhlIGVudW0gY29uc3RhbnQgb2YgdGhpcyB0eXBlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sI3ZhbHVlT2YoamF2YS5sYW5nLlN0cmluZykiPjxCPnZhbHVlT2YoU3RyaW5nKTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGVudW0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdTdHlsZTwvQT4KLTxERD5SZXR1cm5zIHRoZSBlbnVtIGNvbnN0YW50IG9mIHRoaXMgdHlwZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwjdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKSI+PEI+dmFsdWVPZihTdHJpbmcpPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gZW51bSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdVc2U8L0E+Ci08REQ+UmV0dXJucyB0aGUgZW51bSBjb25zdGFudCBvZiB0aGlzIHR5cGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuaHRtbCN2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpIj48Qj52YWx1ZU9mKFN0cmluZyk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBlbnVtIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+V2ViUGFyYW1LaW5kPC9BPgotPEREPlJldHVybnMgdGhlIGVudW0gY29uc3RhbnQgb2YgdGhpcyB0eXBlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sI1ZBTFVFUyI+PEI+VkFMVUVTPC9CPjwvQT4gLSAKLVN0YXRpYyB2YXJpYWJsZSBpbiBlbnVtIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU8L0E+Ci08REQ+QSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlNPQVAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sI3ZhbHVlcygpIj48Qj52YWx1ZXMoKTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGVudW0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTwvQT4KLTxERD5SZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGNvbnN0YW50cyBvZiB0aGlzIGVudW0gdHlwZSwgaW4KLXRoZSBvcmRlciB0aGV5J3JlIGRlY2xhcmVkLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sI1ZBTFVFUyI+PEI+VkFMVUVTPC9CPjwvQT4gLSAKLVN0YXRpYyB2YXJpYWJsZSBpbiBlbnVtIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nU3R5bGU8L0E+Ci08REQ+QSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlNPQVAgQmluZGluZyBTdHlsZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwjdmFsdWVzKCkiPjxCPnZhbHVlcygpPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gZW51bSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1N0eWxlPC9BPgotPEREPlJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgY29uc3RhbnRzIG9mIHRoaXMgZW51bSB0eXBlLCBpbgotdGhlIG9yZGVyIHRoZXkncmUgZGVjbGFyZWQuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sI1ZBTFVFUyI+PEI+VkFMVUVTPC9CPjwvQT4gLSAKLVN0YXRpYyB2YXJpYWJsZSBpbiBlbnVtIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1VzZTwvQT4KLTxERD5BIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFVzZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sI3ZhbHVlcygpIj48Qj52YWx1ZXMoKTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGVudW0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nVXNlPC9BPgotPEREPlJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgY29uc3RhbnRzIG9mIHRoaXMgZW51bSB0eXBlLCBpbgotdGhlIG9yZGVyIHRoZXkncmUgZGVjbGFyZWQuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuaHRtbCNWQUxVRVMiPjxCPlZBTFVFUzwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gZW51bSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPldlYlBhcmFtS2luZDwvQT4KLTxERD5BIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+V2ViIFBhcmFtIEtpbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwjdmFsdWVzKCkiPjxCPnZhbHVlcygpPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gZW51bSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPldlYlBhcmFtS2luZDwvQT4KLTxERD5SZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGNvbnN0YW50cyBvZiB0aGlzIGVudW0gdHlwZSwgaW4KLXRoZSBvcmRlciB0aGV5J3JlIGRlY2xhcmVkLgotPC9ETD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPjxCPlBSRVYgTEVUVEVSPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPjxCPk5FWFQgTEVUVEVSPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uL2luZGV4Lmh0bWw/aW5kZXgtZmlsZXNpbmRleC0xNC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEEgSFJFRj0iaW5kZXgtMS5odG1sIj5BPC9BPiA8QSBIUkVGPSJpbmRleC0yLmh0bWwiPkI8L0E+IDxBIEhSRUY9ImluZGV4LTMuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtNC5odG1sIj5EPC9BPiA8QSBIUkVGPSJpbmRleC01Lmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTYuaHRtbCI+RjwvQT4gPEEgSFJFRj0iaW5kZXgtNy5odG1sIj5HPC9BPiA8QSBIUkVGPSJpbmRleC04Lmh0bWwiPkk8L0E+IDxBIEhSRUY9ImluZGV4LTkuaHRtbCI+TDwvQT4gPEEgSFJFRj0iaW5kZXgtMTAuaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+UjwvQT4gPEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+UzwvQT4gPEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+VDwvQT4gPEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+VjwvQT4gPEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+VzwvQT4gPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2luZGV4LWZpbGVzL2luZGV4LTE1Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2luZGV4LWZpbGVzL2luZGV4LTE1Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMTEzMDQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9pbmRleC1maWxlcy9pbmRleC0xNS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMF8yMikgb24gU2F0IEFwciAxNyAxODo0NjozNiBJU1QgMjAxMCAtLT4KLTxUSVRMRT4KLVctSW5kZXgKLTwvVElUTEU+Ci0KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJXLUluZGV4IjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xNC5odG1sIj48Qj5QUkVWIExFVFRFUjwvQj48L0E+Jm5ic3A7Ci0mbmJzcDtORVhUIExFVFRFUjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTE1Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QjwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkQ8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+RTwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5GPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5UPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5XPC9BPiA8SFI+Ci08QSBOQU1FPSJfV18iPjwhLS0gLS0+PC9BPjxIMj4KLTxCPlc8L0I+PC9IMj4KLTxETD4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCNXRUJfUEFSQU1fS0lORCI+PEI+V0VCX1BBUkFNX0tJTkQ8L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2UuTGl0ZXJhbHM8L0E+Ci08REQ+VGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PENPREU+PGVtPldlYiBQYXJhbSBLaW5kPC9lbT48L0NPREU+PC9BPicgZW51bS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNXRUJfUEFSQU1fS0lORCI+PEI+V0VCX1BBUkFNX0tJTkQ8L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+VGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxDT0RFPjxlbT5XZWIgUGFyYW0gS2luZDwvZW0+PC9DT0RFPjwvQT4nIGVudW0uCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+V2ViUGFyYW1LaW5kPC9CPjwvQT4gLSBFbnVtIGluIDxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0E+PEREPiZuYnNwOzxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuaHRtbCNXUkFQUEVEX1ZBTFVFIj48Qj5XUkFQUEVEX1ZBTFVFPC9CPjwvQT4gLSAKLVN0YXRpYyB2YXJpYWJsZSBpbiBlbnVtIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU8L0E+Ci08REQ+VGhlICc8ZW0+PGI+V1JBUFBFRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbjwvQj48L0E+IC0gRXhjZXB0aW9uIGluIDxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0E+PEREPkV4Y2VwdGlvbiB0aHJvd24gaW4gY2FzZSB0aGUgbG9hZGluZyBvZiBXUyBET00gaGFzIGJlZW4gY2FuY2VsbGVkPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24uaHRtbCNXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKSI+PEI+V3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24oU3RyaW5nLCBTdHJpbmcpPC9CPjwvQT4gLSAKLUNvbnN0cnVjdG9yIGZvciBleGNlcHRpb24gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbjwvQT4KLTxERD5Db25zdHJ1Y3RzIGV4Y2VwdGlvbiB3aXRoIGFiaWxpdHkgdG8gcHJvdmlkZSBsb2NhbGl6ZWQgbWVzc2FnZQotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV3NET01SdW50aW1lTWFuYWdlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+V3NET01SdW50aW1lTWFuYWdlcjwvQj48L0E+IC0gQ2xhc3MgaW4gPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvQT48REQ+RmFjdG9yeSBjbGFzcyBmb3IgaW5zdGFudGlhdGluZyBET00gUnVudGltZXMgYW5kIG1hbmFnaW5nIHRob3NlIGluc3RhbmNlcy48RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwjV3NET01SdW50aW1lTWFuYWdlcigpIj48Qj5Xc0RPTVJ1bnRpbWVNYW5hZ2VyKCk8L0I+PC9BPiAtIAotQ29uc3RydWN0b3IgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Xc0RPTVJ1bnRpbWVNYW5hZ2VyPC9BPgotPEREPiZuYnNwOwotPC9ETD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPjxCPlBSRVYgTEVUVEVSPC9CPjwvQT4mbmJzcDsKLSZuYnNwO05FWFQgTEVUVEVSPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi9pbmRleC5odG1sP2luZGV4LWZpbGVzaW5kZXgtMTUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xNS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxBIEhSRUY9ImluZGV4LTEuaHRtbCI+QTwvQT4gPEEgSFJFRj0iaW5kZXgtMi5odG1sIj5CPC9BPiA8QSBIUkVGPSJpbmRleC0zLmh0bWwiPkM8L0E+IDxBIEhSRUY9ImluZGV4LTQuaHRtbCI+RDwvQT4gPEEgSFJFRj0iaW5kZXgtNS5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC02Lmh0bWwiPkY8L0E+IDxBIEhSRUY9ImluZGV4LTcuaHRtbCI+RzwvQT4gPEEgSFJFRj0iaW5kZXgtOC5odG1sIj5JPC9BPiA8QSBIUkVGPSJpbmRleC05Lmh0bWwiPkw8L0E+IDxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPk88L0E+IDxBIEhSRUY9ImluZGV4LTExLmh0bWwiPlI8L0E+IDxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPlM8L0E+IDxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPlQ8L0E+IDxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPlY8L0E+IDxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPlc8L0E+IDxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9pbmRleC1maWxlcy9pbmRleC0yLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2luZGV4LWZpbGVzL2luZGV4LTIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgzNTAyNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2luZGV4LWZpbGVzL2luZGV4LTIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjBfMjIpIG9uIFNhdCBBcHIgMTcgMTg6NDY6MzYgSVNUIDIwMTAgLS0+Ci08VElUTEU+Ci1CLUluZGV4Ci08L1RJVExFPgotCi0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iQi1JbmRleCI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5JbmRleDwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMS5odG1sIj48Qj5QUkVWIExFVFRFUjwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0zLmh0bWwiPjxCPk5FWFQgTEVUVEVSPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uL2luZGV4Lmh0bWw/aW5kZXgtZmlsZXNpbmRleC0yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxBIEhSRUY9ImluZGV4LTEuaHRtbCI+QTwvQT4gPEEgSFJFRj0iaW5kZXgtMi5odG1sIj5CPC9BPiA8QSBIUkVGPSJpbmRleC0zLmh0bWwiPkM8L0E+IDxBIEhSRUY9ImluZGV4LTQuaHRtbCI+RDwvQT4gPEEgSFJFRj0iaW5kZXgtNS5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC02Lmh0bWwiPkY8L0E+IDxBIEhSRUY9ImluZGV4LTcuaHRtbCI+RzwvQT4gPEEgSFJFRj0iaW5kZXgtOC5odG1sIj5JPC9BPiA8QSBIUkVGPSJpbmRleC05Lmh0bWwiPkw8L0E+IDxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPk88L0E+IDxBIEhSRUY9ImluZGV4LTExLmh0bWwiPlI8L0E+IDxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPlM8L0E+IDxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPlQ8L0E+IDxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPlY8L0E+IDxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPlc8L0E+IDxIUj4KLTxBIE5BTUU9Il9CXyI+PCEtLSAtLT48L0E+PEgyPgotPEI+QjwvQj48L0gyPgotPERMPgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sI0JBUkVfVkFMVUUiPjxCPkJBUkVfVkFMVUU8L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGVudW0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTwvQT4KLTxERD5UaGUgJzxlbT48Yj5CQVJFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotPC9ETD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9ImluZGV4LTEuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMy5odG1sIj48Qj5ORVhUIExFVFRFUjwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi9pbmRleC5odG1sP2luZGV4LWZpbGVzaW5kZXgtMi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QjwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkQ8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+RTwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5GPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5UPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5XPC9BPiA8SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvaW5kZXgtZmlsZXMvaW5kZXgtMy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9pbmRleC1maWxlcy9pbmRleC0zLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYTlhYjAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9pbmRleC1maWxlcy9pbmRleC0zLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wXzIyKSBvbiBTYXQgQXByIDE3IDE4OjQ2OjM2IElTVCAyMDEwIC0tPgotPFRJVExFPgotQy1JbmRleAotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IkMtSW5kZXgiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9ImluZGV4LTIuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNC5odG1sIj48Qj5ORVhUIExFVFRFUjwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi9pbmRleC5odG1sP2luZGV4LWZpbGVzaW5kZXgtMy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QjwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkQ8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+RTwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5GPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5UPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5XPC9BPiA8SFI+Ci08QSBOQU1FPSJfQ18iPjwhLS0gLS0+PC9BPjxIMj4KLTxCPkM8L0I+PC9IMj4KLTxETD4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uaHRtbCNjcmVhdGVET00ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpIj48Qj5jcmVhdGVET00oSVByb2dyZXNzTW9uaXRvcik8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRE9NUnVudGltZUV4dGVuc2lvbi5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXc0RPTVJ1bnRpbWVFeHRlbnNpb248L0E+Ci08REQ+VGhpcyBtZXRob2Qgc2hvdWxkIGluc3RhbnRpYXRlIHRoZSBET00gaW5zdGFuY2UgZm9yIHRoZSBydW50aW1lIGFuZCBsb2FkcyB0aGUKLSBkYXRhIGludG8gaXQuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwjY3JlYXRlRE9NUnVudGltZShvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucmVnaXN0cnkuSVdzRE9NUnVudGltZUluZm8sIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKSI+PEI+Y3JlYXRlRE9NUnVudGltZShJV3NET01SdW50aW1lSW5mbywgSVByb2dyZXNzTW9uaXRvcik8L0I+PC9BPiAtIAotTWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Xc0RPTVJ1bnRpbWVNYW5hZ2VyPC9BPgotPEREPiZuYnNwOwotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdTRE9NUnVudGltZU1hbmFnZXIuaHRtbCNjcmVhdGVET01SdW50aW1lcyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikiPjxCPmNyZWF0ZURPTVJ1bnRpbWVzKElQcm9ncmVzc01vbml0b3IpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXU0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdTRE9NUnVudGltZU1hbmFnZXI8L0E+Ci08REQ+SW5zdGFudGlhdGVzIHRoZSBET00gUnVudGltZXMgaWYgbm90IGFscmVhZHkuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwjY3JlYXRlRE9NUnVudGltZXMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpIj48Qj5jcmVhdGVET01SdW50aW1lcyhJUHJvZ3Jlc3NNb25pdG9yKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dzRE9NUnVudGltZU1hbmFnZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPldzRE9NUnVudGltZU1hbmFnZXI8L0E+Ci08REQ+SW5zdGFudGlhdGVzIHRoZSBET00gUnVudGltZXMgaWYgbm90IGFscmVhZHkuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21GYWN0b3J5Lmh0bWwjY3JlYXRlSURPTSgpIj48Qj5jcmVhdGVJRE9NKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tRmFjdG9yeS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbUZhY3Rvcnk8L0E+Ci08REQ+UmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JRE9NPC9lbT4nLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tRmFjdG9yeS5odG1sI2NyZWF0ZUlKYXZhV2ViU2VydmljZUVsZW1lbnQoKSI+PEI+Y3JlYXRlSUphdmFXZWJTZXJ2aWNlRWxlbWVudCgpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbUZhY3RvcnkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21GYWN0b3J5PC9BPgotPEREPlJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SUphdmEgV2ViIFNlcnZpY2UgRWxlbWVudDwvZW0+Jy4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbUZhY3RvcnkuaHRtbCNjcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkiPjxCPmNyZWF0ZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21GYWN0b3J5Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tRmFjdG9yeTwvQT4KLTxERD5SZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+Jy4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbUZhY3RvcnkuaHRtbCNjcmVhdGVJV2ViTWV0aG9kKCkiPjxCPmNyZWF0ZUlXZWJNZXRob2QoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21GYWN0b3J5Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tRmFjdG9yeTwvQT4KLTxERD5SZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklXZWIgTWV0aG9kPC9lbT4nLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tRmFjdG9yeS5odG1sI2NyZWF0ZUlXZWJQYXJhbSgpIj48Qj5jcmVhdGVJV2ViUGFyYW0oKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21GYWN0b3J5Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tRmFjdG9yeTwvQT4KLTxERD5SZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklXZWIgUGFyYW08L2VtPicuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21GYWN0b3J5Lmh0bWwjY3JlYXRlSVdlYlNlcnZpY2UoKSI+PEI+Y3JlYXRlSVdlYlNlcnZpY2UoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21GYWN0b3J5Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tRmFjdG9yeTwvQT4KLTxERD5SZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklXZWIgU2VydmljZTwvZW0+Jy4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbUZhY3RvcnkuaHRtbCNjcmVhdGVJV2ViU2VydmljZVByb2plY3QoKSI+PEI+Y3JlYXRlSVdlYlNlcnZpY2VQcm9qZWN0KCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tRmFjdG9yeS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbUZhY3Rvcnk8L0E+Ci08REQ+UmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JV2ViIFNlcnZpY2UgUHJvamVjdDwvZW0+Jy4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbUZhY3RvcnkuaHRtbCNjcmVhdGVJV2ViVHlwZSgpIj48Qj5jcmVhdGVJV2ViVHlwZSgpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbUZhY3RvcnkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21GYWN0b3J5PC9BPgotPEREPlJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SVdlYiBUeXBlPC9lbT4nLgotPC9ETD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9ImluZGV4LTIuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNC5odG1sIj48Qj5ORVhUIExFVFRFUjwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi9pbmRleC5odG1sP2luZGV4LWZpbGVzaW5kZXgtMy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QjwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkQ8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+RTwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5GPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5UPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5XPC9BPiA8SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvaW5kZXgtZmlsZXMvaW5kZXgtNC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9pbmRleC1maWxlcy9pbmRleC00Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNDhiZGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9pbmRleC1maWxlcy9pbmRleC00Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wXzIyKSBvbiBTYXQgQXByIDE3IDE4OjQ2OjM2IElTVCAyMDEwIC0tPgotPFRJVExFPgotRC1JbmRleAotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IkQtSW5kZXgiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9ImluZGV4LTMuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNS5odG1sIj48Qj5ORVhUIExFVFRFUjwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi9pbmRleC5odG1sP2luZGV4LWZpbGVzaW5kZXgtNC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QjwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkQ8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+RTwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5GPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5UPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5XPC9BPiA8SFI+Ci08QSBOQU1FPSJfRF8iPjwhLS0gLS0+PC9BPjxIMj4KLTxCPkQ8L0I+PC9IMj4KLTxETD4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuaHRtbCNET0NVTUVOVF9WQUxVRSI+PEI+RE9DVU1FTlRfVkFMVUU8L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGVudW0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdTdHlsZTwvQT4KLTxERD5UaGUgJzxlbT48Yj5ET0NVTUVOVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbUZhY3RvcnkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5Eb21GYWN0b3J5PC9CPjwvQT4gLSBJbnRlcmZhY2UgaW4gPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvQT48REQ+VGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPkRvbVBhY2thZ2U8L0I+PC9BPiAtIEludGVyZmFjZSBpbiA8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpPC9BPjxERD5UaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC48RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+RG9tUGFja2FnZS5MaXRlcmFsczwvQj48L0E+IC0gSW50ZXJmYWNlIGluIDxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0E+PEREPkRlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKLSAKLSAgIGVhY2ggY2xhc3MsCi0gICBlYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcywKLSAgIGVhY2ggZW51bSwKLSAgIGFuZCBlYWNoIGRhdGEgdHlwZQotIAotIDwhLS0gZW5kLXVzZXItZG9jIC0tPjwvREw+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0zLmh0bWwiPjxCPlBSRVYgTEVUVEVSPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTUuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC00Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEEgSFJFRj0iaW5kZXgtMS5odG1sIj5BPC9BPiA8QSBIUkVGPSJpbmRleC0yLmh0bWwiPkI8L0E+IDxBIEhSRUY9ImluZGV4LTMuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtNC5odG1sIj5EPC9BPiA8QSBIUkVGPSJpbmRleC01Lmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTYuaHRtbCI+RjwvQT4gPEEgSFJFRj0iaW5kZXgtNy5odG1sIj5HPC9BPiA8QSBIUkVGPSJpbmRleC04Lmh0bWwiPkk8L0E+IDxBIEhSRUY9ImluZGV4LTkuaHRtbCI+TDwvQT4gPEEgSFJFRj0iaW5kZXgtMTAuaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+UjwvQT4gPEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+UzwvQT4gPEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+VDwvQT4gPEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+VjwvQT4gPEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+VzwvQT4gPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2luZGV4LWZpbGVzL2luZGV4LTUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvaW5kZXgtZmlsZXMvaW5kZXgtNS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWEzMGVmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvaW5kZXgtZmlsZXMvaW5kZXgtNS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMF8yMikgb24gU2F0IEFwciAxNyAxODo0NjozNiBJU1QgMjAxMCAtLT4KLTxUSVRMRT4KLUUtSW5kZXgKLTwvVElUTEU+Ci0KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJFLUluZGV4IjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC00Lmh0bWwiPjxCPlBSRVYgTEVUVEVSPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTYuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC01Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEEgSFJFRj0iaW5kZXgtMS5odG1sIj5BPC9BPiA8QSBIUkVGPSJpbmRleC0yLmh0bWwiPkI8L0E+IDxBIEhSRUY9ImluZGV4LTMuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtNC5odG1sIj5EPC9BPiA8QSBIUkVGPSJpbmRleC01Lmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTYuaHRtbCI+RjwvQT4gPEEgSFJFRj0iaW5kZXgtNy5odG1sIj5HPC9BPiA8QSBIUkVGPSJpbmRleC04Lmh0bWwiPkk8L0E+IDxBIEhSRUY9ImluZGV4LTkuaHRtbCI+TDwvQT4gPEEgSFJFRj0iaW5kZXgtMTAuaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+UjwvQT4gPEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+UzwvQT4gPEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+VDwvQT4gPEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+VjwvQT4gPEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+VzwvQT4gPEhSPgotPEEgTkFNRT0iX0VfIj48IS0tIC0tPjwvQT48SDI+Ci08Qj5FPC9CPjwvSDI+Ci08REw+Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21GYWN0b3J5Lmh0bWwjZUlOU1RBTkNFIj48Qj5lSU5TVEFOQ0U8L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tRmFjdG9yeS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbUZhY3Rvcnk8L0E+Ci08REQ+VGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNlSU5TVEFOQ0UiPjxCPmVJTlNUQU5DRTwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZTwvQT4KLTxERD5UaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI2VOQU1FIj48Qj5lTkFNRTwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZTwvQT4KLTxERD5UaGUgcGFja2FnZSBuYW1lLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuaHRtbCNFTkNPREVEX1ZBTFVFIj48Qj5FTkNPREVEX1ZBTFVFPC9CPjwvQT4gLSAKLVN0YXRpYyB2YXJpYWJsZSBpbiBlbnVtIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1VzZTwvQT4KLTxERD5UaGUgJzxlbT48Yj5FTkNPREVEPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI2VOU19QUkVGSVgiPjxCPmVOU19QUkVGSVg8L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+VGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZU5TX1VSSSI+PEI+ZU5TX1VSSTwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZTwvQT4KLTxERD5UaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgotPC9ETD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9ImluZGV4LTQuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNi5odG1sIj48Qj5ORVhUIExFVFRFUjwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi9pbmRleC5odG1sP2luZGV4LWZpbGVzaW5kZXgtNS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QjwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkQ8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+RTwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5GPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5UPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5XPC9BPiA8SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvaW5kZXgtZmlsZXMvaW5kZXgtNi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9pbmRleC1maWxlcy9pbmRleC02Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ZjQ1NzYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9pbmRleC1maWxlcy9pbmRleC02Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wXzIyKSBvbiBTYXQgQXByIDE3IDE4OjQ2OjM2IElTVCAyMDEwIC0tPgotPFRJVExFPgotRi1JbmRleAotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IkYtSW5kZXgiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9ImluZGV4LTUuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNy5odG1sIj48Qj5ORVhUIExFVFRFUjwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi9pbmRleC5odG1sP2luZGV4LWZpbGVzaW5kZXgtNi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTYuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QjwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkQ8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+RTwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5GPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5UPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5XPC9BPiA8SFI+Ci08QSBOQU1FPSJfRl8iPjwhLS0gLS0+PC9BPjxIMj4KLTxCPkY8L0I+PC9IMj4KLTxETD4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RvbUxvYWRMaXN0ZW5lci5odG1sI2ZpbmlzaGVkKCkiPjxCPmZpbmlzaGVkKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRG9tTG9hZExpc3RlbmVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdzRG9tTG9hZExpc3RlbmVyPC9BPgotPEREPkNhbGxlZCBieSA8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT5JV3NET01SdW50aW1lRXh0ZW5zaW9uPC9DT0RFPjwvQT4gd2hlbiB0aGUgRE9NIGxvYWQgaGFzIGZpbmlzaGVkCi08L0RMPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5JbmRleDwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNS5odG1sIj48Qj5QUkVWIExFVFRFUjwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC03Lmh0bWwiPjxCPk5FWFQgTEVUVEVSPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uL2luZGV4Lmh0bWw/aW5kZXgtZmlsZXNpbmRleC02Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxBIEhSRUY9ImluZGV4LTEuaHRtbCI+QTwvQT4gPEEgSFJFRj0iaW5kZXgtMi5odG1sIj5CPC9BPiA8QSBIUkVGPSJpbmRleC0zLmh0bWwiPkM8L0E+IDxBIEhSRUY9ImluZGV4LTQuaHRtbCI+RDwvQT4gPEEgSFJFRj0iaW5kZXgtNS5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC02Lmh0bWwiPkY8L0E+IDxBIEhSRUY9ImluZGV4LTcuaHRtbCI+RzwvQT4gPEEgSFJFRj0iaW5kZXgtOC5odG1sIj5JPC9BPiA8QSBIUkVGPSJpbmRleC05Lmh0bWwiPkw8L0E+IDxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPk88L0E+IDxBIEhSRUY9ImluZGV4LTExLmh0bWwiPlI8L0E+IDxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPlM8L0E+IDxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPlQ8L0E+IDxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPlY8L0E+IDxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPlc8L0E+IDxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9pbmRleC1maWxlcy9pbmRleC03Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2luZGV4LWZpbGVzL2luZGV4LTcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NkMTU0MC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2luZGV4LWZpbGVzL2luZGV4LTcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0MSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjBfMjIpIG9uIFNhdCBBcHIgMTcgMTg6NDY6MzYgSVNUIDIwMTAgLS0+Ci08VElUTEU+Ci1HLUluZGV4Ci08L1RJVExFPgotCi0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iRy1JbmRleCI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5JbmRleDwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNi5odG1sIj48Qj5QUkVWIExFVFRFUjwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC04Lmh0bWwiPjxCPk5FWFQgTEVUVEVSPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uL2luZGV4Lmh0bWw/aW5kZXgtZmlsZXNpbmRleC03Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxBIEhSRUY9ImluZGV4LTEuaHRtbCI+QTwvQT4gPEEgSFJFRj0iaW5kZXgtMi5odG1sIj5CPC9BPiA8QSBIUkVGPSJpbmRleC0zLmh0bWwiPkM8L0E+IDxBIEhSRUY9ImluZGV4LTQuaHRtbCI+RDwvQT4gPEEgSFJFRj0iaW5kZXgtNS5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC02Lmh0bWwiPkY8L0E+IDxBIEhSRUY9ImluZGV4LTcuaHRtbCI+RzwvQT4gPEEgSFJFRj0iaW5kZXgtOC5odG1sIj5JPC9BPiA8QSBIUkVGPSJpbmRleC05Lmh0bWwiPkw8L0E+IDxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPk88L0E+IDxBIEhSRUY9ImluZGV4LTExLmh0bWwiPlI8L0E+IDxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPlM8L0E+IDxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPlQ8L0E+IDxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPlY8L0E+IDxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPlc8L0E+IDxIUj4KLTxBIE5BTUU9Il9HXyI+PCEtLSAtLT48L0E+PEgyPgotPEI+RzwvQj48L0gyPgotPERMPgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sI2dldChqYXZhLmxhbmcuU3RyaW5nKSI+PEI+Z2V0KFN0cmluZyk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBlbnVtIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU8L0E+Ci08REQ+UmV0dXJucyB0aGUgJzxlbT48Yj5TT0FQIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sI2dldChpbnQpIj48Qj5nZXQoaW50KTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGVudW0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTwvQT4KLTxERD5SZXR1cm5zIHRoZSAnPGVtPjxiPlNPQVAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwjZ2V0KGphdmEubGFuZy5TdHJpbmcpIj48Qj5nZXQoU3RyaW5nKTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGVudW0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdTdHlsZTwvQT4KLTxERD5SZXR1cm5zIHRoZSAnPGVtPjxiPlNPQVAgQmluZGluZyBTdHlsZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuaHRtbCNnZXQoaW50KSI+PEI+Z2V0KGludCk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBlbnVtIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nU3R5bGU8L0E+Ci08REQ+UmV0dXJucyB0aGUgJzxlbT48Yj5TT0FQIEJpbmRpbmcgU3R5bGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sI2dldChqYXZhLmxhbmcuU3RyaW5nKSI+PEI+Z2V0KFN0cmluZyk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBlbnVtIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1VzZTwvQT4KLTxERD5SZXR1cm5zIHRoZSAnPGVtPjxiPlNPQVAgQmluZGluZyBVc2U8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sI2dldChpbnQpIj48Qj5nZXQoaW50KTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGVudW0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nVXNlPC9BPgotPEREPlJldHVybnMgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFVzZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sI2dldChqYXZhLmxhbmcuU3RyaW5nKSI+PEI+Z2V0KFN0cmluZyk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBlbnVtIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+V2ViUGFyYW1LaW5kPC9BPgotPEREPlJldHVybnMgdGhlICc8ZW0+PGI+V2ViIFBhcmFtIEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuaHRtbCNnZXQoaW50KSI+PEI+Z2V0KGludCk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBlbnVtIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+V2ViUGFyYW1LaW5kPC9BPgotPEREPlJldHVybnMgdGhlICc8ZW0+PGI+V2ViIFBhcmFtIEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwjZ2V0QnlOYW1lKGphdmEubGFuZy5TdHJpbmcpIj48Qj5nZXRCeU5hbWUoU3RyaW5nKTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGVudW0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTwvQT4KLTxERD5SZXR1cm5zIHRoZSAnPGVtPjxiPlNPQVAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwjZ2V0QnlOYW1lKGphdmEubGFuZy5TdHJpbmcpIj48Qj5nZXRCeU5hbWUoU3RyaW5nKTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGVudW0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdTdHlsZTwvQT4KLTxERD5SZXR1cm5zIHRoZSAnPGVtPjxiPlNPQVAgQmluZGluZyBTdHlsZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwjZ2V0QnlOYW1lKGphdmEubGFuZy5TdHJpbmcpIj48Qj5nZXRCeU5hbWUoU3RyaW5nKTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGVudW0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nVXNlPC9BPgotPEREPlJldHVybnMgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFVzZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sI2dldEJ5TmFtZShqYXZhLmxhbmcuU3RyaW5nKSI+PEI+Z2V0QnlOYW1lKFN0cmluZyk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBlbnVtIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+V2ViUGFyYW1LaW5kPC9BPgotPEREPlJldHVybnMgdGhlICc8ZW0+PGI+V2ViIFBhcmFtIEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL0lQcm9wZXJ0eURlZmF1bHRzLmh0bWwjZ2V0RGVmYXVsdChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlKSI+PEI+Z2V0RGVmYXVsdChFU3RydWN0dXJhbEZlYXR1cmUpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JUHJvcGVydHlEZWZhdWx0cy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSI+SVByb3BlcnR5RGVmYXVsdHM8L0E+Ci08REQ+RGVmaW5lcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyA8Y29kZT5mZWF0dXJlPC9jb2RlPi4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uaHRtbCNnZXRET00oKSI+PEI+Z2V0RE9NKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRE9NUnVudGltZUV4dGVuc2lvbi5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXc0RPTVJ1bnRpbWVFeHRlbnNpb248L0E+Ci08REQ+VG8gZ2V0IGEgaGFuZGxlIHRvIHRoZSBET00gaW5zdGFuY2UgYXZhaWxhYmxlIGZvciB0aGlzIHJ1bnRpbWUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0RG9tRmFjdG9yeSgpIj48Qj5nZXREb21GYWN0b3J5KCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+UmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21GYWN0b3J5Lmh0bWwjZ2V0RG9tUGFja2FnZSgpIj48Qj5nZXREb21QYWNrYWdlKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tRmFjdG9yeS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbUZhY3Rvcnk8L0E+Ci08REQ+UmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdTRE9NUnVudGltZU1hbmFnZXIuaHRtbCNnZXRET01SdW50aW1lKGphdmEubGFuZy5TdHJpbmcpIj48Qj5nZXRET01SdW50aW1lKFN0cmluZyk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdTRE9NUnVudGltZU1hbmFnZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV1NET01SdW50aW1lTWFuYWdlcjwvQT4KLTxERD5UaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRoZSBET00gcnVudGltZSBpbnN0YW5jZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBydW50aW1lIGlkCi0gYW5kIGluc3RhbnRpYXRlIHN1Y2ggRE9NIHJ1bnRpbWUgaW5zdGFuY2UgaWYgbm9uIGV4aXN0ZW50IGF0IHRoZSAKLSBtb21lbnQgb2YgaW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZC4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dzRE9NUnVudGltZU1hbmFnZXIuaHRtbCNnZXRET01SdW50aW1lKG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5yZWdpc3RyeS5JV3NET01SdW50aW1lSW5mbykiPjxCPmdldERPTVJ1bnRpbWUoSVdzRE9NUnVudGltZUluZm8pPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV3NET01SdW50aW1lTWFuYWdlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+V3NET01SdW50aW1lTWFuYWdlcjwvQT4KLTxERD5UaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRoZSBET00gcnVudGltZSBpbnN0YW5jZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBkZXNjcmlwdG9yIG9iamVjdAotIG9mIHR5cGUgSVJ1bnRpbWVJbmZvIGFuZCBpbnN0YW50aWF0ZSBzdWNoIERPTSBydW50aW1lIGluc3RhbmNlIGlmIG5vbiBleGlzdGVudCBhdCB0aGUgCi0gbW9tZW50IG9mIGludm9jYXRpb24gb2YgdGhpcyBtZXRob2QuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwjZ2V0RE9NUnVudGltZShqYXZhLmxhbmcuU3RyaW5nKSI+PEI+Z2V0RE9NUnVudGltZShTdHJpbmcpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV3NET01SdW50aW1lTWFuYWdlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+V3NET01SdW50aW1lTWFuYWdlcjwvQT4KLTxERD5UaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRoZSBET00gcnVudGltZSBpbnN0YW5jZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBydW50aW1lIGlkCi0gYW5kIGluc3RhbnRpYXRlIHN1Y2ggRE9NIHJ1bnRpbWUgaW5zdGFuY2UgaWYgbm9uIGV4aXN0ZW50IGF0IHRoZSAKLSBtb21lbnQgb2YgaW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZC4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXU0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwjZ2V0RE9NUnVudGltZXMoKSI+PEI+Z2V0RE9NUnVudGltZXMoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV1NET01SdW50aW1lTWFuYWdlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXU0RPTVJ1bnRpbWVNYW5hZ2VyPC9BPgotPEREPiZuYnNwOwotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV3NET01SdW50aW1lTWFuYWdlci5odG1sI2dldERPTVJ1bnRpbWVzKCkiPjxCPmdldERPTVJ1bnRpbWVzKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Xc0RPTVJ1bnRpbWVNYW5hZ2VyPC9BPgotPEREPiZuYnNwOwotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JTmFtZWRFeHRlbnNpb25JbmZvLmh0bWwjZ2V0SWQoKSI+PEI+Z2V0SWQoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvSU5hbWVkRXh0ZW5zaW9uSW5mby5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSI+SU5hbWVkRXh0ZW5zaW9uSW5mbzwvQT4KLTxERD5UaGUgdW5pcXVlIElEIHRvIGlkZW50aWZ5IHRoaXMgY29uc3VtZXIgdHlwZSB3aGVuIGNhbGxpbmcgdGhlIDxjb2RlPlByb3h5R2VuZXJhdG9yRmFjdG9yeTwvY29kZT4sIGUuZy4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNnZXRJRE9NKCkiPjxCPmdldElET00oKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZTwvQT4KLTxERD5SZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSURPTS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxDT0RFPjxlbT5JRE9NPC9lbT48L0NPREU+PC9BPicuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SURPTV9XZWJTZXJ2aWNlUHJvamVjdHMoKSI+PEI+Z2V0SURPTV9XZWJTZXJ2aWNlUHJvamVjdHMoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZTwvQT4KLTxERD5SZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lET00uaHRtbCNnZXRXZWJTZXJ2aWNlUHJvamVjdHMoKSI+PENPREU+PGVtPldlYiBTZXJ2aWNlIFByb2plY3RzPC9lbT48L0NPREU+PC9BPicuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudCgpIj48Qj5nZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50KCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT48ZW0+SUphdmEgV2ViIFNlcnZpY2UgRWxlbWVudDwvZW0+PC9DT0RFPjwvQT4nLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI2dldElKYXZhV2ViU2VydmljZUVsZW1lbnRfSW1wbGVtZW50YXRpb24oKSI+PEI+Z2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudF9JbXBsZW1lbnRhdGlvbigpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlPC9BPgotPEREPlJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuaHRtbCNnZXRJbXBsZW1lbnRhdGlvbigpIj48Q09ERT48ZW0+SW1wbGVtZW50YXRpb248L2VtPjwvQ09ERT48L0E+Jy4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNnZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50X05hbWUoKSI+PEI+Z2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudF9OYW1lKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5odG1sI2dldE5hbWUoKSI+PENPREU+PGVtPk5hbWU8L2VtPjwvQ09ERT48L0E+Jy4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuaHRtbCNnZXRJbXBsZW1lbnRhdGlvbigpIj48Qj5nZXRJbXBsZW1lbnRhdGlvbigpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JSmF2YVdlYlNlcnZpY2VFbGVtZW50PC9BPgotPEREPiZuYnNwOwotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sI2dldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkiPjxCPmdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U8L0E+Ci08REQ+Jm5ic3A7Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpIj48Qj5nZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT48ZW0+SVNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT48L0NPREU+PC9BPicuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9JbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpIj48Qj5nZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX0ltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwjZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKSI+PENPREU+PGVtPkltcGxlbWVudGluZyBXZWIgU2VydmljZXM8L2VtPjwvQ09ERT48L0E+Jy4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX0ltcGxpY2l0KCkiPjxCPmdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfSW1wbGljaXQoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZTwvQT4KLTxERD5SZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwjaXNJbXBsaWNpdCgpIj48Q09ERT48ZW0+SW1wbGljaXQ8L2VtPjwvQ09ERT48L0E+Jy4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSI+PEI+Z2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sI2dldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSI+PENPREU+PGVtPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPjwvQ09ERT48L0E+Jy4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1NvYXBCaW5kaW5nU3R5bGUoKSI+PEI+Z2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1N0eWxlKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sI2dldFNvYXBCaW5kaW5nU3R5bGUoKSI+PENPREU+PGVtPlNvYXAgQmluZGluZyBTdHlsZTwvZW0+PC9DT0RFPjwvQT4nLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI2dldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfU29hcEJpbmRpbmdVc2UoKSI+PEI+Z2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1VzZSgpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlPC9BPgotPEREPlJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCNnZXRTb2FwQmluZGluZ1VzZSgpIj48Q09ERT48ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+PC9DT0RFPjwvQT4nLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI2dldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfVGFyZ2V0TmFtZXNwYWNlKCkiPjxCPmdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfVGFyZ2V0TmFtZXNwYWNlKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sI2dldFRhcmdldE5hbWVzcGFjZSgpIj48Q09ERT48ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+PC9DT0RFPjwvQT4nLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI2dldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfV2ViTWV0aG9kcygpIj48Qj5nZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1dlYk1ldGhvZHMoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZTwvQT4KLTxERD5SZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCNnZXRXZWJNZXRob2RzKCkiPjxDT0RFPjxlbT5XZWIgTWV0aG9kczwvZW0+PC9DT0RFPjwvQT4nLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI2dldElXZWJNZXRob2QoKSI+PEI+Z2V0SVdlYk1ldGhvZCgpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlPC9BPgotPEREPlJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PENPREU+PGVtPklXZWIgTWV0aG9kPC9lbT48L0NPREU+PC9BPicuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SVdlYk1ldGhvZF9FeGNsdWRlZCgpIj48Qj5nZXRJV2ViTWV0aG9kX0V4Y2x1ZGVkKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sI2lzRXhjbHVkZWQoKSI+PENPREU+PGVtPkV4Y2x1ZGVkPC9lbT48L0NPREU+PC9BPicuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SVdlYk1ldGhvZF9QYXJhbWV0ZXJzKCkiPjxCPmdldElXZWJNZXRob2RfUGFyYW1ldGVycygpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlPC9BPgotPEREPlJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sI2dldFBhcmFtZXRlcnMoKSI+PENPREU+PGVtPlBhcmFtZXRlcnM8L2VtPjwvQ09ERT48L0E+Jy4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNnZXRJV2ViTWV0aG9kX1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSI+PEI+Z2V0SVdlYk1ldGhvZF9Tb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sI2dldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSI+PENPREU+PGVtPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPjwvQ09ERT48L0E+Jy4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNnZXRJV2ViTWV0aG9kX1NvYXBCaW5kaW5nU3R5bGUoKSI+PEI+Z2V0SVdlYk1ldGhvZF9Tb2FwQmluZGluZ1N0eWxlKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sI2dldFNvYXBCaW5kaW5nU3R5bGUoKSI+PENPREU+PGVtPlNvYXAgQmluZGluZyBTdHlsZTwvZW0+PC9DT0RFPjwvQT4nLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI2dldElXZWJNZXRob2RfU29hcEJpbmRpbmdVc2UoKSI+PEI+Z2V0SVdlYk1ldGhvZF9Tb2FwQmluZGluZ1VzZSgpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlPC9BPgotPEREPlJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCNnZXRTb2FwQmluZGluZ1VzZSgpIj48Q09ERT48ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+PC9DT0RFPjwvQT4nLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI2dldElXZWJQYXJhbSgpIj48Qj5nZXRJV2ViUGFyYW0oKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZTwvQT4KLTxERD5SZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PENPREU+PGVtPklXZWIgUGFyYW08L2VtPjwvQ09ERT48L0E+Jy4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNnZXRJV2ViUGFyYW1fSGVhZGVyKCkiPjxCPmdldElXZWJQYXJhbV9IZWFkZXIoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZTwvQT4KLTxERD5SZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCNpc0hlYWRlcigpIj48Q09ERT48ZW0+SGVhZGVyPC9lbT48L0NPREU+PC9BPicuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SVdlYlBhcmFtX0tpbmQoKSI+PEI+Z2V0SVdlYlBhcmFtX0tpbmQoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZTwvQT4KLTxERD5SZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCNnZXRLaW5kKCkiPjxDT0RFPjxlbT5LaW5kPC9lbT48L0NPREU+PC9BPicuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SVdlYlBhcmFtX1BhcnROYW1lKCkiPjxCPmdldElXZWJQYXJhbV9QYXJ0TmFtZSgpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlPC9BPgotPEREPlJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sI2dldFBhcnROYW1lKCkiPjxDT0RFPjxlbT5QYXJ0IE5hbWU8L2VtPjwvQ09ERT48L0E+Jy4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNnZXRJV2ViUGFyYW1fVGFyZ2V0TmFtZXNwYWNlKCkiPjxCPmdldElXZWJQYXJhbV9UYXJnZXROYW1lc3BhY2UoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZTwvQT4KLTxERD5SZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCNnZXRUYXJnZXROYW1lc3BhY2UoKSI+PENPREU+PGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPjwvQ09ERT48L0E+Jy4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNnZXRJV2ViUGFyYW1fVHlwZU5hbWUoKSI+PEI+Z2V0SVdlYlBhcmFtX1R5cGVOYW1lKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwjZ2V0VHlwZU5hbWUoKSI+PENPREU+PGVtPlR5cGUgTmFtZTwvZW0+PC9DT0RFPjwvQT4nLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI2dldElXZWJTZXJ2aWNlKCkiPjxCPmdldElXZWJTZXJ2aWNlKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PENPREU+PGVtPklXZWIgU2VydmljZTwvZW0+PC9DT0RFPjwvQT4nLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI2dldElXZWJTZXJ2aWNlX1BvcnROYW1lKCkiPjxCPmdldElXZWJTZXJ2aWNlX1BvcnROYW1lKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2UuaHRtbCNnZXRQb3J0TmFtZSgpIj48Q09ERT48ZW0+UG9ydCBOYW1lPC9lbT48L0NPREU+PC9BPicuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SVdlYlNlcnZpY2VfU2VydmljZUVuZHBvaW50KCkiPjxCPmdldElXZWJTZXJ2aWNlX1NlcnZpY2VFbmRwb2ludCgpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlPC9BPgotPEREPlJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwjZ2V0U2VydmljZUVuZHBvaW50KCkiPjxDT0RFPjxlbT5TZXJ2aWNlIEVuZHBvaW50PC9lbT48L0NPREU+PC9BPicuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SVdlYlNlcnZpY2VfVGFyZ2V0TmFtZXNwYWNlKCkiPjxCPmdldElXZWJTZXJ2aWNlX1RhcmdldE5hbWVzcGFjZSgpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlPC9BPgotPEREPlJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkiPjxDT0RFPjxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT48L0NPREU+PC9BPicuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SVdlYlNlcnZpY2VfV3NkbExvY2F0aW9uKCkiPjxCPmdldElXZWJTZXJ2aWNlX1dzZGxMb2NhdGlvbigpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlPC9BPgotPEREPlJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwjZ2V0V3NkbExvY2F0aW9uKCkiPjxDT0RFPjxlbT5Xc2RsIExvY2F0aW9uPC9lbT48L0NPREU+PC9BPicuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SVdlYlNlcnZpY2VQcm9qZWN0KCkiPjxCPmdldElXZWJTZXJ2aWNlUHJvamVjdCgpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlPC9BPgotPEREPlJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZVByb2plY3QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT48ZW0+SVdlYiBTZXJ2aWNlIFByb2plY3Q8L2VtPjwvQ09ERT48L0E+Jy4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNnZXRJV2ViU2VydmljZVByb2plY3RfTmFtZSgpIj48Qj5nZXRJV2ViU2VydmljZVByb2plY3RfTmFtZSgpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlPC9BPgotPEREPlJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlUHJvamVjdC5odG1sI2dldE5hbWUoKSI+PENPREU+PGVtPk5hbWU8L2VtPjwvQ09ERT48L0E+Jy4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNnZXRJV2ViU2VydmljZVByb2plY3RfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpIj48Qj5nZXRJV2ViU2VydmljZVByb2plY3RfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlPC9BPgotPEREPlJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpIj48Q09ERT48ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2VzPC9lbT48L0NPREU+PC9BPicuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SVdlYlNlcnZpY2VQcm9qZWN0X1dlYlNlcnZpY2VzKCkiPjxCPmdldElXZWJTZXJ2aWNlUHJvamVjdF9XZWJTZXJ2aWNlcygpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlPC9BPgotPEREPlJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwjZ2V0V2ViU2VydmljZXMoKSI+PENPREU+PGVtPldlYiBTZXJ2aWNlczwvZW0+PC9DT0RFPjwvQT4nLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI2dldElXZWJUeXBlKCkiPjxCPmdldElXZWJUeXBlKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJUeXBlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PENPREU+PGVtPklXZWIgVHlwZTwvZW0+PC9DT0RFPjwvQT4nLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwjZ2V0S2luZCgpIj48Qj5nZXRLaW5kKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlBhcmFtPC9BPgotPEREPiZuYnNwOwotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sI2dldExpdGVyYWwoKSI+PEI+Z2V0TGl0ZXJhbCgpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBlbnVtIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU8L0E+Ci08REQ+Jm5ic3A7Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwjZ2V0TGl0ZXJhbCgpIj48Qj5nZXRMaXRlcmFsKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGVudW0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdTdHlsZTwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwjZ2V0TGl0ZXJhbCgpIj48Qj5nZXRMaXRlcmFsKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGVudW0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nVXNlPC9BPgotPEREPiZuYnNwOwotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwjZ2V0TGl0ZXJhbCgpIj48Qj5nZXRMaXRlcmFsKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGVudW0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5XZWJQYXJhbUtpbmQ8L0E+Ci08REQ+Jm5ic3A7Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbi5odG1sI2dldExvY2FsaXplZE1lc3NhZ2UoKSI+PEI+Z2V0TG9jYWxpemVkTWVzc2FnZSgpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBleGNlcHRpb24gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbjwvQT4KLTxERD5SZXR1cm5zIGxvY2FsaXplZCBtZXNzYWdlIHdpdGggd2hpY2ggdGhlIGV4Y2VwdGlvbiB3YXMgY29uc3RydWN0ZWQuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JSmF2YVdlYlNlcnZpY2VFbGVtZW50Lmh0bWwjZ2V0TmFtZSgpIj48Qj5nZXROYW1lKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklKYXZhV2ViU2VydmljZUVsZW1lbnQ8L0E+Ci08REQ+Jm5ic3A7Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZVByb2plY3QuaHRtbCNnZXROYW1lKCkiPjxCPmdldE5hbWUoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZVByb2plY3QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViU2VydmljZVByb2plY3Q8L0E+Ci08REQ+Jm5ic3A7Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwjZ2V0TmFtZSgpIj48Qj5nZXROYW1lKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGVudW0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuaHRtbCNnZXROYW1lKCkiPjxCPmdldE5hbWUoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gZW51bSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1N0eWxlPC9BPgotPEREPiZuYnNwOwotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuaHRtbCNnZXROYW1lKCkiPjxCPmdldE5hbWUoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gZW51bSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdVc2U8L0E+Ci08REQ+Jm5ic3A7Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuaHRtbCNnZXROYW1lKCkiPjxCPmdldE5hbWUoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gZW51bSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPldlYlBhcmFtS2luZDwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvSU5hbWVkRXh0ZW5zaW9uSW5mby5odG1sI2dldE5hbWUoKSI+PEI+Z2V0TmFtZSgpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JTmFtZWRFeHRlbnNpb25JbmZvLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lIj5JTmFtZWRFeHRlbnNpb25JbmZvPC9BPgotPEREPkEgdmVyYm9zZSBuYW1lIGZvciB0aGUgdHlwZSBvZiBjb25zdW1lciwgZS5nLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sI2dldFBhcmFtZXRlcnMoKSI+PEI+Z2V0UGFyYW1ldGVycygpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViTWV0aG9kPC9BPgotPEREPiZuYnNwOwotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwjZ2V0UGFydE5hbWUoKSI+PEI+Z2V0UGFydE5hbWUoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViUGFyYW08L0E+Ci08REQ+UmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFydCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sI2dldFBvcnROYW1lKCkiPjxCPmdldFBvcnROYW1lKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViU2VydmljZTwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwjZ2V0U2VydmljZUVuZHBvaW50KCkiPjxCPmdldFNlcnZpY2VFbmRwb2ludCgpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlNlcnZpY2U8L0E+Ci08REQ+Jm5ic3A7Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZVByb2plY3QuaHRtbCNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkiPjxCPmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZVByb2plY3QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViU2VydmljZVByb2plY3Q8L0E+Ci08REQ+Jm5ic3A7Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpIj48Qj5nZXRTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT48ZW0+U09BUCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvZW0+PC9DT0RFPjwvQT4nLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sI2dldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSI+PEI+Z2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9BPgotPEREPlJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkiPjxCPmdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYk1ldGhvZDwvQT4KLTxERD5SZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0U09BUEJpbmRpbmdTdHlsZSgpIj48Qj5nZXRTT0FQQmluZGluZ1N0eWxlKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT48ZW0+U09BUCBCaW5kaW5nIFN0eWxlPC9lbT48L0NPREU+PC9BPicuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwjZ2V0U29hcEJpbmRpbmdTdHlsZSgpIj48Qj5nZXRTb2FwQmluZGluZ1N0eWxlKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U8L0E+Ci08REQ+UmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFN0eWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmh0bWwjZ2V0U29hcEJpbmRpbmdTdHlsZSgpIj48Qj5nZXRTb2FwQmluZGluZ1N0eWxlKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJNZXRob2Q8L0E+Ci08REQ+UmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFN0eWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0U09BUEJpbmRpbmdVc2UoKSI+PEI+Z2V0U09BUEJpbmRpbmdVc2UoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZTwvQT4KLTxERD5SZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT48ZW0+U09BUCBCaW5kaW5nIFVzZTwvZW0+PC9DT0RFPjwvQT4nLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sI2dldFNvYXBCaW5kaW5nVXNlKCkiPjxCPmdldFNvYXBCaW5kaW5nVXNlKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U8L0E+Ci08REQ+UmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFVzZTwvYj48L2VtPicgYXR0cmlidXRlLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sI2dldFNvYXBCaW5kaW5nVXNlKCkiPjxCPmdldFNvYXBCaW5kaW5nVXNlKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJNZXRob2Q8L0E+Ci08REQ+UmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFVzZTwvYj48L2VtPicgYXR0cmlidXRlLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sI2dldFRhcmdldE5hbWVzcGFjZSgpIj48Qj5nZXRUYXJnZXROYW1lc3BhY2UoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sI2dldFRhcmdldE5hbWVzcGFjZSgpIj48Qj5nZXRUYXJnZXROYW1lc3BhY2UoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViUGFyYW08L0E+Ci08REQ+UmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFyZ2V0IE5hbWVzcGFjZTwvYj48L2VtPicgYXR0cmlidXRlLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2UuaHRtbCNnZXRUYXJnZXROYW1lc3BhY2UoKSI+PEI+Z2V0VGFyZ2V0TmFtZXNwYWNlKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViU2VydmljZTwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sI2dldFR5cGVOYW1lKCkiPjxCPmdldFR5cGVOYW1lKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlBhcmFtPC9BPgotPEREPiZuYnNwOwotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sI2dldFZhbHVlKCkiPjxCPmdldFZhbHVlKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGVudW0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuaHRtbCNnZXRWYWx1ZSgpIj48Qj5nZXRWYWx1ZSgpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBlbnVtIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nU3R5bGU8L0E+Ci08REQ+Jm5ic3A7Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sI2dldFZhbHVlKCkiPjxCPmdldFZhbHVlKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGVudW0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nVXNlPC9BPgotPEREPiZuYnNwOwotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwjZ2V0VmFsdWUoKSI+PEI+Z2V0VmFsdWUoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gZW51bSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPldlYlBhcmFtS2luZDwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCNnZXRXZWJNZXRob2RzKCkiPjxCPmdldFdlYk1ldGhvZHMoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNnZXRXZWJQYXJhbUtpbmQoKSI+PEI+Z2V0V2ViUGFyYW1LaW5kKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxDT0RFPjxlbT5XZWIgUGFyYW0gS2luZDwvZW0+PC9DT0RFPjwvQT4nLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSURPTS5odG1sI2dldFdlYlNlcnZpY2VQcm9qZWN0cygpIj48Qj5nZXRXZWJTZXJ2aWNlUHJvamVjdHMoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JRE9NLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SURPTTwvQT4KLTxERD5SZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5XZWIgU2VydmljZSBQcm9qZWN0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZVByb2plY3QuaHRtbCNnZXRXZWJTZXJ2aWNlcygpIj48Qj5nZXRXZWJTZXJ2aWNlcygpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlUHJvamVjdC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJTZXJ2aWNlUHJvamVjdDwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwjZ2V0V3NkbExvY2F0aW9uKCkiPjxCPmdldFdzZGxMb2NhdGlvbigpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlNlcnZpY2U8L0E+Ci08REQ+Jm5ic3A7Ci08L0RMPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5JbmRleDwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNi5odG1sIj48Qj5QUkVWIExFVFRFUjwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC04Lmh0bWwiPjxCPk5FWFQgTEVUVEVSPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uL2luZGV4Lmh0bWw/aW5kZXgtZmlsZXNpbmRleC03Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxBIEhSRUY9ImluZGV4LTEuaHRtbCI+QTwvQT4gPEEgSFJFRj0iaW5kZXgtMi5odG1sIj5CPC9BPiA8QSBIUkVGPSJpbmRleC0zLmh0bWwiPkM8L0E+IDxBIEhSRUY9ImluZGV4LTQuaHRtbCI+RDwvQT4gPEEgSFJFRj0iaW5kZXgtNS5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC02Lmh0bWwiPkY8L0E+IDxBIEhSRUY9ImluZGV4LTcuaHRtbCI+RzwvQT4gPEEgSFJFRj0iaW5kZXgtOC5odG1sIj5JPC9BPiA8QSBIUkVGPSJpbmRleC05Lmh0bWwiPkw8L0E+IDxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPk88L0E+IDxBIEhSRUY9ImluZGV4LTExLmh0bWwiPlI8L0E+IDxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPlM8L0E+IDxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPlQ8L0E+IDxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPlY8L0E+IDxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPlc8L0E+IDxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9pbmRleC1maWxlcy9pbmRleC04Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2luZGV4LWZpbGVzL2luZGV4LTguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM5M2NjNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2luZGV4LWZpbGVzL2luZGV4LTguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQyNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjBfMjIpIG9uIFNhdCBBcHIgMTcgMTg6NDY6MzYgSVNUIDIwMTAgLS0+Ci08VElUTEU+Ci1JLUluZGV4Ci08L1RJVExFPgotCi0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iSS1JbmRleCI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5JbmRleDwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNy5odG1sIj48Qj5QUkVWIExFVFRFUjwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC05Lmh0bWwiPjxCPk5FWFQgTEVUVEVSPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uL2luZGV4Lmh0bWw/aW5kZXgtZmlsZXNpbmRleC04Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtOC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxBIEhSRUY9ImluZGV4LTEuaHRtbCI+QTwvQT4gPEEgSFJFRj0iaW5kZXgtMi5odG1sIj5CPC9BPiA8QSBIUkVGPSJpbmRleC0zLmh0bWwiPkM8L0E+IDxBIEhSRUY9ImluZGV4LTQuaHRtbCI+RDwvQT4gPEEgSFJFRj0iaW5kZXgtNS5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC02Lmh0bWwiPkY8L0E+IDxBIEhSRUY9ImluZGV4LTcuaHRtbCI+RzwvQT4gPEEgSFJFRj0iaW5kZXgtOC5odG1sIj5JPC9BPiA8QSBIUkVGPSJpbmRleC05Lmh0bWwiPkw8L0E+IDxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPk88L0E+IDxBIEhSRUY9ImluZGV4LTExLmh0bWwiPlI8L0E+IDxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPlM8L0E+IDxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPlQ8L0E+IDxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPlY8L0E+IDxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPlc8L0E+IDxIUj4KLTxBIE5BTUU9Il9JXyI+PCEtLSAtLT48L0E+PEgyPgotPEI+STwvQj48L0gyPgotPERMPgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lET00iPjxCPklET008L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+VGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxDT0RFPjxlbT5JRE9NPC9lbT48L0NPREU+JyBjbGFzcy4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCNJRE9NIj48Qj5JRE9NPC9CPjwvQT4gLSAKLVN0YXRpYyB2YXJpYWJsZSBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlLkxpdGVyYWxzPC9BPgotPEREPlRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxDT0RFPjxlbT5JRE9NPC9lbT48L0NPREU+JyBjbGFzcy4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lET00uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5JRE9NPC9CPjwvQT4gLSBJbnRlcmZhY2UgaW4gPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvQT48REQ+QSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SURPTTwvYj48L2VtPicuPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lET01fX1dFQl9TRVJWSUNFX1BST0pFQ1RTIj48Qj5JRE9NX19XRUJfU0VSVklDRV9QUk9KRUNUUzwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZTwvQT4KLTxERD5UaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2ViIFNlcnZpY2UgUHJvamVjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sI0lET01fX1dFQl9TRVJWSUNFX1BST0pFQ1RTIj48Qj5JRE9NX19XRUJfU0VSVklDRV9QUk9KRUNUUzwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZS5MaXRlcmFsczwvQT4KLTxERD5UaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V2ViIFNlcnZpY2UgUHJvamVjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSURPTV9GRUFUVVJFX0NPVU5UIj48Qj5JRE9NX0ZFQVRVUkVfQ09VTlQ8L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+VGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPklET008L2VtPicgY2xhc3MuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVCI+PEI+SUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVDwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZTwvQT4KLTxERD5UaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPENPREU+PGVtPklKYXZhIFdlYiBTZXJ2aWNlIEVsZW1lbnQ8L2VtPjwvQ09ERT4nIGNsYXNzLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sI0lKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlQiPjxCPklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlQ8L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2UuTGl0ZXJhbHM8L0E+Ci08REQ+VGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPENPREU+PGVtPklKYXZhIFdlYiBTZXJ2aWNlIEVsZW1lbnQ8L2VtPjwvQ09ERT4nIGNsYXNzLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OIj48Qj5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTjwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZTwvQT4KLTxERD5UaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wbGVtZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCNJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTiI+PEI+SUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT048L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2UuTGl0ZXJhbHM8L0E+Ci08REQ+VGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkltcGxlbWVudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FIj48Qj5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FPC9CPjwvQT4gLSAKLVN0YXRpYyB2YXJpYWJsZSBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlPC9BPgotPEREPlRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwjSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRSI+PEI+SUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRTwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZS5MaXRlcmFsczwvQT4KLTxERD5UaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UIj48Qj5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQ8L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+VGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPklKYXZhIFdlYiBTZXJ2aWNlIEVsZW1lbnQ8L2VtPicgY2xhc3MuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JSmF2YVdlYlNlcnZpY2VFbGVtZW50Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+SUphdmFXZWJTZXJ2aWNlRWxlbWVudDwvQj48L0E+IC0gSW50ZXJmYWNlIGluIDxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0E+PEREPiZuYnNwOzxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sI0lOX1ZBTFVFIj48Qj5JTl9WQUxVRTwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gZW51bSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPldlYlBhcmFtS2luZDwvQT4KLTxERD5UaGUgJzxlbT48Yj5JTjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvSU5hbWVkRXh0ZW5zaW9uSW5mby5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSI+PEI+SU5hbWVkRXh0ZW5zaW9uSW5mbzwvQj48L0E+IC0gSW50ZXJmYWNlIGluIDxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lPC9BPjxERD5JbnRlcmZhY2UgcmVwcmVzZW50aWcgYW5kIGV4dGVudGlvbi48RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuaHRtbCNJTk9VVF9WQUxVRSI+PEI+SU5PVVRfVkFMVUU8L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGVudW0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5XZWJQYXJhbUtpbmQ8L0E+Ci08REQ+VGhlICc8ZW0+PGI+SU5PVVQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwjaW5zdGFuY2UoKSI+PEI+aW5zdGFuY2UoKTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Xc0RPTVJ1bnRpbWVNYW5hZ2VyPC9BPgotPEREPiZuYnNwOwotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JUHJvcGVydHlEZWZhdWx0cy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSI+PEI+SVByb3BlcnR5RGVmYXVsdHM8L0I+PC9BPiAtIEludGVyZmFjZSBpbiA8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZTwvQT48REQ+SW50ZXJmYWNlIHRoYXQgcHJvdmlkZXMgZGVmYXVsdCB2YWx1ZXMgZm9yIERPTSBvYmplY3QncyBwcm9wZXJ0aWVzLjxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvSVByb3BlcnR5U3RhdGUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUiPjxCPklQcm9wZXJ0eVN0YXRlPC9CPjwvQT4gLSBJbnRlcmZhY2UgaW4gPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWU8L0E+PEREPkludGVyZmFjZSBmb3IgY2hlY2tpbmcgdGhlIHN0YXRlIG9mIHNvbWUgcHJvcGVydHkgZm9yIGNvbmNyZXRlIERPTSBvYmplY3QuPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JUHJvcGVydHlTdGF0ZS5odG1sI2lzQ2hhbmdlYWJsZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlKSI+PEI+aXNDaGFuZ2VhYmxlKEVTdHJ1Y3R1cmFsRmVhdHVyZSk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL0lQcm9wZXJ0eVN0YXRlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lIj5JUHJvcGVydHlTdGF0ZTwvQT4KLTxERD5EZWZpbmVzIGlmIHByb3BlcnR5IGlzIGNoYW5nZWFibGUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFIj48Qj5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0U8L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+VGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxDT0RFPjxlbT5JU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPjwvQ09ERT4nIGNsYXNzLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sI0lTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRSI+PEI+SVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFPC9CPjwvQT4gLSAKLVN0YXRpYyB2YXJpYWJsZSBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlLkxpdGVyYWxzPC9BPgotPEREPlRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxDT0RFPjxlbT5JU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPjwvQ09ERT4nIGNsYXNzLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5UQVRJT04iPjxCPklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5UQVRJT048L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGxlbWVudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRJTkdfV0VCX1NFUlZJQ0VTIj48Qj5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExFTUVOVElOR19XRUJfU0VSVklDRVM8L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGxlbWVudGluZyBXZWIgU2VydmljZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sI0lTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5USU5HX1dFQl9TRVJWSUNFUyI+PEI+SVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRJTkdfV0VCX1NFUlZJQ0VTPC9CPjwvQT4gLSAKLVN0YXRpYyB2YXJpYWJsZSBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlLkxpdGVyYWxzPC9BPgotPEREPlRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbXBsZW1lbnRpbmcgV2ViIFNlcnZpY2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTElDSVQiPjxCPklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTElDSVQ8L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGxpY2l0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwjSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVCI+PEI+SVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVDwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZS5MaXRlcmFsczwvQT4KLTxERD5UaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW1wbGljaXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fTkFNRSI+PEI+SVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19OQU1FPC9CPjwvQT4gLSAKLVN0YXRpYyB2YXJpYWJsZSBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlPC9BPgotPEREPlRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFIj48Qj5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEU8L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCNJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEUiPjxCPklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRTwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZS5MaXRlcmFsczwvQT4KLTxERD5UaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfU1RZTEUiPjxCPklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1NUWUxFPC9CPjwvQT4gLSAKLVN0YXRpYyB2YXJpYWJsZSBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlPC9BPgotPEREPlRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgU3R5bGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCNJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19TVFlMRSI+PEI+SVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfU1RZTEU8L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2UuTGl0ZXJhbHM8L0E+Ci08REQ+VGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfVVNFIj48Qj5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19VU0U8L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBVc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCNJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19VU0UiPjxCPklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1VTRTwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZS5MaXRlcmFsczwvQT4KLTxERD5UaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFVzZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19UQVJHRVRfTkFNRVNQQUNFIj48Qj5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1RBUkdFVF9OQU1FU1BBQ0U8L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBOYW1lc3BhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCNJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1RBUkdFVF9OQU1FU1BBQ0UiPjxCPklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fVEFSR0VUX05BTUVTUEFDRTwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZS5MaXRlcmFsczwvQT4KLTxERD5UaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IE5hbWVzcGFjZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19XRUJfTUVUSE9EUyI+PEI+SVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19XRUJfTUVUSE9EUzwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZTwvQT4KLTxERD5UaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2ViIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sI0lTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fV0VCX01FVEhPRFMiPjxCPklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fV0VCX01FVEhPRFM8L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2UuTGl0ZXJhbHM8L0E+Ci08REQ+VGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldlYiBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9GRUFUVVJFX0NPVU5UIj48Qj5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfRkVBVFVSRV9DT1VOVDwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZTwvQT4KLTxERD5UaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SVNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT4nIGNsYXNzLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U8L0I+PC9BPiAtIEludGVyZmFjZSBpbiA8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpPC9BPjxERD4mbmJzcDs8RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmh0bWwjaXNFeGNsdWRlZCgpIj48Qj5pc0V4Y2x1ZGVkKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJNZXRob2Q8L0E+Ci08REQ+Jm5ic3A7Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCNpc0hlYWRlcigpIj48Qj5pc0hlYWRlcigpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJQYXJhbTwvQT4KLTxERD5SZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IZWFkZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCNpc0ltcGxpY2l0KCkiPjxCPmlzSW1wbGljaXQoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJV0VCX01FVEhPRCI+PEI+SVdFQl9NRVRIT0Q8L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+VGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxDT0RFPjxlbT5JV2ViIE1ldGhvZDwvZW0+PC9DT0RFPicgY2xhc3MuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwjSVdFQl9NRVRIT0QiPjxCPklXRUJfTUVUSE9EPC9CPjwvQT4gLSAKLVN0YXRpYyB2YXJpYWJsZSBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlLkxpdGVyYWxzPC9BPgotPEREPlRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxDT0RFPjxlbT5JV2ViIE1ldGhvZDwvZW0+PC9DT0RFPicgY2xhc3MuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVdFQl9NRVRIT0RfX0VYQ0xVREVEIj48Qj5JV0VCX01FVEhPRF9fRVhDTFVERUQ8L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwjSVdFQl9NRVRIT0RfX0VYQ0xVREVEIj48Qj5JV0VCX01FVEhPRF9fRVhDTFVERUQ8L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2UuTGl0ZXJhbHM8L0E+Ci08REQ+VGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJV0VCX01FVEhPRF9fSU1QTEVNRU5UQVRJT04iPjxCPklXRUJfTUVUSE9EX19JTVBMRU1FTlRBVElPTjwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZTwvQT4KLTxERD5UaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wbGVtZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJV0VCX01FVEhPRF9fTkFNRSI+PEI+SVdFQl9NRVRIT0RfX05BTUU8L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJV0VCX01FVEhPRF9fUEFSQU1FVEVSUyI+PEI+SVdFQl9NRVRIT0RfX1BBUkFNRVRFUlM8L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcmFtZXRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sI0lXRUJfTUVUSE9EX19QQVJBTUVURVJTIj48Qj5JV0VCX01FVEhPRF9fUEFSQU1FVEVSUzwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZS5MaXRlcmFsczwvQT4KLTxERD5UaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFyYW1ldGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRSI+PEI+SVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEU8L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCNJV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRSI+PEI+SVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEU8L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2UuTGl0ZXJhbHM8L0E+Ci08REQ+VGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfU1RZTEUiPjxCPklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfU1RZTEU8L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sI0lXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfU1RZTEUiPjxCPklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfU1RZTEU8L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2UuTGl0ZXJhbHM8L0E+Ci08REQ+VGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19VU0UiPjxCPklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfVVNFPC9CPjwvQT4gLSAKLVN0YXRpYyB2YXJpYWJsZSBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlPC9BPgotPEREPlRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgVXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwjSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19VU0UiPjxCPklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfVVNFPC9CPjwvQT4gLSAKLVN0YXRpYyB2YXJpYWJsZSBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlLkxpdGVyYWxzPC9BPgotPEREPlRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgVXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJV0VCX01FVEhPRF9GRUFUVVJFX0NPVU5UIj48Qj5JV0VCX01FVEhPRF9GRUFUVVJFX0NPVU5UPC9CPjwvQT4gLSAKLVN0YXRpYyB2YXJpYWJsZSBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlPC9BPgotPEREPlRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JV2ViIE1ldGhvZDwvZW0+JyBjbGFzcy4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJV0VCX1BBUkFNIj48Qj5JV0VCX1BBUkFNPC9CPjwvQT4gLSAKLVN0YXRpYyB2YXJpYWJsZSBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlPC9BPgotPEREPlRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8Q09ERT48ZW0+SVdlYiBQYXJhbTwvZW0+PC9DT0RFPicgY2xhc3MuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwjSVdFQl9QQVJBTSI+PEI+SVdFQl9QQVJBTTwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZS5MaXRlcmFsczwvQT4KLTxERD5UaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8Q09ERT48ZW0+SVdlYiBQYXJhbTwvZW0+PC9DT0RFPicgY2xhc3MuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVdFQl9QQVJBTV9fSEVBREVSIj48Qj5JV0VCX1BBUkFNX19IRUFERVI8L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlYWRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sI0lXRUJfUEFSQU1fX0hFQURFUiI+PEI+SVdFQl9QQVJBTV9fSEVBREVSPC9CPjwvQT4gLSAKLVN0YXRpYyB2YXJpYWJsZSBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlLkxpdGVyYWxzPC9BPgotPEREPlRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5IZWFkZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lXRUJfUEFSQU1fX0lNUExFTUVOVEFUSU9OIj48Qj5JV0VCX1BBUkFNX19JTVBMRU1FTlRBVElPTjwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZTwvQT4KLTxERD5UaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wbGVtZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJV0VCX1BBUkFNX19LSU5EIj48Qj5JV0VCX1BBUkFNX19LSU5EPC9CPjwvQT4gLSAKLVN0YXRpYyB2YXJpYWJsZSBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlPC9BPgotPEREPlRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwjSVdFQl9QQVJBTV9fS0lORCI+PEI+SVdFQl9QQVJBTV9fS0lORDwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZS5MaXRlcmFsczwvQT4KLTxERD5UaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVdFQl9QQVJBTV9fTkFNRSI+PEI+SVdFQl9QQVJBTV9fTkFNRTwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZTwvQT4KLTxERD5UaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lXRUJfUEFSQU1fX1BBUlRfTkFNRSI+PEI+SVdFQl9QQVJBTV9fUEFSVF9OQU1FPC9CPjwvQT4gLSAKLVN0YXRpYyB2YXJpYWJsZSBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlPC9BPgotPEREPlRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJ0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCNJV0VCX1BBUkFNX19QQVJUX05BTUUiPjxCPklXRUJfUEFSQU1fX1BBUlRfTkFNRTwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZS5MaXRlcmFsczwvQT4KLTxERD5UaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFydCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJV0VCX1BBUkFNX19UQVJHRVRfTkFNRVNQQUNFIj48Qj5JV0VCX1BBUkFNX19UQVJHRVRfTkFNRVNQQUNFPC9CPjwvQT4gLSAKLVN0YXRpYyB2YXJpYWJsZSBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlPC9BPgotPEREPlRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgTmFtZXNwYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwjSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRSI+PEI+SVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRTwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZS5MaXRlcmFsczwvQT4KLTxERD5UaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IE5hbWVzcGFjZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVdFQl9QQVJBTV9fVFlQRV9OQU1FIj48Qj5JV0VCX1BBUkFNX19UWVBFX05BTUU8L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sI0lXRUJfUEFSQU1fX1RZUEVfTkFNRSI+PEI+SVdFQl9QQVJBTV9fVFlQRV9OQU1FPC9CPjwvQT4gLSAKLVN0YXRpYyB2YXJpYWJsZSBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlLkxpdGVyYWxzPC9BPgotPEREPlRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lXRUJfUEFSQU1fRkVBVFVSRV9DT1VOVCI+PEI+SVdFQl9QQVJBTV9GRUFUVVJFX0NPVU5UPC9CPjwvQT4gLSAKLVN0YXRpYyB2YXJpYWJsZSBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlPC9BPgotPEREPlRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JV2ViIFBhcmFtPC9lbT4nIGNsYXNzLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lXRUJfU0VSVklDRSI+PEI+SVdFQl9TRVJWSUNFPC9CPjwvQT4gLSAKLVN0YXRpYyB2YXJpYWJsZSBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlPC9BPgotPEREPlRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8Q09ERT48ZW0+SVdlYiBTZXJ2aWNlPC9lbT48L0NPREU+JyBjbGFzcy4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCNJV0VCX1NFUlZJQ0UiPjxCPklXRUJfU0VSVklDRTwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZS5MaXRlcmFsczwvQT4KLTxERD5UaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8Q09ERT48ZW0+SVdlYiBTZXJ2aWNlPC9lbT48L0NPREU+JyBjbGFzcy4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJV0VCX1NFUlZJQ0VfX0lNUExFTUVOVEFUSU9OIj48Qj5JV0VCX1NFUlZJQ0VfX0lNUExFTUVOVEFUSU9OPC9CPjwvQT4gLSAKLVN0YXRpYyB2YXJpYWJsZSBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlPC9BPgotPEREPlRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBsZW1lbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lXRUJfU0VSVklDRV9fTkFNRSI+PEI+SVdFQl9TRVJWSUNFX19OQU1FPC9CPjwvQT4gLSAKLVN0YXRpYyB2YXJpYWJsZSBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlPC9BPgotPEREPlRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVdFQl9TRVJWSUNFX19QT1JUX05BTUUiPjxCPklXRUJfU0VSVklDRV9fUE9SVF9OQU1FPC9CPjwvQT4gLSAKLVN0YXRpYyB2YXJpYWJsZSBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlPC9BPgotPEREPlRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3J0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCNJV0VCX1NFUlZJQ0VfX1BPUlRfTkFNRSI+PEI+SVdFQl9TRVJWSUNFX19QT1JUX05BTUU8L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2UuTGl0ZXJhbHM8L0E+Ci08REQ+VGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvcnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVdFQl9TRVJWSUNFX19TRVJWSUNFX0VORFBPSU5UIj48Qj5JV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQ8L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCNJV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQiPjxCPklXRUJfU0VSVklDRV9fU0VSVklDRV9FTkRQT0lOVDwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZS5MaXRlcmFsczwvQT4KLTxERD5UaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVdFQl9TRVJWSUNFX19UQVJHRVRfTkFNRVNQQUNFIj48Qj5JV0VCX1NFUlZJQ0VfX1RBUkdFVF9OQU1FU1BBQ0U8L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBOYW1lc3BhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCNJV0VCX1NFUlZJQ0VfX1RBUkdFVF9OQU1FU1BBQ0UiPjxCPklXRUJfU0VSVklDRV9fVEFSR0VUX05BTUVTUEFDRTwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZS5MaXRlcmFsczwvQT4KLTxERD5UaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IE5hbWVzcGFjZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVdFQl9TRVJWSUNFX19XU0RMX0xPQ0FUSU9OIj48Qj5JV0VCX1NFUlZJQ0VfX1dTRExfTE9DQVRJT048L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldzZGwgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCNJV0VCX1NFUlZJQ0VfX1dTRExfTE9DQVRJT04iPjxCPklXRUJfU0VSVklDRV9fV1NETF9MT0NBVElPTjwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZS5MaXRlcmFsczwvQT4KLTxERD5UaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBMb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVdFQl9TRVJWSUNFX0ZFQVRVUkVfQ09VTlQiPjxCPklXRUJfU0VSVklDRV9GRUFUVVJFX0NPVU5UPC9CPjwvQT4gLSAKLVN0YXRpYyB2YXJpYWJsZSBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlPC9BPgotPEREPlRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JV2ViIFNlcnZpY2U8L2VtPicgY2xhc3MuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVdFQl9TRVJWSUNFX1BST0pFQ1QiPjxCPklXRUJfU0VSVklDRV9QUk9KRUNUPC9CPjwvQT4gLSAKLVN0YXRpYyB2YXJpYWJsZSBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlPC9BPgotPEREPlRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8Q09ERT48ZW0+SVdlYiBTZXJ2aWNlIFByb2plY3Q8L2VtPjwvQ09ERT4nIGNsYXNzLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sI0lXRUJfU0VSVklDRV9QUk9KRUNUIj48Qj5JV0VCX1NFUlZJQ0VfUFJPSkVDVDwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZS5MaXRlcmFsczwvQT4KLTxERD5UaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8Q09ERT48ZW0+SVdlYiBTZXJ2aWNlIFByb2plY3Q8L2VtPjwvQ09ERT4nIGNsYXNzLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lXRUJfU0VSVklDRV9QUk9KRUNUX19OQU1FIj48Qj5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fTkFNRTwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZTwvQT4KLTxERD5UaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sI0lXRUJfU0VSVklDRV9QUk9KRUNUX19OQU1FIj48Qj5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fTkFNRTwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZS5MaXRlcmFsczwvQT4KLTxERD5UaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVdFQl9TRVJWSUNFX1BST0pFQ1RfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFUyI+PEI+SVdFQl9TRVJWSUNFX1BST0pFQ1RfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFUzwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZTwvQT4KLTxERD5UaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCNJV0VCX1NFUlZJQ0VfUFJPSkVDVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VTIj48Qj5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VTPC9CPjwvQT4gLSAKLVN0YXRpYyB2YXJpYWJsZSBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlLkxpdGVyYWxzPC9BPgotPEREPlRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVdFQl9TRVJWSUNFX1BST0pFQ1RfX1dFQl9TRVJWSUNFUyI+PEI+SVdFQl9TRVJWSUNFX1BST0pFQ1RfX1dFQl9TRVJWSUNFUzwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZTwvQT4KLTxERD5UaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2ViIFNlcnZpY2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCNJV0VCX1NFUlZJQ0VfUFJPSkVDVF9fV0VCX1NFUlZJQ0VTIj48Qj5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fV0VCX1NFUlZJQ0VTPC9CPjwvQT4gLSAKLVN0YXRpYyB2YXJpYWJsZSBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlLkxpdGVyYWxzPC9BPgotPEREPlRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5XZWIgU2VydmljZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVdFQl9TRVJWSUNFX1BST0pFQ1RfRkVBVFVSRV9DT1VOVCI+PEI+SVdFQl9TRVJWSUNFX1BST0pFQ1RfRkVBVFVSRV9DT1VOVDwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZTwvQT4KLTxERD5UaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SVdlYiBTZXJ2aWNlIFByb2plY3Q8L2VtPicgY2xhc3MuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVdFQl9UWVBFIj48Qj5JV0VCX1RZUEU8L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+VGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxDT0RFPjxlbT5JV2ViIFR5cGU8L2VtPjwvQ09ERT4nIGNsYXNzLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sI0lXRUJfVFlQRSI+PEI+SVdFQl9UWVBFPC9CPjwvQT4gLSAKLVN0YXRpYyB2YXJpYWJsZSBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlLkxpdGVyYWxzPC9BPgotPEREPlRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxDT0RFPjxlbT5JV2ViIFR5cGU8L2VtPjwvQ09ERT4nIGNsYXNzLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lXRUJfVFlQRV9fSU1QTEVNRU5UQVRJT04iPjxCPklXRUJfVFlQRV9fSU1QTEVNRU5UQVRJT048L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGxlbWVudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVdFQl9UWVBFX19OQU1FIj48Qj5JV0VCX1RZUEVfX05BTUU8L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJV0VCX1RZUEVfRkVBVFVSRV9DT1VOVCI+PEI+SVdFQl9UWVBFX0ZFQVRVUkVfQ09VTlQ8L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+Ci08REQ+VGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPklXZWIgVHlwZTwvZW0+JyBjbGFzcy4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5JV2ViTWV0aG9kPC9CPjwvQT4gLSBJbnRlcmZhY2UgaW4gPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvQT48REQ+Jm5ic3A7PERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+SVdlYlBhcmFtPC9CPjwvQT4gLSBJbnRlcmZhY2UgaW4gPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvQT48REQ+Jm5ic3A7PERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5JV2ViU2VydmljZTwvQj48L0E+IC0gSW50ZXJmYWNlIGluIDxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0E+PEREPiZuYnNwOzxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlUHJvamVjdC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPklXZWJTZXJ2aWNlUHJvamVjdDwvQj48L0E+IC0gSW50ZXJmYWNlIGluIDxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0E+PEREPiZuYnNwOzxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJUeXBlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+SVdlYlR5cGU8L0I+PC9BPiAtIEludGVyZmFjZSBpbiA8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpPC9BPjxERD4mbmJzcDs8RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV3NEb21Mb2FkTGlzdGVuZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5JV3NEb21Mb2FkTGlzdGVuZXI8L0I+PC9BPiAtIEludGVyZmFjZSBpbiA8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpPC9BPjxERD5JbnRlcmZhY2UgdG8gYmUgaW1wbGVtZW50ZWQgYnkgaW50ZXJlc3RlZCBpbiBET00gbG9hZCBwcm9jZXNzLjxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5JV3NET01SdW50aW1lRXh0ZW5zaW9uPC9CPjwvQT4gLSBJbnRlcmZhY2UgaW4gPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvQT48REQ+VGhpcyBpbnRlcmZhY2Ugc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IGFsbCBydW50aW1lIHdoaWNoIHdhbnQgdG8gaGF2ZSBET00gVHJlZSAKLSByZXByZXNlbnRhdGlvbiBvbiB0b3Agb2YgdGhlbS48RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV1NET01SdW50aW1lTWFuYWdlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPklXU0RPTVJ1bnRpbWVNYW5hZ2VyPC9CPjwvQT4gLSBJbnRlcmZhY2UgaW4gPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvQT48REQ+Jm5ic3A7PC9ETD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9ImluZGV4LTcuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtOS5odG1sIj48Qj5ORVhUIExFVFRFUjwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi9pbmRleC5odG1sP2luZGV4LWZpbGVzaW5kZXgtOC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTguaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QjwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkQ8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+RTwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5GPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5UPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5XPC9BPiA8SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvaW5kZXgtZmlsZXMvaW5kZXgtOS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9pbmRleC1maWxlcy9pbmRleC05Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1OGI1YzguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9pbmRleC1maWxlcy9pbmRleC05Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wXzIyKSBvbiBTYXQgQXByIDE3IDE4OjQ2OjM2IElTVCAyMDEwIC0tPgotPFRJVExFPgotTC1JbmRleAotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IkwtSW5kZXgiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9ImluZGV4LTguaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTAuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC05Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEEgSFJFRj0iaW5kZXgtMS5odG1sIj5BPC9BPiA8QSBIUkVGPSJpbmRleC0yLmh0bWwiPkI8L0E+IDxBIEhSRUY9ImluZGV4LTMuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtNC5odG1sIj5EPC9BPiA8QSBIUkVGPSJpbmRleC01Lmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTYuaHRtbCI+RjwvQT4gPEEgSFJFRj0iaW5kZXgtNy5odG1sIj5HPC9BPiA8QSBIUkVGPSJpbmRleC04Lmh0bWwiPkk8L0E+IDxBIEhSRUY9ImluZGV4LTkuaHRtbCI+TDwvQT4gPEEgSFJFRj0iaW5kZXgtMTAuaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+UjwvQT4gPEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+UzwvQT4gPEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+VDwvQT4gPEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+VjwvQT4gPEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+VzwvQT4gPEhSPgotPEEgTkFNRT0iX0xfIj48IS0tIC0tPjwvQT48SDI+Ci08Qj5MPC9CPjwvSDI+Ci08REw+Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sI0xJVEVSQUxfVkFMVUUiPjxCPkxJVEVSQUxfVkFMVUU8L0I+PC9BPiAtIAotU3RhdGljIHZhcmlhYmxlIGluIGVudW0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nVXNlPC9BPgotPEREPlRoZSAnPGVtPjxiPkxJVEVSQUw8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi08L0RMPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5JbmRleDwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtOC5odG1sIj48Qj5QUkVWIExFVFRFUjwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xMC5odG1sIj48Qj5ORVhUIExFVFRFUjwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi9pbmRleC5odG1sP2luZGV4LWZpbGVzaW5kZXgtOS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QjwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkQ8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+RTwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5GPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5UPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5XPC9BPiA8SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvaW5kZXguaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvaW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYxZjE4ZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2luZGV4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBGcmFtZXNldC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9mcmFtZXNldC5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIG9uIFNhdCBBcHIgMTcgMTg6NDY6MzYgSVNUIDIwMTAtLT4KLTxUSVRMRT4KLUdlbmVyYXRlZCBEb2N1bWVudGF0aW9uIChVbnRpdGxlZCkKLTwvVElUTEU+Ci08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gICAgdGFyZ2V0UGFnZSA9ICIiICsgd2luZG93LmxvY2F0aW9uLnNlYXJjaDsKLSAgICBpZiAodGFyZ2V0UGFnZSAhPSAiIiAmJiB0YXJnZXRQYWdlICE9ICJ1bmRlZmluZWQiKQotICAgICAgICB0YXJnZXRQYWdlID0gdGFyZ2V0UGFnZS5zdWJzdHJpbmcoMSk7Ci0gICAgaWYgKHRhcmdldFBhZ2UuaW5kZXhPZigiOiIpICE9IC0xKQotICAgICAgICB0YXJnZXRQYWdlID0gInVuZGVmaW5lZCI7Ci0gICAgZnVuY3Rpb24gbG9hZEZyYW1lcygpIHsKLSAgICAgICAgaWYgKHRhcmdldFBhZ2UgIT0gIiIgJiYgdGFyZ2V0UGFnZSAhPSAidW5kZWZpbmVkIikKLSAgICAgICAgICAgICB0b3AuY2xhc3NGcmFtZS5sb2NhdGlvbiA9IHRvcC50YXJnZXRQYWdlOwotICAgIH0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLTwvSEVBRD4KLTxGUkFNRVNFVCBjb2xzPSIyMCUsODAlIiB0aXRsZT0iIiBvbkxvYWQ9InRvcC5sb2FkRnJhbWVzKCkiPgotPEZSQU1FU0VUIHJvd3M9IjMwJSw3MCUiIHRpdGxlPSIiIG9uTG9hZD0idG9wLmxvYWRGcmFtZXMoKSI+Ci08RlJBTUUgc3JjPSJvdmVydmlldy1mcmFtZS5odG1sIiBuYW1lPSJwYWNrYWdlTGlzdEZyYW1lIiB0aXRsZT0iQWxsIFBhY2thZ2VzIj4KLTxGUkFNRSBzcmM9ImFsbGNsYXNzZXMtZnJhbWUuaHRtbCIgbmFtZT0icGFja2FnZUZyYW1lIiB0aXRsZT0iQWxsIGNsYXNzZXMgYW5kIGludGVyZmFjZXMgKGV4Y2VwdCBub24tc3RhdGljIG5lc3RlZCB0eXBlcykiPgotPC9GUkFNRVNFVD4KLTxGUkFNRSBzcmM9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCIgbmFtZT0iY2xhc3NGcmFtZSIgdGl0bGU9IlBhY2thZ2UsIGNsYXNzIGFuZCBpbnRlcmZhY2UgZGVzY3JpcHRpb25zIiBzY3JvbGxpbmc9InllcyI+Ci08Tk9GUkFNRVM+Ci08SDI+Ci1GcmFtZSBBbGVydDwvSDI+Ci0KLTxQPgotVGhpcyBkb2N1bWVudCBpcyBkZXNpZ25lZCB0byBiZSB2aWV3ZWQgdXNpbmcgdGhlIGZyYW1lcyBmZWF0dXJlLiBJZiB5b3Ugc2VlIHRoaXMgbWVzc2FnZSwgeW91IGFyZSB1c2luZyBhIG5vbi1mcmFtZS1jYXBhYmxlIHdlYiBjbGllbnQuCi08QlI+Ci1MaW5rIHRvPEEgSFJFRj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIj5Ob24tZnJhbWUgdmVyc2lvbi48L0E+Ci08L05PRlJBTUVTPgotPC9GUkFNRVNFVD4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL0lOYW1lZEV4dGVuc2lvbkluZm8uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL0lOYW1lZEV4dGVuc2lvbkluZm8uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ4MzI0ZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JTmFtZWRFeHRlbnNpb25JbmZvLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMzIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wXzIyKSBvbiBTYXQgQXByIDE3IDE4OjQ2OjM1IElTVCAyMDEwIC0tPgotPFRJVExFPgotSU5hbWVkRXh0ZW5zaW9uSW5mbwotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0ia2V5d29yZHMiIENPTlRFTlQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5JTmFtZWRFeHRlbnNpb25JbmZvIGludGVyZmFjZSI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iSU5hbWVkRXh0ZW5zaW9uSW5mbyI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9JTmFtZWRFeHRlbnNpb25JbmZvLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWIENMQVNTJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvSVByb3BlcnR5RGVmYXVsdHMuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvSU5hbWVkRXh0ZW5zaW9uSW5mby5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklOYW1lZEV4dGVuc2lvbkluZm8uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTwhLS0gPT09PT09PT0gU1RBUlQgT0YgQ0xBU1MgREFUQSA9PT09PT09PSAtLT4KLTxIMj4KLTxGT05UIFNJWkU9Ii0xIj4KLW9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZTwvRk9OVD4KLTxCUj4KLUludGVyZmFjZSBJTmFtZWRFeHRlbnNpb25JbmZvPC9IMj4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBpbnRlcmZhY2UgPEI+SU5hbWVkRXh0ZW5zaW9uSW5mbzwvQj48L0RMPgotPC9QUkU+Ci0KLTxQPgotSW50ZXJmYWNlIHJlcHJlc2VudGlnIGFuZCBleHRlbnRpb24uCi08UD4KLQotPFA+Ci08SFI+Ci0KLTxQPgotCi08IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JTmFtZWRFeHRlbnNpb25JbmZvLmh0bWwjZ2V0SWQoKSI+Z2V0SWQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgdW5pcXVlIElEIHRvIGlkZW50aWZ5IHRoaXMgY29uc3VtZXIgdHlwZSB3aGVuIGNhbGxpbmcgdGhlIDxjb2RlPlByb3h5R2VuZXJhdG9yRmFjdG9yeTwvY29kZT4sIGUuZy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvSU5hbWVkRXh0ZW5zaW9uSW5mby5odG1sI2dldE5hbWUoKSI+Z2V0TmFtZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0EgdmVyYm9zZSBuYW1lIGZvciB0aGUgdHlwZSBvZiBjb25zdW1lciwgZS5nLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iZ2V0SWQoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0SWQ8L0gzPgotPFBSRT4KLWphdmEubGFuZy5TdHJpbmcgPEI+Z2V0SWQ8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5UaGUgdW5pcXVlIElEIHRvIGlkZW50aWZ5IHRoaXMgY29uc3VtZXIgdHlwZSB3aGVuIGNhbGxpbmcgdGhlIDxjb2RlPlByb3h5R2VuZXJhdG9yRmFjdG9yeTwvY29kZT4sIGUuZy4gPGNvZGU+amVlL2pheHdzPC9jb2RlPgotPFA+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPm5vbi1lbXB0eSBzdHJpbmcgY29udGFpbmluZyB0aGUgSUQ8L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldE5hbWUoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0TmFtZTwvSDM+Ci08UFJFPgotamF2YS5sYW5nLlN0cmluZyA8Qj5nZXROYW1lPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+QSB2ZXJib3NlIG5hbWUgZm9yIHRoZSB0eXBlIG9mIGNvbnN1bWVyLCBlLmcuIDxjb2RlPkpBWC1XUzwvY29kZT4KLTxQPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5sb2NhbGl6ZWQgc3RyaW5nIHVzZWQgZm9yIHRoZSBVSTwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvSU5hbWVkRXh0ZW5zaW9uSW5mby5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViBDTEFTUyZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL0lQcm9wZXJ0eURlZmF1bHRzLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL0lOYW1lZEV4dGVuc2lvbkluZm8uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJTmFtZWRFeHRlbnNpb25JbmZvLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL0lQcm9wZXJ0eURlZmF1bHRzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JUHJvcGVydHlEZWZhdWx0cy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzlhYzI3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL0lQcm9wZXJ0eURlZmF1bHRzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wXzIyKSBvbiBTYXQgQXByIDE3IDE4OjQ2OjM1IElTVCAyMDEwIC0tPgotPFRJVExFPgotSVByb3BlcnR5RGVmYXVsdHMKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImtleXdvcmRzIiBDT05URU5UPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuSVByb3BlcnR5RGVmYXVsdHMgaW50ZXJmYWNlIj4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJJUHJvcGVydHlEZWZhdWx0cyI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9JUHJvcGVydHlEZWZhdWx0cy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL0lOYW1lZEV4dGVuc2lvbkluZm8uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL0lQcm9wZXJ0eVN0YXRlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL0lQcm9wZXJ0eURlZmF1bHRzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVByb3BlcnR5RGVmYXVsdHMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTwhLS0gPT09PT09PT0gU1RBUlQgT0YgQ0xBU1MgREFUQSA9PT09PT09PSAtLT4KLTxIMj4KLTxGT05UIFNJWkU9Ii0xIj4KLW9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZTwvRk9OVD4KLTxCUj4KLUludGVyZmFjZSBJUHJvcGVydHlEZWZhdWx0czwvSDI+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgaW50ZXJmYWNlIDxCPklQcm9wZXJ0eURlZmF1bHRzPC9CPjwvREw+Ci08L1BSRT4KLQotPFA+Ci1JbnRlcmZhY2UgdGhhdCBwcm92aWRlcyBkZWZhdWx0IHZhbHVlcyBmb3IgRE9NIG9iamVjdCdzIHByb3BlcnRpZXMuCi0gVXN1YWxseSB0aGlzIGludGVyZmFjZSBzaG91bGQgYmUgdXNlZCBieSBjbGllbnRzIHRoYXQgbmVlZCB0byByZXZlcnQgc29tZQotIHByb3BlcnR5IHZhbHVlIHRvIHRoZSBkZWZhdWx0IG9uZS4KLTxQPgotCi08UD4KLTxETD4KLTxEVD48Qj5BdXRob3I6PC9CPjwvRFQ+Ci0gIDxERD5HZW9yZ2kgVmFjaGtvdjwvREQ+Ci08L0RMPgotPEhSPgotCi08UD4KLQotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLk9iamVjdDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvSVByb3BlcnR5RGVmYXVsdHMuaHRtbCNnZXREZWZhdWx0KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUpIj5nZXREZWZhdWx0PC9BPjwvQj4ob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSZuYnNwO2ZlYXR1cmUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtEZWZpbmVzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIDxjb2RlPmZlYXR1cmU8L2NvZGU+LjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iZ2V0RGVmYXVsdChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0RGVmYXVsdDwvSDM+Ci08UFJFPgotamF2YS5sYW5nLk9iamVjdCA8Qj5nZXREZWZhdWx0PC9CPihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlJm5ic3A7ZmVhdHVyZSk8L1BSRT4KLTxETD4KLTxERD5EZWZpbmVzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIDxjb2RlPmZlYXR1cmU8L2NvZGU+LgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5mZWF0dXJlPC9DT0RFPiAtIHRoZSBmZWF0dXJlIHJlcHJlc2VudGluZyB0aGUgb2JqZWN0cyBwcm9wZXJ0eSB0eXBlCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBkZWZhdWx0IHZhbHVlLiBJbiBjYXNlIDxjb2RlPm51bGw8L2NvZGU+IGlzIHBvc3NpYmxlIHByb3BlcnR5IHZhbHVlCi0gPGNvZGU+bnVsbDwvY29kZT4gbWlnaHQgYmUgcmV0dXJuZWQ8L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0lQcm9wZXJ0eURlZmF1bHRzLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvSU5hbWVkRXh0ZW5zaW9uSW5mby5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvSVByb3BlcnR5U3RhdGUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvSVByb3BlcnR5RGVmYXVsdHMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJUHJvcGVydHlEZWZhdWx0cy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JUHJvcGVydHlTdGF0ZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvSVByb3BlcnR5U3RhdGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVhNzNkOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JUHJvcGVydHlTdGF0ZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMF8yMikgb24gU2F0IEFwciAxNyAxODo0NjozNSBJU1QgMjAxMCAtLT4KLTxUSVRMRT4KLUlQcm9wZXJ0eVN0YXRlCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJrZXl3b3JkcyIgQ09OVEVOVD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklQcm9wZXJ0eVN0YXRlIGludGVyZmFjZSI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iSVByb3BlcnR5U3RhdGUiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvSVByb3BlcnR5U3RhdGUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JUHJvcGVydHlEZWZhdWx0cy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDtORVhUIENMQVNTPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JUHJvcGVydHlTdGF0ZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklQcm9wZXJ0eVN0YXRlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08IS0tID09PT09PT09IFNUQVJUIE9GIENMQVNTIERBVEEgPT09PT09PT0gLS0+Ci08SDI+Ci08Rk9OVCBTSVpFPSItMSI+Ci1vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWU8L0ZPTlQ+Ci08QlI+Ci1JbnRlcmZhY2UgSVByb3BlcnR5U3RhdGU8L0gyPgotPEhSPgotPERMPgotPERUPjxQUkU+cHVibGljIGludGVyZmFjZSA8Qj5JUHJvcGVydHlTdGF0ZTwvQj48L0RMPgotPC9QUkU+Ci0KLTxQPgotSW50ZXJmYWNlIGZvciBjaGVja2luZyB0aGUgc3RhdGUgb2Ygc29tZSBwcm9wZXJ0eSBmb3IgY29uY3JldGUgRE9NIG9iamVjdC4KLSBUaGlzIGludGVyZmFjZSBzaG91bGQgYmUgdXNlZCBieSBET00gY2xpZW50cyB0aGF0IG5lZWQgdG8ga25vdyBpZiBzb21lIHByb3BlcnR5IAotIGNhbiBiZSBjaGFuZ2VkIC0gZm9yIGV4YW1wbGUgVUkgZWRpdG9yIHRoYXQgbmVlZHMgdG8ga25vdyBpZiB0aGUgcHJvcGVydHkgc2hvdWxkCi0gYmUgZW5hYmxlZCBmb3IgZWRpdCBvciBkaXNhYmxlZC4KLTxQPgotCi08UD4KLTxETD4KLTxEVD48Qj5BdXRob3I6PC9CPjwvRFQ+Ci0gIDxERD5HZW9yZ2kgVmFjaGtvdjwvREQ+Ci08L0RMPgotPEhSPgotCi08UD4KLQotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvSVByb3BlcnR5U3RhdGUuaHRtbCNpc0NoYW5nZWFibGUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSkiPmlzQ2hhbmdlYWJsZTwvQT48L0I+KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUmbmJzcDtmZWF0dXJlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7RGVmaW5lcyBpZiBwcm9wZXJ0eSBpcyBjaGFuZ2VhYmxlLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iaXNDaGFuZ2VhYmxlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUpIj48IS0tIC0tPjwvQT48SDM+Ci1pc0NoYW5nZWFibGU8L0gzPgotPFBSRT4KLWJvb2xlYW4gPEI+aXNDaGFuZ2VhYmxlPC9CPihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlJm5ic3A7ZmVhdHVyZSk8L1BSRT4KLTxETD4KLTxERD5EZWZpbmVzIGlmIHByb3BlcnR5IGlzIGNoYW5nZWFibGUuCi08UD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+PGNvZGU+dHJ1ZTwvY29kZT4gaW4gY2FzZSBwcm9wZXJ0eSBjYW4gYmUgY2hhbmdlZDwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvSVByb3BlcnR5U3RhdGUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JUHJvcGVydHlEZWZhdWx0cy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDtORVhUIENMQVNTPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JUHJvcGVydHlTdGF0ZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklQcm9wZXJ0eVN0YXRlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21GYWN0b3J5Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tRmFjdG9yeS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmQ5YTJkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21GYWN0b3J5Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjU4OjExIEJTVCAyMDEwIC0tPgotPFRJVExFPgotRG9tRmFjdG9yeQotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMC0wNC0wNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IkRvbUZhY3RvcnkiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0RvbUZhY3RvcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYgQ0xBU1MmbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbUZhY3RvcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJEb21GYWN0b3J5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNmaWVsZF9zdW1tYXJ5Ij5GSUVMRDwvQT4mbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDs8QSBIUkVGPSIjZmllbGRfZGV0YWlsIj5GSUVMRDwvQT4mbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08IS0tID09PT09PT09IFNUQVJUIE9GIENMQVNTIERBVEEgPT09PT09PT0gLS0+Ci08SDI+Ci08Rk9OVCBTSVpFPSItMSI+Ci1vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpPC9GT05UPgotPEJSPgotSW50ZXJmYWNlIERvbUZhY3Rvcnk8L0gyPgotPERMPgotPERUPjxCPkFsbCBTdXBlcmludGVyZmFjZXM6PC9CPiA8REQ+b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5LCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudCwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyPC9ERD4KLTwvREw+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgaW50ZXJmYWNlIDxCPkRvbUZhY3Rvcnk8L0I+PERUPmV4dGVuZHMgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5PC9ETD4KLTwvUFJFPgotCi08UD4KLTwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLQotPFA+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT5Eb21QYWNrYWdlPC9DT0RFPjwvQT48L0RMPgotPEhSPgotCi08UD4KLTwhLS0gPT09PT09PT09PT0gRklFTEQgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0iZmllbGRfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkZpZWxkIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbUZhY3RvcnkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21GYWN0b3J5PC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbUZhY3RvcnkuaHRtbCNlSU5TVEFOQ0UiPmVJTlNUQU5DRTwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JRE9NLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SURPTTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21GYWN0b3J5Lmh0bWwjY3JlYXRlSURPTSgpIj5jcmVhdGVJRE9NPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JRE9NPC9lbT4nLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JSmF2YVdlYlNlcnZpY2VFbGVtZW50PC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbUZhY3RvcnkuaHRtbCNjcmVhdGVJSmF2YVdlYlNlcnZpY2VFbGVtZW50KCkiPmNyZWF0ZUlKYXZhV2ViU2VydmljZUVsZW1lbnQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklKYXZhIFdlYiBTZXJ2aWNlIEVsZW1lbnQ8L2VtPicuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tRmFjdG9yeS5odG1sI2NyZWF0ZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSI+Y3JlYXRlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SVNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT4nLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViTWV0aG9kPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbUZhY3RvcnkuaHRtbCNjcmVhdGVJV2ViTWV0aG9kKCkiPmNyZWF0ZUlXZWJNZXRob2Q8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklXZWIgTWV0aG9kPC9lbT4nLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJQYXJhbTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21GYWN0b3J5Lmh0bWwjY3JlYXRlSVdlYlBhcmFtKCkiPmNyZWF0ZUlXZWJQYXJhbTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SVdlYiBQYXJhbTwvZW0+Jy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJTZXJ2aWNlPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbUZhY3RvcnkuaHRtbCNjcmVhdGVJV2ViU2VydmljZSgpIj5jcmVhdGVJV2ViU2VydmljZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SVdlYiBTZXJ2aWNlPC9lbT4nLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlUHJvamVjdC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJTZXJ2aWNlUHJvamVjdDwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21GYWN0b3J5Lmh0bWwjY3JlYXRlSVdlYlNlcnZpY2VQcm9qZWN0KCkiPmNyZWF0ZUlXZWJTZXJ2aWNlUHJvamVjdDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SVdlYiBTZXJ2aWNlIFByb2plY3Q8L2VtPicuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlR5cGUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViVHlwZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21GYWN0b3J5Lmh0bWwjY3JlYXRlSVdlYlR5cGUoKSI+Y3JlYXRlSVdlYlR5cGU8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklXZWIgVHlwZTwvZW0+Jy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21GYWN0b3J5Lmh0bWwjZ2V0RG9tUGFja2FnZSgpIj5nZXREb21QYWNrYWdlPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3Nfb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+Y29udmVydFRvU3RyaW5nLCBjcmVhdGUsIGNyZWF0ZUZyb21TdHJpbmcsIGdldEVQYWNrYWdlLCBzZXRFUGFja2FnZTwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDs8QSBOQU1FPSJtZXRob2RzX2luaGVyaXRlZF9mcm9tX2NsYXNzX29yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ8L0I+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT5nZXRFQW5ub3RhdGlvbiwgZ2V0RUFubm90YXRpb25zPC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3Nfb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGludGVyZmFjZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmVBbGxDb250ZW50cywgZUNsYXNzLCBlQ29udGFpbmVyLCBlQ29udGFpbmluZ0ZlYXR1cmUsIGVDb250YWlubWVudEZlYXR1cmUsIGVDb250ZW50cywgZUNyb3NzUmVmZXJlbmNlcywgZUdldCwgZUdldCwgZUlzUHJveHksIGVJc1NldCwgZVJlc291cmNlLCBlU2V0LCBlVW5zZXQ8L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19vcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllciI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyPC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+ZUFkYXB0ZXJzLCBlRGVsaXZlciwgZU5vdGlmeSwgZVNldERlbGl2ZXI8L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT09PT0gRklFTEQgREVUQUlMID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJmaWVsZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5GaWVsZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iZUlOU1RBTkNFIj48IS0tIC0tPjwvQT48SDM+Ci1lSU5TVEFOQ0U8L0gzPgotPFBSRT4KLXN0YXRpYyBmaW5hbCA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbUZhY3RvcnkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21GYWN0b3J5PC9BPiA8Qj5lSU5TVEFOQ0U8L0I+PC9QUkU+Ci08REw+Ci08REQ+VGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REw+Ci08L0RMPgotPC9ETD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJjcmVhdGVJRE9NKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWNyZWF0ZUlET008L0gzPgotPFBSRT4KLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSURPTS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklET008L0E+IDxCPmNyZWF0ZUlET008L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklET008L2VtPicuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5hIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JRE9NPC9lbT4nLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iY3JlYXRlSUphdmFXZWJTZXJ2aWNlRWxlbWVudCgpIj48IS0tIC0tPjwvQT48SDM+Ci1jcmVhdGVJSmF2YVdlYlNlcnZpY2VFbGVtZW50PC9IMz4KLTxQUkU+Ci08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JSmF2YVdlYlNlcnZpY2VFbGVtZW50PC9BPiA8Qj5jcmVhdGVJSmF2YVdlYlNlcnZpY2VFbGVtZW50PC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JSmF2YSBXZWIgU2VydmljZSBFbGVtZW50PC9lbT4nLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+YSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SUphdmEgV2ViIFNlcnZpY2UgRWxlbWVudDwvZW0+Jy48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImNyZWF0ZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSI+PCEtLSAtLT48L0E+PEgzPgotY3JlYXRlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvSDM+Ci08UFJFPgotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvQT4gPEI+Y3JlYXRlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvQj4oKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SVNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT4nLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+YSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SVNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT4nLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iY3JlYXRlSVdlYk1ldGhvZCgpIj48IS0tIC0tPjwvQT48SDM+Ci1jcmVhdGVJV2ViTWV0aG9kPC9IMz4KLTxQUkU+Ci08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViTWV0aG9kPC9BPiA8Qj5jcmVhdGVJV2ViTWV0aG9kPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JV2ViIE1ldGhvZDwvZW0+Jy4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPmEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklXZWIgTWV0aG9kPC9lbT4nLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iY3JlYXRlSVdlYlBhcmFtKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWNyZWF0ZUlXZWJQYXJhbTwvSDM+Ci08UFJFPgotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViUGFyYW08L0E+IDxCPmNyZWF0ZUlXZWJQYXJhbTwvQj4oKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SVdlYiBQYXJhbTwvZW0+Jy4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPmEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklXZWIgUGFyYW08L2VtPicuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJjcmVhdGVJV2ViU2VydmljZSgpIj48IS0tIC0tPjwvQT48SDM+Ci1jcmVhdGVJV2ViU2VydmljZTwvSDM+Ci08UFJFPgotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJTZXJ2aWNlPC9BPiA8Qj5jcmVhdGVJV2ViU2VydmljZTwvQj4oKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SVdlYiBTZXJ2aWNlPC9lbT4nLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+YSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SVdlYiBTZXJ2aWNlPC9lbT4nLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iY3JlYXRlSVdlYlNlcnZpY2VQcm9qZWN0KCkiPjwhLS0gLS0+PC9BPjxIMz4KLWNyZWF0ZUlXZWJTZXJ2aWNlUHJvamVjdDwvSDM+Ci08UFJFPgotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZVByb2plY3QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViU2VydmljZVByb2plY3Q8L0E+IDxCPmNyZWF0ZUlXZWJTZXJ2aWNlUHJvamVjdDwvQj4oKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SVdlYiBTZXJ2aWNlIFByb2plY3Q8L2VtPicuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5hIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JV2ViIFNlcnZpY2UgUHJvamVjdDwvZW0+Jy48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImNyZWF0ZUlXZWJUeXBlKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWNyZWF0ZUlXZWJUeXBlPC9IMz4KLTxQUkU+Ci08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJUeXBlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlR5cGU8L0E+IDxCPmNyZWF0ZUlXZWJUeXBlPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JV2ViIFR5cGU8L2VtPicuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5hIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JV2ViIFR5cGU8L2VtPicuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXREb21QYWNrYWdlKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldERvbVBhY2thZ2U8L0gzPgotPFBSRT4KLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+IDxCPmdldERvbVBhY2thZ2U8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LjwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvRG9tRmFjdG9yeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViBDTEFTUyZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tRmFjdG9yeS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IkRvbUZhY3RvcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2ZpZWxkX3N1bW1hcnkiPkZJRUxEPC9BPiZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwOzxBIEhSRUY9IiNmaWVsZF9kZXRhaWwiPkZJRUxEPC9BPiZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNTMxMzIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNzEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjU4OjEyIEJTVCAyMDEwIC0tPgotPFRJVExFPgotRG9tUGFja2FnZS5MaXRlcmFscwotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMC0wNC0wNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IkRvbVBhY2thZ2UuTGl0ZXJhbHMiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JRE9NLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IkRvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2ZpZWxkX3N1bW1hcnkiPkZJRUxEPC9BPiZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7TUVUSE9EPC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwOzxBIEhSRUY9IiNmaWVsZF9kZXRhaWwiPkZJRUxEPC9BPiZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7TUVUSE9EPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08IS0tID09PT09PT09IFNUQVJUIE9GIENMQVNTIERBVEEgPT09PT09PT0gLS0+Ci08SDI+Ci08Rk9OVCBTSVpFPSItMSI+Ci1vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpPC9GT05UPgotPEJSPgotSW50ZXJmYWNlIERvbVBhY2thZ2UuTGl0ZXJhbHM8L0gyPgotPERMPgotPERUPjxCPkVuY2xvc2luZyBpbnRlcmZhY2U6PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlPC9BPjwvREQ+Ci08L0RMPgotPEhSPgotPERMPgotPERUPjxQUkU+cHVibGljIHN0YXRpYyBpbnRlcmZhY2UgPEI+RG9tUGFja2FnZS5MaXRlcmFsczwvQj48L0RMPgotPC9QUkU+Ci0KLTxQPgotPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50Ci0gPHVsPgotICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICAgPGxpPmVhY2ggZW51bSw8L2xpPgotICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gPC91bD4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotCi08UD4KLTxIUj4KLQotPFA+Ci08IS0tID09PT09PT09PT09IEZJRUxEIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImZpZWxkX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5GaWVsZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCNJRE9NIj5JRE9NPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxDT0RFPjxlbT5JRE9NPC9lbT48L0NPREU+JyBjbGFzcy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwjSURPTV9fV0VCX1NFUlZJQ0VfUFJPSkVDVFMiPklET01fX1dFQl9TRVJWSUNFX1BST0pFQ1RTPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5XZWIgU2VydmljZSBQcm9qZWN0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCNJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UIj5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxDT0RFPjxlbT5JSmF2YSBXZWIgU2VydmljZSBFbGVtZW50PC9lbT48L0NPREU+JyBjbGFzcy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwjSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT04iPklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbXBsZW1lbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO29yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sI0lKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUiPklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUU8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sI0lTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRSI+SVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxDT0RFPjxlbT5JU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPjwvQ09ERT4nIGNsYXNzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCNJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExFTUVOVElOR19XRUJfU0VSVklDRVMiPklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5USU5HX1dFQl9TRVJWSUNFUzwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW1wbGVtZW50aW5nIFdlYiBTZXJ2aWNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwjSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVCI+SVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVDwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW1wbGljaXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCNJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEUiPklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRTwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO29yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sI0lTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1NUWUxFIj5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19TVFlMRTwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFN0eWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwjSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfVVNFIj5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19VU0U8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBVc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCNJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1RBUkdFVF9OQU1FU1BBQ0UiPklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fVEFSR0VUX05BTUVTUEFDRTwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IE5hbWVzcGFjZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO29yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sI0lTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fV0VCX01FVEhPRFMiPklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fV0VCX01FVEhPRFM8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldlYiBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sI0lXRUJfTUVUSE9EIj5JV0VCX01FVEhPRDwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8Q09ERT48ZW0+SVdlYiBNZXRob2Q8L2VtPjwvQ09ERT4nIGNsYXNzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCNJV0VCX01FVEhPRF9fRVhDTFVERUQiPklXRUJfTUVUSE9EX19FWENMVURFRDwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCNJV0VCX01FVEhPRF9fUEFSQU1FVEVSUyI+SVdFQl9NRVRIT0RfX1BBUkFNRVRFUlM8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBhcmFtZXRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO29yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sI0lXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFIj5JV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRTwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO29yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sI0lXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfU1RZTEUiPklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfU1RZTEU8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO29yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sI0lXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfVVNFIj5JV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1VTRTwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFVzZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO29yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwjSVdFQl9QQVJBTSI+SVdFQl9QQVJBTTwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8Q09ERT48ZW0+SVdlYiBQYXJhbTwvZW0+PC9DT0RFPicgY2xhc3MuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO29yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sI0lXRUJfUEFSQU1fX0hFQURFUiI+SVdFQl9QQVJBTV9fSEVBREVSPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5IZWFkZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCNJV0VCX1BBUkFNX19LSU5EIj5JV0VCX1BBUkFNX19LSU5EPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwjSVdFQl9QQVJBTV9fUEFSVF9OQU1FIj5JV0VCX1BBUkFNX19QQVJUX05BTUU8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBhcnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO29yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sI0lXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0UiPklXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0U8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBOYW1lc3BhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCNJV0VCX1BBUkFNX19UWVBFX05BTUUiPklXRUJfUEFSQU1fX1RZUEVfTkFNRTwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCNJV0VCX1NFUlZJQ0UiPklXRUJfU0VSVklDRTwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8Q09ERT48ZW0+SVdlYiBTZXJ2aWNlPC9lbT48L0NPREU+JyBjbGFzcy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwjSVdFQl9TRVJWSUNFX19QT1JUX05BTUUiPklXRUJfU0VSVklDRV9fUE9SVF9OQU1FPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3J0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCNJV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQiPklXRUJfU0VSVklDRV9fU0VSVklDRV9FTkRQT0lOVDwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO29yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sI0lXRUJfU0VSVklDRV9fVEFSR0VUX05BTUVTUEFDRSI+SVdFQl9TRVJWSUNFX19UQVJHRVRfTkFNRVNQQUNFPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgTmFtZXNwYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwjSVdFQl9TRVJWSUNFX19XU0RMX0xPQ0FUSU9OIj5JV0VCX1NFUlZJQ0VfX1dTRExfTE9DQVRJT048L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldzZGwgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sI0lXRUJfU0VSVklDRV9QUk9KRUNUIj5JV0VCX1NFUlZJQ0VfUFJPSkVDVDwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8Q09ERT48ZW0+SVdlYiBTZXJ2aWNlIFByb2plY3Q8L2VtPjwvQ09ERT4nIGNsYXNzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCNJV0VCX1NFUlZJQ0VfUFJPSkVDVF9fTkFNRSI+SVdFQl9TRVJWSUNFX1BST0pFQ1RfX05BTUU8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCNJV0VCX1NFUlZJQ0VfUFJPSkVDVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VTIj5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VTPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO29yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sI0lXRUJfU0VSVklDRV9QUk9KRUNUX19XRUJfU0VSVklDRVMiPklXRUJfU0VSVklDRV9QUk9KRUNUX19XRUJfU0VSVklDRVM8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldlYiBTZXJ2aWNlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCNJV0VCX1RZUEUiPklXRUJfVFlQRTwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8Q09ERT48ZW0+SVdlYiBUeXBlPC9lbT48L0NPREU+JyBjbGFzcy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sI1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEUiPlNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEU8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxDT0RFPjxlbT5TT0FQIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT48L0NPREU+PC9BPicgZW51bS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sI1NPQVBfQklORElOR19TVFlMRSI+U09BUF9CSU5ESU5HX1NUWUxFPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT48ZW0+U09BUCBCaW5kaW5nIFN0eWxlPC9lbT48L0NPREU+PC9BPicgZW51bS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sI1NPQVBfQklORElOR19VU0UiPlNPQVBfQklORElOR19VU0U8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT48ZW0+U09BUCBCaW5kaW5nIFVzZTwvZW0+PC9DT0RFPjwvQT4nIGVudW0uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO29yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCNXRUJfUEFSQU1fS0lORCI+V0VCX1BBUkFNX0tJTkQ8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PENPREU+PGVtPldlYiBQYXJhbSBLaW5kPC9lbT48L0NPREU+PC9BPicgZW51bS48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PT09PSBGSUVMRCBERVRBSUwgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImZpZWxkX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPkZpZWxkIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJJRE9NIj48IS0tIC0tPjwvQT48SDM+Ci1JRE9NPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzcyA8Qj5JRE9NPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxDT0RFPjxlbT5JRE9NPC9lbT48L0NPREU+JyBjbGFzcy4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48Q09ERT5JRE9NSW1wbDwvQ09ERT4sIAotPENPREU+RG9tUGFja2FnZUltcGwuZ2V0SURPTSgpPC9DT0RFPjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJJRE9NX19XRUJfU0VSVklDRV9QUk9KRUNUUyI+PCEtLSAtLT48L0E+PEgzPgotSURPTV9fV0VCX1NFUlZJQ0VfUFJPSkVDVFM8L0gzPgotPFBSRT4KLXN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZSA8Qj5JRE9NX19XRUJfU0VSVklDRV9QUk9KRUNUUzwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V2ViIFNlcnZpY2UgUHJvamVjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPERMPgotPC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlQiPjwhLS0gLS0+PC9BPjxIMz4KLUlKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlQ8L0gzPgotPFBSRT4KLXN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzIDxCPklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlQ8L0I+PC9QUkU+Ci08REw+Ci08REQ+VGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPENPREU+PGVtPklKYXZhIFdlYiBTZXJ2aWNlIEVsZW1lbnQ8L2VtPjwvQ09ERT4nIGNsYXNzLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxDT0RFPklKYXZhV2ViU2VydmljZUVsZW1lbnRJbXBsPC9DT0RFPiwgCi08Q09ERT5Eb21QYWNrYWdlSW1wbC5nZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50KCk8L0NPREU+PC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OIj48IS0tIC0tPjwvQT48SDM+Ci1JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTjwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlIDxCPklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbXBsZW1lbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPERMPgotPC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUiPjwhLS0gLS0+PC9BPjxIMz4KLUlKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUU8L0gzPgotPFBSRT4KLXN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZSA8Qj5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REw+Ci08L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFIj48IS0tIC0tPjwvQT48SDM+Ci1JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0U8L0gzPgotPFBSRT4KLXN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzIDxCPklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRTwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8Q09ERT48ZW0+SVNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT48L0NPREU+JyBjbGFzcy4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48Q09ERT5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSW1wbDwvQ09ERT4sIAotPENPREU+RG9tUGFja2FnZUltcGwuZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpPC9DT0RFPjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExJQ0lUIj48IS0tIC0tPjwvQT48SDM+Ci1JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExJQ0lUPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGUgPEI+SVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVDwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW1wbGljaXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExFTUVOVElOR19XRUJfU0VSVklDRVMiPjwhLS0gLS0+PC9BPjxIMz4KLUlTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5USU5HX1dFQl9TRVJWSUNFUzwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlIDxCPklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5USU5HX1dFQl9TRVJWSUNFUzwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW1wbGVtZW50aW5nIFdlYiBTZXJ2aWNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REw+Ci08L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19XRUJfTUVUSE9EUyI+PCEtLSAtLT48L0E+PEgzPgotSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19XRUJfTUVUSE9EUzwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlIDxCPklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fV0VCX01FVEhPRFM8L0I+PC9QUkU+Ci08REw+Ci08REQ+VGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldlYiBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1RBUkdFVF9OQU1FU1BBQ0UiPjwhLS0gLS0+PC9BPjxIMz4KLUlTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fVEFSR0VUX05BTUVTUEFDRTwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlIDxCPklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fVEFSR0VUX05BTUVTUEFDRTwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IE5hbWVzcGFjZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPERMPgotPC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1NUWUxFIj48IS0tIC0tPjwvQT48SDM+Ci1JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19TVFlMRTwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlIDxCPklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1NUWUxFPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgU3R5bGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19VU0UiPjwhLS0gLS0+PC9BPjxIMz4KLUlTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1VTRTwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlIDxCPklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1VTRTwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFVzZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPERMPgotPC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRSI+PCEtLSAtLT48L0E+PEgzPgotSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGUgPEI+SVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REw+Ci08L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iSVdFQl9NRVRIT0QiPjwhLS0gLS0+PC9BPjxIMz4KLUlXRUJfTUVUSE9EPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzcyA8Qj5JV0VCX01FVEhPRDwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8Q09ERT48ZW0+SVdlYiBNZXRob2Q8L2VtPjwvQ09ERT4nIGNsYXNzLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxDT0RFPklXZWJNZXRob2RJbXBsPC9DT0RFPiwgCi08Q09ERT5Eb21QYWNrYWdlSW1wbC5nZXRJV2ViTWV0aG9kKCk8L0NPREU+PC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IklXRUJfTUVUSE9EX19QQVJBTUVURVJTIj48IS0tIC0tPjwvQT48SDM+Ci1JV0VCX01FVEhPRF9fUEFSQU1FVEVSUzwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlIDxCPklXRUJfTUVUSE9EX19QQVJBTUVURVJTPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QYXJhbWV0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJJV0VCX01FVEhPRF9fRVhDTFVERUQiPjwhLS0gLS0+PC9BPjxIMz4KLUlXRUJfTUVUSE9EX19FWENMVURFRDwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlIDxCPklXRUJfTUVUSE9EX19FWENMVURFRDwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJJV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1NUWUxFIj48IS0tIC0tPjwvQT48SDM+Ci1JV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1NUWUxFPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGUgPEI+SVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19TVFlMRTwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFN0eWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REw+Ci08L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19VU0UiPjwhLS0gLS0+PC9BPjxIMz4KLUlXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfVVNFPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGUgPEI+SVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19VU0U8L0I+PC9QUkU+Ci08REw+Ci08REQ+VGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBVc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJJV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRSI+PCEtLSAtLT48L0E+PEgzPgotSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEU8L0gzPgotPFBSRT4KLXN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZSA8Qj5JV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRTwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPERMPgotPC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IklXRUJfUEFSQU0iPjwhLS0gLS0+PC9BPjxIMz4KLUlXRUJfUEFSQU08L0gzPgotPFBSRT4KLXN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzIDxCPklXRUJfUEFSQU08L0I+PC9QUkU+Ci08REw+Ci08REQ+VGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPENPREU+PGVtPklXZWIgUGFyYW08L2VtPjwvQ09ERT4nIGNsYXNzLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxDT0RFPklXZWJQYXJhbUltcGw8L0NPREU+LCAKLTxDT0RFPkRvbVBhY2thZ2VJbXBsLmdldElXZWJQYXJhbSgpPC9DT0RFPjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJJV0VCX1BBUkFNX19LSU5EIj48IS0tIC0tPjwvQT48SDM+Ci1JV0VCX1BBUkFNX19LSU5EPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGUgPEI+SVdFQl9QQVJBTV9fS0lORDwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPERMPgotPC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IklXRUJfUEFSQU1fX1RZUEVfTkFNRSI+PCEtLSAtLT48L0E+PEgzPgotSVdFQl9QQVJBTV9fVFlQRV9OQU1FPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGUgPEI+SVdFQl9QQVJBTV9fVFlQRV9OQU1FPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJJV0VCX1BBUkFNX19QQVJUX05BTUUiPjwhLS0gLS0+PC9BPjxIMz4KLUlXRUJfUEFSQU1fX1BBUlRfTkFNRTwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlIDxCPklXRUJfUEFSQU1fX1BBUlRfTkFNRTwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFydCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REw+Ci08L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRSI+PCEtLSAtLT48L0E+PEgzPgotSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRTwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlIDxCPklXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0U8L0I+PC9QUkU+Ci08REw+Ci08REQ+VGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBOYW1lc3BhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJJV0VCX1BBUkFNX19IRUFERVIiPjwhLS0gLS0+PC9BPjxIMz4KLUlXRUJfUEFSQU1fX0hFQURFUjwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlIDxCPklXRUJfUEFSQU1fX0hFQURFUjwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGVhZGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REw+Ci08L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iSVdFQl9TRVJWSUNFIj48IS0tIC0tPjwvQT48SDM+Ci1JV0VCX1NFUlZJQ0U8L0gzPgotPFBSRT4KLXN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzIDxCPklXRUJfU0VSVklDRTwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8Q09ERT48ZW0+SVdlYiBTZXJ2aWNlPC9lbT48L0NPREU+JyBjbGFzcy4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48Q09ERT5JV2ViU2VydmljZUltcGw8L0NPREU+LCAKLTxDT0RFPkRvbVBhY2thZ2VJbXBsLmdldElXZWJTZXJ2aWNlKCk8L0NPREU+PC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IklXRUJfU0VSVklDRV9fU0VSVklDRV9FTkRQT0lOVCI+PCEtLSAtLT48L0E+PEgzPgotSVdFQl9TRVJWSUNFX19TRVJWSUNFX0VORFBPSU5UPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2UgPEI+SVdFQl9TRVJWSUNFX19TRVJWSUNFX0VORFBPSU5UPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIEVuZHBvaW50PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REw+Ci08L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iSVdFQl9TRVJWSUNFX19UQVJHRVRfTkFNRVNQQUNFIj48IS0tIC0tPjwvQT48SDM+Ci1JV0VCX1NFUlZJQ0VfX1RBUkdFVF9OQU1FU1BBQ0U8L0gzPgotPFBSRT4KLXN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZSA8Qj5JV0VCX1NFUlZJQ0VfX1RBUkdFVF9OQU1FU1BBQ0U8L0I+PC9QUkU+Ci08REw+Ci08REQ+VGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBOYW1lc3BhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJJV0VCX1NFUlZJQ0VfX1BPUlRfTkFNRSI+PCEtLSAtLT48L0E+PEgzPgotSVdFQl9TRVJWSUNFX19QT1JUX05BTUU8L0gzPgotPFBSRT4KLXN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZSA8Qj5JV0VCX1NFUlZJQ0VfX1BPUlRfTkFNRTwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9ydCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REw+Ci08L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iSVdFQl9TRVJWSUNFX19XU0RMX0xPQ0FUSU9OIj48IS0tIC0tPjwvQT48SDM+Ci1JV0VCX1NFUlZJQ0VfX1dTRExfTE9DQVRJT048L0gzPgotPFBSRT4KLXN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZSA8Qj5JV0VCX1NFUlZJQ0VfX1dTRExfTE9DQVRJT048L0I+PC9QUkU+Ci08REw+Ci08REQ+VGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldzZGwgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJJV0VCX1NFUlZJQ0VfUFJPSkVDVCI+PCEtLSAtLT48L0E+PEgzPgotSVdFQl9TRVJWSUNFX1BST0pFQ1Q8L0gzPgotPFBSRT4KLXN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzIDxCPklXRUJfU0VSVklDRV9QUk9KRUNUPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxDT0RFPjxlbT5JV2ViIFNlcnZpY2UgUHJvamVjdDwvZW0+PC9DT0RFPicgY2xhc3MuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PENPREU+SVdlYlNlcnZpY2VQcm9qZWN0SW1wbDwvQ09ERT4sIAotPENPREU+RG9tUGFja2FnZUltcGwuZ2V0SVdlYlNlcnZpY2VQcm9qZWN0KCk8L0NPREU+PC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IklXRUJfU0VSVklDRV9QUk9KRUNUX19XRUJfU0VSVklDRVMiPjwhLS0gLS0+PC9BPjxIMz4KLUlXRUJfU0VSVklDRV9QUk9KRUNUX19XRUJfU0VSVklDRVM8L0gzPgotPFBSRT4KLXN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZSA8Qj5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fV0VCX1NFUlZJQ0VTPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5XZWIgU2VydmljZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPERMPgotPC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IklXRUJfU0VSVklDRV9QUk9KRUNUX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRVMiPjwhLS0gLS0+PC9BPjxIMz4KLUlXRUJfU0VSVklDRV9QUk9KRUNUX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRVM8L0gzPgotPFBSRT4KLXN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZSA8Qj5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VTPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPERMPgotPC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IklXRUJfU0VSVklDRV9QUk9KRUNUX19OQU1FIj48IS0tIC0tPjwvQT48SDM+Ci1JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fTkFNRTwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlIDxCPklXRUJfU0VSVklDRV9QUk9KRUNUX19OQU1FPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REw+Ci08L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iSVdFQl9UWVBFIj48IS0tIC0tPjwvQT48SDM+Ci1JV0VCX1RZUEU8L0gzPgotPFBSRT4KLXN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzIDxCPklXRUJfVFlQRTwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8Q09ERT48ZW0+SVdlYiBUeXBlPC9lbT48L0NPREU+JyBjbGFzcy4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48Q09ERT5JV2ViVHlwZUltcGw8L0NPREU+LCAKLTxDT0RFPkRvbVBhY2thZ2VJbXBsLmdldElXZWJUeXBlKCk8L0NPREU+PC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IldFQl9QQVJBTV9LSU5EIj48IS0tIC0tPjwvQT48SDM+Ci1XRUJfUEFSQU1fS0lORDwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bSA8Qj5XRUJfUEFSQU1fS0lORDwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT48ZW0+V2ViIFBhcmFtIEtpbmQ8L2VtPjwvQ09ERT48L0E+JyBlbnVtLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxDT0RFPldlYlBhcmFtS2luZDwvQ09ERT48L0E+LCAKLTxDT0RFPkRvbVBhY2thZ2VJbXBsLmdldFdlYlBhcmFtS2luZCgpPC9DT0RFPjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJTT0FQX0JJTkRJTkdfU1RZTEUiPjwhLS0gLS0+PC9BPjxIMz4KLVNPQVBfQklORElOR19TVFlMRTwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bSA8Qj5TT0FQX0JJTkRJTkdfU1RZTEU8L0I+PC9QUkU+Ci08REw+Ci08REQ+VGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxDT0RFPjxlbT5TT0FQIEJpbmRpbmcgU3R5bGU8L2VtPjwvQ09ERT48L0E+JyBlbnVtLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT5TT0FQQmluZGluZ1N0eWxlPC9DT0RFPjwvQT4sIAotPENPREU+RG9tUGFja2FnZUltcGwuZ2V0U09BUEJpbmRpbmdTdHlsZSgpPC9DT0RFPjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJTT0FQX0JJTkRJTkdfVVNFIj48IS0tIC0tPjwvQT48SDM+Ci1TT0FQX0JJTkRJTkdfVVNFPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtIDxCPlNPQVBfQklORElOR19VU0U8L0I+PC9QUkU+Ci08REw+Ci08REQ+VGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT48ZW0+U09BUCBCaW5kaW5nIFVzZTwvZW0+PC9DT0RFPjwvQT4nIGVudW0uCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT5TT0FQQmluZGluZ1VzZTwvQ09ERT48L0E+LCAKLTxDT0RFPkRvbVBhY2thZ2VJbXBsLmdldFNPQVBCaW5kaW5nVXNlKCk8L0NPREU+PC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IlNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEUiPjwhLS0gLS0+PC9BPjxIMz4KLVNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEU8L0gzPgotPFBSRT4KLXN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW0gPEI+U09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRTwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PENPREU+PGVtPlNPQVAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPjwvQ09ERT48L0E+JyBlbnVtLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlPC9DT0RFPjwvQT4sIAotPENPREU+RG9tUGFja2FnZUltcGwuZ2V0U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpPC9DT0RFPjwvREw+Ci08L0RMPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIENMQVNTIERBVEEgPT09PT09PT09IC0tPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSURPTS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJEb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNmaWVsZF9zdW1tYXJ5Ij5GSUVMRDwvQT4mbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwO01FVEhPRDwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDs8QSBIUkVGPSIjZmllbGRfZGV0YWlsIj5GSUVMRDwvQT4mbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwO01FVEhPRDwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJjZWFiYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjc3NSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMTQpIG9uIFdlZCBBcHIgMDcgMDc6NTg6MTEgQlNUIDIwMTAgLS0+Ci08VElUTEU+Ci1Eb21QYWNrYWdlCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDEwLTA0LTA3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iRG9tUGFja2FnZSI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvRG9tUGFja2FnZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21GYWN0b3J5Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iRG9tUGFja2FnZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwOzxBIEhSRUY9IiNuZXN0ZWRfY2xhc3Nfc3VtbWFyeSI+TkVTVEVEPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjZmllbGRfc3VtbWFyeSI+RklFTEQ8L0E+Jm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7PEEgSFJFRj0iI2ZpZWxkX2RldGFpbCI+RklFTEQ8L0E+Jm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvRk9OVD4KLTxCUj4KLUludGVyZmFjZSBEb21QYWNrYWdlPC9IMj4KLTxETD4KLTxEVD48Qj5BbGwgU3VwZXJpbnRlcmZhY2VzOjwvQj4gPEREPm9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50LCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudCwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZSwgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI8L0REPgotPC9ETD4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBpbnRlcmZhY2UgPEI+RG9tUGFja2FnZTwvQj48RFQ+ZXh0ZW5kcyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U8L0RMPgotPC9QUkU+Ci0KLTxQPgotPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gPHVsPgotICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICAgPGxpPmVhY2ggZW51bSw8L2xpPgotICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gPC91bD4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotCi08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tRmFjdG9yeS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxDT0RFPkRvbUZhY3Rvcnk8L0NPREU+PC9BPjwvREw+Ci08SFI+Ci0KLTxQPgotPCEtLSA9PT09PT09PSBORVNURUQgQ0xBU1MgU1VNTUFSWSA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibmVzdGVkX2NsYXNzX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5OZXN0ZWQgQ2xhc3MgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2ludGVyZmFjZTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlLkxpdGVyYWxzPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0RlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKLSAKLSAgIGVhY2ggY2xhc3MsCi0gICBlYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcywKLSAgIGVhY2ggZW51bSwKLSAgIGFuZCBlYWNoIGRhdGEgdHlwZQotIAotIDwhLS0gZW5kLXVzZXItZG9jIC0tPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im5lc3RlZF9jbGFzc2VzX2luaGVyaXRlZF9mcm9tX2NsYXNzX29yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk5lc3RlZCBjbGFzc2VzL2ludGVyZmFjZXMgaW5oZXJpdGVkIGZyb20gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPm9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5EZXNjcmlwdG9yLCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnk8L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08IS0tID09PT09PT09PT09IEZJRUxEIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImZpZWxkX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5GaWVsZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZUlOU1RBTkNFIj5lSU5TVEFOQ0U8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNlTkFNRSI+ZU5BTUU8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIHBhY2thZ2UgbmFtZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNlTlNfUFJFRklYIj5lTlNfUFJFRklYPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI2VOU19VUkkiPmVOU19VUkk8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lET00iPklET008L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxDT0RFPjxlbT5JRE9NPC9lbT48L0NPREU+JyBjbGFzcy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lET01fX1dFQl9TRVJWSUNFX1BST0pFQ1RTIj5JRE9NX19XRUJfU0VSVklDRV9QUk9KRUNUUzwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2ViIFNlcnZpY2UgUHJvamVjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSURPTV9GRUFUVVJFX0NPVU5UIj5JRE9NX0ZFQVRVUkVfQ09VTlQ8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPklET008L2VtPicgY2xhc3MuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UIj5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8Q09ERT48ZW0+SUphdmEgV2ViIFNlcnZpY2UgRWxlbWVudDwvZW0+PC9DT0RFPicgY2xhc3MuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTiI+SUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT048L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGxlbWVudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FIj5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQiPklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVDwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SUphdmEgV2ViIFNlcnZpY2UgRWxlbWVudDwvZW0+JyBjbGFzcy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRSI+SVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8Q09ERT48ZW0+SVNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT48L0NPREU+JyBjbGFzcy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5UQVRJT04iPklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5UQVRJT048L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGxlbWVudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExFTUVOVElOR19XRUJfU0VSVklDRVMiPklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5USU5HX1dFQl9TRVJWSUNFUzwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wbGVtZW50aW5nIFdlYiBTZXJ2aWNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExJQ0lUIj5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExJQ0lUPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBsaWNpdDwvYj48L2VtPicgYXR0cmlidXRlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19OQU1FIj5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX05BTUU8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRSI+SVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19TVFlMRSI+SVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfU1RZTEU8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfVVNFIj5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19VU0U8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBVc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fVEFSR0VUX05BTUVTUEFDRSI+SVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19UQVJHRVRfTkFNRVNQQUNFPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgTmFtZXNwYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1dFQl9NRVRIT0RTIj5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1dFQl9NRVRIT0RTPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XZWIgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfRkVBVFVSRV9DT1VOVCI+SVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX0ZFQVRVUkVfQ09VTlQ8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPklTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+JyBjbGFzcy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lXRUJfTUVUSE9EIj5JV0VCX01FVEhPRDwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPENPREU+PGVtPklXZWIgTWV0aG9kPC9lbT48L0NPREU+JyBjbGFzcy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lXRUJfTUVUSE9EX19FWENMVURFRCI+SVdFQl9NRVRIT0RfX0VYQ0xVREVEPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGNsdWRlZDwvYj48L2VtPicgYXR0cmlidXRlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVdFQl9NRVRIT0RfX0lNUExFTUVOVEFUSU9OIj5JV0VCX01FVEhPRF9fSU1QTEVNRU5UQVRJT048L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGxlbWVudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJV0VCX01FVEhPRF9fTkFNRSI+SVdFQl9NRVRIT0RfX05BTUU8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lXRUJfTUVUSE9EX19QQVJBTUVURVJTIj5JV0VCX01FVEhPRF9fUEFSQU1FVEVSUzwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFyYW1ldGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRSI+SVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEU8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfU1RZTEUiPklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfU1RZTEU8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19VU0UiPklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfVVNFPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgVXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJV0VCX01FVEhPRF9GRUFUVVJFX0NPVU5UIj5JV0VCX01FVEhPRF9GRUFUVVJFX0NPVU5UPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JV2ViIE1ldGhvZDwvZW0+JyBjbGFzcy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lXRUJfUEFSQU0iPklXRUJfUEFSQU08L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxDT0RFPjxlbT5JV2ViIFBhcmFtPC9lbT48L0NPREU+JyBjbGFzcy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lXRUJfUEFSQU1fX0hFQURFUiI+SVdFQl9QQVJBTV9fSEVBREVSPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWFkZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lXRUJfUEFSQU1fX0lNUExFTUVOVEFUSU9OIj5JV0VCX1BBUkFNX19JTVBMRU1FTlRBVElPTjwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wbGVtZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lXRUJfUEFSQU1fX0tJTkQiPklXRUJfUEFSQU1fX0tJTkQ8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lXRUJfUEFSQU1fX05BTUUiPklXRUJfUEFSQU1fX05BTUU8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lXRUJfUEFSQU1fX1BBUlRfTkFNRSI+SVdFQl9QQVJBTV9fUEFSVF9OQU1FPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJ0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0UiPklXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0U8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBOYW1lc3BhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lXRUJfUEFSQU1fX1RZUEVfTkFNRSI+SVdFQl9QQVJBTV9fVFlQRV9OQU1FPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lXRUJfUEFSQU1fRkVBVFVSRV9DT1VOVCI+SVdFQl9QQVJBTV9GRUFUVVJFX0NPVU5UPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JV2ViIFBhcmFtPC9lbT4nIGNsYXNzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVdFQl9TRVJWSUNFIj5JV0VCX1NFUlZJQ0U8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxDT0RFPjxlbT5JV2ViIFNlcnZpY2U8L2VtPjwvQ09ERT4nIGNsYXNzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVdFQl9TRVJWSUNFX19JTVBMRU1FTlRBVElPTiI+SVdFQl9TRVJWSUNFX19JTVBMRU1FTlRBVElPTjwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wbGVtZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lXRUJfU0VSVklDRV9fTkFNRSI+SVdFQl9TRVJWSUNFX19OQU1FPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJV0VCX1NFUlZJQ0VfX1BPUlRfTkFNRSI+SVdFQl9TRVJWSUNFX19QT1JUX05BTUU8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVdFQl9TRVJWSUNFX19TRVJWSUNFX0VORFBPSU5UIj5JV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQ8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lXRUJfU0VSVklDRV9fVEFSR0VUX05BTUVTUEFDRSI+SVdFQl9TRVJWSUNFX19UQVJHRVRfTkFNRVNQQUNFPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgTmFtZXNwYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJV0VCX1NFUlZJQ0VfX1dTRExfTE9DQVRJT04iPklXRUJfU0VSVklDRV9fV1NETF9MT0NBVElPTjwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBMb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVdFQl9TRVJWSUNFX0ZFQVRVUkVfQ09VTlQiPklXRUJfU0VSVklDRV9GRUFUVVJFX0NPVU5UPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JV2ViIFNlcnZpY2U8L2VtPicgY2xhc3MuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJV0VCX1NFUlZJQ0VfUFJPSkVDVCI+SVdFQl9TRVJWSUNFX1BST0pFQ1Q8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxDT0RFPjxlbT5JV2ViIFNlcnZpY2UgUHJvamVjdDwvZW0+PC9DT0RFPicgY2xhc3MuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJV0VCX1NFUlZJQ0VfUFJPSkVDVF9fTkFNRSI+SVdFQl9TRVJWSUNFX1BST0pFQ1RfX05BTUU8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lXRUJfU0VSVklDRV9QUk9KRUNUX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRVMiPklXRUJfU0VSVklDRV9QUk9KRUNUX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRVM8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJV0VCX1NFUlZJQ0VfUFJPSkVDVF9fV0VCX1NFUlZJQ0VTIj5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fV0VCX1NFUlZJQ0VTPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XZWIgU2VydmljZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVdFQl9TRVJWSUNFX1BST0pFQ1RfRkVBVFVSRV9DT1VOVCI+SVdFQl9TRVJWSUNFX1BST0pFQ1RfRkVBVFVSRV9DT1VOVDwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SVdlYiBTZXJ2aWNlIFByb2plY3Q8L2VtPicgY2xhc3MuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJV0VCX1RZUEUiPklXRUJfVFlQRTwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPENPREU+PGVtPklXZWIgVHlwZTwvZW0+PC9DT0RFPicgY2xhc3MuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNJV0VCX1RZUEVfX0lNUExFTUVOVEFUSU9OIj5JV0VCX1RZUEVfX0lNUExFTUVOVEFUSU9OPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBsZW1lbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjSVdFQl9UWVBFX19OQU1FIj5JV0VCX1RZUEVfX05BTUU8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI0lXRUJfVFlQRV9GRUFUVVJFX0NPVU5UIj5JV0VCX1RZUEVfRkVBVFVSRV9DT1VOVDwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SVdlYiBUeXBlPC9lbT4nIGNsYXNzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRSI+U09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRTwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxDT0RFPjxlbT5TT0FQIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT48L0NPREU+PC9BPicgZW51bS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI1NPQVBfQklORElOR19TVFlMRSI+U09BUF9CSU5ESU5HX1NUWUxFPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PENPREU+PGVtPlNPQVAgQmluZGluZyBTdHlsZTwvZW0+PC9DT0RFPjwvQT4nIGVudW0uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNTT0FQX0JJTkRJTkdfVVNFIj5TT0FQX0JJTkRJTkdfVVNFPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxDT0RFPjxlbT5TT0FQIEJpbmRpbmcgVXNlPC9lbT48L0NPREU+PC9BPicgZW51bS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI1dFQl9QQVJBTV9LSU5EIj5XRUJfUEFSQU1fS0lORDwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PENPREU+PGVtPldlYiBQYXJhbSBLaW5kPC9lbT48L0NPREU+PC9BPicgZW51bS48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tRmFjdG9yeS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbUZhY3Rvcnk8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI2dldERvbUZhY3RvcnkoKSI+Z2V0RG9tRmFjdG9yeTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNnZXRJRE9NX1dlYlNlcnZpY2VQcm9qZWN0cygpIj5nZXRJRE9NX1dlYlNlcnZpY2VQcm9qZWN0czwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSURPTS5odG1sI2dldFdlYlNlcnZpY2VQcm9qZWN0cygpIj48Q09ERT48ZW0+V2ViIFNlcnZpY2UgUHJvamVjdHM8L2VtPjwvQ09ERT48L0E+Jy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNnZXRJRE9NKCkiPmdldElET008L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSURPTS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxDT0RFPjxlbT5JRE9NPC9lbT48L0NPREU+PC9BPicuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO29yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI2dldElKYXZhV2ViU2VydmljZUVsZW1lbnRfSW1wbGVtZW50YXRpb24oKSI+Z2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudF9JbXBsZW1lbnRhdGlvbjwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuaHRtbCNnZXRJbXBsZW1lbnRhdGlvbigpIj48Q09ERT48ZW0+SW1wbGVtZW50YXRpb248L2VtPjwvQ09ERT48L0E+Jy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudF9OYW1lKCkiPmdldElKYXZhV2ViU2VydmljZUVsZW1lbnRfTmFtZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuaHRtbCNnZXROYW1lKCkiPjxDT0RFPjxlbT5OYW1lPC9lbT48L0NPREU+PC9BPicuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO29yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudCgpIj5nZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50PC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT48ZW0+SUphdmEgV2ViIFNlcnZpY2UgRWxlbWVudDwvZW0+PC9DT0RFPjwvQT4nLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX0ltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkiPmdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfSW1wbGVtZW50aW5nV2ViU2VydmljZXM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCNnZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpIj48Q09ERT48ZW0+SW1wbGVtZW50aW5nIFdlYiBTZXJ2aWNlczwvZW0+PC9DT0RFPjwvQT4nLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX0ltcGxpY2l0KCkiPmdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfSW1wbGljaXQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwjaXNJbXBsaWNpdCgpIj48Q09ERT48ZW0+SW1wbGljaXQ8L2VtPjwvQ09ERT48L0E+Jy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkiPmdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfU29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkiPjxDT0RFPjxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT48L0NPREU+PC9BPicuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO29yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI2dldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfU29hcEJpbmRpbmdTdHlsZSgpIj5nZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1NvYXBCaW5kaW5nU3R5bGU8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwjZ2V0U29hcEJpbmRpbmdTdHlsZSgpIj48Q09ERT48ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT48L0NPREU+PC9BPicuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO29yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI2dldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfU29hcEJpbmRpbmdVc2UoKSI+Z2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1VzZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCNnZXRTb2FwQmluZGluZ1VzZSgpIj48Q09ERT48ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+PC9DT0RFPjwvQT4nLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1RhcmdldE5hbWVzcGFjZSgpIj5nZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1RhcmdldE5hbWVzcGFjZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCNnZXRUYXJnZXROYW1lc3BhY2UoKSI+PENPREU+PGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPjwvQ09ERT48L0E+Jy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9XZWJNZXRob2RzKCkiPmdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfV2ViTWV0aG9kczwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sI2dldFdlYk1ldGhvZHMoKSI+PENPREU+PGVtPldlYiBNZXRob2RzPC9lbT48L0NPREU+PC9BPicuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO29yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpIj5nZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT48ZW0+SVNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT48L0NPREU+PC9BPicuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO29yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI2dldElXZWJNZXRob2RfRXhjbHVkZWQoKSI+Z2V0SVdlYk1ldGhvZF9FeGNsdWRlZDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCNpc0V4Y2x1ZGVkKCkiPjxDT0RFPjxlbT5FeGNsdWRlZDwvZW0+PC9DT0RFPjwvQT4nLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNnZXRJV2ViTWV0aG9kX1BhcmFtZXRlcnMoKSI+Z2V0SVdlYk1ldGhvZF9QYXJhbWV0ZXJzPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmh0bWwjZ2V0UGFyYW1ldGVycygpIj48Q09ERT48ZW0+UGFyYW1ldGVyczwvZW0+PC9DT0RFPjwvQT4nLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNnZXRJV2ViTWV0aG9kX1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSI+Z2V0SVdlYk1ldGhvZF9Tb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sI2dldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSI+PENPREU+PGVtPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPjwvQ09ERT48L0E+Jy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SVdlYk1ldGhvZF9Tb2FwQmluZGluZ1N0eWxlKCkiPmdldElXZWJNZXRob2RfU29hcEJpbmRpbmdTdHlsZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCNnZXRTb2FwQmluZGluZ1N0eWxlKCkiPjxDT0RFPjxlbT5Tb2FwIEJpbmRpbmcgU3R5bGU8L2VtPjwvQ09ERT48L0E+Jy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SVdlYk1ldGhvZF9Tb2FwQmluZGluZ1VzZSgpIj5nZXRJV2ViTWV0aG9kX1NvYXBCaW5kaW5nVXNlPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sI2dldFNvYXBCaW5kaW5nVXNlKCkiPjxDT0RFPjxlbT5Tb2FwIEJpbmRpbmcgVXNlPC9lbT48L0NPREU+PC9BPicuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO29yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SVdlYk1ldGhvZCgpIj5nZXRJV2ViTWV0aG9kPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT48ZW0+SVdlYiBNZXRob2Q8L2VtPjwvQ09ERT48L0E+Jy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SVdlYlBhcmFtX0hlYWRlcigpIj5nZXRJV2ViUGFyYW1fSGVhZGVyPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwjaXNIZWFkZXIoKSI+PENPREU+PGVtPkhlYWRlcjwvZW0+PC9DT0RFPjwvQT4nLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNnZXRJV2ViUGFyYW1fS2luZCgpIj5nZXRJV2ViUGFyYW1fS2luZDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sI2dldEtpbmQoKSI+PENPREU+PGVtPktpbmQ8L2VtPjwvQ09ERT48L0E+Jy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SVdlYlBhcmFtX1BhcnROYW1lKCkiPmdldElXZWJQYXJhbV9QYXJ0TmFtZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sI2dldFBhcnROYW1lKCkiPjxDT0RFPjxlbT5QYXJ0IE5hbWU8L2VtPjwvQ09ERT48L0E+Jy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SVdlYlBhcmFtX1RhcmdldE5hbWVzcGFjZSgpIj5nZXRJV2ViUGFyYW1fVGFyZ2V0TmFtZXNwYWNlPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkiPjxDT0RFPjxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT48L0NPREU+PC9BPicuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO29yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI2dldElXZWJQYXJhbV9UeXBlTmFtZSgpIj5nZXRJV2ViUGFyYW1fVHlwZU5hbWU8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCNnZXRUeXBlTmFtZSgpIj48Q09ERT48ZW0+VHlwZSBOYW1lPC9lbT48L0NPREU+PC9BPicuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO29yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SVdlYlBhcmFtKCkiPmdldElXZWJQYXJhbTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT48ZW0+SVdlYiBQYXJhbTwvZW0+PC9DT0RFPjwvQT4nLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNnZXRJV2ViU2VydmljZV9Qb3J0TmFtZSgpIj5nZXRJV2ViU2VydmljZV9Qb3J0TmFtZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwjZ2V0UG9ydE5hbWUoKSI+PENPREU+PGVtPlBvcnQgTmFtZTwvZW0+PC9DT0RFPjwvQT4nLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNnZXRJV2ViU2VydmljZV9TZXJ2aWNlRW5kcG9pbnQoKSI+Z2V0SVdlYlNlcnZpY2VfU2VydmljZUVuZHBvaW50PC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2UuaHRtbCNnZXRTZXJ2aWNlRW5kcG9pbnQoKSI+PENPREU+PGVtPlNlcnZpY2UgRW5kcG9pbnQ8L2VtPjwvQ09ERT48L0E+Jy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SVdlYlNlcnZpY2VfVGFyZ2V0TmFtZXNwYWNlKCkiPmdldElXZWJTZXJ2aWNlX1RhcmdldE5hbWVzcGFjZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkiPjxDT0RFPjxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT48L0NPREU+PC9BPicuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO29yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI2dldElXZWJTZXJ2aWNlX1dzZGxMb2NhdGlvbigpIj5nZXRJV2ViU2VydmljZV9Xc2RsTG9jYXRpb248L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sI2dldFdzZGxMb2NhdGlvbigpIj48Q09ERT48ZW0+V3NkbCBMb2NhdGlvbjwvZW0+PC9DT0RFPjwvQT4nLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI2dldElXZWJTZXJ2aWNlKCkiPmdldElXZWJTZXJ2aWNlPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PENPREU+PGVtPklXZWIgU2VydmljZTwvZW0+PC9DT0RFPjwvQT4nLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNnZXRJV2ViU2VydmljZVByb2plY3RfTmFtZSgpIj5nZXRJV2ViU2VydmljZVByb2plY3RfTmFtZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlUHJvamVjdC5odG1sI2dldE5hbWUoKSI+PENPREU+PGVtPk5hbWU8L2VtPjwvQ09ERT48L0E+Jy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SVdlYlNlcnZpY2VQcm9qZWN0X1NlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKSI+Z2V0SVdlYlNlcnZpY2VQcm9qZWN0X1NlcnZpY2VFbmRwb2ludEludGVyZmFjZXM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlUHJvamVjdC5odG1sI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKSI+PENPREU+PGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlczwvZW0+PC9DT0RFPjwvQT4nLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNnZXRJV2ViU2VydmljZVByb2plY3RfV2ViU2VydmljZXMoKSI+Z2V0SVdlYlNlcnZpY2VQcm9qZWN0X1dlYlNlcnZpY2VzPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZVByb2plY3QuaHRtbCNnZXRXZWJTZXJ2aWNlcygpIj48Q09ERT48ZW0+V2ViIFNlcnZpY2VzPC9lbT48L0NPREU+PC9BPicuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO29yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SVdlYlNlcnZpY2VQcm9qZWN0KCkiPmdldElXZWJTZXJ2aWNlUHJvamVjdDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZVByb2plY3QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT48ZW0+SVdlYiBTZXJ2aWNlIFByb2plY3Q8L2VtPjwvQ09ERT48L0E+Jy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNnZXRJV2ViVHlwZSgpIj5nZXRJV2ViVHlwZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViVHlwZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxDT0RFPjxlbT5JV2ViIFR5cGU8L2VtPjwvQ09ERT48L0E+Jy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI2dldFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSI+Z2V0U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PENPREU+PGVtPlNPQVAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPjwvQ09ERT48L0E+Jy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI2dldFNPQVBCaW5kaW5nU3R5bGUoKSI+Z2V0U09BUEJpbmRpbmdTdHlsZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PENPREU+PGVtPlNPQVAgQmluZGluZyBTdHlsZTwvZW0+PC9DT0RFPjwvQT4nLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW08L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0U09BUEJpbmRpbmdVc2UoKSI+Z2V0U09BUEJpbmRpbmdVc2U8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT48ZW0+U09BUCBCaW5kaW5nIFVzZTwvZW0+PC9DT0RFPjwvQT4nLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW08L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0V2ViUGFyYW1LaW5kKCkiPmdldFdlYlBhcmFtS2luZDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT48ZW0+V2ViIFBhcmFtIEtpbmQ8L2VtPjwvQ09ERT48L0E+Jy48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDs8QSBOQU1FPSJtZXRob2RzX2luaGVyaXRlZF9mcm9tX2NsYXNzX29yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmdldEVDbGFzc2lmaWVyLCBnZXRFQ2xhc3NpZmllcnMsIGdldEVGYWN0b3J5SW5zdGFuY2UsIGdldEVTdWJwYWNrYWdlcywgZ2V0RVN1cGVyUGFja2FnZSwgZ2V0TnNQcmVmaXgsIGdldE5zVVJJLCBzZXRFRmFjdG9yeUluc3RhbmNlLCBzZXROc1ByZWZpeCwgc2V0TnNVUkk8L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19vcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+Z2V0TmFtZSwgc2V0TmFtZTwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDs8QSBOQU1FPSJtZXRob2RzX2luaGVyaXRlZF9mcm9tX2NsYXNzX29yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ8L0I+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT5nZXRFQW5ub3RhdGlvbiwgZ2V0RUFubm90YXRpb25zPC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3Nfb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGludGVyZmFjZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmVBbGxDb250ZW50cywgZUNsYXNzLCBlQ29udGFpbmVyLCBlQ29udGFpbmluZ0ZlYXR1cmUsIGVDb250YWlubWVudEZlYXR1cmUsIGVDb250ZW50cywgZUNyb3NzUmVmZXJlbmNlcywgZUdldCwgZUdldCwgZUlzUHJveHksIGVJc1NldCwgZVJlc291cmNlLCBlU2V0LCBlVW5zZXQ8L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19vcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllciI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyPC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+ZUFkYXB0ZXJzLCBlRGVsaXZlciwgZU5vdGlmeSwgZVNldERlbGl2ZXI8L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT09PT0gRklFTEQgREVUQUlMID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJmaWVsZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5GaWVsZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iZU5BTUUiPjwhLS0gLS0+PC9BPjxIMz4KLWVOQU1FPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyA8Qj5lTkFNRTwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgcGFja2FnZSBuYW1lLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnN0YW50LXZhbHVlcy5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZS5lTkFNRSI+Q29uc3RhbnQgRmllbGQgVmFsdWVzPC9BPjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJlTlNfVVJJIj48IS0tIC0tPjwvQT48SDM+Ci1lTlNfVVJJPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyA8Qj5lTlNfVVJJPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29uc3RhbnQtdmFsdWVzLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlLmVOU19VUkkiPkNvbnN0YW50IEZpZWxkIFZhbHVlczwvQT48L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZU5TX1BSRUZJWCI+PCEtLSAtLT48L0E+PEgzPgotZU5TX1BSRUZJWDwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgPEI+ZU5TX1BSRUZJWDwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb25zdGFudC12YWx1ZXMuaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuZU5TX1BSRUZJWCI+Q29uc3RhbnQgRmllbGQgVmFsdWVzPC9BPjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJlSU5TVEFOQ0UiPjwhLS0gLS0+PC9BPjxIMz4KLWVJTlNUQU5DRTwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+IDxCPmVJTlNUQU5DRTwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJJRE9NIj48IS0tIC0tPjwvQT48SDM+Ci1JRE9NPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgaW50IDxCPklET008L0I+PC9QUkU+Ci08REw+Ci08REQ+VGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxDT0RFPjxlbT5JRE9NPC9lbT48L0NPREU+JyBjbGFzcy4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48Q09ERT5JRE9NSW1wbDwvQ09ERT4sIAotPENPREU+RG9tUGFja2FnZUltcGwuZ2V0SURPTSgpPC9DT0RFPiwgCi08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb25zdGFudC12YWx1ZXMuaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSURPTSI+Q29uc3RhbnQgRmllbGQgVmFsdWVzPC9BPjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJJRE9NX19XRUJfU0VSVklDRV9QUk9KRUNUUyI+PCEtLSAtLT48L0E+PEgzPgotSURPTV9fV0VCX1NFUlZJQ0VfUFJPSkVDVFM8L0gzPgotPFBSRT4KLXN0YXRpYyBmaW5hbCBpbnQgPEI+SURPTV9fV0VCX1NFUlZJQ0VfUFJPSkVDVFM8L0I+PC9QUkU+Ci08REw+Ci08REQ+VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldlYiBTZXJ2aWNlIFByb2plY3RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb25zdGFudC12YWx1ZXMuaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSURPTV9fV0VCX1NFUlZJQ0VfUFJPSkVDVFMiPkNvbnN0YW50IEZpZWxkIFZhbHVlczwvQT48L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iSURPTV9GRUFUVVJFX0NPVU5UIj48IS0tIC0tPjwvQT48SDM+Ci1JRE9NX0ZFQVRVUkVfQ09VTlQ8L0gzPgotPFBSRT4KLXN0YXRpYyBmaW5hbCBpbnQgPEI+SURPTV9GRUFUVVJFX0NPVU5UPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JRE9NPC9lbT4nIGNsYXNzLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnN0YW50LXZhbHVlcy5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZS5JRE9NX0ZFQVRVUkVfQ09VTlQiPkNvbnN0YW50IEZpZWxkIFZhbHVlczwvQT48L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVCI+PCEtLSAtLT48L0E+PEgzPgotSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVDwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIGludCA8Qj5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8Q09ERT48ZW0+SUphdmEgV2ViIFNlcnZpY2UgRWxlbWVudDwvZW0+PC9DT0RFPicgY2xhc3MuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PENPREU+SUphdmFXZWJTZXJ2aWNlRWxlbWVudEltcGw8L0NPREU+LCAKLTxDT0RFPkRvbVBhY2thZ2VJbXBsLmdldElKYXZhV2ViU2VydmljZUVsZW1lbnQoKTwvQ09ERT4sIAotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29uc3RhbnQtdmFsdWVzLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlQiPkNvbnN0YW50IEZpZWxkIFZhbHVlczwvQT48L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT04iPjwhLS0gLS0+PC9BPjxIMz4KLUlKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgaW50IDxCPklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBsZW1lbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnN0YW50LXZhbHVlcy5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZS5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTiI+Q29uc3RhbnQgRmllbGQgVmFsdWVzPC9BPjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FIj48IS0tIC0tPjwvQT48SDM+Ci1JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgaW50IDxCPklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUU8L0I+PC9QUkU+Ci08REw+Ci08REQ+VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb25zdGFudC12YWx1ZXMuaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRSI+Q29uc3RhbnQgRmllbGQgVmFsdWVzPC9BPjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQiPjwhLS0gLS0+PC9BPjxIMz4KLUlKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVDwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIGludCA8Qj5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQ8L0I+PC9QUkU+Ci08REw+Ci08REQ+VGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPklKYXZhIFdlYiBTZXJ2aWNlIEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29uc3RhbnQtdmFsdWVzLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCI+Q29uc3RhbnQgRmllbGQgVmFsdWVzPC9BPjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0UiPjwhLS0gLS0+PC9BPjxIMz4KLUlTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRTwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIGludCA8Qj5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0U8L0I+PC9QUkU+Ci08REw+Ci08REQ+VGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxDT0RFPjxlbT5JU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPjwvQ09ERT4nIGNsYXNzLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxDT0RFPklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJbXBsPC9DT0RFPiwgCi08Q09ERT5Eb21QYWNrYWdlSW1wbC5nZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk8L0NPREU+LCAKLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnN0YW50LXZhbHVlcy5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0UiPkNvbnN0YW50IEZpZWxkIFZhbHVlczwvQT48L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRBVElPTiI+PCEtLSAtLT48L0E+PEgzPgotSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRBVElPTjwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIGludCA8Qj5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExFTUVOVEFUSU9OPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBsZW1lbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnN0YW50LXZhbHVlcy5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExFTUVOVEFUSU9OIj5Db25zdGFudCBGaWVsZCBWYWx1ZXM8L0E+PC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fTkFNRSI+PCEtLSAtLT48L0E+PEgzPgotSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19OQU1FPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgaW50IDxCPklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fTkFNRTwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnN0YW50LXZhbHVlcy5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX05BTUUiPkNvbnN0YW50IEZpZWxkIFZhbHVlczwvQT48L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVCI+PCEtLSAtLT48L0E+PEgzPgotSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVDwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIGludCA8Qj5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExJQ0lUPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBsaWNpdDwvYj48L2VtPicgYXR0cmlidXRlLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnN0YW50LXZhbHVlcy5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExJQ0lUIj5Db25zdGFudCBGaWVsZCBWYWx1ZXM8L0E+PC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5USU5HX1dFQl9TRVJWSUNFUyI+PCEtLSAtLT48L0E+PEgzPgotSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRJTkdfV0VCX1NFUlZJQ0VTPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgaW50IDxCPklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5USU5HX1dFQl9TRVJWSUNFUzwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wbGVtZW50aW5nIFdlYiBTZXJ2aWNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29uc3RhbnQtdmFsdWVzLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5USU5HX1dFQl9TRVJWSUNFUyI+Q29uc3RhbnQgRmllbGQgVmFsdWVzPC9BPjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1dFQl9NRVRIT0RTIj48IS0tIC0tPjwvQT48SDM+Ci1JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1dFQl9NRVRIT0RTPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgaW50IDxCPklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fV0VCX01FVEhPRFM8L0I+PC9QUkU+Ci08REw+Ci08REQ+VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldlYiBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb25zdGFudC12YWx1ZXMuaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19XRUJfTUVUSE9EUyI+Q29uc3RhbnQgRmllbGQgVmFsdWVzPC9BPjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1RBUkdFVF9OQU1FU1BBQ0UiPjwhLS0gLS0+PC9BPjxIMz4KLUlTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fVEFSR0VUX05BTUVTUEFDRTwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIGludCA8Qj5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1RBUkdFVF9OQU1FU1BBQ0U8L0I+PC9QUkU+Ci08REw+Ci08REQ+VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBOYW1lc3BhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb25zdGFudC12YWx1ZXMuaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19UQVJHRVRfTkFNRVNQQUNFIj5Db25zdGFudCBGaWVsZCBWYWx1ZXM8L0E+PC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1NUWUxFIj48IS0tIC0tPjwvQT48SDM+Ci1JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19TVFlMRTwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIGludCA8Qj5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19TVFlMRTwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFN0eWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29uc3RhbnQtdmFsdWVzLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1NUWUxFIj5Db25zdGFudCBGaWVsZCBWYWx1ZXM8L0E+PC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1VTRSI+PCEtLSAtLT48L0E+PEgzPgotSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfVVNFPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgaW50IDxCPklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1VTRTwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFVzZTwvYj48L2VtPicgYXR0cmlidXRlLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnN0YW50LXZhbHVlcy5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19VU0UiPkNvbnN0YW50IEZpZWxkIFZhbHVlczwvQT48L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFIj48IS0tIC0tPjwvQT48SDM+Ci1JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEU8L0gzPgotPFBSRT4KLXN0YXRpYyBmaW5hbCBpbnQgPEI+SVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29uc3RhbnQtdmFsdWVzLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRSI+Q29uc3RhbnQgRmllbGQgVmFsdWVzPC9BPjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfRkVBVFVSRV9DT1VOVCI+PCEtLSAtLT48L0E+PEgzPgotSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX0ZFQVRVUkVfQ09VTlQ8L0gzPgotPFBSRT4KLXN0YXRpYyBmaW5hbCBpbnQgPEI+SVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX0ZFQVRVUkVfQ09VTlQ8L0I+PC9QUkU+Ci08REw+Ci08REQ+VGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPklTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+JyBjbGFzcy4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb25zdGFudC12YWx1ZXMuaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX0ZFQVRVUkVfQ09VTlQiPkNvbnN0YW50IEZpZWxkIFZhbHVlczwvQT48L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iSVdFQl9NRVRIT0QiPjwhLS0gLS0+PC9BPjxIMz4KLUlXRUJfTUVUSE9EPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgaW50IDxCPklXRUJfTUVUSE9EPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8Q09ERT48ZW0+SVdlYiBNZXRob2Q8L2VtPjwvQ09ERT4nIGNsYXNzLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxDT0RFPklXZWJNZXRob2RJbXBsPC9DT0RFPiwgCi08Q09ERT5Eb21QYWNrYWdlSW1wbC5nZXRJV2ViTWV0aG9kKCk8L0NPREU+LCAKLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnN0YW50LXZhbHVlcy5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZS5JV0VCX01FVEhPRCI+Q29uc3RhbnQgRmllbGQgVmFsdWVzPC9BPjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJJV0VCX01FVEhPRF9fSU1QTEVNRU5UQVRJT04iPjwhLS0gLS0+PC9BPjxIMz4KLUlXRUJfTUVUSE9EX19JTVBMRU1FTlRBVElPTjwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIGludCA8Qj5JV0VCX01FVEhPRF9fSU1QTEVNRU5UQVRJT048L0I+PC9QUkU+Ci08REw+Ci08REQ+VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGxlbWVudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29uc3RhbnQtdmFsdWVzLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlLklXRUJfTUVUSE9EX19JTVBMRU1FTlRBVElPTiI+Q29uc3RhbnQgRmllbGQgVmFsdWVzPC9BPjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJJV0VCX01FVEhPRF9fTkFNRSI+PCEtLSAtLT48L0E+PEgzPgotSVdFQl9NRVRIT0RfX05BTUU8L0gzPgotPFBSRT4KLXN0YXRpYyBmaW5hbCBpbnQgPEI+SVdFQl9NRVRIT0RfX05BTUU8L0I+PC9QUkU+Ci08REw+Ci08REQ+VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb25zdGFudC12YWx1ZXMuaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX05BTUUiPkNvbnN0YW50IEZpZWxkIFZhbHVlczwvQT48L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iSVdFQl9NRVRIT0RfX1BBUkFNRVRFUlMiPjwhLS0gLS0+PC9BPjxIMz4KLUlXRUJfTUVUSE9EX19QQVJBTUVURVJTPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgaW50IDxCPklXRUJfTUVUSE9EX19QQVJBTUVURVJTPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJhbWV0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb25zdGFudC12YWx1ZXMuaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1BBUkFNRVRFUlMiPkNvbnN0YW50IEZpZWxkIFZhbHVlczwvQT48L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iSVdFQl9NRVRIT0RfX0VYQ0xVREVEIj48IS0tIC0tPjwvQT48SDM+Ci1JV0VCX01FVEhPRF9fRVhDTFVERUQ8L0gzPgotPFBSRT4KLXN0YXRpYyBmaW5hbCBpbnQgPEI+SVdFQl9NRVRIT0RfX0VYQ0xVREVEPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGNsdWRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnN0YW50LXZhbHVlcy5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fRVhDTFVERUQiPkNvbnN0YW50IEZpZWxkIFZhbHVlczwvQT48L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19TVFlMRSI+PCEtLSAtLT48L0E+PEgzPgotSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19TVFlMRTwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIGludCA8Qj5JV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1NUWUxFPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgU3R5bGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb25zdGFudC12YWx1ZXMuaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19TVFlMRSI+Q29uc3RhbnQgRmllbGQgVmFsdWVzPC9BPjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJJV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1VTRSI+PCEtLSAtLT48L0E+PEgzPgotSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19VU0U8L0gzPgotPFBSRT4KLXN0YXRpYyBmaW5hbCBpbnQgPEI+SVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19VU0U8L0I+PC9QUkU+Ci08REw+Ci08REQ+VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBVc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb25zdGFudC12YWx1ZXMuaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19VU0UiPkNvbnN0YW50IEZpZWxkIFZhbHVlczwvQT48L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEUiPjwhLS0gLS0+PC9BPjxIMz4KLUlXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgaW50IDxCPklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29uc3RhbnQtdmFsdWVzLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlLklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFIj5Db25zdGFudCBGaWVsZCBWYWx1ZXM8L0E+PC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IklXRUJfTUVUSE9EX0ZFQVRVUkVfQ09VTlQiPjwhLS0gLS0+PC9BPjxIMz4KLUlXRUJfTUVUSE9EX0ZFQVRVUkVfQ09VTlQ8L0gzPgotPFBSRT4KLXN0YXRpYyBmaW5hbCBpbnQgPEI+SVdFQl9NRVRIT0RfRkVBVFVSRV9DT1VOVDwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SVdlYiBNZXRob2Q8L2VtPicgY2xhc3MuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29uc3RhbnQtdmFsdWVzLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlLklXRUJfTUVUSE9EX0ZFQVRVUkVfQ09VTlQiPkNvbnN0YW50IEZpZWxkIFZhbHVlczwvQT48L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iSVdFQl9QQVJBTSI+PCEtLSAtLT48L0E+PEgzPgotSVdFQl9QQVJBTTwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIGludCA8Qj5JV0VCX1BBUkFNPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8Q09ERT48ZW0+SVdlYiBQYXJhbTwvZW0+PC9DT0RFPicgY2xhc3MuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PENPREU+SVdlYlBhcmFtSW1wbDwvQ09ERT4sIAotPENPREU+RG9tUGFja2FnZUltcGwuZ2V0SVdlYlBhcmFtKCk8L0NPREU+LCAKLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnN0YW50LXZhbHVlcy5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZS5JV0VCX1BBUkFNIj5Db25zdGFudCBGaWVsZCBWYWx1ZXM8L0E+PC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IklXRUJfUEFSQU1fX0lNUExFTUVOVEFUSU9OIj48IS0tIC0tPjwvQT48SDM+Ci1JV0VCX1BBUkFNX19JTVBMRU1FTlRBVElPTjwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIGludCA8Qj5JV0VCX1BBUkFNX19JTVBMRU1FTlRBVElPTjwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wbGVtZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb25zdGFudC12YWx1ZXMuaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9QQVJBTV9fSU1QTEVNRU5UQVRJT04iPkNvbnN0YW50IEZpZWxkIFZhbHVlczwvQT48L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iSVdFQl9QQVJBTV9fTkFNRSI+PCEtLSAtLT48L0E+PEgzPgotSVdFQl9QQVJBTV9fTkFNRTwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIGludCA8Qj5JV0VCX1BBUkFNX19OQU1FPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29uc3RhbnQtdmFsdWVzLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlLklXRUJfUEFSQU1fX05BTUUiPkNvbnN0YW50IEZpZWxkIFZhbHVlczwvQT48L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iSVdFQl9QQVJBTV9fS0lORCI+PCEtLSAtLT48L0E+PEgzPgotSVdFQl9QQVJBTV9fS0lORDwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIGludCA8Qj5JV0VCX1BBUkFNX19LSU5EPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29uc3RhbnQtdmFsdWVzLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlLklXRUJfUEFSQU1fX0tJTkQiPkNvbnN0YW50IEZpZWxkIFZhbHVlczwvQT48L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iSVdFQl9QQVJBTV9fVFlQRV9OQU1FIj48IS0tIC0tPjwvQT48SDM+Ci1JV0VCX1BBUkFNX19UWVBFX05BTUU8L0gzPgotPFBSRT4KLXN0YXRpYyBmaW5hbCBpbnQgPEI+SVdFQl9QQVJBTV9fVFlQRV9OQU1FPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb25zdGFudC12YWx1ZXMuaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9QQVJBTV9fVFlQRV9OQU1FIj5Db25zdGFudCBGaWVsZCBWYWx1ZXM8L0E+PC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IklXRUJfUEFSQU1fX1BBUlRfTkFNRSI+PCEtLSAtLT48L0E+PEgzPgotSVdFQl9QQVJBTV9fUEFSVF9OQU1FPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgaW50IDxCPklXRUJfUEFSQU1fX1BBUlRfTkFNRTwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFydCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29uc3RhbnQtdmFsdWVzLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlLklXRUJfUEFSQU1fX1BBUlRfTkFNRSI+Q29uc3RhbnQgRmllbGQgVmFsdWVzPC9BPjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJJV0VCX1BBUkFNX19UQVJHRVRfTkFNRVNQQUNFIj48IS0tIC0tPjwvQT48SDM+Ci1JV0VCX1BBUkFNX19UQVJHRVRfTkFNRVNQQUNFPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgaW50IDxCPklXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0U8L0I+PC9QUkU+Ci08REw+Ci08REQ+VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBOYW1lc3BhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb25zdGFudC12YWx1ZXMuaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRSI+Q29uc3RhbnQgRmllbGQgVmFsdWVzPC9BPjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJJV0VCX1BBUkFNX19IRUFERVIiPjwhLS0gLS0+PC9BPjxIMz4KLUlXRUJfUEFSQU1fX0hFQURFUjwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIGludCA8Qj5JV0VCX1BBUkFNX19IRUFERVI8L0I+PC9QUkU+Ci08REw+Ci08REQ+VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlYWRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnN0YW50LXZhbHVlcy5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZS5JV0VCX1BBUkFNX19IRUFERVIiPkNvbnN0YW50IEZpZWxkIFZhbHVlczwvQT48L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iSVdFQl9QQVJBTV9GRUFUVVJFX0NPVU5UIj48IS0tIC0tPjwvQT48SDM+Ci1JV0VCX1BBUkFNX0ZFQVRVUkVfQ09VTlQ8L0gzPgotPFBSRT4KLXN0YXRpYyBmaW5hbCBpbnQgPEI+SVdFQl9QQVJBTV9GRUFUVVJFX0NPVU5UPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JV2ViIFBhcmFtPC9lbT4nIGNsYXNzLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnN0YW50LXZhbHVlcy5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZS5JV0VCX1BBUkFNX0ZFQVRVUkVfQ09VTlQiPkNvbnN0YW50IEZpZWxkIFZhbHVlczwvQT48L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iSVdFQl9TRVJWSUNFIj48IS0tIC0tPjwvQT48SDM+Ci1JV0VCX1NFUlZJQ0U8L0gzPgotPFBSRT4KLXN0YXRpYyBmaW5hbCBpbnQgPEI+SVdFQl9TRVJWSUNFPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8Q09ERT48ZW0+SVdlYiBTZXJ2aWNlPC9lbT48L0NPREU+JyBjbGFzcy4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48Q09ERT5JV2ViU2VydmljZUltcGw8L0NPREU+LCAKLTxDT0RFPkRvbVBhY2thZ2VJbXBsLmdldElXZWJTZXJ2aWNlKCk8L0NPREU+LCAKLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnN0YW50LXZhbHVlcy5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0UiPkNvbnN0YW50IEZpZWxkIFZhbHVlczwvQT48L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iSVdFQl9TRVJWSUNFX19JTVBMRU1FTlRBVElPTiI+PCEtLSAtLT48L0E+PEgzPgotSVdFQl9TRVJWSUNFX19JTVBMRU1FTlRBVElPTjwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIGludCA8Qj5JV0VCX1NFUlZJQ0VfX0lNUExFTUVOVEFUSU9OPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBsZW1lbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnN0YW50LXZhbHVlcy5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX0lNUExFTUVOVEFUSU9OIj5Db25zdGFudCBGaWVsZCBWYWx1ZXM8L0E+PC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IklXRUJfU0VSVklDRV9fTkFNRSI+PCEtLSAtLT48L0E+PEgzPgotSVdFQl9TRVJWSUNFX19OQU1FPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgaW50IDxCPklXRUJfU0VSVklDRV9fTkFNRTwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnN0YW50LXZhbHVlcy5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX05BTUUiPkNvbnN0YW50IEZpZWxkIFZhbHVlczwvQT48L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iSVdFQl9TRVJWSUNFX19TRVJWSUNFX0VORFBPSU5UIj48IS0tIC0tPjwvQT48SDM+Ci1JV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQ8L0gzPgotPFBSRT4KLXN0YXRpYyBmaW5hbCBpbnQgPEI+SVdFQl9TRVJWSUNFX19TRVJWSUNFX0VORFBPSU5UPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIEVuZHBvaW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29uc3RhbnQtdmFsdWVzLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlLklXRUJfU0VSVklDRV9fU0VSVklDRV9FTkRQT0lOVCI+Q29uc3RhbnQgRmllbGQgVmFsdWVzPC9BPjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJJV0VCX1NFUlZJQ0VfX1RBUkdFVF9OQU1FU1BBQ0UiPjwhLS0gLS0+PC9BPjxIMz4KLUlXRUJfU0VSVklDRV9fVEFSR0VUX05BTUVTUEFDRTwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIGludCA8Qj5JV0VCX1NFUlZJQ0VfX1RBUkdFVF9OQU1FU1BBQ0U8L0I+PC9QUkU+Ci08REw+Ci08REQ+VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBOYW1lc3BhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb25zdGFudC12YWx1ZXMuaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19UQVJHRVRfTkFNRVNQQUNFIj5Db25zdGFudCBGaWVsZCBWYWx1ZXM8L0E+PC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IklXRUJfU0VSVklDRV9fUE9SVF9OQU1FIj48IS0tIC0tPjwvQT48SDM+Ci1JV0VCX1NFUlZJQ0VfX1BPUlRfTkFNRTwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIGludCA8Qj5JV0VCX1NFUlZJQ0VfX1BPUlRfTkFNRTwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9ydCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29uc3RhbnQtdmFsdWVzLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlLklXRUJfU0VSVklDRV9fUE9SVF9OQU1FIj5Db25zdGFudCBGaWVsZCBWYWx1ZXM8L0E+PC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IklXRUJfU0VSVklDRV9fV1NETF9MT0NBVElPTiI+PCEtLSAtLT48L0E+PEgzPgotSVdFQl9TRVJWSUNFX19XU0RMX0xPQ0FUSU9OPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgaW50IDxCPklXRUJfU0VSVklDRV9fV1NETF9MT0NBVElPTjwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBMb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnN0YW50LXZhbHVlcy5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1dTRExfTE9DQVRJT04iPkNvbnN0YW50IEZpZWxkIFZhbHVlczwvQT48L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iSVdFQl9TRVJWSUNFX0ZFQVRVUkVfQ09VTlQiPjwhLS0gLS0+PC9BPjxIMz4KLUlXRUJfU0VSVklDRV9GRUFUVVJFX0NPVU5UPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgaW50IDxCPklXRUJfU0VSVklDRV9GRUFUVVJFX0NPVU5UPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JV2ViIFNlcnZpY2U8L2VtPicgY2xhc3MuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29uc3RhbnQtdmFsdWVzLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlLklXRUJfU0VSVklDRV9GRUFUVVJFX0NPVU5UIj5Db25zdGFudCBGaWVsZCBWYWx1ZXM8L0E+PC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IklXRUJfU0VSVklDRV9QUk9KRUNUIj48IS0tIC0tPjwvQT48SDM+Ci1JV0VCX1NFUlZJQ0VfUFJPSkVDVDwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIGludCA8Qj5JV0VCX1NFUlZJQ0VfUFJPSkVDVDwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPENPREU+PGVtPklXZWIgU2VydmljZSBQcm9qZWN0PC9lbT48L0NPREU+JyBjbGFzcy4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48Q09ERT5JV2ViU2VydmljZVByb2plY3RJbXBsPC9DT0RFPiwgCi08Q09ERT5Eb21QYWNrYWdlSW1wbC5nZXRJV2ViU2VydmljZVByb2plY3QoKTwvQ09ERT4sIAotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29uc3RhbnQtdmFsdWVzLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlLklXRUJfU0VSVklDRV9QUk9KRUNUIj5Db25zdGFudCBGaWVsZCBWYWx1ZXM8L0E+PC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IklXRUJfU0VSVklDRV9QUk9KRUNUX19XRUJfU0VSVklDRVMiPjwhLS0gLS0+PC9BPjxIMz4KLUlXRUJfU0VSVklDRV9QUk9KRUNUX19XRUJfU0VSVklDRVM8L0gzPgotPFBSRT4KLXN0YXRpYyBmaW5hbCBpbnQgPEI+SVdFQl9TRVJWSUNFX1BST0pFQ1RfX1dFQl9TRVJWSUNFUzwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2ViIFNlcnZpY2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb25zdGFudC12YWx1ZXMuaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX1dFQl9TRVJWSUNFUyI+Q29uc3RhbnQgRmllbGQgVmFsdWVzPC9BPjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJJV0VCX1NFUlZJQ0VfUFJPSkVDVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VTIj48IS0tIC0tPjwvQT48SDM+Ci1JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VTPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgaW50IDxCPklXRUJfU0VSVklDRV9QUk9KRUNUX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRVM8L0I+PC9QUkU+Ci08REw+Ci08REQ+VGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29uc3RhbnQtdmFsdWVzLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlLklXRUJfU0VSVklDRV9QUk9KRUNUX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRVMiPkNvbnN0YW50IEZpZWxkIFZhbHVlczwvQT48L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iSVdFQl9TRVJWSUNFX1BST0pFQ1RfX05BTUUiPjwhLS0gLS0+PC9BPjxIMz4KLUlXRUJfU0VSVklDRV9QUk9KRUNUX19OQU1FPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgaW50IDxCPklXRUJfU0VSVklDRV9QUk9KRUNUX19OQU1FPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29uc3RhbnQtdmFsdWVzLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlLklXRUJfU0VSVklDRV9QUk9KRUNUX19OQU1FIj5Db25zdGFudCBGaWVsZCBWYWx1ZXM8L0E+PC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IklXRUJfU0VSVklDRV9QUk9KRUNUX0ZFQVRVUkVfQ09VTlQiPjwhLS0gLS0+PC9BPjxIMz4KLUlXRUJfU0VSVklDRV9QUk9KRUNUX0ZFQVRVUkVfQ09VTlQ8L0gzPgotPFBSRT4KLXN0YXRpYyBmaW5hbCBpbnQgPEI+SVdFQl9TRVJWSUNFX1BST0pFQ1RfRkVBVFVSRV9DT1VOVDwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SVdlYiBTZXJ2aWNlIFByb2plY3Q8L2VtPicgY2xhc3MuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29uc3RhbnQtdmFsdWVzLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlLklXRUJfU0VSVklDRV9QUk9KRUNUX0ZFQVRVUkVfQ09VTlQiPkNvbnN0YW50IEZpZWxkIFZhbHVlczwvQT48L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iSVdFQl9UWVBFIj48IS0tIC0tPjwvQT48SDM+Ci1JV0VCX1RZUEU8L0gzPgotPFBSRT4KLXN0YXRpYyBmaW5hbCBpbnQgPEI+SVdFQl9UWVBFPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8Q09ERT48ZW0+SVdlYiBUeXBlPC9lbT48L0NPREU+JyBjbGFzcy4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48Q09ERT5JV2ViVHlwZUltcGw8L0NPREU+LCAKLTxDT0RFPkRvbVBhY2thZ2VJbXBsLmdldElXZWJUeXBlKCk8L0NPREU+LCAKLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnN0YW50LXZhbHVlcy5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZS5JV0VCX1RZUEUiPkNvbnN0YW50IEZpZWxkIFZhbHVlczwvQT48L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iSVdFQl9UWVBFX19JTVBMRU1FTlRBVElPTiI+PCEtLSAtLT48L0E+PEgzPgotSVdFQl9UWVBFX19JTVBMRU1FTlRBVElPTjwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIGludCA8Qj5JV0VCX1RZUEVfX0lNUExFTUVOVEFUSU9OPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBsZW1lbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnN0YW50LXZhbHVlcy5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZS5JV0VCX1RZUEVfX0lNUExFTUVOVEFUSU9OIj5Db25zdGFudCBGaWVsZCBWYWx1ZXM8L0E+PC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IklXRUJfVFlQRV9fTkFNRSI+PCEtLSAtLT48L0E+PEgzPgotSVdFQl9UWVBFX19OQU1FPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgaW50IDxCPklXRUJfVFlQRV9fTkFNRTwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnN0YW50LXZhbHVlcy5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZS5JV0VCX1RZUEVfX05BTUUiPkNvbnN0YW50IEZpZWxkIFZhbHVlczwvQT48L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iSVdFQl9UWVBFX0ZFQVRVUkVfQ09VTlQiPjwhLS0gLS0+PC9BPjxIMz4KLUlXRUJfVFlQRV9GRUFUVVJFX0NPVU5UPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgaW50IDxCPklXRUJfVFlQRV9GRUFUVVJFX0NPVU5UPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JV2ViIFR5cGU8L2VtPicgY2xhc3MuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29uc3RhbnQtdmFsdWVzLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlLklXRUJfVFlQRV9GRUFUVVJFX0NPVU5UIj5Db25zdGFudCBGaWVsZCBWYWx1ZXM8L0E+PC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IldFQl9QQVJBTV9LSU5EIj48IS0tIC0tPjwvQT48SDM+Ci1XRUJfUEFSQU1fS0lORDwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIGludCA8Qj5XRUJfUEFSQU1fS0lORDwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PENPREU+PGVtPldlYiBQYXJhbSBLaW5kPC9lbT48L0NPREU+PC9BPicgZW51bS4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT5XZWJQYXJhbUtpbmQ8L0NPREU+PC9BPiwgCi08Q09ERT5Eb21QYWNrYWdlSW1wbC5nZXRXZWJQYXJhbUtpbmQoKTwvQ09ERT4sIAotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29uc3RhbnQtdmFsdWVzLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlLldFQl9QQVJBTV9LSU5EIj5Db25zdGFudCBGaWVsZCBWYWx1ZXM8L0E+PC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IlNPQVBfQklORElOR19TVFlMRSI+PCEtLSAtLT48L0E+PEgzPgotU09BUF9CSU5ESU5HX1NUWUxFPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgaW50IDxCPlNPQVBfQklORElOR19TVFlMRTwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxDT0RFPjxlbT5TT0FQIEJpbmRpbmcgU3R5bGU8L2VtPjwvQ09ERT48L0E+JyBlbnVtLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT5TT0FQQmluZGluZ1N0eWxlPC9DT0RFPjwvQT4sIAotPENPREU+RG9tUGFja2FnZUltcGwuZ2V0U09BUEJpbmRpbmdTdHlsZSgpPC9DT0RFPiwgCi08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb25zdGFudC12YWx1ZXMuaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuU09BUF9CSU5ESU5HX1NUWUxFIj5Db25zdGFudCBGaWVsZCBWYWx1ZXM8L0E+PC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IlNPQVBfQklORElOR19VU0UiPjwhLS0gLS0+PC9BPjxIMz4KLVNPQVBfQklORElOR19VU0U8L0gzPgotPFBSRT4KLXN0YXRpYyBmaW5hbCBpbnQgPEI+U09BUF9CSU5ESU5HX1VTRTwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT48ZW0+U09BUCBCaW5kaW5nIFVzZTwvZW0+PC9DT0RFPjwvQT4nIGVudW0uCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT5TT0FQQmluZGluZ1VzZTwvQ09ERT48L0E+LCAKLTxDT0RFPkRvbVBhY2thZ2VJbXBsLmdldFNPQVBCaW5kaW5nVXNlKCk8L0NPREU+LCAKLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnN0YW50LXZhbHVlcy5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZS5TT0FQX0JJTkRJTkdfVVNFIj5Db25zdGFudCBGaWVsZCBWYWx1ZXM8L0E+PC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IlNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEUiPjwhLS0gLS0+PC9BPjxIMz4KLVNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEU8L0gzPgotPFBSRT4KLXN0YXRpYyBmaW5hbCBpbnQgPEI+U09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRTwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxDT0RFPjxlbT5TT0FQIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT48L0NPREU+PC9BPicgZW51bS4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PENPREU+U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTwvQ09ERT48L0E+LCAKLTxDT0RFPkRvbVBhY2thZ2VJbXBsLmdldFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKTwvQ09ERT4sIAotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29uc3RhbnQtdmFsdWVzLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlLlNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEUiPkNvbnN0YW50IEZpZWxkIFZhbHVlczwvQT48L0RMPgotPC9ETD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJnZXRJRE9NKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldElET008L0gzPgotPFBSRT4KLW9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3MgPEI+Z2V0SURPTTwvQj4oKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JRE9NLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PENPREU+PGVtPklET008L2VtPjwvQ09ERT48L0E+Jy4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JRE9NPC9lbT4nLjxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSURPTS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxDT0RFPklET008L0NPREU+PC9BPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0SURPTV9XZWJTZXJ2aWNlUHJvamVjdHMoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0SURPTV9XZWJTZXJ2aWNlUHJvamVjdHM8L0gzPgotPFBSRT4KLW9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlIDxCPmdldElET01fV2ViU2VydmljZVByb2plY3RzPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JRE9NLmh0bWwjZ2V0V2ViU2VydmljZVByb2plY3RzKCkiPjxDT0RFPjxlbT5XZWIgU2VydmljZSBQcm9qZWN0czwvZW0+PC9DT0RFPjwvQT4nLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5XZWIgU2VydmljZSBQcm9qZWN0czwvZW0+Jy48RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lET00uaHRtbCNnZXRXZWJTZXJ2aWNlUHJvamVjdHMoKSI+PENPREU+SURPTS5nZXRXZWJTZXJ2aWNlUHJvamVjdHMoKTwvQ09ERT48L0E+LCAKLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI2dldElET00oKSI+PENPREU+Z2V0SURPTSgpPC9DT0RFPjwvQT48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldElKYXZhV2ViU2VydmljZUVsZW1lbnQoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudDwvSDM+Ci08UFJFPgotb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzcyA8Qj5nZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50PC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT48ZW0+SUphdmEgV2ViIFNlcnZpY2UgRWxlbWVudDwvZW0+PC9DT0RFPjwvQT4nLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklKYXZhIFdlYiBTZXJ2aWNlIEVsZW1lbnQ8L2VtPicuPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JSmF2YVdlYlNlcnZpY2VFbGVtZW50Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PENPREU+SUphdmFXZWJTZXJ2aWNlRWxlbWVudDwvQ09ERT48L0E+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50X0ltcGxlbWVudGF0aW9uKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldElKYXZhV2ViU2VydmljZUVsZW1lbnRfSW1wbGVtZW50YXRpb248L0gzPgotPFBSRT4KLW9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlIDxCPmdldElKYXZhV2ViU2VydmljZUVsZW1lbnRfSW1wbGVtZW50YXRpb248L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JSmF2YVdlYlNlcnZpY2VFbGVtZW50Lmh0bWwjZ2V0SW1wbGVtZW50YXRpb24oKSI+PENPREU+PGVtPkltcGxlbWVudGF0aW9uPC9lbT48L0NPREU+PC9BPicuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JbXBsZW1lbnRhdGlvbjwvZW0+Jy48RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuaHRtbCNnZXRJbXBsZW1lbnRhdGlvbigpIj48Q09ERT5JSmF2YVdlYlNlcnZpY2VFbGVtZW50LmdldEltcGxlbWVudGF0aW9uKCk8L0NPREU+PC9BPiwgCi08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNnZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50KCkiPjxDT0RFPmdldElKYXZhV2ViU2VydmljZUVsZW1lbnQoKTwvQ09ERT48L0E+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50X05hbWUoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudF9OYW1lPC9IMz4KLTxQUkU+Ci1vcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZSA8Qj5nZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50X05hbWU8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JSmF2YVdlYlNlcnZpY2VFbGVtZW50Lmh0bWwjZ2V0TmFtZSgpIj48Q09ERT48ZW0+TmFtZTwvZW0+PC9DT0RFPjwvQT4nLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy48RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuaHRtbCNnZXROYW1lKCkiPjxDT0RFPklKYXZhV2ViU2VydmljZUVsZW1lbnQuZ2V0TmFtZSgpPC9DT0RFPjwvQT4sIAotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudCgpIj48Q09ERT5nZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50KCk8L0NPREU+PC9BPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9IMz4KLTxQUkU+Ci1vcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzIDxCPmdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxDT0RFPjxlbT5JU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPjwvQ09ERT48L0E+Jy4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPicuPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PENPREU+SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvQ09ERT48L0E+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX0ltcGxpY2l0KCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfSW1wbGljaXQ8L0gzPgotPFBSRT4KLW9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlIDxCPmdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfSW1wbGljaXQ8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwjaXNJbXBsaWNpdCgpIj48Q09ERT48ZW0+SW1wbGljaXQ8L2VtPjwvQ09ERT48L0E+Jy4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkltcGxpY2l0PC9lbT4nLjxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sI2lzSW1wbGljaXQoKSI+PENPREU+SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5pc0ltcGxpY2l0KCk8L0NPREU+PC9BPiwgCi08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkiPjxDT0RFPmdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTwvQ09ERT48L0E+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX0ltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfSW1wbGVtZW50aW5nV2ViU2VydmljZXM8L0gzPgotPFBSRT4KLW9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlIDxCPmdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfSW1wbGVtZW50aW5nV2ViU2VydmljZXM8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCNnZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpIj48Q09ERT48ZW0+SW1wbGVtZW50aW5nIFdlYiBTZXJ2aWNlczwvZW0+PC9DT0RFPjwvQT4nLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5JbXBsZW1lbnRpbmcgV2ViIFNlcnZpY2VzPC9lbT4nLjxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sI2dldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkiPjxDT0RFPklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKTwvQ09ERT48L0E+LCAKLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI2dldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSI+PENPREU+Z2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpPC9DT0RFPjwvQT48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfV2ViTWV0aG9kcygpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1dlYk1ldGhvZHM8L0gzPgotPFBSRT4KLW9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlIDxCPmdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfV2ViTWV0aG9kczwvQj4oKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sI2dldFdlYk1ldGhvZHMoKSI+PENPREU+PGVtPldlYiBNZXRob2RzPC9lbT48L0NPREU+PC9BPicuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPldlYiBNZXRob2RzPC9lbT4nLjxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sI2dldFdlYk1ldGhvZHMoKSI+PENPREU+SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5nZXRXZWJNZXRob2RzKCk8L0NPREU+PC9BPiwgCi08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkiPjxDT0RFPmdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTwvQ09ERT48L0E+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1RhcmdldE5hbWVzcGFjZSgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1RhcmdldE5hbWVzcGFjZTwvSDM+Ci08UFJFPgotb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGUgPEI+Z2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9UYXJnZXROYW1lc3BhY2U8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkiPjxDT0RFPjxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT48L0NPREU+PC9BPicuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT4nLjxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sI2dldFRhcmdldE5hbWVzcGFjZSgpIj48Q09ERT5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmdldFRhcmdldE5hbWVzcGFjZSgpPC9DT0RFPjwvQT4sIAotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpIj48Q09ERT5nZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk8L0NPREU+PC9BPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1N0eWxlKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfU29hcEJpbmRpbmdTdHlsZTwvSDM+Ci08UFJFPgotb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGUgPEI+Z2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1N0eWxlPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sI2dldFNvYXBCaW5kaW5nU3R5bGUoKSI+PENPREU+PGVtPlNvYXAgQmluZGluZyBTdHlsZTwvZW0+PC9DT0RFPjwvQT4nLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT4nLjxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sI2dldFNvYXBCaW5kaW5nU3R5bGUoKSI+PENPREU+SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5nZXRTb2FwQmluZGluZ1N0eWxlKCk8L0NPREU+PC9BPiwgCi08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkiPjxDT0RFPmdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTwvQ09ERT48L0E+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1NvYXBCaW5kaW5nVXNlKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfU29hcEJpbmRpbmdVc2U8L0gzPgotPFBSRT4KLW9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlIDxCPmdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfU29hcEJpbmRpbmdVc2U8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwjZ2V0U29hcEJpbmRpbmdVc2UoKSI+PENPREU+PGVtPlNvYXAgQmluZGluZyBVc2U8L2VtPjwvQ09ERT48L0E+Jy4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNvYXAgQmluZGluZyBVc2U8L2VtPicuPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwjZ2V0U29hcEJpbmRpbmdVc2UoKSI+PENPREU+SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5nZXRTb2FwQmluZGluZ1VzZSgpPC9DT0RFPjwvQT4sIAotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpIj48Q09ERT5nZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk8L0NPREU+PC9BPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfU29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTwvSDM+Ci08UFJFPgotb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGUgPEI+Z2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sI2dldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSI+PENPREU+PGVtPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPjwvQ09ERT48L0E+Jy4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPicuPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwjZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpIj48Q09ERT5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKTwvQ09ERT48L0E+LCAKLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI2dldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSI+PENPREU+Z2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpPC9DT0RFPjwvQT48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldElXZWJNZXRob2QoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0SVdlYk1ldGhvZDwvSDM+Ci08UFJFPgotb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzcyA8Qj5nZXRJV2ViTWV0aG9kPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT48ZW0+SVdlYiBNZXRob2Q8L2VtPjwvQ09ERT48L0E+Jy4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JV2ViIE1ldGhvZDwvZW0+Jy48RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT5JV2ViTWV0aG9kPC9DT0RFPjwvQT48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldElXZWJNZXRob2RfUGFyYW1ldGVycygpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRJV2ViTWV0aG9kX1BhcmFtZXRlcnM8L0gzPgotPFBSRT4KLW9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlIDxCPmdldElXZWJNZXRob2RfUGFyYW1ldGVyczwvQj4oKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sI2dldFBhcmFtZXRlcnMoKSI+PENPREU+PGVtPlBhcmFtZXRlcnM8L2VtPjwvQ09ERT48L0E+Jy4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UGFyYW1ldGVyczwvZW0+Jy48RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCNnZXRQYXJhbWV0ZXJzKCkiPjxDT0RFPklXZWJNZXRob2QuZ2V0UGFyYW1ldGVycygpPC9DT0RFPjwvQT4sIAotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SVdlYk1ldGhvZCgpIj48Q09ERT5nZXRJV2ViTWV0aG9kKCk8L0NPREU+PC9BPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0SVdlYk1ldGhvZF9FeGNsdWRlZCgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRJV2ViTWV0aG9kX0V4Y2x1ZGVkPC9IMz4KLTxQUkU+Ci1vcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZSA8Qj5nZXRJV2ViTWV0aG9kX0V4Y2x1ZGVkPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sI2lzRXhjbHVkZWQoKSI+PENPREU+PGVtPkV4Y2x1ZGVkPC9lbT48L0NPREU+PC9BPicuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeGNsdWRlZDwvZW0+Jy48RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCNpc0V4Y2x1ZGVkKCkiPjxDT0RFPklXZWJNZXRob2QuaXNFeGNsdWRlZCgpPC9DT0RFPjwvQT4sIAotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SVdlYk1ldGhvZCgpIj48Q09ERT5nZXRJV2ViTWV0aG9kKCk8L0NPREU+PC9BPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0SVdlYk1ldGhvZF9Tb2FwQmluZGluZ1N0eWxlKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldElXZWJNZXRob2RfU29hcEJpbmRpbmdTdHlsZTwvSDM+Ci08UFJFPgotb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGUgPEI+Z2V0SVdlYk1ldGhvZF9Tb2FwQmluZGluZ1N0eWxlPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sI2dldFNvYXBCaW5kaW5nU3R5bGUoKSI+PENPREU+PGVtPlNvYXAgQmluZGluZyBTdHlsZTwvZW0+PC9DT0RFPjwvQT4nLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT4nLjxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sI2dldFNvYXBCaW5kaW5nU3R5bGUoKSI+PENPREU+SVdlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1N0eWxlKCk8L0NPREU+PC9BPiwgCi08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNnZXRJV2ViTWV0aG9kKCkiPjxDT0RFPmdldElXZWJNZXRob2QoKTwvQ09ERT48L0E+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRJV2ViTWV0aG9kX1NvYXBCaW5kaW5nVXNlKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldElXZWJNZXRob2RfU29hcEJpbmRpbmdVc2U8L0gzPgotPFBSRT4KLW9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlIDxCPmdldElXZWJNZXRob2RfU29hcEJpbmRpbmdVc2U8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmh0bWwjZ2V0U29hcEJpbmRpbmdVc2UoKSI+PENPREU+PGVtPlNvYXAgQmluZGluZyBVc2U8L2VtPjwvQ09ERT48L0E+Jy4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNvYXAgQmluZGluZyBVc2U8L2VtPicuPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmh0bWwjZ2V0U29hcEJpbmRpbmdVc2UoKSI+PENPREU+SVdlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1VzZSgpPC9DT0RFPjwvQT4sIAotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SVdlYk1ldGhvZCgpIj48Q09ERT5nZXRJV2ViTWV0aG9kKCk8L0NPREU+PC9BPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0SVdlYk1ldGhvZF9Tb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldElXZWJNZXRob2RfU29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTwvSDM+Ci08UFJFPgotb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGUgPEI+Z2V0SVdlYk1ldGhvZF9Tb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sI2dldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSI+PENPREU+PGVtPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPjwvQ09ERT48L0E+Jy4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPicuPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmh0bWwjZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpIj48Q09ERT5JV2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKTwvQ09ERT48L0E+LCAKLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI2dldElXZWJNZXRob2QoKSI+PENPREU+Z2V0SVdlYk1ldGhvZCgpPC9DT0RFPjwvQT48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldElXZWJQYXJhbSgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRJV2ViUGFyYW08L0gzPgotPFBSRT4KLW9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3MgPEI+Z2V0SVdlYlBhcmFtPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxDT0RFPjxlbT5JV2ViIFBhcmFtPC9lbT48L0NPREU+PC9BPicuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SVdlYiBQYXJhbTwvZW0+Jy48RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxDT0RFPklXZWJQYXJhbTwvQ09ERT48L0E+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRJV2ViUGFyYW1fS2luZCgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRJV2ViUGFyYW1fS2luZDwvSDM+Ci08UFJFPgotb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGUgPEI+Z2V0SVdlYlBhcmFtX0tpbmQ8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCNnZXRLaW5kKCkiPjxDT0RFPjxlbT5LaW5kPC9lbT48L0NPREU+PC9BPicuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5LaW5kPC9lbT4nLjxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwjZ2V0S2luZCgpIj48Q09ERT5JV2ViUGFyYW0uZ2V0S2luZCgpPC9DT0RFPjwvQT4sIAotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SVdlYlBhcmFtKCkiPjxDT0RFPmdldElXZWJQYXJhbSgpPC9DT0RFPjwvQT48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldElXZWJQYXJhbV9UeXBlTmFtZSgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRJV2ViUGFyYW1fVHlwZU5hbWU8L0gzPgotPFBSRT4KLW9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlIDxCPmdldElXZWJQYXJhbV9UeXBlTmFtZTwvQj4oKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sI2dldFR5cGVOYW1lKCkiPjxDT0RFPjxlbT5UeXBlIE5hbWU8L2VtPjwvQ09ERT48L0E+Jy4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGUgTmFtZTwvZW0+Jy48RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sI2dldFR5cGVOYW1lKCkiPjxDT0RFPklXZWJQYXJhbS5nZXRUeXBlTmFtZSgpPC9DT0RFPjwvQT4sIAotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SVdlYlBhcmFtKCkiPjxDT0RFPmdldElXZWJQYXJhbSgpPC9DT0RFPjwvQT48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldElXZWJQYXJhbV9QYXJ0TmFtZSgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRJV2ViUGFyYW1fUGFydE5hbWU8L0gzPgotPFBSRT4KLW9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlIDxCPmdldElXZWJQYXJhbV9QYXJ0TmFtZTwvQj4oKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sI2dldFBhcnROYW1lKCkiPjxDT0RFPjxlbT5QYXJ0IE5hbWU8L2VtPjwvQ09ERT48L0E+Jy4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBhcnQgTmFtZTwvZW0+Jy48RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sI2dldFBhcnROYW1lKCkiPjxDT0RFPklXZWJQYXJhbS5nZXRQYXJ0TmFtZSgpPC9DT0RFPjwvQT4sIAotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SVdlYlBhcmFtKCkiPjxDT0RFPmdldElXZWJQYXJhbSgpPC9DT0RFPjwvQT48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldElXZWJQYXJhbV9UYXJnZXROYW1lc3BhY2UoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0SVdlYlBhcmFtX1RhcmdldE5hbWVzcGFjZTwvSDM+Ci08UFJFPgotb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGUgPEI+Z2V0SVdlYlBhcmFtX1RhcmdldE5hbWVzcGFjZTwvQj4oKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sI2dldFRhcmdldE5hbWVzcGFjZSgpIj48Q09ERT48ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+PC9DT0RFPjwvQT4nLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+Jy48RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sI2dldFRhcmdldE5hbWVzcGFjZSgpIj48Q09ERT5JV2ViUGFyYW0uZ2V0VGFyZ2V0TmFtZXNwYWNlKCk8L0NPREU+PC9BPiwgCi08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNnZXRJV2ViUGFyYW0oKSI+PENPREU+Z2V0SVdlYlBhcmFtKCk8L0NPREU+PC9BPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0SVdlYlBhcmFtX0hlYWRlcigpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRJV2ViUGFyYW1fSGVhZGVyPC9IMz4KLTxQUkU+Ci1vcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZSA8Qj5nZXRJV2ViUGFyYW1fSGVhZGVyPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwjaXNIZWFkZXIoKSI+PENPREU+PGVtPkhlYWRlcjwvZW0+PC9DT0RFPjwvQT4nLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SGVhZGVyPC9lbT4nLjxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwjaXNIZWFkZXIoKSI+PENPREU+SVdlYlBhcmFtLmlzSGVhZGVyKCk8L0NPREU+PC9BPiwgCi08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNnZXRJV2ViUGFyYW0oKSI+PENPREU+Z2V0SVdlYlBhcmFtKCk8L0NPREU+PC9BPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0SVdlYlNlcnZpY2UoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0SVdlYlNlcnZpY2U8L0gzPgotPFBSRT4KLW9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3MgPEI+Z2V0SVdlYlNlcnZpY2U8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT48ZW0+SVdlYiBTZXJ2aWNlPC9lbT48L0NPREU+PC9BPicuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SVdlYiBTZXJ2aWNlPC9lbT4nLjxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT5JV2ViU2VydmljZTwvQ09ERT48L0E+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRJV2ViU2VydmljZV9TZXJ2aWNlRW5kcG9pbnQoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0SVdlYlNlcnZpY2VfU2VydmljZUVuZHBvaW50PC9IMz4KLTxQUkU+Ci1vcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZSA8Qj5nZXRJV2ViU2VydmljZV9TZXJ2aWNlRW5kcG9pbnQ8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sI2dldFNlcnZpY2VFbmRwb2ludCgpIj48Q09ERT48ZW0+U2VydmljZSBFbmRwb2ludDwvZW0+PC9DT0RFPjwvQT4nLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+U2VydmljZSBFbmRwb2ludDwvZW0+Jy48RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwjZ2V0U2VydmljZUVuZHBvaW50KCkiPjxDT0RFPklXZWJTZXJ2aWNlLmdldFNlcnZpY2VFbmRwb2ludCgpPC9DT0RFPjwvQT4sIAotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SVdlYlNlcnZpY2UoKSI+PENPREU+Z2V0SVdlYlNlcnZpY2UoKTwvQ09ERT48L0E+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRJV2ViU2VydmljZV9UYXJnZXROYW1lc3BhY2UoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0SVdlYlNlcnZpY2VfVGFyZ2V0TmFtZXNwYWNlPC9IMz4KLTxQUkU+Ci1vcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZSA8Qj5nZXRJV2ViU2VydmljZV9UYXJnZXROYW1lc3BhY2U8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sI2dldFRhcmdldE5hbWVzcGFjZSgpIj48Q09ERT48ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+PC9DT0RFPjwvQT4nLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+Jy48RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkiPjxDT0RFPklXZWJTZXJ2aWNlLmdldFRhcmdldE5hbWVzcGFjZSgpPC9DT0RFPjwvQT4sIAotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SVdlYlNlcnZpY2UoKSI+PENPREU+Z2V0SVdlYlNlcnZpY2UoKTwvQ09ERT48L0E+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRJV2ViU2VydmljZV9Qb3J0TmFtZSgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRJV2ViU2VydmljZV9Qb3J0TmFtZTwvSDM+Ci08UFJFPgotb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGUgPEI+Z2V0SVdlYlNlcnZpY2VfUG9ydE5hbWU8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sI2dldFBvcnROYW1lKCkiPjxDT0RFPjxlbT5Qb3J0IE5hbWU8L2VtPjwvQ09ERT48L0E+Jy4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBvcnQgTmFtZTwvZW0+Jy48RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwjZ2V0UG9ydE5hbWUoKSI+PENPREU+SVdlYlNlcnZpY2UuZ2V0UG9ydE5hbWUoKTwvQ09ERT48L0E+LCAKLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI2dldElXZWJTZXJ2aWNlKCkiPjxDT0RFPmdldElXZWJTZXJ2aWNlKCk8L0NPREU+PC9BPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0SVdlYlNlcnZpY2VfV3NkbExvY2F0aW9uKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldElXZWJTZXJ2aWNlX1dzZGxMb2NhdGlvbjwvSDM+Ci08UFJFPgotb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGUgPEI+Z2V0SVdlYlNlcnZpY2VfV3NkbExvY2F0aW9uPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2UuaHRtbCNnZXRXc2RsTG9jYXRpb24oKSI+PENPREU+PGVtPldzZGwgTG9jYXRpb248L2VtPjwvQ09ERT48L0E+Jy4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldzZGwgTG9jYXRpb248L2VtPicuPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sI2dldFdzZGxMb2NhdGlvbigpIj48Q09ERT5JV2ViU2VydmljZS5nZXRXc2RsTG9jYXRpb24oKTwvQ09ERT48L0E+LCAKLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI2dldElXZWJTZXJ2aWNlKCkiPjxDT0RFPmdldElXZWJTZXJ2aWNlKCk8L0NPREU+PC9BPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0SVdlYlNlcnZpY2VQcm9qZWN0KCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldElXZWJTZXJ2aWNlUHJvamVjdDwvSDM+Ci08UFJFPgotb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzcyA8Qj5nZXRJV2ViU2VydmljZVByb2plY3Q8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PENPREU+PGVtPklXZWIgU2VydmljZSBQcm9qZWN0PC9lbT48L0NPREU+PC9BPicuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SVdlYiBTZXJ2aWNlIFByb2plY3Q8L2VtPicuPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZVByb2plY3QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT5JV2ViU2VydmljZVByb2plY3Q8L0NPREU+PC9BPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0SVdlYlNlcnZpY2VQcm9qZWN0X1dlYlNlcnZpY2VzKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldElXZWJTZXJ2aWNlUHJvamVjdF9XZWJTZXJ2aWNlczwvSDM+Ci08UFJFPgotb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2UgPEI+Z2V0SVdlYlNlcnZpY2VQcm9qZWN0X1dlYlNlcnZpY2VzPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZVByb2plY3QuaHRtbCNnZXRXZWJTZXJ2aWNlcygpIj48Q09ERT48ZW0+V2ViIFNlcnZpY2VzPC9lbT48L0NPREU+PC9BPicuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPldlYiBTZXJ2aWNlczwvZW0+Jy48RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlUHJvamVjdC5odG1sI2dldFdlYlNlcnZpY2VzKCkiPjxDT0RFPklXZWJTZXJ2aWNlUHJvamVjdC5nZXRXZWJTZXJ2aWNlcygpPC9DT0RFPjwvQT4sIAotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SVdlYlNlcnZpY2VQcm9qZWN0KCkiPjxDT0RFPmdldElXZWJTZXJ2aWNlUHJvamVjdCgpPC9DT0RFPjwvQT48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldElXZWJTZXJ2aWNlUHJvamVjdF9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldElXZWJTZXJ2aWNlUHJvamVjdF9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzPC9IMz4KLTxQUkU+Ci1vcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZSA8Qj5nZXRJV2ViU2VydmljZVByb2plY3RfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlczwvQj4oKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpIj48Q09ERT48ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2VzPC9lbT48L0NPREU+PC9BPicuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlczwvZW0+Jy48RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlUHJvamVjdC5odG1sI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKSI+PENPREU+SVdlYlNlcnZpY2VQcm9qZWN0LmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKTwvQ09ERT48L0E+LCAKLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI2dldElXZWJTZXJ2aWNlUHJvamVjdCgpIj48Q09ERT5nZXRJV2ViU2VydmljZVByb2plY3QoKTwvQ09ERT48L0E+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRJV2ViU2VydmljZVByb2plY3RfTmFtZSgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRJV2ViU2VydmljZVByb2plY3RfTmFtZTwvSDM+Ci08UFJFPgotb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGUgPEI+Z2V0SVdlYlNlcnZpY2VQcm9qZWN0X05hbWU8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZVByb2plY3QuaHRtbCNnZXROYW1lKCkiPjxDT0RFPjxlbT5OYW1lPC9lbT48L0NPREU+PC9BPicuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLjxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwjZ2V0TmFtZSgpIj48Q09ERT5JV2ViU2VydmljZVByb2plY3QuZ2V0TmFtZSgpPC9DT0RFPjwvQT4sIAotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SVdlYlNlcnZpY2VQcm9qZWN0KCkiPjxDT0RFPmdldElXZWJTZXJ2aWNlUHJvamVjdCgpPC9DT0RFPjwvQT48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldElXZWJUeXBlKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldElXZWJUeXBlPC9IMz4KLTxQUkU+Ci1vcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzIDxCPmdldElXZWJUeXBlPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJUeXBlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PENPREU+PGVtPklXZWIgVHlwZTwvZW0+PC9DT0RFPjwvQT4nLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklXZWIgVHlwZTwvZW0+Jy48RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJUeXBlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PENPREU+SVdlYlR5cGU8L0NPREU+PC9BPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0V2ViUGFyYW1LaW5kKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFdlYlBhcmFtS2luZDwvSDM+Ci08UFJFPgotb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtIDxCPmdldFdlYlBhcmFtS2luZDwvQj4oKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT48ZW0+V2ViIFBhcmFtIEtpbmQ8L2VtPjwvQ09ERT48L0E+Jy4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPldlYiBQYXJhbSBLaW5kPC9lbT4nLjxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxDT0RFPldlYlBhcmFtS2luZDwvQ09ERT48L0E+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRTT0FQQmluZGluZ1N0eWxlKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFNPQVBCaW5kaW5nU3R5bGU8L0gzPgotPFBSRT4KLW9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bSA8Qj5nZXRTT0FQQmluZGluZ1N0eWxlPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT48ZW0+U09BUCBCaW5kaW5nIFN0eWxlPC9lbT48L0NPREU+PC9BPicuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5TT0FQIEJpbmRpbmcgU3R5bGU8L2VtPicuPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxDT0RFPlNPQVBCaW5kaW5nU3R5bGU8L0NPREU+PC9BPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0U09BUEJpbmRpbmdVc2UoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0U09BUEJpbmRpbmdVc2U8L0gzPgotPFBSRT4KLW9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bSA8Qj5nZXRTT0FQQmluZGluZ1VzZTwvQj4oKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxDT0RFPjxlbT5TT0FQIEJpbmRpbmcgVXNlPC9lbT48L0NPREU+PC9BPicuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5TT0FQIEJpbmRpbmcgVXNlPC9lbT4nLjxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PENPREU+U09BUEJpbmRpbmdVc2U8L0NPREU+PC9BPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlPC9IMz4KLTxQUkU+Ci1vcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW0gPEI+Z2V0U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTwvQj4oKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PENPREU+PGVtPlNPQVAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPjwvQ09ERT48L0E+Jy4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlNPQVAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPicuPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxDT0RFPlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU8L0NPREU+PC9BPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0RG9tRmFjdG9yeSgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXREb21GYWN0b3J5PC9IMz4KLTxQUkU+Ci08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbUZhY3RvcnkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21GYWN0b3J5PC9BPiA8Qj5nZXREb21GYWN0b3J5PC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuPC9ETD4KLTwvREQ+Ci08L0RMPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIENMQVNTIERBVEEgPT09PT09PT09IC0tPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9Eb21QYWNrYWdlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbUZhY3RvcnkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJEb21QYWNrYWdlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7PEEgSFJFRj0iI25lc3RlZF9jbGFzc19zdW1tYXJ5Ij5ORVNURUQ8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNmaWVsZF9zdW1tYXJ5Ij5GSUVMRDwvQT4mbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDs8QSBIUkVGPSIjZmllbGRfZGV0YWlsIj5GSUVMRDwvQT4mbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JRE9NLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSURPTS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjJhNTMwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JRE9NLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjU4OjEyIEJTVCAyMDEwIC0tPgotPFRJVExFPgotSURPTQotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMC0wNC0wNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IklET00iOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0lET00uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JSmF2YVdlYlNlcnZpY2VFbGVtZW50Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSURPTS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklET00uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTwhLS0gPT09PT09PT0gU1RBUlQgT0YgQ0xBU1MgREFUQSA9PT09PT09PSAtLT4KLTxIMj4KLTxGT05UIFNJWkU9Ii0xIj4KLW9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0ZPTlQ+Ci08QlI+Ci1JbnRlcmZhY2UgSURPTTwvSDI+Ci08REw+Ci08RFQ+PEI+QWxsIFN1cGVyaW50ZXJmYWNlczo8L0I+IDxERD5vcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI8L0REPgotPC9ETD4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBpbnRlcmZhY2UgPEI+SURPTTwvQj48RFQ+ZXh0ZW5kcyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDwvREw+Ci08L1BSRT4KLQotPFA+Ci08IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPklET008L2I+PC9lbT4nLgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCi0gPHA+Ci0gVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotIDx1bD4KLSAgIDxsaT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lET00uaHRtbCNnZXRXZWJTZXJ2aWNlUHJvamVjdHMoKSI+PENPREU+PGVtPldlYiBTZXJ2aWNlIFByb2plY3RzPC9lbT48L0NPREU+PC9BPjwvbGk+Ci0gPC91bD4KLSA8L3A+Ci08UD4KLQotPFA+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNnZXRJRE9NKCkiPjxDT0RFPkRvbVBhY2thZ2UuZ2V0SURPTSgpPC9DT0RFPjwvQT48L0RMPgotPEhSPgotCi08UD4KLQotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7b3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Jmx0OzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlNlcnZpY2VQcm9qZWN0PC9BPiZndDs8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JRE9NLmh0bWwjZ2V0V2ViU2VydmljZVByb2plY3RzKCkiPmdldFdlYlNlcnZpY2VQcm9qZWN0czwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldlYiBTZXJ2aWNlIFByb2plY3RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDs8QSBOQU1FPSJtZXRob2RzX2luaGVyaXRlZF9mcm9tX2NsYXNzX29yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q8L0I+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT5lQWxsQ29udGVudHMsIGVDbGFzcywgZUNvbnRhaW5lciwgZUNvbnRhaW5pbmdGZWF0dXJlLCBlQ29udGFpbm1lbnRGZWF0dXJlLCBlQ29udGVudHMsIGVDcm9zc1JlZmVyZW5jZXMsIGVHZXQsIGVHZXQsIGVJc1Byb3h5LCBlSXNTZXQsIGVSZXNvdXJjZSwgZVNldCwgZVVuc2V0PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3Nfb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXIiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGludGVyZmFjZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmVBZGFwdGVycywgZURlbGl2ZXIsIGVOb3RpZnksIGVTZXREZWxpdmVyPC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iZ2V0V2ViU2VydmljZVByb2plY3RzKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFdlYlNlcnZpY2VQcm9qZWN0czwvSDM+Ci08UFJFPgotb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Jmx0OzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlNlcnZpY2VQcm9qZWN0PC9BPiZndDsgPEI+Z2V0V2ViU2VydmljZVByb2plY3RzPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V2ViIFNlcnZpY2UgUHJvamVjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PENPREU+SVdlYlNlcnZpY2VQcm9qZWN0PC9DT0RFPjwvQT4uCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8cD4KLSBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5XZWIgU2VydmljZSBQcm9qZWN0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLSB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gPC9wPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XZWIgU2VydmljZSBQcm9qZWN0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC48RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNnZXRJRE9NX1dlYlNlcnZpY2VQcm9qZWN0cygpIj48Q09ERT5Eb21QYWNrYWdlLmdldElET01fV2ViU2VydmljZVByb2plY3RzKCk8L0NPREU+PC9BPjwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvSURPTS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JRE9NLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSURPTS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE0OTNhMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjgzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8xNCkgb24gV2VkIEFwciAwNyAwNzo1ODoxMiBCU1QgMjAxMCAtLT4KLTxUSVRMRT4KLUlKYXZhV2ViU2VydmljZUVsZW1lbnQKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTAtMDQtMDciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJJSmF2YVdlYlNlcnZpY2VFbGVtZW50IjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9JSmF2YVdlYlNlcnZpY2VFbGVtZW50Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lET00uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJSmF2YVdlYlNlcnZpY2VFbGVtZW50Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08IS0tID09PT09PT09IFNUQVJUIE9GIENMQVNTIERBVEEgPT09PT09PT0gLS0+Ci08SDI+Ci08Rk9OVCBTSVpFPSItMSI+Ci1vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpPC9GT05UPgotPEJSPgotSW50ZXJmYWNlIElKYXZhV2ViU2VydmljZUVsZW1lbnQ8L0gyPgotPERMPgotPERUPjxCPkFsbCBTdXBlcmludGVyZmFjZXM6PC9CPiA8REQ+b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyPC9ERD4KLTwvREw+Ci08REw+Ci08RFQ+PEI+QWxsIEtub3duIFN1YmludGVyZmFjZXM6PC9CPiA8REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJNZXRob2Q8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJQYXJhbTwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViU2VydmljZTwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlR5cGUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViVHlwZTwvQT48L0REPgotPC9ETD4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBpbnRlcmZhY2UgPEI+SUphdmFXZWJTZXJ2aWNlRWxlbWVudDwvQj48RFQ+ZXh0ZW5kcyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDwvREw+Ci08L1BSRT4KLQotPFA+Ci08SFI+Ci0KLTxQPgotCi08IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5odG1sI2dldEltcGxlbWVudGF0aW9uKCkiPmdldEltcGxlbWVudGF0aW9uPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEubGFuZy5TdHJpbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JSmF2YVdlYlNlcnZpY2VFbGVtZW50Lmh0bWwjZ2V0TmFtZSgpIj5nZXROYW1lPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JSmF2YVdlYlNlcnZpY2VFbGVtZW50Lmh0bWwjc2V0TmFtZShqYXZhLmxhbmcuU3RyaW5nKSI+c2V0TmFtZTwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDt2YWx1ZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1NldHMgdGhlIHZhbHVlIG9mIHRoZSAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JSmF2YVdlYlNlcnZpY2VFbGVtZW50Lmh0bWwjZ2V0TmFtZSgpIj48Q09ERT48ZW0+TmFtZTwvZW0+PC9DT0RFPjwvQT4nIGF0dHJpYnV0ZS48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDs8QSBOQU1FPSJtZXRob2RzX2luaGVyaXRlZF9mcm9tX2NsYXNzX29yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q8L0I+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT5lQWxsQ29udGVudHMsIGVDbGFzcywgZUNvbnRhaW5lciwgZUNvbnRhaW5pbmdGZWF0dXJlLCBlQ29udGFpbm1lbnRGZWF0dXJlLCBlQ29udGVudHMsIGVDcm9zc1JlZmVyZW5jZXMsIGVHZXQsIGVHZXQsIGVJc1Byb3h5LCBlSXNTZXQsIGVSZXNvdXJjZSwgZVNldCwgZVVuc2V0PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3Nfb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXIiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGludGVyZmFjZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmVBZGFwdGVycywgZURlbGl2ZXIsIGVOb3RpZnksIGVTZXREZWxpdmVyPC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iZ2V0SW1wbGVtZW50YXRpb24oKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0SW1wbGVtZW50YXRpb248L0gzPgotPFBSRT4KLWphdmEubGFuZy5TdHJpbmcgPEI+Z2V0SW1wbGVtZW50YXRpb248L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXROYW1lKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldE5hbWU8L0gzPgotPFBSRT4KLWphdmEubGFuZy5TdHJpbmcgPEI+Z2V0TmFtZTwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldE5hbWUoamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLXNldE5hbWU8L0gzPgotPFBSRT4KLXZvaWQgPEI+c2V0TmFtZTwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO3ZhbHVlKTwvUFJFPgotPERMPgotPEREPlNldHMgdGhlIHZhbHVlIG9mIHRoZSAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JSmF2YVdlYlNlcnZpY2VFbGVtZW50Lmh0bWwjZ2V0TmFtZSgpIj48Q09ERT48ZW0+TmFtZTwvZW0+PC9DT0RFPjwvQT4nIGF0dHJpYnV0ZS4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT52YWx1ZTwvQ09ERT4gLSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLjxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5odG1sI2dldE5hbWUoKSI+PENPREU+Z2V0TmFtZSgpPC9DT0RFPjwvQT48L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSURPTS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklKYXZhV2ViU2VydmljZUVsZW1lbnQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMTkxMTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUyNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMTQpIG9uIFdlZCBBcHIgMDcgMDc6NTg6MTIgQlNUIDIwMTAgLS0+Ci08VElUTEU+Ci1JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDEwLTA0LTA3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JSmF2YVdlYlNlcnZpY2VFbGVtZW50Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvRk9OVD4KLTxCUj4KLUludGVyZmFjZSBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9IMj4KLTxETD4KLTxEVD48Qj5BbGwgU3VwZXJpbnRlcmZhY2VzOjwvQj4gPEREPm9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JSmF2YVdlYlNlcnZpY2VFbGVtZW50PC9BPiwgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI8L0REPgotPC9ETD4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBpbnRlcmZhY2UgPEI+SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvQj48RFQ+ZXh0ZW5kcyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JSmF2YVdlYlNlcnZpY2VFbGVtZW50PC9BPjwvREw+Ci08L1BSRT4KLQotPFA+Ci08REw+Ci08RFQ+PEI+QXV0aG9yOjwvQj48L0RUPgotICA8REQ+SHJpc3RvIFNhYmV2PC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxQPgotCi08IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3QmbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJTZXJ2aWNlPC9BPiZndDs8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwjZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKSI+Z2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sI2dldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSI+Z2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nU3R5bGU8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sI2dldFNvYXBCaW5kaW5nU3R5bGUoKSI+Z2V0U29hcEJpbmRpbmdTdHlsZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nVXNlPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCNnZXRTb2FwQmluZGluZ1VzZSgpIj5nZXRTb2FwQmluZGluZ1VzZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBVc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCNnZXRUYXJnZXROYW1lc3BhY2UoKSI+Z2V0VGFyZ2V0TmFtZXNwYWNlPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO29yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdCZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViTWV0aG9kPC9BPiZndDs8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwjZ2V0V2ViTWV0aG9kcygpIj5nZXRXZWJNZXRob2RzPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwjaXNJbXBsaWNpdCgpIj5pc0ltcGxpY2l0PC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwjc2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZShvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUpIj5zZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU8L0E+Jm5ic3A7dmFsdWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sI2dldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSI+PENPREU+PGVtPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPjwvQ09ERT48L0E+JyBhdHRyaWJ1dGUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwjc2V0U29hcEJpbmRpbmdTdHlsZShvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGUpIj5zZXRTb2FwQmluZGluZ1N0eWxlPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nU3R5bGU8L0E+Jm5ic3A7dmFsdWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sI2dldFNvYXBCaW5kaW5nU3R5bGUoKSI+PENPREU+PGVtPlNvYXAgQmluZGluZyBTdHlsZTwvZW0+PC9DT0RFPjwvQT4nIGF0dHJpYnV0ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCNzZXRTb2FwQmluZGluZ1VzZShvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlKSI+c2V0U29hcEJpbmRpbmdVc2U8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nVXNlPC9BPiZuYnNwO3ZhbHVlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2V0cyB0aGUgdmFsdWUgb2YgdGhlICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCNnZXRTb2FwQmluZGluZ1VzZSgpIj48Q09ERT48ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+PC9DT0RFPjwvQT4nIGF0dHJpYnV0ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCNzZXRUYXJnZXROYW1lc3BhY2UoamF2YS5sYW5nLlN0cmluZykiPnNldFRhcmdldE5hbWVzcGFjZTwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDt2YWx1ZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1NldHMgdGhlIHZhbHVlIG9mIHRoZSAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkiPjxDT0RFPjxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT48L0NPREU+PC9BPicgYXR0cmlidXRlLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3Nfb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JSmF2YVdlYlNlcnZpY2VFbGVtZW50PC9BPjwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5odG1sI2dldEltcGxlbWVudGF0aW9uKCkiPmdldEltcGxlbWVudGF0aW9uPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JSmF2YVdlYlNlcnZpY2VFbGVtZW50Lmh0bWwjZ2V0TmFtZSgpIj5nZXROYW1lPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JSmF2YVdlYlNlcnZpY2VFbGVtZW50Lmh0bWwjc2V0TmFtZShqYXZhLmxhbmcuU3RyaW5nKSI+c2V0TmFtZTwvQT48L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19vcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+ZUFsbENvbnRlbnRzLCBlQ2xhc3MsIGVDb250YWluZXIsIGVDb250YWluaW5nRmVhdHVyZSwgZUNvbnRhaW5tZW50RmVhdHVyZSwgZUNvbnRlbnRzLCBlQ3Jvc3NSZWZlcmVuY2VzLCBlR2V0LCBlR2V0LCBlSXNQcm94eSwgZUlzU2V0LCBlUmVzb3VyY2UsIGVTZXQsIGVVbnNldDwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDs8QSBOQU1FPSJtZXRob2RzX2luaGVyaXRlZF9mcm9tX2NsYXNzX29yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI8L0I+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT5lQWRhcHRlcnMsIGVEZWxpdmVyLCBlTm90aWZ5LCBlU2V0RGVsaXZlcjwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9ImlzSW1wbGljaXQoKSI+PCEtLSAtLT48L0E+PEgzPgotaXNJbXBsaWNpdDwvSDM+Ci08UFJFPgotYm9vbGVhbiA8Qj5pc0ltcGxpY2l0PC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXM8L0gzPgotPFBSRT4KLW9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdCZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlNlcnZpY2U8L0E+Jmd0OyA8Qj5nZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlczwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFdlYk1ldGhvZHMoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0V2ViTWV0aG9kczwvSDM+Ci08UFJFPgotb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Jmx0OzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJNZXRob2Q8L0E+Jmd0OyA8Qj5nZXRXZWJNZXRob2RzPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0VGFyZ2V0TmFtZXNwYWNlKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFRhcmdldE5hbWVzcGFjZTwvSDM+Ci08UFJFPgotamF2YS5sYW5nLlN0cmluZyA8Qj5nZXRUYXJnZXROYW1lc3BhY2U8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldFRhcmdldE5hbWVzcGFjZShqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotc2V0VGFyZ2V0TmFtZXNwYWNlPC9IMz4KLTxQUkU+Ci12b2lkIDxCPnNldFRhcmdldE5hbWVzcGFjZTwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO3ZhbHVlKTwvUFJFPgotPERMPgotPEREPlNldHMgdGhlIHZhbHVlIG9mIHRoZSAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkiPjxDT0RFPjxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT48L0NPREU+PC9BPicgYXR0cmlidXRlLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnZhbHVlPC9DT0RFPiAtIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+JyBhdHRyaWJ1dGUuPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkiPjxDT0RFPmdldFRhcmdldE5hbWVzcGFjZSgpPC9DT0RFPjwvQT48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFNvYXBCaW5kaW5nU3R5bGUoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0U29hcEJpbmRpbmdTdHlsZTwvSDM+Ci08UFJFPgotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nU3R5bGU8L0E+IDxCPmdldFNvYXBCaW5kaW5nU3R5bGU8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgU3R5bGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iRE9DVU1FTlQiPC9jb2RlPi4KLSBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT5TT0FQQmluZGluZ1N0eWxlPC9DT0RFPjwvQT4uCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8cD4KLSBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Tb2FwIEJpbmRpbmcgU3R5bGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSA8L3A+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNvYXAgQmluZGluZyBTdHlsZTwvZW0+JyBhdHRyaWJ1dGUuPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxDT0RFPlNPQVBCaW5kaW5nU3R5bGU8L0NPREU+PC9BPiwgCi08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCNzZXRTb2FwQmluZGluZ1N0eWxlKG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZSkiPjxDT0RFPnNldFNvYXBCaW5kaW5nU3R5bGUoU09BUEJpbmRpbmdTdHlsZSk8L0NPREU+PC9BPiwgCi08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1NvYXBCaW5kaW5nU3R5bGUoKSI+PENPREU+RG9tUGFja2FnZS5nZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1NvYXBCaW5kaW5nU3R5bGUoKTwvQ09ERT48L0E+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzZXRTb2FwQmluZGluZ1N0eWxlKG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZSkiPjwhLS0gLS0+PC9BPjxIMz4KLXNldFNvYXBCaW5kaW5nU3R5bGU8L0gzPgotPFBSRT4KLXZvaWQgPEI+c2V0U29hcEJpbmRpbmdTdHlsZTwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nU3R5bGU8L0E+Jm5ic3A7dmFsdWUpPC9QUkU+Ci08REw+Ci08REQ+U2V0cyB0aGUgdmFsdWUgb2YgdGhlICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCNnZXRTb2FwQmluZGluZ1N0eWxlKCkiPjxDT0RFPjxlbT5Tb2FwIEJpbmRpbmcgU3R5bGU8L2VtPjwvQ09ERT48L0E+JyBhdHRyaWJ1dGUuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+dmFsdWU8L0NPREU+IC0gdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Tb2FwIEJpbmRpbmcgU3R5bGU8L2VtPicgYXR0cmlidXRlLjxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT5TT0FQQmluZGluZ1N0eWxlPC9DT0RFPjwvQT4sIAotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwjZ2V0U29hcEJpbmRpbmdTdHlsZSgpIj48Q09ERT5nZXRTb2FwQmluZGluZ1N0eWxlKCk8L0NPREU+PC9BPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0U29hcEJpbmRpbmdVc2UoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0U29hcEJpbmRpbmdVc2U8L0gzPgotPFBSRT4KLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdVc2U8L0E+IDxCPmdldFNvYXBCaW5kaW5nVXNlPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFVzZTwvYj48L2VtPicgYXR0cmlidXRlLgotIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJMSVRFUkFMIjwvY29kZT4uCi0gVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxDT0RFPlNPQVBCaW5kaW5nVXNlPC9DT0RFPjwvQT4uCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8cD4KLSBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Tb2FwIEJpbmRpbmcgVXNlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gPC9wPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Tb2FwIEJpbmRpbmcgVXNlPC9lbT4nIGF0dHJpYnV0ZS48RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxDT0RFPlNPQVBCaW5kaW5nVXNlPC9DT0RFPjwvQT4sIAotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwjc2V0U29hcEJpbmRpbmdVc2Uob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZSkiPjxDT0RFPnNldFNvYXBCaW5kaW5nVXNlKFNPQVBCaW5kaW5nVXNlKTwvQ09ERT48L0E+LCAKLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI2dldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfU29hcEJpbmRpbmdVc2UoKSI+PENPREU+RG9tUGFja2FnZS5nZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1NvYXBCaW5kaW5nVXNlKCk8L0NPREU+PC9BPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2V0U29hcEJpbmRpbmdVc2Uob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZSkiPjwhLS0gLS0+PC9BPjxIMz4KLXNldFNvYXBCaW5kaW5nVXNlPC9IMz4KLTxQUkU+Ci12b2lkIDxCPnNldFNvYXBCaW5kaW5nVXNlPC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nVXNlPC9BPiZuYnNwO3ZhbHVlKTwvUFJFPgotPERMPgotPEREPlNldHMgdGhlIHZhbHVlIG9mIHRoZSAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwjZ2V0U29hcEJpbmRpbmdVc2UoKSI+PENPREU+PGVtPlNvYXAgQmluZGluZyBVc2U8L2VtPjwvQ09ERT48L0E+JyBhdHRyaWJ1dGUuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+dmFsdWU8L0NPREU+IC0gdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Tb2FwIEJpbmRpbmcgVXNlPC9lbT4nIGF0dHJpYnV0ZS48RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxDT0RFPlNPQVBCaW5kaW5nVXNlPC9DT0RFPjwvQT4sIAotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwjZ2V0U29hcEJpbmRpbmdVc2UoKSI+PENPREU+Z2V0U29hcEJpbmRpbmdVc2UoKTwvQ09ERT48L0E+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGU8L0gzPgotPFBSRT4KLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlPC9BPiA8Qj5nZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJXUkFQUEVEIjwvY29kZT4uCi0gVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PENPREU+U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTwvQ09ERT48L0E+LgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPHA+Ci0gSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotIDwvcD4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgdmFsdWUgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvZW0+JyBhdHRyaWJ1dGUuPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxDT0RFPlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU8L0NPREU+PC9BPiwgCi08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCNzZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSkiPjxDT0RFPnNldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSk8L0NPREU+PC9BPiwgCi08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSI+PENPREU+RG9tUGFja2FnZS5nZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKTwvQ09ERT48L0E+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSkiPjwhLS0gLS0+PC9BPjxIMz4KLXNldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGU8L0gzPgotPFBSRT4KLXZvaWQgPEI+c2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU8L0E+Jm5ic3A7dmFsdWUpPC9QUkU+Ci08REw+Ci08REQ+U2V0cyB0aGUgdmFsdWUgb2YgdGhlICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkiPjxDT0RFPjxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT48L0NPREU+PC9BPicgYXR0cmlidXRlLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnZhbHVlPC9DT0RFPiAtIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvZW0+JyBhdHRyaWJ1dGUuPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxDT0RFPlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU8L0NPREU+PC9BPiwgCi08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkiPjxDT0RFPmdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKTwvQ09ERT48L0E+PC9ETD4KLTwvREQ+Ci08L0RMPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIENMQVNTIERBVEEgPT09PT09PT09IC0tPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV1NET01SdW50aW1lTWFuYWdlci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXU0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2Njc5NWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXU0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNzggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjU4OjEyIEJTVCAyMDEwIC0tPgotPFRJVExFPgotSVdTRE9NUnVudGltZU1hbmFnZXIKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTAtMDQtMDciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJJV1NET01SdW50aW1lTWFuYWdlciI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvSVdTRE9NUnVudGltZU1hbmFnZXIuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRE9NUnVudGltZUV4dGVuc2lvbi5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXU0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVdTRE9NUnVudGltZU1hbmFnZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTwhLS0gPT09PT09PT0gU1RBUlQgT0YgQ0xBU1MgREFUQSA9PT09PT09PSAtLT4KLTxIMj4KLTxGT05UIFNJWkU9Ii0xIj4KLW9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0ZPTlQ+Ci08QlI+Ci1JbnRlcmZhY2UgSVdTRE9NUnVudGltZU1hbmFnZXI8L0gyPgotPERMPgotPERUPjxCPkFsbCBLbm93biBJbXBsZW1lbnRpbmcgQ2xhc3Nlczo8L0I+IDxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dzRE9NUnVudGltZU1hbmFnZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPldzRE9NUnVudGltZU1hbmFnZXI8L0E+PC9ERD4KLTwvREw+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgaW50ZXJmYWNlIDxCPklXU0RPTVJ1bnRpbWVNYW5hZ2VyPC9CPjwvREw+Ci08L1BSRT4KLQotPFA+Ci08SFI+Ci0KLTxQPgotCi08IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdTRE9NUnVudGltZU1hbmFnZXIuaHRtbCNjcmVhdGVET01SdW50aW1lcyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikiPmNyZWF0ZURPTVJ1bnRpbWVzPC9BPjwvQj4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7SW5zdGFudGlhdGVzIHRoZSBET00gUnVudGltZXMgaWYgbm90IGFscmVhZHkuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRE9NUnVudGltZUV4dGVuc2lvbi5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXc0RPTVJ1bnRpbWVFeHRlbnNpb248L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdTRE9NUnVudGltZU1hbmFnZXIuaHRtbCNnZXRET01SdW50aW1lKGphdmEubGFuZy5TdHJpbmcpIj5nZXRET01SdW50aW1lPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO3J1bnRpbWVJZCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gdGhlIERPTSBydW50aW1lIGluc3RhbmNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJ1bnRpbWUgaWQKLSBhbmQgaW5zdGFudGlhdGUgc3VjaCBET00gcnVudGltZSBpbnN0YW5jZSBpZiBub24gZXhpc3RlbnQgYXQgdGhlIAotIG1vbWVudCBvZiBpbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLnV0aWwuQ29sbGVjdGlvbiZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV3NET01SdW50aW1lRXh0ZW5zaW9uPC9BPiZndDs8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV1NET01SdW50aW1lTWFuYWdlci5odG1sI2dldERPTVJ1bnRpbWVzKCkiPmdldERPTVJ1bnRpbWVzPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV1NET01SdW50aW1lTWFuYWdlci5odG1sI3JlbG9hZERPTVJ1bnRpbWVzKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKSI+cmVsb2FkRE9NUnVudGltZXM8L0E+PC9CPihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGlzIG1ldGhvZCBzaG91bGQgcmVsb2FkIGFsbCBpbnN0YW5jZXMgb2YgRE9NIFJ1bnRpbWVzLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iY3JlYXRlRE9NUnVudGltZXMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpIj48IS0tIC0tPjwvQT48SDM+Ci1jcmVhdGVET01SdW50aW1lczwvSDM+Ci08UFJFPgotdm9pZCA8Qj5jcmVhdGVET01SdW50aW1lczwvQj4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvUFJFPgotPERMPgotPEREPkluc3RhbnRpYXRlcyB0aGUgRE9NIFJ1bnRpbWVzIGlmIG5vdCBhbHJlYWR5LgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5wcm9ncmVzczwvQ09ERT4gLSBtb25pdG9yIHRvIHRyYWNrIHByb2dyZXNzPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRET01SdW50aW1lKGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRET01SdW50aW1lPC9IMz4KLTxQUkU+Ci08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV3NET01SdW50aW1lRXh0ZW5zaW9uPC9BPiA8Qj5nZXRET01SdW50aW1lPC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7cnVudGltZUlkKTwvUFJFPgotPERMPgotPEREPlRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gdGhlIERPTSBydW50aW1lIGluc3RhbmNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJ1bnRpbWUgaWQKLSBhbmQgaW5zdGFudGlhdGUgc3VjaCBET00gcnVudGltZSBpbnN0YW5jZSBpZiBub24gZXhpc3RlbnQgYXQgdGhlIAotIG1vbWVudCBvZiBpbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5ydW50aW1lSWQ8L0NPREU+IC0gLSBzdHJpbmcgaWRlbnRpZmllciBvZiB0aGUgcnVudGltZQotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgRE9NIHJ1bnRpbWUgaW5zdGFuY2UuIE51bGwgaWYgcnVudGltZSB3aXRoIHN1Y2ggaWQgaXMgbm90IHJlZ2lzdGVyZWQ8L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldERPTVJ1bnRpbWVzKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldERPTVJ1bnRpbWVzPC9IMz4KLTxQUkU+Ci1qYXZhLnV0aWwuQ29sbGVjdGlvbiZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV3NET01SdW50aW1lRXh0ZW5zaW9uPC9BPiZndDsgPEI+Z2V0RE9NUnVudGltZXM8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+YSBsaXN0IG9mIGFsbCBET00gUnVudGltZXMgY3VycmVudGx5IGluc3RhbnRpYXRlZDwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0icmVsb2FkRE9NUnVudGltZXMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpIj48IS0tIC0tPjwvQT48SDM+Ci1yZWxvYWRET01SdW50aW1lczwvSDM+Ci08UFJFPgotdm9pZCA8Qj5yZWxvYWRET01SdW50aW1lczwvQj4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvUFJFPgotPERMPgotPEREPlRoaXMgbWV0aG9kIHNob3VsZCByZWxvYWQgYWxsIGluc3RhbmNlcyBvZiBET00gUnVudGltZXMuCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0lXU0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV1NET01SdW50aW1lTWFuYWdlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklXU0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTViNzUxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NzggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjU4OjEyIEJTVCAyMDEwIC0tPgotPFRJVExFPgotSVdlYk1ldGhvZAotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMC0wNC0wNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IklXZWJNZXRob2QiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0lXZWJNZXRob2QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVdlYk1ldGhvZC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvRk9OVD4KLTxCUj4KLUludGVyZmFjZSBJV2ViTWV0aG9kPC9IMj4KLTxETD4KLTxEVD48Qj5BbGwgU3VwZXJpbnRlcmZhY2VzOjwvQj4gPEREPm9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JSmF2YVdlYlNlcnZpY2VFbGVtZW50PC9BPiwgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI8L0REPgotPC9ETD4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBpbnRlcmZhY2UgPEI+SVdlYk1ldGhvZDwvQj48RFQ+ZXh0ZW5kcyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JSmF2YVdlYlNlcnZpY2VFbGVtZW50PC9BPjwvREw+Ci08L1BSRT4KLQotPFA+Ci08REw+Ci08RFQ+PEI+QXV0aG9yOjwvQj48L0RUPgotICA8REQ+SHJpc3RvIFNhYmV2PC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxQPgotCi08IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3QmbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViUGFyYW08L0E+Jmd0OzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCNnZXRQYXJhbWV0ZXJzKCkiPmdldFBhcmFtZXRlcnM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sI2dldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSI+Z2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nU3R5bGU8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sI2dldFNvYXBCaW5kaW5nU3R5bGUoKSI+Z2V0U29hcEJpbmRpbmdTdHlsZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nVXNlPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCNnZXRTb2FwQmluZGluZ1VzZSgpIj5nZXRTb2FwQmluZGluZ1VzZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBVc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCNpc0V4Y2x1ZGVkKCkiPmlzRXhjbHVkZWQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCNzZXRFeGNsdWRlZChib29sZWFuKSI+c2V0RXhjbHVkZWQ8L0E+PC9CPihib29sZWFuJm5ic3A7dmFsdWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sI2lzRXhjbHVkZWQoKSI+PENPREU+PGVtPkV4Y2x1ZGVkPC9lbT48L0NPREU+PC9BPicgYXR0cmlidXRlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sI3NldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlKSI+c2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlPC9BPiZuYnNwO3ZhbHVlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2V0cyB0aGUgdmFsdWUgb2YgdGhlICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkiPjxDT0RFPjxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT48L0NPREU+PC9BPicgYXR0cmlidXRlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sI3NldFNvYXBCaW5kaW5nU3R5bGUob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlKSI+c2V0U29hcEJpbmRpbmdTdHlsZTwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1N0eWxlPC9BPiZuYnNwO3ZhbHVlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2V0cyB0aGUgdmFsdWUgb2YgdGhlICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCNnZXRTb2FwQmluZGluZ1N0eWxlKCkiPjxDT0RFPjxlbT5Tb2FwIEJpbmRpbmcgU3R5bGU8L2VtPjwvQ09ERT48L0E+JyBhdHRyaWJ1dGUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmh0bWwjc2V0U29hcEJpbmRpbmdVc2Uob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZSkiPnNldFNvYXBCaW5kaW5nVXNlPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1VzZTwvQT4mbmJzcDt2YWx1ZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1NldHMgdGhlIHZhbHVlIG9mIHRoZSAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmh0bWwjZ2V0U29hcEJpbmRpbmdVc2UoKSI+PENPREU+PGVtPlNvYXAgQmluZGluZyBVc2U8L2VtPjwvQ09ERT48L0E+JyBhdHRyaWJ1dGUuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklKYXZhV2ViU2VydmljZUVsZW1lbnQiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklKYXZhV2ViU2VydmljZUVsZW1lbnQ8L0E+PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JSmF2YVdlYlNlcnZpY2VFbGVtZW50Lmh0bWwjZ2V0SW1wbGVtZW50YXRpb24oKSI+Z2V0SW1wbGVtZW50YXRpb248L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuaHRtbCNnZXROYW1lKCkiPmdldE5hbWU8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuaHRtbCNzZXROYW1lKGphdmEubGFuZy5TdHJpbmcpIj5zZXROYW1lPC9BPjwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDs8QSBOQU1FPSJtZXRob2RzX2luaGVyaXRlZF9mcm9tX2NsYXNzX29yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q8L0I+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT5lQWxsQ29udGVudHMsIGVDbGFzcywgZUNvbnRhaW5lciwgZUNvbnRhaW5pbmdGZWF0dXJlLCBlQ29udGFpbm1lbnRGZWF0dXJlLCBlQ29udGVudHMsIGVDcm9zc1JlZmVyZW5jZXMsIGVHZXQsIGVHZXQsIGVJc1Byb3h5LCBlSXNTZXQsIGVSZXNvdXJjZSwgZVNldCwgZVVuc2V0PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3Nfb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXIiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGludGVyZmFjZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmVBZGFwdGVycywgZURlbGl2ZXIsIGVOb3RpZnksIGVTZXREZWxpdmVyPC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iZ2V0UGFyYW1ldGVycygpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRQYXJhbWV0ZXJzPC9IMz4KLTxQUkU+Ci1vcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3QmbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViUGFyYW08L0E+Jmd0OyA8Qj5nZXRQYXJhbWV0ZXJzPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iaXNFeGNsdWRlZCgpIj48IS0tIC0tPjwvQT48SDM+Ci1pc0V4Y2x1ZGVkPC9IMz4KLTxQUkU+Ci1ib29sZWFuIDxCPmlzRXhjbHVkZWQ8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldEV4Y2x1ZGVkKGJvb2xlYW4pIj48IS0tIC0tPjwvQT48SDM+Ci1zZXRFeGNsdWRlZDwvSDM+Ci08UFJFPgotdm9pZCA8Qj5zZXRFeGNsdWRlZDwvQj4oYm9vbGVhbiZuYnNwO3ZhbHVlKTwvUFJFPgotPERMPgotPEREPlNldHMgdGhlIHZhbHVlIG9mIHRoZSAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmh0bWwjaXNFeGNsdWRlZCgpIj48Q09ERT48ZW0+RXhjbHVkZWQ8L2VtPjwvQ09ERT48L0E+JyBhdHRyaWJ1dGUuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+dmFsdWU8L0NPREU+IC0gdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeGNsdWRlZDwvZW0+JyBhdHRyaWJ1dGUuPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmh0bWwjaXNFeGNsdWRlZCgpIj48Q09ERT5pc0V4Y2x1ZGVkKCk8L0NPREU+PC9BPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0U29hcEJpbmRpbmdTdHlsZSgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRTb2FwQmluZGluZ1N0eWxlPC9IMz4KLTxQUkU+Ci08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdTdHlsZTwvQT4gPEI+Z2V0U29hcEJpbmRpbmdTdHlsZTwvQj4oKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJET0NVTUVOVCI8L2NvZGU+LgotIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxDT0RFPlNPQVBCaW5kaW5nU3R5bGU8L0NPREU+PC9BPi4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDxwPgotIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNvYXAgQmluZGluZyBTdHlsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotIDwvcD4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgdmFsdWUgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT4nIGF0dHJpYnV0ZS48RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PENPREU+U09BUEJpbmRpbmdTdHlsZTwvQ09ERT48L0E+LCAKLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sI3NldFNvYXBCaW5kaW5nU3R5bGUob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlKSI+PENPREU+c2V0U29hcEJpbmRpbmdTdHlsZShTT0FQQmluZGluZ1N0eWxlKTwvQ09ERT48L0E+LCAKLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI2dldElXZWJNZXRob2RfU29hcEJpbmRpbmdTdHlsZSgpIj48Q09ERT5Eb21QYWNrYWdlLmdldElXZWJNZXRob2RfU29hcEJpbmRpbmdTdHlsZSgpPC9DT0RFPjwvQT48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldFNvYXBCaW5kaW5nU3R5bGUob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlKSI+PCEtLSAtLT48L0E+PEgzPgotc2V0U29hcEJpbmRpbmdTdHlsZTwvSDM+Ci08UFJFPgotdm9pZCA8Qj5zZXRTb2FwQmluZGluZ1N0eWxlPC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdTdHlsZTwvQT4mbmJzcDt2YWx1ZSk8L1BSRT4KLTxETD4KLTxERD5TZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sI2dldFNvYXBCaW5kaW5nU3R5bGUoKSI+PENPREU+PGVtPlNvYXAgQmluZGluZyBTdHlsZTwvZW0+PC9DT0RFPjwvQT4nIGF0dHJpYnV0ZS4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT52YWx1ZTwvQ09ERT4gLSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNvYXAgQmluZGluZyBTdHlsZTwvZW0+JyBhdHRyaWJ1dGUuPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxDT0RFPlNPQVBCaW5kaW5nU3R5bGU8L0NPREU+PC9BPiwgCi08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCNnZXRTb2FwQmluZGluZ1N0eWxlKCkiPjxDT0RFPmdldFNvYXBCaW5kaW5nU3R5bGUoKTwvQ09ERT48L0E+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRTb2FwQmluZGluZ1VzZSgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRTb2FwQmluZGluZ1VzZTwvSDM+Ci08UFJFPgotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1VzZTwvQT4gPEI+Z2V0U29hcEJpbmRpbmdVc2U8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgVXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IkxJVEVSQUwiPC9jb2RlPi4KLSBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PENPREU+U09BUEJpbmRpbmdVc2U8L0NPREU+PC9BPi4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDxwPgotIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNvYXAgQmluZGluZyBVc2U8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSA8L3A+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNvYXAgQmluZGluZyBVc2U8L2VtPicgYXR0cmlidXRlLjxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PENPREU+U09BUEJpbmRpbmdVc2U8L0NPREU+PC9BPiwgCi08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCNzZXRTb2FwQmluZGluZ1VzZShvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlKSI+PENPREU+c2V0U29hcEJpbmRpbmdVc2UoU09BUEJpbmRpbmdVc2UpPC9DT0RFPjwvQT4sIAotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SVdlYk1ldGhvZF9Tb2FwQmluZGluZ1VzZSgpIj48Q09ERT5Eb21QYWNrYWdlLmdldElXZWJNZXRob2RfU29hcEJpbmRpbmdVc2UoKTwvQ09ERT48L0E+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzZXRTb2FwQmluZGluZ1VzZShvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlKSI+PCEtLSAtLT48L0E+PEgzPgotc2V0U29hcEJpbmRpbmdVc2U8L0gzPgotPFBSRT4KLXZvaWQgPEI+c2V0U29hcEJpbmRpbmdVc2U8L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdVc2U8L0E+Jm5ic3A7dmFsdWUpPC9QUkU+Ci08REw+Ci08REQ+U2V0cyB0aGUgdmFsdWUgb2YgdGhlICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCNnZXRTb2FwQmluZGluZ1VzZSgpIj48Q09ERT48ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+PC9DT0RFPjwvQT4nIGF0dHJpYnV0ZS4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT52YWx1ZTwvQ09ERT4gLSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNvYXAgQmluZGluZyBVc2U8L2VtPicgYXR0cmlidXRlLjxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PENPREU+U09BUEJpbmRpbmdVc2U8L0NPREU+PC9BPiwgCi08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCNnZXRTb2FwQmluZGluZ1VzZSgpIj48Q09ERT5nZXRTb2FwQmluZGluZ1VzZSgpPC9DT0RFPjwvQT48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTwvSDM+Ci08UFJFPgotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU8L0E+IDxCPmdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGU8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IldSQVBQRUQiPC9jb2RlPi4KLSBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlPC9DT0RFPjwvQT4uCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8cD4KLSBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gPC9wPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT4nIGF0dHJpYnV0ZS48RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PENPREU+U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTwvQ09ERT48L0E+LCAKLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sI3NldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlKSI+PENPREU+c2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZShTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlKTwvQ09ERT48L0E+LCAKLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI2dldElXZWJNZXRob2RfU29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpIj48Q09ERT5Eb21QYWNrYWdlLmdldElXZWJNZXRob2RfU29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpPC9DT0RFPjwvQT48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlKSI+PCEtLSAtLT48L0E+PEgzPgotc2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTwvSDM+Ci08UFJFPgotdm9pZCA8Qj5zZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlPC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTwvQT4mbmJzcDt2YWx1ZSk8L1BSRT4KLTxETD4KLTxERD5TZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sI2dldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSI+PENPREU+PGVtPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPjwvQ09ERT48L0E+JyBhdHRyaWJ1dGUuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+dmFsdWU8L0NPREU+IC0gdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT4nIGF0dHJpYnV0ZS48RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PENPREU+U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTwvQ09ERT48L0E+LCAKLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sI2dldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSI+PENPREU+Z2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpPC9DT0RFPjwvQT48L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0lXZWJNZXRob2QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVdlYk1ldGhvZC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZTE1YWMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDY4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8xNCkgb24gV2VkIEFwciAwNyAwNzo1ODoxMiBCU1QgMjAxMCAtLT4KLTxUSVRMRT4KLUlXZWJQYXJhbQotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMC0wNC0wNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IklXZWJQYXJhbSI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvSVdlYlBhcmFtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJV2ViUGFyYW0uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTwhLS0gPT09PT09PT0gU1RBUlQgT0YgQ0xBU1MgREFUQSA9PT09PT09PSAtLT4KLTxIMj4KLTxGT05UIFNJWkU9Ii0xIj4KLW9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0ZPTlQ+Ci08QlI+Ci1JbnRlcmZhY2UgSVdlYlBhcmFtPC9IMj4KLTxETD4KLTxEVD48Qj5BbGwgU3VwZXJpbnRlcmZhY2VzOjwvQj4gPEREPm9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JSmF2YVdlYlNlcnZpY2VFbGVtZW50PC9BPiwgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI8L0REPgotPC9ETD4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBpbnRlcmZhY2UgPEI+SVdlYlBhcmFtPC9CPjxEVD5leHRlbmRzIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklKYXZhV2ViU2VydmljZUVsZW1lbnQ8L0E+PC9ETD4KLTwvUFJFPgotCi08UD4KLTxETD4KLTxEVD48Qj5BdXRob3I6PC9CPjwvRFQ+Ci0gIDxERD5IcmlzdG8gU2FiZXY8L0REPgotPC9ETD4KLTxIUj4KLQotPFA+Ci0KLTwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPldlYlBhcmFtS2luZDwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCNnZXRLaW5kKCkiPmdldEtpbmQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sI2dldFBhcnROYW1lKCkiPmdldFBhcnROYW1lPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFydCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEubGFuZy5TdHJpbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCNnZXRUYXJnZXROYW1lc3BhY2UoKSI+Z2V0VGFyZ2V0TmFtZXNwYWNlPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFyZ2V0IE5hbWVzcGFjZTwvYj48L2VtPicgYXR0cmlidXRlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwjZ2V0VHlwZU5hbWUoKSI+Z2V0VHlwZU5hbWU8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sI2lzSGVhZGVyKCkiPmlzSGVhZGVyPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGVhZGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCNzZXRIZWFkZXIoYm9vbGVhbikiPnNldEhlYWRlcjwvQT48L0I+KGJvb2xlYW4mbmJzcDt2YWx1ZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1NldHMgdGhlIHZhbHVlIG9mIHRoZSAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCNpc0hlYWRlcigpIj48Q09ERT48ZW0+SGVhZGVyPC9lbT48L0NPREU+PC9BPicgYXR0cmlidXRlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwjc2V0S2luZChvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldlYlBhcmFtS2luZCkiPnNldEtpbmQ8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5XZWJQYXJhbUtpbmQ8L0E+Jm5ic3A7dmFsdWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwjZ2V0S2luZCgpIj48Q09ERT48ZW0+S2luZDwvZW0+PC9DT0RFPjwvQT4nIGF0dHJpYnV0ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sI3NldFBhcnROYW1lKGphdmEubGFuZy5TdHJpbmcpIj5zZXRQYXJ0TmFtZTwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDt2YWx1ZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1NldHMgdGhlIHZhbHVlIG9mIHRoZSAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCNnZXRQYXJ0TmFtZSgpIj48Q09ERT48ZW0+UGFydCBOYW1lPC9lbT48L0NPREU+PC9BPicgYXR0cmlidXRlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwjc2V0VGFyZ2V0TmFtZXNwYWNlKGphdmEubGFuZy5TdHJpbmcpIj5zZXRUYXJnZXROYW1lc3BhY2U8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7dmFsdWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkiPjxDT0RFPjxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT48L0NPREU+PC9BPicgYXR0cmlidXRlLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3Nfb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JSmF2YVdlYlNlcnZpY2VFbGVtZW50PC9BPjwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5odG1sI2dldEltcGxlbWVudGF0aW9uKCkiPmdldEltcGxlbWVudGF0aW9uPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JSmF2YVdlYlNlcnZpY2VFbGVtZW50Lmh0bWwjZ2V0TmFtZSgpIj5nZXROYW1lPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JSmF2YVdlYlNlcnZpY2VFbGVtZW50Lmh0bWwjc2V0TmFtZShqYXZhLmxhbmcuU3RyaW5nKSI+c2V0TmFtZTwvQT48L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19vcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+ZUFsbENvbnRlbnRzLCBlQ2xhc3MsIGVDb250YWluZXIsIGVDb250YWluaW5nRmVhdHVyZSwgZUNvbnRhaW5tZW50RmVhdHVyZSwgZUNvbnRlbnRzLCBlQ3Jvc3NSZWZlcmVuY2VzLCBlR2V0LCBlR2V0LCBlSXNQcm94eSwgZUlzU2V0LCBlUmVzb3VyY2UsIGVTZXQsIGVVbnNldDwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDs8QSBOQU1FPSJtZXRob2RzX2luaGVyaXRlZF9mcm9tX2NsYXNzX29yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI8L0I+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT5lQWRhcHRlcnMsIGVEZWxpdmVyLCBlTm90aWZ5LCBlU2V0RGVsaXZlcjwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9ImdldFR5cGVOYW1lKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFR5cGVOYW1lPC9IMz4KLTxQUkU+Ci1qYXZhLmxhbmcuU3RyaW5nIDxCPmdldFR5cGVOYW1lPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0UGFydE5hbWUoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0UGFydE5hbWU8L0gzPgotPFBSRT4KLWphdmEubGFuZy5TdHJpbmcgPEI+Z2V0UGFydE5hbWU8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJ0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDxwPgotIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhcnQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotIDwvcD4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFydCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS48RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sI3NldFBhcnROYW1lKGphdmEubGFuZy5TdHJpbmcpIj48Q09ERT5zZXRQYXJ0TmFtZShTdHJpbmcpPC9DT0RFPjwvQT4sIAotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0SVdlYlBhcmFtX1BhcnROYW1lKCkiPjxDT0RFPkRvbVBhY2thZ2UuZ2V0SVdlYlBhcmFtX1BhcnROYW1lKCk8L0NPREU+PC9BPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2V0UGFydE5hbWUoamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLXNldFBhcnROYW1lPC9IMz4KLTxQUkU+Ci12b2lkIDxCPnNldFBhcnROYW1lPC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7dmFsdWUpPC9QUkU+Ci08REw+Ci08REQ+U2V0cyB0aGUgdmFsdWUgb2YgdGhlICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sI2dldFBhcnROYW1lKCkiPjxDT0RFPjxlbT5QYXJ0IE5hbWU8L2VtPjwvQ09ERT48L0E+JyBhdHRyaWJ1dGUuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+dmFsdWU8L0NPREU+IC0gdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJ0IE5hbWU8L2VtPicgYXR0cmlidXRlLjxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwjZ2V0UGFydE5hbWUoKSI+PENPREU+Z2V0UGFydE5hbWUoKTwvQ09ERT48L0E+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRUYXJnZXROYW1lc3BhY2UoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0VGFyZ2V0TmFtZXNwYWNlPC9IMz4KLTxQUkU+Ci1qYXZhLmxhbmcuU3RyaW5nIDxCPmdldFRhcmdldE5hbWVzcGFjZTwvQj4oKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhcmdldCBOYW1lc3BhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDxwPgotIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSA8L3A+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPicgYXR0cmlidXRlLjxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwjc2V0VGFyZ2V0TmFtZXNwYWNlKGphdmEubGFuZy5TdHJpbmcpIj48Q09ERT5zZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nKTwvQ09ERT48L0E+LCAKLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI2dldElXZWJQYXJhbV9UYXJnZXROYW1lc3BhY2UoKSI+PENPREU+RG9tUGFja2FnZS5nZXRJV2ViUGFyYW1fVGFyZ2V0TmFtZXNwYWNlKCk8L0NPREU+PC9BPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2V0VGFyZ2V0TmFtZXNwYWNlKGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1zZXRUYXJnZXROYW1lc3BhY2U8L0gzPgotPFBSRT4KLXZvaWQgPEI+c2V0VGFyZ2V0TmFtZXNwYWNlPC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7dmFsdWUpPC9QUkU+Ci08REw+Ci08REQ+U2V0cyB0aGUgdmFsdWUgb2YgdGhlICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sI2dldFRhcmdldE5hbWVzcGFjZSgpIj48Q09ERT48ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+PC9DT0RFPjwvQT4nIGF0dHJpYnV0ZS4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT52YWx1ZTwvQ09ERT4gLSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPicgYXR0cmlidXRlLjxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkiPjxDT0RFPmdldFRhcmdldE5hbWVzcGFjZSgpPC9DT0RFPjwvQT48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImlzSGVhZGVyKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWlzSGVhZGVyPC9IMz4KLTxQUkU+Ci1ib29sZWFuIDxCPmlzSGVhZGVyPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGVhZGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8cD4KLSBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IZWFkZXI8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSA8L3A+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhlYWRlcjwvZW0+JyBhdHRyaWJ1dGUuPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCNzZXRIZWFkZXIoYm9vbGVhbikiPjxDT0RFPnNldEhlYWRlcihib29sZWFuKTwvQ09ERT48L0E+LCAKLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI2dldElXZWJQYXJhbV9IZWFkZXIoKSI+PENPREU+RG9tUGFja2FnZS5nZXRJV2ViUGFyYW1fSGVhZGVyKCk8L0NPREU+PC9BPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2V0SGVhZGVyKGJvb2xlYW4pIj48IS0tIC0tPjwvQT48SDM+Ci1zZXRIZWFkZXI8L0gzPgotPFBSRT4KLXZvaWQgPEI+c2V0SGVhZGVyPC9CPihib29sZWFuJm5ic3A7dmFsdWUpPC9QUkU+Ci08REw+Ci08REQ+U2V0cyB0aGUgdmFsdWUgb2YgdGhlICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sI2lzSGVhZGVyKCkiPjxDT0RFPjxlbT5IZWFkZXI8L2VtPjwvQ09ERT48L0E+JyBhdHRyaWJ1dGUuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+dmFsdWU8L0NPREU+IC0gdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IZWFkZXI8L2VtPicgYXR0cmlidXRlLjxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwjaXNIZWFkZXIoKSI+PENPREU+aXNIZWFkZXIoKTwvQ09ERT48L0E+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRLaW5kKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldEtpbmQ8L0gzPgotPFBSRT4KLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPldlYlBhcmFtS2luZDwvQT4gPEI+Z2V0S2luZDwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2V0S2luZChvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldlYlBhcmFtS2luZCkiPjwhLS0gLS0+PC9BPjxIMz4KLXNldEtpbmQ8L0gzPgotPFBSRT4KLXZvaWQgPEI+c2V0S2luZDwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+V2ViUGFyYW1LaW5kPC9BPiZuYnNwO3ZhbHVlKTwvUFJFPgotPERMPgotPEREPlNldHMgdGhlIHZhbHVlIG9mIHRoZSAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCNnZXRLaW5kKCkiPjxDT0RFPjxlbT5LaW5kPC9lbT48L0NPREU+PC9BPicgYXR0cmlidXRlLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnZhbHVlPC9DT0RFPiAtIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+S2luZDwvZW0+JyBhdHRyaWJ1dGUuPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PENPREU+V2ViUGFyYW1LaW5kPC9DT0RFPjwvQT4sIAotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCNnZXRLaW5kKCkiPjxDT0RFPmdldEtpbmQoKTwvQ09ERT48L0E+PC9ETD4KLTwvREQ+Ci08L0RMPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIENMQVNTIERBVEEgPT09PT09PT09IC0tPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9JV2ViUGFyYW0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklXZWJQYXJhbS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2UuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjdjMjEyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzg4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8xNCkgb24gV2VkIEFwciAwNyAwNzo1ODoxMiBCU1QgMjAxMCAtLT4KLTxUSVRMRT4KLUlXZWJTZXJ2aWNlCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDEwLTA0LTA3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iSVdlYlNlcnZpY2UiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0lXZWJTZXJ2aWNlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZVByb2plY3QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklXZWJTZXJ2aWNlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08IS0tID09PT09PT09IFNUQVJUIE9GIENMQVNTIERBVEEgPT09PT09PT0gLS0+Ci08SDI+Ci08Rk9OVCBTSVpFPSItMSI+Ci1vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpPC9GT05UPgotPEJSPgotSW50ZXJmYWNlIElXZWJTZXJ2aWNlPC9IMj4KLTxETD4KLTxEVD48Qj5BbGwgU3VwZXJpbnRlcmZhY2VzOjwvQj4gPEREPm9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JSmF2YVdlYlNlcnZpY2VFbGVtZW50PC9BPiwgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI8L0REPgotPC9ETD4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBpbnRlcmZhY2UgPEI+SVdlYlNlcnZpY2U8L0I+PERUPmV4dGVuZHMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JSmF2YVdlYlNlcnZpY2VFbGVtZW50Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SUphdmFXZWJTZXJ2aWNlRWxlbWVudDwvQT48L0RMPgotPC9QUkU+Ci0KLTxQPgotPERMPgotPERUPjxCPkF1dGhvcjo8L0I+PC9EVD4KLSAgPEREPkhyaXN0byBTYWJldjwvREQ+Ci08L0RMPgotPEhSPgotCi08UD4KLQotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwjZ2V0UG9ydE5hbWUoKSI+Z2V0UG9ydE5hbWU8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sI2dldFNlcnZpY2VFbmRwb2ludCgpIj5nZXRTZXJ2aWNlRW5kcG9pbnQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkiPmdldFRhcmdldE5hbWVzcGFjZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2UuaHRtbCNnZXRXc2RsTG9jYXRpb24oKSI+Z2V0V3NkbExvY2F0aW9uPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sI3NldFBvcnROYW1lKGphdmEubGFuZy5TdHJpbmcpIj5zZXRQb3J0TmFtZTwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDt2YWx1ZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1NldHMgdGhlIHZhbHVlIG9mIHRoZSAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sI2dldFBvcnROYW1lKCkiPjxDT0RFPjxlbT5Qb3J0IE5hbWU8L2VtPjwvQ09ERT48L0E+JyBhdHRyaWJ1dGUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sI3NldFRhcmdldE5hbWVzcGFjZShqYXZhLmxhbmcuU3RyaW5nKSI+c2V0VGFyZ2V0TmFtZXNwYWNlPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO3ZhbHVlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2V0cyB0aGUgdmFsdWUgb2YgdGhlICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkiPjxDT0RFPjxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT48L0NPREU+PC9BPicgYXR0cmlidXRlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2UuaHRtbCNzZXRXc2RsTG9jYXRpb24oamF2YS5sYW5nLlN0cmluZykiPnNldFdzZGxMb2NhdGlvbjwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDt2YWx1ZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1NldHMgdGhlIHZhbHVlIG9mIHRoZSAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sI2dldFdzZGxMb2NhdGlvbigpIj48Q09ERT48ZW0+V3NkbCBMb2NhdGlvbjwvZW0+PC9DT0RFPjwvQT4nIGF0dHJpYnV0ZS48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDs8QSBOQU1FPSJtZXRob2RzX2luaGVyaXRlZF9mcm9tX2NsYXNzX29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JSmF2YVdlYlNlcnZpY2VFbGVtZW50Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SUphdmFXZWJTZXJ2aWNlRWxlbWVudDwvQT48L0I+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuaHRtbCNnZXRJbXBsZW1lbnRhdGlvbigpIj5nZXRJbXBsZW1lbnRhdGlvbjwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5odG1sI2dldE5hbWUoKSI+Z2V0TmFtZTwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5odG1sI3NldE5hbWUoamF2YS5sYW5nLlN0cmluZykiPnNldE5hbWU8L0E+PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3Nfb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGludGVyZmFjZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmVBbGxDb250ZW50cywgZUNsYXNzLCBlQ29udGFpbmVyLCBlQ29udGFpbmluZ0ZlYXR1cmUsIGVDb250YWlubWVudEZlYXR1cmUsIGVDb250ZW50cywgZUNyb3NzUmVmZXJlbmNlcywgZUdldCwgZUdldCwgZUlzUHJveHksIGVJc1NldCwgZVJlc291cmNlLCBlU2V0LCBlVW5zZXQ8L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19vcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllciI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyPC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+ZUFkYXB0ZXJzLCBlRGVsaXZlciwgZU5vdGlmeSwgZVNldERlbGl2ZXI8L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJnZXRTZXJ2aWNlRW5kcG9pbnQoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0U2VydmljZUVuZHBvaW50PC9IMz4KLTxQUkU+Ci08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9BPiA8Qj5nZXRTZXJ2aWNlRW5kcG9pbnQ8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRUYXJnZXROYW1lc3BhY2UoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0VGFyZ2V0TmFtZXNwYWNlPC9IMz4KLTxQUkU+Ci1qYXZhLmxhbmcuU3RyaW5nIDxCPmdldFRhcmdldE5hbWVzcGFjZTwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2V0VGFyZ2V0TmFtZXNwYWNlKGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1zZXRUYXJnZXROYW1lc3BhY2U8L0gzPgotPFBSRT4KLXZvaWQgPEI+c2V0VGFyZ2V0TmFtZXNwYWNlPC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7dmFsdWUpPC9QUkU+Ci08REw+Ci08REQ+U2V0cyB0aGUgdmFsdWUgb2YgdGhlICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkiPjxDT0RFPjxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT48L0NPREU+PC9BPicgYXR0cmlidXRlLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnZhbHVlPC9DT0RFPiAtIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+JyBhdHRyaWJ1dGUuPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sI2dldFRhcmdldE5hbWVzcGFjZSgpIj48Q09ERT5nZXRUYXJnZXROYW1lc3BhY2UoKTwvQ09ERT48L0E+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRQb3J0TmFtZSgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRQb3J0TmFtZTwvSDM+Ci08UFJFPgotamF2YS5sYW5nLlN0cmluZyA8Qj5nZXRQb3J0TmFtZTwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2V0UG9ydE5hbWUoamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLXNldFBvcnROYW1lPC9IMz4KLTxQUkU+Ci12b2lkIDxCPnNldFBvcnROYW1lPC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7dmFsdWUpPC9QUkU+Ci08REw+Ci08REQ+U2V0cyB0aGUgdmFsdWUgb2YgdGhlICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwjZ2V0UG9ydE5hbWUoKSI+PENPREU+PGVtPlBvcnQgTmFtZTwvZW0+PC9DT0RFPjwvQT4nIGF0dHJpYnV0ZS4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT52YWx1ZTwvQ09ERT4gLSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBvcnQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sI2dldFBvcnROYW1lKCkiPjxDT0RFPmdldFBvcnROYW1lKCk8L0NPREU+PC9BPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0V3NkbExvY2F0aW9uKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFdzZGxMb2NhdGlvbjwvSDM+Ci08UFJFPgotamF2YS5sYW5nLlN0cmluZyA8Qj5nZXRXc2RsTG9jYXRpb248L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldFdzZGxMb2NhdGlvbihqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotc2V0V3NkbExvY2F0aW9uPC9IMz4KLTxQUkU+Ci12b2lkIDxCPnNldFdzZGxMb2NhdGlvbjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO3ZhbHVlKTwvUFJFPgotPERMPgotPEREPlNldHMgdGhlIHZhbHVlIG9mIHRoZSAnPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sI2dldFdzZGxMb2NhdGlvbigpIj48Q09ERT48ZW0+V3NkbCBMb2NhdGlvbjwvZW0+PC9DT0RFPjwvQT4nIGF0dHJpYnV0ZS4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT52YWx1ZTwvQ09ERT4gLSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgTG9jYXRpb248L2VtPicgYXR0cmlidXRlLjxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2UuaHRtbCNnZXRXc2RsTG9jYXRpb24oKSI+PENPREU+Z2V0V3NkbExvY2F0aW9uKCk8L0NPREU+PC9BPjwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvSVdlYlNlcnZpY2UuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlUHJvamVjdC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVdlYlNlcnZpY2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlUHJvamVjdC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlUHJvamVjdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGI5NWRjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZVByb2plY3QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMTQpIG9uIFdlZCBBcHIgMDcgMDc6NTg6MTIgQlNUIDIwMTAgLS0+Ci08VElUTEU+Ci1JV2ViU2VydmljZVByb2plY3QKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTAtMDQtMDciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJJV2ViU2VydmljZVByb2plY3QiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0lXZWJTZXJ2aWNlUHJvamVjdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViVHlwZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlUHJvamVjdC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklXZWJTZXJ2aWNlUHJvamVjdC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvRk9OVD4KLTxCUj4KLUludGVyZmFjZSBJV2ViU2VydmljZVByb2plY3Q8L0gyPgotPERMPgotPERUPjxCPkFsbCBTdXBlcmludGVyZmFjZXM6PC9CPiA8REQ+b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyPC9ERD4KLTwvREw+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgaW50ZXJmYWNlIDxCPklXZWJTZXJ2aWNlUHJvamVjdDwvQj48RFQ+ZXh0ZW5kcyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDwvREw+Ci08L1BSRT4KLQotPFA+Ci08REw+Ci08RFQ+PEI+QXV0aG9yOjwvQj48L0RUPgotICA8REQ+SHJpc3RvIFNhYmV2PC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxQPgotCi08IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwjZ2V0TmFtZSgpIj5nZXROYW1lPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO29yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdCZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9BPiZndDs8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZVByb2plY3QuaHRtbCNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkiPmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7b3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Jmx0OzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViU2VydmljZTwvQT4mZ3Q7PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwjZ2V0V2ViU2VydmljZXMoKSI+Z2V0V2ViU2VydmljZXM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDs8QSBOQU1FPSJtZXRob2RzX2luaGVyaXRlZF9mcm9tX2NsYXNzX29yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q8L0I+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT5lQWxsQ29udGVudHMsIGVDbGFzcywgZUNvbnRhaW5lciwgZUNvbnRhaW5pbmdGZWF0dXJlLCBlQ29udGFpbm1lbnRGZWF0dXJlLCBlQ29udGVudHMsIGVDcm9zc1JlZmVyZW5jZXMsIGVHZXQsIGVHZXQsIGVJc1Byb3h5LCBlSXNTZXQsIGVSZXNvdXJjZSwgZVNldCwgZVVuc2V0PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3Nfb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXIiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGludGVyZmFjZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmVBZGFwdGVycywgZURlbGl2ZXIsIGVOb3RpZnksIGVTZXREZWxpdmVyPC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iZ2V0V2ViU2VydmljZXMoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0V2ViU2VydmljZXM8L0gzPgotPFBSRT4KLW9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdCZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlNlcnZpY2U8L0E+Jmd0OyA8Qj5nZXRXZWJTZXJ2aWNlczwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlczwvSDM+Ci08UFJFPgotb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Jmx0OzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U8L0E+Jmd0OyA8Qj5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXROYW1lKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldE5hbWU8L0gzPgotPFBSRT4KLWphdmEubGFuZy5TdHJpbmcgPEI+Z2V0TmFtZTwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJUeXBlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViVHlwZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJUeXBlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMGQ4MjEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJUeXBlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjU4OjEyIEJTVCAyMDEwIC0tPgotPFRJVExFPgotSVdlYlR5cGUKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTAtMDQtMDciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJJV2ViVHlwZSI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvSVdlYlR5cGUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RvbUxvYWRMaXN0ZW5lci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJUeXBlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVdlYlR5cGUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwO01FVEhPRDwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7TUVUSE9EPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08IS0tID09PT09PT09IFNUQVJUIE9GIENMQVNTIERBVEEgPT09PT09PT0gLS0+Ci08SDI+Ci08Rk9OVCBTSVpFPSItMSI+Ci1vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpPC9GT05UPgotPEJSPgotSW50ZXJmYWNlIElXZWJUeXBlPC9IMj4KLTxETD4KLTxEVD48Qj5BbGwgU3VwZXJpbnRlcmZhY2VzOjwvQj4gPEREPm9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JSmF2YVdlYlNlcnZpY2VFbGVtZW50PC9BPiwgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI8L0REPgotPC9ETD4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBpbnRlcmZhY2UgPEI+SVdlYlR5cGU8L0I+PERUPmV4dGVuZHMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JSmF2YVdlYlNlcnZpY2VFbGVtZW50Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SUphdmFXZWJTZXJ2aWNlRWxlbWVudDwvQT48L0RMPgotPC9QUkU+Ci0KLTxQPgotPERMPgotPERUPjxCPkF1dGhvcjo8L0I+PC9EVD4KLSAgPEREPkhyaXN0byBTYWJldjwvREQ+Ci08L0RMPgotPEhSPgotCi08UD4KLQotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDs8QSBOQU1FPSJtZXRob2RzX2luaGVyaXRlZF9mcm9tX2NsYXNzX29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JSmF2YVdlYlNlcnZpY2VFbGVtZW50Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SUphdmFXZWJTZXJ2aWNlRWxlbWVudDwvQT48L0I+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuaHRtbCNnZXRJbXBsZW1lbnRhdGlvbigpIj5nZXRJbXBsZW1lbnRhdGlvbjwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5odG1sI2dldE5hbWUoKSI+Z2V0TmFtZTwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5odG1sI3NldE5hbWUoamF2YS5sYW5nLlN0cmluZykiPnNldE5hbWU8L0E+PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3Nfb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGludGVyZmFjZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmVBbGxDb250ZW50cywgZUNsYXNzLCBlQ29udGFpbmVyLCBlQ29udGFpbmluZ0ZlYXR1cmUsIGVDb250YWlubWVudEZlYXR1cmUsIGVDb250ZW50cywgZUNyb3NzUmVmZXJlbmNlcywgZUdldCwgZUdldCwgZUlzUHJveHksIGVJc1NldCwgZVJlc291cmNlLCBlU2V0LCBlVW5zZXQ8L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19vcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllciI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyPC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+ZUFkYXB0ZXJzLCBlRGVsaXZlciwgZU5vdGlmeSwgZVNldERlbGl2ZXI8L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvSVdlYlR5cGUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RvbUxvYWRMaXN0ZW5lci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJUeXBlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVdlYlR5cGUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwO01FVEhPRDwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7TUVUSE9EPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV3NET01SdW50aW1lRXh0ZW5zaW9uLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRE9NUnVudGltZUV4dGVuc2lvbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGRlNTA1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV3NET01SdW50aW1lRXh0ZW5zaW9uLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMDIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjU4OjEyIEJTVCAyMDEwIC0tPgotPFRJVExFPgotSVdzRE9NUnVudGltZUV4dGVuc2lvbgotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMC0wNC0wNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IklXc0RPTVJ1bnRpbWVFeHRlbnNpb24iOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRG9tTG9hZExpc3RlbmVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXU0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRE9NUnVudGltZUV4dGVuc2lvbi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklXc0RPTVJ1bnRpbWVFeHRlbnNpb24uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTwhLS0gPT09PT09PT0gU1RBUlQgT0YgQ0xBU1MgREFUQSA9PT09PT09PSAtLT4KLTxIMj4KLTxGT05UIFNJWkU9Ii0xIj4KLW9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0ZPTlQ+Ci08QlI+Ci1JbnRlcmZhY2UgSVdzRE9NUnVudGltZUV4dGVuc2lvbjwvSDI+Ci08REw+Ci08RFQ+PEI+QWxsIEtub3duIEltcGxlbWVudGluZyBDbGFzc2VzOjwvQj4gPEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9KZWU1V3NEb21SdW50aW1lRXh0ZW5zaW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UiPkplZTVXc0RvbVJ1bnRpbWVFeHRlbnNpb248L0E+PC9ERD4KLTwvREw+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgaW50ZXJmYWNlIDxCPklXc0RPTVJ1bnRpbWVFeHRlbnNpb248L0I+PC9ETD4KLTwvUFJFPgotCi08UD4KLVRoaXMgaW50ZXJmYWNlIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSBhbGwgcnVudGltZSB3aGljaCB3YW50IHRvIGhhdmUgRE9NIFRyZWUgCi0gcmVwcmVzZW50YXRpb24gb24gdG9wIG9mIHRoZW0uCi08UD4KLQotPFA+Ci08REw+Ci08RFQ+PEI+QXV0aG9yOjwvQj48L0RUPgotICA8REQ+R2VvcmdpIEhyaXN0b3YgSTAzNjIwMTwvREQ+Ci08L0RMPgotPEhSPgotCi08UD4KLQotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uaHRtbCNhZGRMb2FkTGlzdGVuZXIob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV3NEb21Mb2FkTGlzdGVuZXIpIj5hZGRMb2FkTGlzdGVuZXI8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RvbUxvYWRMaXN0ZW5lci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXc0RvbUxvYWRMaXN0ZW5lcjwvQT4mbmJzcDtsaXN0ZW5lcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0FkZHMgYSBsb2FkIGxpc3RlbmVyIHRvIGJlIG5vdGlmaWVkIGluIGxvYWQgZXZlbnRzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRE9NUnVudGltZUV4dGVuc2lvbi5odG1sI2NyZWF0ZURPTShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikiPmNyZWF0ZURPTTwvQT48L0I+KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgbWV0aG9kIHNob3VsZCBpbnN0YW50aWF0ZSB0aGUgRE9NIGluc3RhbmNlIGZvciB0aGUgcnVudGltZSBhbmQgbG9hZHMgdGhlCi0gZGF0YSBpbnRvIGl0LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lET00uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JRE9NPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uaHRtbCNnZXRET00oKSI+Z2V0RE9NPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VG8gZ2V0IGEgaGFuZGxlIHRvIHRoZSBET00gaW5zdGFuY2UgYXZhaWxhYmxlIGZvciB0aGlzIHJ1bnRpbWUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV3NET01SdW50aW1lRXh0ZW5zaW9uLmh0bWwjcmVtb3ZlTG9hZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdzRG9tTG9hZExpc3RlbmVyKSI+cmVtb3ZlTG9hZExpc3RlbmVyPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV3NEb21Mb2FkTGlzdGVuZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV3NEb21Mb2FkTGlzdGVuZXI8L0E+Jm5ic3A7bGlzdGVuZXIpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZW1vdmVzIHRoZSBsaXN0ZW5lciBmcm9tIERPTSBsb2FkaW5nIGxpc3RlbmVycyBsaXN0PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJjcmVhdGVET00ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpIj48IS0tIC0tPjwvQT48SDM+Ci1jcmVhdGVET008L0gzPgotPFBSRT4KLXZvaWQgPEI+Y3JlYXRlRE9NPC9CPihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IpCi0gICAgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbjwvQT48L1BSRT4KLTxETD4KLTxERD5UaGlzIG1ldGhvZCBzaG91bGQgaW5zdGFudGlhdGUgdGhlIERPTSBpbnN0YW5jZSBmb3IgdGhlIHJ1bnRpbWUgYW5kIGxvYWRzIHRoZQotIGRhdGEgaW50byBpdC4gVGhlIG1ldGhvZCBsb2NrcyB0aGUgd29ya3NwYWNlIHJvb3QgZHVyaW5nIGV4ZWN1dGlvbi4gSWYgeW91IGNhbGwgdGhpcwotIG1ldGhvZCBkdXJpbmcgbG9hZGluZyAoaS5lLiBzb21lYm9keSBhbHJlYWR5IGNhbGxlZCBpdCBpbiBkaWZmZXJlbnQgdGhyZWFkKSB0aGUgbWV0aG9kIAotIHdpbGwgYmxvY2sgdW50aWwgdGhlIGxvYWQgZmluaXNoZXMgaW5zdGVhZCBvZiB0cmlnZ2VyaW5nIERPTSByZWxvYWQuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPm1vbml0b3I8L0NPREU+IC0gcHJvZ3Jlc3MgbW9uaXRvciB0byBiZSB1c2VkIGR1cmluZyBsb2FkaW5nLCBjYW5jZWxsaW5nIHRoZSBsb2FkIHZpYSBtb25pdG9yIGlzIHN1cHBvcnRlZAotPERUPjxCPlRocm93czo8L0I+Ci08REQ+PENPREU+amF2YS5pby5JT0V4Y2VwdGlvbjwvQ09ERT4gLSBpbiBjYXNlIHRoZSBET00gbG9hZGluZyBpcyBub3QgYWJsZSB0byByZWFkIHJlcXVpcmVkIGRhdGEKLTxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbjwvQT48L0NPREU+IC0gaW4gY2FzZSB0aGUgbG9hZGluZyB3YXMgY2FuY2VsbGVkIHZpYSBwcm92aWRlZCAKLSA8Y29kZT5tb25pdG9yPC9jb2RlPi48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImFkZExvYWRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXc0RvbUxvYWRMaXN0ZW5lcikiPjwhLS0gLS0+PC9BPjxIMz4KLWFkZExvYWRMaXN0ZW5lcjwvSDM+Ci08UFJFPgotdm9pZCA8Qj5hZGRMb2FkTGlzdGVuZXI8L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRG9tTG9hZExpc3RlbmVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdzRG9tTG9hZExpc3RlbmVyPC9BPiZuYnNwO2xpc3RlbmVyKTwvUFJFPgotPERMPgotPEREPkFkZHMgYSBsb2FkIGxpc3RlbmVyIHRvIGJlIG5vdGlmaWVkIGluIGxvYWQgZXZlbnRzLiBJbiBjYXNlIHRoZSBsb2FkaW5nIGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZCAKLSB0aGlzIGxpc3RlbmVyJ3MgbWV0aG9kcyBhcmUgY2FsbGVkIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbG9hZC4KLSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RvbUxvYWRMaXN0ZW5lci5odG1sI2ZpbmlzaGVkKCkiPjxDT0RFPklXc0RvbUxvYWRMaXN0ZW5lci5maW5pc2hlZCgpPC9DT0RFPjwvQT4gbWV0aG9kIGlzIGNhbGxlZCBpbiBhbnkgY2FzZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgbG9hZGluZwotIGhhcyBiZWVuIGNhbmNlbGxlZCBvciBub3QuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmxpc3RlbmVyPC9DT0RFPiAtIDwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0icmVtb3ZlTG9hZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdzRG9tTG9hZExpc3RlbmVyKSI+PCEtLSAtLT48L0E+PEgzPgotcmVtb3ZlTG9hZExpc3RlbmVyPC9IMz4KLTxQUkU+Ci12b2lkIDxCPnJlbW92ZUxvYWRMaXN0ZW5lcjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV3NEb21Mb2FkTGlzdGVuZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV3NEb21Mb2FkTGlzdGVuZXI8L0E+Jm5ic3A7bGlzdGVuZXIpPC9QUkU+Ci08REw+Ci08REQ+UmVtb3ZlcyB0aGUgbGlzdGVuZXIgZnJvbSBET00gbG9hZGluZyBsaXN0ZW5lcnMgbGlzdAotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5saXN0ZW5lcjwvQ09ERT4gLSA8L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldERPTSgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRET008L0gzPgotPFBSRT4KLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSURPTS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklET008L0E+IDxCPmdldERPTTwvQj4oKQotICAgICAgICAgICAgdGhyb3dzIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPldzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uPC9BPjwvUFJFPgotPERMPgotPEREPlRvIGdldCBhIGhhbmRsZSB0byB0aGUgRE9NIGluc3RhbmNlIGF2YWlsYWJsZSBmb3IgdGhpcyBydW50aW1lLgotPFA+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBET00gaW5zdGFuY2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gaW4gY2FzZSB0aGUgbG9hZGluZyB3YXMgbm90IHN0YXJ0ZWQgeWV0IG9yCi0gaXMgbm90IGZpbmlzaGVkIHlldC4KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPldzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uPC9BPjwvQ09ERT4gLSBpbiBjYXNlIGxvYWRpbmcgaGFzIGJlZW4gY2FsbGVkIGFscmVhZHkgYnV0IHRoZSBsb2FkCi0gaGFzIGJlZW4gY2FuY2VsbGVkPC9ETD4KLTwvREQ+Ci08L0RMPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIENMQVNTIERBVEEgPT09PT09PT09IC0tPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9JV3NET01SdW50aW1lRXh0ZW5zaW9uLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RvbUxvYWRMaXN0ZW5lci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV1NET01SdW50aW1lTWFuYWdlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJV3NET01SdW50aW1lRXh0ZW5zaW9uLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV3NEb21Mb2FkTGlzdGVuZXIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV3NEb21Mb2FkTGlzdGVuZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjExNWY2Ni4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRG9tTG9hZExpc3RlbmVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjU4OjEyIEJTVCAyMDEwIC0tPgotPFRJVExFPgotSVdzRG9tTG9hZExpc3RlbmVyCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDEwLTA0LTA3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iSVdzRG9tTG9hZExpc3RlbmVyIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9JV3NEb21Mb2FkTGlzdGVuZXIuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlR5cGUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRE9NUnVudGltZUV4dGVuc2lvbi5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RvbUxvYWRMaXN0ZW5lci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklXc0RvbUxvYWRMaXN0ZW5lci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvRk9OVD4KLTxCUj4KLUludGVyZmFjZSBJV3NEb21Mb2FkTGlzdGVuZXI8L0gyPgotPERMPgotPERUPjxCPkFsbCBLbm93biBJbXBsZW1lbnRpbmcgQ2xhc3Nlczo8L0I+IDxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9ET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlci5Mb2FkTGlzdGVuZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yIj5ET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlci5Mb2FkTGlzdGVuZXI8L0E+PC9ERD4KLTwvREw+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgaW50ZXJmYWNlIDxCPklXc0RvbUxvYWRMaXN0ZW5lcjwvQj48L0RMPgotPC9QUkU+Ci0KLTxQPgotSW50ZXJmYWNlIHRvIGJlIGltcGxlbWVudGVkIGJ5IGludGVyZXN0ZWQgaW4gRE9NIGxvYWQgcHJvY2Vzcy4gSW1wbGVtZW50b3JzIGNhbiBiZSBhZGRlZCB0bwotIHRoZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT5JV3NET01SdW50aW1lRXh0ZW5zaW9uPC9DT0RFPjwvQT4gdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zIG9uIGxvYWQgc3RhcnR1cC9maW5pc2gKLTxQPgotCi08UD4KLTxETD4KLTxEVD48Qj5BdXRob3I6PC9CPjwvRFQ+Ci0gIDxERD5HZW9yZ2kgVmFjaGtvdjwvREQ+Ci08L0RMPgotPEhSPgotCi08UD4KLQotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RvbUxvYWRMaXN0ZW5lci5odG1sI2ZpbmlzaGVkKCkiPmZpbmlzaGVkPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q2FsbGVkIGJ5IDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRE9NUnVudGltZUV4dGVuc2lvbi5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxDT0RFPklXc0RPTVJ1bnRpbWVFeHRlbnNpb248L0NPREU+PC9BPiB3aGVuIHRoZSBET00gbG9hZCBoYXMgZmluaXNoZWQ8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RvbUxvYWRMaXN0ZW5lci5odG1sI3N0YXJ0ZWQoKSI+c3RhcnRlZDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NhbGxlZCBieSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT5JV3NET01SdW50aW1lRXh0ZW5zaW9uPC9DT0RFPjwvQT4ganVzdCBiZWZvcmUgdGhlIERPTSBsb2FkIHN0YXJ0PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJzdGFydGVkKCkiPjwhLS0gLS0+PC9BPjxIMz4KLXN0YXJ0ZWQ8L0gzPgotPFBSRT4KLXZvaWQgPEI+c3RhcnRlZDwvQj4oKTwvUFJFPgotPERMPgotPEREPkNhbGxlZCBieSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT5JV3NET01SdW50aW1lRXh0ZW5zaW9uPC9DT0RFPjwvQT4ganVzdCBiZWZvcmUgdGhlIERPTSBsb2FkIHN0YXJ0Ci08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImZpbmlzaGVkKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWZpbmlzaGVkPC9IMz4KLTxQUkU+Ci12b2lkIDxCPmZpbmlzaGVkPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+Q2FsbGVkIGJ5IDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRE9NUnVudGltZUV4dGVuc2lvbi5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxDT0RFPklXc0RPTVJ1bnRpbWVFeHRlbnNpb248L0NPREU+PC9BPiB3aGVuIHRoZSBET00gbG9hZCBoYXMgZmluaXNoZWQKLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvSVdzRG9tTG9hZExpc3RlbmVyLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJUeXBlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV3NEb21Mb2FkTGlzdGVuZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJV3NEb21Mb2FkTGlzdGVuZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NzM2ZjAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYxOCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMTQpIG9uIFdlZCBBcHIgMDcgMDc6NTg6MTIgQlNUIDIwMTAgLS0+Ci08VElUTEU+Ci1TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDEwLTA0LTA3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV1NET01SdW50aW1lTWFuYWdlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNlbnVtX2NvbnN0YW50X3N1bW1hcnkiPkVOVU0gQ09OU1RBTlRTPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjZmllbGRfc3VtbWFyeSI+RklFTEQ8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDs8QSBIUkVGPSIjZW51bV9jb25zdGFudF9kZXRhaWwiPkVOVU0gQ09OU1RBTlRTPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjZmllbGRfZGV0YWlsIj5GSUVMRDwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTwhLS0gPT09PT09PT0gU1RBUlQgT0YgQ0xBU1MgREFUQSA9PT09PT09PSAtLT4KLTxIMj4KLTxGT05UIFNJWkU9Ii0xIj4KLW9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0ZPTlQ+Ci08QlI+Ci1FbnVtIFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU8L0gyPgotPFBSRT4KLWphdmEubGFuZy5PYmplY3QKLSAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPmphdmEubGFuZy5FbnVtJmx0OzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlPC9BPiZndDsKLSAgICAgIDxJTUcgU1JDPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9yZXNvdXJjZXMvaW5oZXJpdC5naWYiIEFMVD0iZXh0ZW5kZWQgYnkgIj48Qj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU8L0I+Ci08L1BSRT4KLTxETD4KLTxEVD48Qj5BbGwgSW1wbGVtZW50ZWQgSW50ZXJmYWNlczo8L0I+IDxERD5qYXZhLmlvLlNlcmlhbGl6YWJsZSwgamF2YS5sYW5nLkNvbXBhcmFibGUmbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU8L0E+Jmd0Oywgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I8L0REPgotPC9ETD4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBlbnVtIDxCPlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU8L0I+PERUPmV4dGVuZHMgamF2YS5sYW5nLkVudW0mbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU8L0E+Jmd0OzxEVD5pbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yPC9ETD4KLTwvUFJFPgotCi08UD4KLTwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+U09BUCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicsCi0gYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLQotPFA+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCNnZXRTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlKCkiPjxDT0RFPkRvbVBhY2thZ2UuZ2V0U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpPC9DT0RFPjwvQT48L0RMPgotPEhSPgotCi08UD4KLTwhLS0gPT09PT09PT09PT0gRU5VTSBDT05TVEFOVCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJlbnVtX2NvbnN0YW50X3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5FbnVtIENvbnN0YW50IFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwjQkFSRSI+QkFSRTwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgJzxlbT48Yj5CQVJFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sI1dSQVBQRUQiPldSQVBQRUQ8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlICc8ZW0+PGI+V1JBUFBFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PCEtLSA9PT09PT09PT09PSBGSUVMRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJmaWVsZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+RmllbGQgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuaHRtbCNCQVJFX1ZBTFVFIj5CQVJFX1ZBTFVFPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSAnPGVtPjxiPkJBUkU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2phdmEudXRpbC5MaXN0Jmx0OzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlPC9BPiZndDs8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwjVkFMVUVTIj5WQUxVRVM8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlNPQVAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwjV1JBUFBFRF9WQUxVRSI+V1JBUFBFRF9WQUxVRTwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgJzxlbT48Yj5XUkFQUEVEPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sI2dldChpbnQpIj5nZXQ8L0E+PC9CPihpbnQmbmJzcDt2YWx1ZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sI2dldChqYXZhLmxhbmcuU3RyaW5nKSI+Z2V0PC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2xpdGVyYWwpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSAnPGVtPjxiPlNPQVAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuaHRtbCNnZXRCeU5hbWUoamF2YS5sYW5nLlN0cmluZykiPmdldEJ5TmFtZTwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtuYW1lKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgJzxlbT48Yj5TT0FQIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sI2dldExpdGVyYWwoKSI+Z2V0TGl0ZXJhbDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sI2dldE5hbWUoKSI+Z2V0TmFtZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwjZ2V0VmFsdWUoKSI+Z2V0VmFsdWU8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuaHRtbCN0b1N0cmluZygpIj50b1N0cmluZzwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuaHRtbCN2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpIj52YWx1ZU9mPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO25hbWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBlbnVtIGNvbnN0YW50IG9mIHRoaXMgdHlwZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU8L0E+W108L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwjdmFsdWVzKCkiPnZhbHVlczwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgY29uc3RhbnRzIG9mIHRoaXMgZW51bSB0eXBlLCBpbgotdGhlIG9yZGVyIHRoZXkgYXJlIGRlY2xhcmVkLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3NfamF2YS5sYW5nLkVudW0iPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGNsYXNzIGphdmEubGFuZy5FbnVtPC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+Y2xvbmUsIGNvbXBhcmVUbywgZXF1YWxzLCBmaW5hbGl6ZSwgZ2V0RGVjbGFyaW5nQ2xhc3MsIGhhc2hDb2RlLCBuYW1lLCBvcmRpbmFsLCB2YWx1ZU9mPC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3NfamF2YS5sYW5nLk9iamVjdCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gY2xhc3MgamF2YS5sYW5nLk9iamVjdDwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmdldENsYXNzLCBub3RpZnksIG5vdGlmeUFsbCwgd2FpdCwgd2FpdCwgd2FpdDwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PT09PSBFTlVNIENPTlNUQU5UIERFVEFJTCA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0iZW51bV9jb25zdGFudF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5FbnVtIENvbnN0YW50IERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJXUkFQUEVEIj48IS0tIC0tPjwvQT48SDM+Ci1XUkFQUEVEPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIGZpbmFsIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlPC9BPiA8Qj5XUkFQUEVEPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSAnPGVtPjxiPldSQVBQRUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sI1dSQVBQRURfVkFMVUUiPjxDT0RFPldSQVBQRURfVkFMVUU8L0NPREU+PC9BPjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJCQVJFIj48IS0tIC0tPjwvQT48SDM+Ci1CQVJFPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIGZpbmFsIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlPC9BPiA8Qj5CQVJFPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSAnPGVtPjxiPkJBUkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sI0JBUkVfVkFMVUUiPjxDT0RFPkJBUkVfVkFMVUU8L0NPREU+PC9BPjwvREw+Ci08L0RMPgotCi08IS0tID09PT09PT09PT09PSBGSUVMRCBERVRBSUwgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImZpZWxkX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPkZpZWxkIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJXUkFQUEVEX1ZBTFVFIj48IS0tIC0tPjwvQT48SDM+Ci1XUkFQUEVEX1ZBTFVFPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCA8Qj5XUkFQUEVEX1ZBTFVFPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSAnPGVtPjxiPldSQVBQRUQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8cD4KLSBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPldSQVBQRUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSA8L3A+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sI1dSQVBQRUQiPjxDT0RFPldSQVBQRUQ8L0NPREU+PC9BPiwgCi08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb25zdGFudC12YWx1ZXMuaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuV1JBUFBFRF9WQUxVRSI+Q29uc3RhbnQgRmllbGQgVmFsdWVzPC9BPjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJCQVJFX1ZBTFVFIj48IS0tIC0tPjwvQT48SDM+Ci1CQVJFX1ZBTFVFPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCA8Qj5CQVJFX1ZBTFVFPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSAnPGVtPjxiPkJBUkU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8cD4KLSBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkJBUkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSA8L3A+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sI0JBUkUiPjxDT0RFPkJBUkU8L0NPREU+PC9BPiwgCi08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb25zdGFudC12YWx1ZXMuaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuQkFSRV9WQUxVRSI+Q29uc3RhbnQgRmllbGQgVmFsdWVzPC9BPjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJWQUxVRVMiPjwhLS0gLS0+PC9BPjxIMz4KLVZBTFVFUzwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuTGlzdCZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTwvQT4mZ3Q7IDxCPlZBTFVFUzwvQj48L1BSRT4KLTxETD4KLTxERD5BIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPERMPgotPC9ETD4KLTwvREw+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0idmFsdWVzKCkiPjwhLS0gLS0+PC9BPjxIMz4KLXZhbHVlczwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTwvQT5bXSA8Qj52YWx1ZXM8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGNvbnN0YW50cyBvZiB0aGlzIGVudW0gdHlwZSwgaW4KLXRoZSBvcmRlciB0aGV5IGFyZSBkZWNsYXJlZC4gIFRoaXMgbWV0aG9kIG1heSBiZSB1c2VkIHRvIGl0ZXJhdGUKLW92ZXIgdGhlIGNvbnN0YW50cyBhcyBmb2xsb3dzOgotPHByZT4KLWZvciAoU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSBjIDogU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS52YWx1ZXMoKSkKLSZuYnNwOyAgIFN5c3RlbS5vdXQucHJpbnRsbihjKTsKLTwvcHJlPgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPmFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGNvbnN0YW50cyBvZiB0aGlzIGVudW0gdHlwZSwgaW4KLXRoZSBvcmRlciB0aGV5IGFyZSBkZWNsYXJlZDwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0idmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotdmFsdWVPZjwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTwvQT4gPEI+dmFsdWVPZjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO25hbWUpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgZW51bSBjb25zdGFudCBvZiB0aGlzIHR5cGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi1UaGUgc3RyaW5nIG11c3QgbWF0Y2ggPEk+ZXhhY3RseTwvST4gYW4gaWRlbnRpZmllciB1c2VkIHRvIGRlY2xhcmUgYW4KLWVudW0gY29uc3RhbnQgaW4gdGhpcyB0eXBlLiAgKEV4dHJhbmVvdXMgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGFyZSAKLW5vdCBwZXJtaXR0ZWQuKQotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5uYW1lPC9DT0RFPiAtIHRoZSBuYW1lIG9mIHRoZSBlbnVtIGNvbnN0YW50IHRvIGJlIHJldHVybmVkLgotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgZW51bSBjb25zdGFudCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZQotPERUPjxCPlRocm93czo8L0I+Ci08REQ+PENPREU+amF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvQ09ERT4gLSBpZiB0aGlzIGVudW0gdHlwZSBoYXMgbm8gY29uc3RhbnQKLXdpdGggdGhlIHNwZWNpZmllZCBuYW1lCi08REQ+PENPREU+amF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uPC9DT0RFPiAtIGlmIHRoZSBhcmd1bWVudCBpcyBudWxsPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXQoamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLWdldDwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTwvQT4gPEI+Z2V0PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bGl0ZXJhbCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSAnPGVtPjxiPlNPQVAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0QnlOYW1lKGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRCeU5hbWU8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU8L0E+IDxCPmdldEJ5TmFtZTwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO25hbWUpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgJzxlbT48Yj5TT0FQIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldChpbnQpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXQ8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU8L0E+IDxCPmdldDwvQj4oaW50Jm5ic3A7dmFsdWUpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgJzxlbT48Yj5TT0FQIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFZhbHVlKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFZhbHVlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgaW50IDxCPmdldFZhbHVlPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5TcGVjaWZpZWQgYnk6PC9CPjxERD48Q09ERT5nZXRWYWx1ZTwvQ09ERT4gaW4gaW50ZXJmYWNlIDxDT0RFPm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yPC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0TmFtZSgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXROYW1lPC9IMz4KLTxQUkU+Ci1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyA8Qj5nZXROYW1lPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5TcGVjaWZpZWQgYnk6PC9CPjxERD48Q09ERT5nZXROYW1lPC9DT0RFPiBpbiBpbnRlcmZhY2UgPENPREU+b3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I8L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRMaXRlcmFsKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldExpdGVyYWw8L0gzPgotPFBSRT4KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIDxCPmdldExpdGVyYWw8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REQ+PERMPgotPERUPjxCPlNwZWNpZmllZCBieTo8L0I+PEREPjxDT0RFPmdldExpdGVyYWw8L0NPREU+IGluIGludGVyZmFjZSA8Q09ERT5vcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjwvQ09ERT48L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InRvU3RyaW5nKCkiPjwhLS0gLS0+PC9BPjxIMz4KLXRvU3RyaW5nPC9IMz4KLTxQUkU+Ci1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyA8Qj50b1N0cmluZzwvQj4oKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5PdmVycmlkZXM6PC9CPjxERD48Q09ERT50b1N0cmluZzwvQ09ERT4gaW4gY2xhc3MgPENPREU+amF2YS5sYW5nLkVudW0mbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU8L0E+Jmd0OzwvQ09ERT48L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdTRE9NUnVudGltZU1hbmFnZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjZW51bV9jb25zdGFudF9zdW1tYXJ5Ij5FTlVNIENPTlNUQU5UUzwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2ZpZWxkX3N1bW1hcnkiPkZJRUxEPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7PEEgSFJFRj0iI2VudW1fY29uc3RhbnRfZGV0YWlsIj5FTlVNIENPTlNUQU5UUzwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2ZpZWxkX2RldGFpbCI+RklFTEQ8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTVhZTk2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjU4OjEyIEJTVCAyMDEwIC0tPgotPFRJVExFPgotU09BUEJpbmRpbmdTdHlsZQotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMC0wNC0wNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlNPQVBCaW5kaW5nU3R5bGUiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL1NPQVBCaW5kaW5nU3R5bGUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlNPQVBCaW5kaW5nU3R5bGUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2VudW1fY29uc3RhbnRfc3VtbWFyeSI+RU5VTSBDT05TVEFOVFM8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNmaWVsZF9zdW1tYXJ5Ij5GSUVMRDwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwOzxBIEhSRUY9IiNlbnVtX2NvbnN0YW50X2RldGFpbCI+RU5VTSBDT05TVEFOVFM8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNmaWVsZF9kZXRhaWwiPkZJRUxEPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvRk9OVD4KLTxCUj4KLUVudW0gU09BUEJpbmRpbmdTdHlsZTwvSDI+Ci08UFJFPgotamF2YS5sYW5nLk9iamVjdAotICA8SU1HIFNSQz0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcmVzb3VyY2VzL2luaGVyaXQuZ2lmIiBBTFQ9ImV4dGVuZGVkIGJ5ICI+amF2YS5sYW5nLkVudW0mbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nU3R5bGU8L0E+Jmd0OwotICAgICAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZTwvQj4KLTwvUFJFPgotPERMPgotPERUPjxCPkFsbCBJbXBsZW1lbnRlZCBJbnRlcmZhY2VzOjwvQj4gPEREPmphdmEuaW8uU2VyaWFsaXphYmxlLCBqYXZhLmxhbmcuQ29tcGFyYWJsZSZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdTdHlsZTwvQT4mZ3Q7LCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjwvREQ+Ci08L0RMPgotPEhSPgotPERMPgotPERUPjxQUkU+cHVibGljIGVudW0gPEI+U09BUEJpbmRpbmdTdHlsZTwvQj48RFQ+ZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdTdHlsZTwvQT4mZ3Q7PERUPmltcGxlbWVudHMgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I8L0RMPgotPC9QUkU+Ci0KLTxQPgotPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5TT0FQIEJpbmRpbmcgU3R5bGU8L2I+PC9lbT4nLAotIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci0KLTxQPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0U09BUEJpbmRpbmdTdHlsZSgpIj48Q09ERT5Eb21QYWNrYWdlLmdldFNPQVBCaW5kaW5nU3R5bGUoKTwvQ09ERT48L0E+PC9ETD4KLTxIUj4KLQotPFA+Ci08IS0tID09PT09PT09PT09IEVOVU0gQ09OU1RBTlQgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0iZW51bV9jb25zdGFudF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+RW51bSBDb25zdGFudCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sI0RPQ1VNRU5UIj5ET0NVTUVOVDwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgJzxlbT48Yj5ET0NVTUVOVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuaHRtbCNSUEMiPlJQQzwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgJzxlbT48Yj5SUEM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzwhLS0gPT09PT09PT09PT0gRklFTEQgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0iZmllbGRfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkZpZWxkIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwjRE9DVU1FTlRfVkFMVUUiPkRPQ1VNRU5UX1ZBTFVFPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSAnPGVtPjxiPkRPQ1VNRU5UPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwjUlBDX1ZBTFVFIj5SUENfVkFMVUU8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlICc8ZW0+PGI+UlBDPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtqYXZhLnV0aWwuTGlzdCZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdTdHlsZTwvQT4mZ3Q7PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sI1ZBTFVFUyI+VkFMVUVTPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0EgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5TT0FQIEJpbmRpbmcgU3R5bGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nU3R5bGU8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sI2dldChpbnQpIj5nZXQ8L0E+PC9CPihpbnQmbmJzcDt2YWx1ZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFN0eWxlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdTdHlsZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwjZ2V0KGphdmEubGFuZy5TdHJpbmcpIj5nZXQ8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bGl0ZXJhbCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFN0eWxlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdTdHlsZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwjZ2V0QnlOYW1lKGphdmEubGFuZy5TdHJpbmcpIj5nZXRCeU5hbWU8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bmFtZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFN0eWxlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sI2dldExpdGVyYWwoKSI+Z2V0TGl0ZXJhbDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sI2dldE5hbWUoKSI+Z2V0TmFtZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwjZ2V0VmFsdWUoKSI+Z2V0VmFsdWU8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuaHRtbCN0b1N0cmluZygpIj50b1N0cmluZzwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1N0eWxlPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuaHRtbCN2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpIj52YWx1ZU9mPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO25hbWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBlbnVtIGNvbnN0YW50IG9mIHRoaXMgdHlwZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nU3R5bGU8L0E+W108L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwjdmFsdWVzKCkiPnZhbHVlczwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgY29uc3RhbnRzIG9mIHRoaXMgZW51bSB0eXBlLCBpbgotdGhlIG9yZGVyIHRoZXkgYXJlIGRlY2xhcmVkLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3NfamF2YS5sYW5nLkVudW0iPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGNsYXNzIGphdmEubGFuZy5FbnVtPC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+Y2xvbmUsIGNvbXBhcmVUbywgZXF1YWxzLCBmaW5hbGl6ZSwgZ2V0RGVjbGFyaW5nQ2xhc3MsIGhhc2hDb2RlLCBuYW1lLCBvcmRpbmFsLCB2YWx1ZU9mPC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3NfamF2YS5sYW5nLk9iamVjdCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gY2xhc3MgamF2YS5sYW5nLk9iamVjdDwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmdldENsYXNzLCBub3RpZnksIG5vdGlmeUFsbCwgd2FpdCwgd2FpdCwgd2FpdDwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PT09PSBFTlVNIENPTlNUQU5UIERFVEFJTCA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0iZW51bV9jb25zdGFudF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5FbnVtIENvbnN0YW50IERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJET0NVTUVOVCI+PCEtLSAtLT48L0E+PEgzPgotRE9DVU1FTlQ8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgZmluYWwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nU3R5bGU8L0E+IDxCPkRPQ1VNRU5UPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSAnPGVtPjxiPkRPQ1VNRU5UPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuaHRtbCNET0NVTUVOVF9WQUxVRSI+PENPREU+RE9DVU1FTlRfVkFMVUU8L0NPREU+PC9BPjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJSUEMiPjwhLS0gLS0+PC9BPjxIMz4KLVJQQzwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyBmaW5hbCA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdTdHlsZTwvQT4gPEI+UlBDPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSAnPGVtPjxiPlJQQzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwjUlBDX1ZBTFVFIj48Q09ERT5SUENfVkFMVUU8L0NPREU+PC9BPjwvREw+Ci08L0RMPgotCi08IS0tID09PT09PT09PT09PSBGSUVMRCBERVRBSUwgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImZpZWxkX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPkZpZWxkIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJET0NVTUVOVF9WQUxVRSI+PCEtLSAtLT48L0E+PEgzPgotRE9DVU1FTlRfVkFMVUU8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IDxCPkRPQ1VNRU5UX1ZBTFVFPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSAnPGVtPjxiPkRPQ1VNRU5UPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPHA+Ci0gSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5ET0NVTUVOVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0gdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotIDwvcD4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwjRE9DVU1FTlQiPjxDT0RFPkRPQ1VNRU5UPC9DT0RFPjwvQT4sIAotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29uc3RhbnQtdmFsdWVzLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlLkRPQ1VNRU5UX1ZBTFVFIj5Db25zdGFudCBGaWVsZCBWYWx1ZXM8L0E+PC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IlJQQ19WQUxVRSI+PCEtLSAtLT48L0E+PEgzPgotUlBDX1ZBTFVFPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCA8Qj5SUENfVkFMVUU8L0I+PC9QUkU+Ci08REw+Ci08REQ+VGhlICc8ZW0+PGI+UlBDPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPHA+Ci0gSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5SUEM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSA8L3A+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sI1JQQyI+PENPREU+UlBDPC9DT0RFPjwvQT4sIAotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29uc3RhbnQtdmFsdWVzLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlLlJQQ19WQUxVRSI+Q29uc3RhbnQgRmllbGQgVmFsdWVzPC9BPjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJWQUxVRVMiPjwhLS0gLS0+PC9BPjxIMz4KLVZBTFVFUzwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuTGlzdCZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdTdHlsZTwvQT4mZ3Q7IDxCPlZBTFVFUzwvQj48L1BSRT4KLTxETD4KLTxERD5BIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFN0eWxlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REw+Ci08L0RMPgotPC9ETD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJ2YWx1ZXMoKSI+PCEtLSAtLT48L0E+PEgzPgotdmFsdWVzPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1N0eWxlPC9BPltdIDxCPnZhbHVlczwvQj4oKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgY29uc3RhbnRzIG9mIHRoaXMgZW51bSB0eXBlLCBpbgotdGhlIG9yZGVyIHRoZXkgYXJlIGRlY2xhcmVkLiAgVGhpcyBtZXRob2QgbWF5IGJlIHVzZWQgdG8gaXRlcmF0ZQotb3ZlciB0aGUgY29uc3RhbnRzIGFzIGZvbGxvd3M6Ci08cHJlPgotZm9yIChTT0FQQmluZGluZ1N0eWxlIGMgOiBTT0FQQmluZGluZ1N0eWxlLnZhbHVlcygpKQotJm5ic3A7ICAgU3lzdGVtLm91dC5wcmludGxuKGMpOwotPC9wcmU+Ci08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+YW4gYXJyYXkgY29udGFpbmluZyB0aGUgY29uc3RhbnRzIG9mIHRoaXMgZW51bSB0eXBlLCBpbgotdGhlIG9yZGVyIHRoZXkgYXJlIGRlY2xhcmVkPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJ2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci12YWx1ZU9mPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1N0eWxlPC9BPiA8Qj52YWx1ZU9mPC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bmFtZSk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSBlbnVtIGNvbnN0YW50IG9mIHRoaXMgdHlwZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLVRoZSBzdHJpbmcgbXVzdCBtYXRjaCA8ST5leGFjdGx5PC9JPiBhbiBpZGVudGlmaWVyIHVzZWQgdG8gZGVjbGFyZSBhbgotZW51bSBjb25zdGFudCBpbiB0aGlzIHR5cGUuICAoRXh0cmFuZW91cyB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgYXJlIAotbm90IHBlcm1pdHRlZC4pCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPm5hbWU8L0NPREU+IC0gdGhlIG5hbWUgb2YgdGhlIGVudW0gY29uc3RhbnQgdG8gYmUgcmV0dXJuZWQuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBlbnVtIGNvbnN0YW50IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lCi08RFQ+PEI+VGhyb3dzOjwvQj4KLTxERD48Q09ERT5qYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uPC9DT0RFPiAtIGlmIHRoaXMgZW51bSB0eXBlIGhhcyBubyBjb25zdGFudAotd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUKLTxERD48Q09ERT5qYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb248L0NPREU+IC0gaWYgdGhlIGFyZ3VtZW50IGlzIG51bGw8L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldChqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0PC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1N0eWxlPC9BPiA8Qj5nZXQ8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtsaXRlcmFsKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFN0eWxlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldEJ5TmFtZShqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0QnlOYW1lPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1N0eWxlPC9BPiA8Qj5nZXRCeU5hbWU8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtuYW1lKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFN0eWxlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldChpbnQpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXQ8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nU3R5bGU8L0E+IDxCPmdldDwvQj4oaW50Jm5ic3A7dmFsdWUpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgJzxlbT48Yj5TT0FQIEJpbmRpbmcgU3R5bGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0VmFsdWUoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0VmFsdWU8L0gzPgotPFBSRT4KLXB1YmxpYyBpbnQgPEI+Z2V0VmFsdWU8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REQ+PERMPgotPERUPjxCPlNwZWNpZmllZCBieTo8L0I+PEREPjxDT0RFPmdldFZhbHVlPC9DT0RFPiBpbiBpbnRlcmZhY2UgPENPREU+b3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I8L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXROYW1lKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldE5hbWU8L0gzPgotPFBSRT4KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIDxCPmdldE5hbWU8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REQ+PERMPgotPERUPjxCPlNwZWNpZmllZCBieTo8L0I+PEREPjxDT0RFPmdldE5hbWU8L0NPREU+IGluIGludGVyZmFjZSA8Q09ERT5vcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjwvQ09ERT48L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldExpdGVyYWwoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0TGl0ZXJhbDwvSDM+Ci08UFJFPgotcHVibGljIGphdmEubGFuZy5TdHJpbmcgPEI+Z2V0TGl0ZXJhbDwvQj4oKTwvUFJFPgotPERMPgotPEREPjwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxERD48REw+Ci08RFQ+PEI+U3BlY2lmaWVkIGJ5OjwvQj48REQ+PENPREU+Z2V0TGl0ZXJhbDwvQ09ERT4gaW4gaW50ZXJmYWNlIDxDT0RFPm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yPC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0idG9TdHJpbmcoKSI+PCEtLSAtLT48L0E+PEgzPgotdG9TdHJpbmc8L0gzPgotPFBSRT4KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIDxCPnRvU3RyaW5nPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REQ+PERMPgotPERUPjxCPk92ZXJyaWRlczo8L0I+PEREPjxDT0RFPnRvU3RyaW5nPC9DT0RFPiBpbiBjbGFzcyA8Q09ERT5qYXZhLmxhbmcuRW51bSZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdTdHlsZTwvQT4mZ3Q7PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvU09BUEJpbmRpbmdTdHlsZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iU09BUEJpbmRpbmdTdHlsZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjZW51bV9jb25zdGFudF9zdW1tYXJ5Ij5FTlVNIENPTlNUQU5UUzwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2ZpZWxkX3N1bW1hcnkiPkZJRUxEPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7PEEgSFJFRj0iI2VudW1fY29uc3RhbnRfZGV0YWlsIj5FTlVNIENPTlNUQU5UUzwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2ZpZWxkX2RldGFpbCI+RklFTEQ8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYWZmYTQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjU4OjEyIEJTVCAyMDEwIC0tPgotPFRJVExFPgotU09BUEJpbmRpbmdVc2UKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTAtMDQtMDciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJTT0FQQmluZGluZ1VzZSI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvU09BUEJpbmRpbmdVc2UuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iU09BUEJpbmRpbmdVc2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2VudW1fY29uc3RhbnRfc3VtbWFyeSI+RU5VTSBDT05TVEFOVFM8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNmaWVsZF9zdW1tYXJ5Ij5GSUVMRDwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwOzxBIEhSRUY9IiNlbnVtX2NvbnN0YW50X2RldGFpbCI+RU5VTSBDT05TVEFOVFM8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNmaWVsZF9kZXRhaWwiPkZJRUxEPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvRk9OVD4KLTxCUj4KLUVudW0gU09BUEJpbmRpbmdVc2U8L0gyPgotPFBSRT4KLWphdmEubGFuZy5PYmplY3QKLSAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPmphdmEubGFuZy5FbnVtJmx0OzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdVc2U8L0E+Jmd0OwotICAgICAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdVc2U8L0I+Ci08L1BSRT4KLTxETD4KLTxEVD48Qj5BbGwgSW1wbGVtZW50ZWQgSW50ZXJmYWNlczo8L0I+IDxERD5qYXZhLmlvLlNlcmlhbGl6YWJsZSwgamF2YS5sYW5nLkNvbXBhcmFibGUmbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1VzZTwvQT4mZ3Q7LCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjwvREQ+Ci08L0RMPgotPEhSPgotPERMPgotPERUPjxQUkU+cHVibGljIGVudW0gPEI+U09BUEJpbmRpbmdVc2U8L0I+PERUPmV4dGVuZHMgamF2YS5sYW5nLkVudW0mbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1VzZTwvQT4mZ3Q7PERUPmltcGxlbWVudHMgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I8L0RMPgotPC9QUkU+Ci0KLTxQPgotPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5TT0FQIEJpbmRpbmcgVXNlPC9iPjwvZW0+JywKLSBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotCi08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sI2dldFNPQVBCaW5kaW5nVXNlKCkiPjxDT0RFPkRvbVBhY2thZ2UuZ2V0U09BUEJpbmRpbmdVc2UoKTwvQ09ERT48L0E+PC9ETD4KLTxIUj4KLQotPFA+Ci08IS0tID09PT09PT09PT09IEVOVU0gQ09OU1RBTlQgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0iZW51bV9jb25zdGFudF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+RW51bSBDb25zdGFudCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuaHRtbCNFTkNPREVEIj5FTkNPREVEPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSAnPGVtPjxiPkVOQ09ERUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sI0xJVEVSQUwiPkxJVEVSQUw8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlICc8ZW0+PGI+TElURVJBTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PCEtLSA9PT09PT09PT09PSBGSUVMRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJmaWVsZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+RmllbGQgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwjRU5DT0RFRF9WQUxVRSI+RU5DT0RFRF9WQUxVRTwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgJzxlbT48Yj5FTkNPREVEPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sI0xJVEVSQUxfVkFMVUUiPkxJVEVSQUxfVkFMVUU8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlICc8ZW0+PGI+TElURVJBTDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7amF2YS51dGlsLkxpc3QmbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1VzZTwvQT4mZ3Q7PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuaHRtbCNWQUxVRVMiPlZBTFVFUzwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFVzZTwvYj48L2VtPicgZW51bWVyYXRvcnMuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nVXNlPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwjZ2V0KGludCkiPmdldDwvQT48L0I+KGludCZuYnNwO3ZhbHVlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgJzxlbT48Yj5TT0FQIEJpbmRpbmcgVXNlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nVXNlPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwjZ2V0KGphdmEubGFuZy5TdHJpbmcpIj5nZXQ8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bGl0ZXJhbCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFVzZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1VzZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sI2dldEJ5TmFtZShqYXZhLmxhbmcuU3RyaW5nKSI+Z2V0QnlOYW1lPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO25hbWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSAnPGVtPjxiPlNPQVAgQmluZGluZyBVc2U8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEubGFuZy5TdHJpbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sI2dldExpdGVyYWwoKSI+Z2V0TGl0ZXJhbDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuaHRtbCNnZXROYW1lKCkiPmdldE5hbWU8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuaHRtbCNnZXRWYWx1ZSgpIj5nZXRWYWx1ZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuaHRtbCN0b1N0cmluZygpIj50b1N0cmluZzwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdVc2U8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuaHRtbCN2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpIj52YWx1ZU9mPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO25hbWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBlbnVtIGNvbnN0YW50IG9mIHRoaXMgdHlwZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1VzZTwvQT5bXTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwjdmFsdWVzKCkiPnZhbHVlczwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgY29uc3RhbnRzIG9mIHRoaXMgZW51bSB0eXBlLCBpbgotdGhlIG9yZGVyIHRoZXkgYXJlIGRlY2xhcmVkLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3NfamF2YS5sYW5nLkVudW0iPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGNsYXNzIGphdmEubGFuZy5FbnVtPC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+Y2xvbmUsIGNvbXBhcmVUbywgZXF1YWxzLCBmaW5hbGl6ZSwgZ2V0RGVjbGFyaW5nQ2xhc3MsIGhhc2hDb2RlLCBuYW1lLCBvcmRpbmFsLCB2YWx1ZU9mPC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3NfamF2YS5sYW5nLk9iamVjdCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gY2xhc3MgamF2YS5sYW5nLk9iamVjdDwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmdldENsYXNzLCBub3RpZnksIG5vdGlmeUFsbCwgd2FpdCwgd2FpdCwgd2FpdDwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PT09PSBFTlVNIENPTlNUQU5UIERFVEFJTCA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0iZW51bV9jb25zdGFudF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5FbnVtIENvbnN0YW50IERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJMSVRFUkFMIj48IS0tIC0tPjwvQT48SDM+Ci1MSVRFUkFMPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIGZpbmFsIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdVc2U8L0E+IDxCPkxJVEVSQUw8L0I+PC9QUkU+Ci08REw+Ci08REQ+VGhlICc8ZW0+PGI+TElURVJBTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sI0xJVEVSQUxfVkFMVUUiPjxDT0RFPkxJVEVSQUxfVkFMVUU8L0NPREU+PC9BPjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJFTkNPREVEIj48IS0tIC0tPjwvQT48SDM+Ci1FTkNPREVEPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIGZpbmFsIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdVc2U8L0E+IDxCPkVOQ09ERUQ8L0I+PC9QUkU+Ci08REw+Ci08REQ+VGhlICc8ZW0+PGI+RU5DT0RFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sI0VOQ09ERURfVkFMVUUiPjxDT0RFPkVOQ09ERURfVkFMVUU8L0NPREU+PC9BPjwvREw+Ci08L0RMPgotCi08IS0tID09PT09PT09PT09PSBGSUVMRCBERVRBSUwgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImZpZWxkX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPkZpZWxkIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJMSVRFUkFMX1ZBTFVFIj48IS0tIC0tPjwvQT48SDM+Ci1MSVRFUkFMX1ZBTFVFPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCA8Qj5MSVRFUkFMX1ZBTFVFPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSAnPGVtPjxiPkxJVEVSQUw8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8cD4KLSBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkxJVEVSQUw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSA8L3A+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuaHRtbCNMSVRFUkFMIj48Q09ERT5MSVRFUkFMPC9DT0RFPjwvQT4sIAotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29uc3RhbnQtdmFsdWVzLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZS5MSVRFUkFMX1ZBTFVFIj5Db25zdGFudCBGaWVsZCBWYWx1ZXM8L0E+PC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IkVOQ09ERURfVkFMVUUiPjwhLS0gLS0+PC9BPjxIMz4KLUVOQ09ERURfVkFMVUU8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IDxCPkVOQ09ERURfVkFMVUU8L0I+PC9QUkU+Ci08REw+Ci08REQ+VGhlICc8ZW0+PGI+RU5DT0RFRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDxwPgotIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RU5DT0RFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0gdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotIDwvcD4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sI0VOQ09ERUQiPjxDT0RFPkVOQ09ERUQ8L0NPREU+PC9BPiwgCi08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb25zdGFudC12YWx1ZXMuaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlLkVOQ09ERURfVkFMVUUiPkNvbnN0YW50IEZpZWxkIFZhbHVlczwvQT48L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iVkFMVUVTIj48IS0tIC0tPjwvQT48SDM+Ci1WQUxVRVM8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLkxpc3QmbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1VzZTwvQT4mZ3Q7IDxCPlZBTFVFUzwvQj48L1BSRT4KLTxETD4KLTxERD5BIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFVzZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPERMPgotPC9ETD4KLTwvREw+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0idmFsdWVzKCkiPjwhLS0gLS0+PC9BPjxIMz4KLXZhbHVlczwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nVXNlPC9BPltdIDxCPnZhbHVlczwvQj4oKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgY29uc3RhbnRzIG9mIHRoaXMgZW51bSB0eXBlLCBpbgotdGhlIG9yZGVyIHRoZXkgYXJlIGRlY2xhcmVkLiAgVGhpcyBtZXRob2QgbWF5IGJlIHVzZWQgdG8gaXRlcmF0ZQotb3ZlciB0aGUgY29uc3RhbnRzIGFzIGZvbGxvd3M6Ci08cHJlPgotZm9yIChTT0FQQmluZGluZ1VzZSBjIDogU09BUEJpbmRpbmdVc2UudmFsdWVzKCkpCi0mbmJzcDsgICBTeXN0ZW0ub3V0LnByaW50bG4oYyk7Ci08L3ByZT4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5hbiBhcnJheSBjb250YWluaW5nIHRoZSBjb25zdGFudHMgb2YgdGhpcyBlbnVtIHR5cGUsIGluCi10aGUgb3JkZXIgdGhleSBhcmUgZGVjbGFyZWQ8L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InZhbHVlT2YoamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLXZhbHVlT2Y8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1VzZTwvQT4gPEI+dmFsdWVPZjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO25hbWUpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgZW51bSBjb25zdGFudCBvZiB0aGlzIHR5cGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi1UaGUgc3RyaW5nIG11c3QgbWF0Y2ggPEk+ZXhhY3RseTwvST4gYW4gaWRlbnRpZmllciB1c2VkIHRvIGRlY2xhcmUgYW4KLWVudW0gY29uc3RhbnQgaW4gdGhpcyB0eXBlLiAgKEV4dHJhbmVvdXMgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGFyZSAKLW5vdCBwZXJtaXR0ZWQuKQotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5uYW1lPC9DT0RFPiAtIHRoZSBuYW1lIG9mIHRoZSBlbnVtIGNvbnN0YW50IHRvIGJlIHJldHVybmVkLgotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgZW51bSBjb25zdGFudCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZQotPERUPjxCPlRocm93czo8L0I+Ci08REQ+PENPREU+amF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvQ09ERT4gLSBpZiB0aGlzIGVudW0gdHlwZSBoYXMgbm8gY29uc3RhbnQKLXdpdGggdGhlIHNwZWNpZmllZCBuYW1lCi08REQ+PENPREU+amF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uPC9DT0RFPiAtIGlmIHRoZSBhcmd1bWVudCBpcyBudWxsPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXQoamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLWdldDwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nVXNlPC9BPiA8Qj5nZXQ8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtsaXRlcmFsKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFVzZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRCeU5hbWUoamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLWdldEJ5TmFtZTwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nVXNlPC9BPiA8Qj5nZXRCeU5hbWU8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtuYW1lKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFVzZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXQoaW50KSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0PC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdVc2U8L0E+IDxCPmdldDwvQj4oaW50Jm5ic3A7dmFsdWUpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgJzxlbT48Yj5TT0FQIEJpbmRpbmcgVXNlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFZhbHVlKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFZhbHVlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgaW50IDxCPmdldFZhbHVlPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5TcGVjaWZpZWQgYnk6PC9CPjxERD48Q09ERT5nZXRWYWx1ZTwvQ09ERT4gaW4gaW50ZXJmYWNlIDxDT0RFPm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yPC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0TmFtZSgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXROYW1lPC9IMz4KLTxQUkU+Ci1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyA8Qj5nZXROYW1lPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5TcGVjaWZpZWQgYnk6PC9CPjxERD48Q09ERT5nZXROYW1lPC9DT0RFPiBpbiBpbnRlcmZhY2UgPENPREU+b3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I8L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRMaXRlcmFsKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldExpdGVyYWw8L0gzPgotPFBSRT4KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIDxCPmdldExpdGVyYWw8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REQ+PERMPgotPERUPjxCPlNwZWNpZmllZCBieTo8L0I+PEREPjxDT0RFPmdldExpdGVyYWw8L0NPREU+IGluIGludGVyZmFjZSA8Q09ERT5vcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjwvQ09ERT48L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InRvU3RyaW5nKCkiPjwhLS0gLS0+PC9BPjxIMz4KLXRvU3RyaW5nPC9IMz4KLTxQUkU+Ci1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyA8Qj50b1N0cmluZzwvQj4oKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5PdmVycmlkZXM6PC9CPjxERD48Q09ERT50b1N0cmluZzwvQ09ERT4gaW4gY2xhc3MgPENPREU+amF2YS5sYW5nLkVudW0mbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1VzZTwvQT4mZ3Q7PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvU09BUEJpbmRpbmdVc2UuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iU09BUEJpbmRpbmdVc2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2VudW1fY29uc3RhbnRfc3VtbWFyeSI+RU5VTSBDT05TVEFOVFM8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNmaWVsZF9zdW1tYXJ5Ij5GSUVMRDwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwOzxBIEhSRUY9IiNlbnVtX2NvbnN0YW50X2RldGFpbCI+RU5VTSBDT05TVEFOVFM8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNmaWVsZF9kZXRhaWwiPkZJRUxEPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYzAxMmQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjQ4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8xNCkgb24gV2VkIEFwciAwNyAwNzo1ODoxMiBCU1QgMjAxMCAtLT4KLTxUSVRMRT4KLVdlYlBhcmFtS2luZAotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMC0wNC0wNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IldlYlBhcmFtS2luZCI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvV2ViUGFyYW1LaW5kLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iV2ViUGFyYW1LaW5kLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNlbnVtX2NvbnN0YW50X3N1bW1hcnkiPkVOVU0gQ09OU1RBTlRTPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjZmllbGRfc3VtbWFyeSI+RklFTEQ8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDs8QSBIUkVGPSIjZW51bV9jb25zdGFudF9kZXRhaWwiPkVOVU0gQ09OU1RBTlRTPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjZmllbGRfZGV0YWlsIj5GSUVMRDwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTwhLS0gPT09PT09PT0gU1RBUlQgT0YgQ0xBU1MgREFUQSA9PT09PT09PSAtLT4KLTxIMj4KLTxGT05UIFNJWkU9Ii0xIj4KLW9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0ZPTlQ+Ci08QlI+Ci1FbnVtIFdlYlBhcmFtS2luZDwvSDI+Ci08UFJFPgotamF2YS5sYW5nLk9iamVjdAotICA8SU1HIFNSQz0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcmVzb3VyY2VzL2luaGVyaXQuZ2lmIiBBTFQ9ImV4dGVuZGVkIGJ5ICI+amF2YS5sYW5nLkVudW0mbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+V2ViUGFyYW1LaW5kPC9BPiZndDsKLSAgICAgIDxJTUcgU1JDPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9yZXNvdXJjZXMvaW5oZXJpdC5naWYiIEFMVD0iZXh0ZW5kZWQgYnkgIj48Qj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldlYlBhcmFtS2luZDwvQj4KLTwvUFJFPgotPERMPgotPERUPjxCPkFsbCBJbXBsZW1lbnRlZCBJbnRlcmZhY2VzOjwvQj4gPEREPmphdmEuaW8uU2VyaWFsaXphYmxlLCBqYXZhLmxhbmcuQ29tcGFyYWJsZSZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5XZWJQYXJhbUtpbmQ8L0E+Jmd0Oywgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I8L0REPgotPC9ETD4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBlbnVtIDxCPldlYlBhcmFtS2luZDwvQj48RFQ+ZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5XZWJQYXJhbUtpbmQ8L0E+Jmd0OzxEVD5pbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yPC9ETD4KLTwvUFJFPgotCi08UD4KLTxETD4KLTxEVD48Qj5BdXRob3I6PC9CPjwvRFQ+Ci0gIDxERD5IcmlzdG8gU2FiZXY8L0REPgotPC9ETD4KLTxIUj4KLQotPFA+Ci08IS0tID09PT09PT09PT09IEVOVU0gQ09OU1RBTlQgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0iZW51bV9jb25zdGFudF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+RW51bSBDb25zdGFudCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwjSU4iPklOPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuaHRtbCNJTk9VVCI+SU5PVVQ8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sI09VVCI+T1VUPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzwhLS0gPT09PT09PT09PT0gRklFTEQgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0iZmllbGRfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkZpZWxkIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuaHRtbCNJTl9WQUxVRSI+SU5fVkFMVUU8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlICc8ZW0+PGI+SU48L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sI0lOT1VUX1ZBTFVFIj5JTk9VVF9WQUxVRTwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgJzxlbT48Yj5JTk9VVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwjT1VUX1ZBTFVFIj5PVVRfVkFMVUU8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlICc8ZW0+PGI+T1VUPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtqYXZhLnV0aWwuTGlzdCZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5XZWJQYXJhbUtpbmQ8L0E+Jmd0OzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sI1ZBTFVFUyI+VkFMVUVTPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0EgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5XZWIgUGFyYW0gS2luZDwvYj48L2VtPicgZW51bWVyYXRvcnMuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5XZWJQYXJhbUtpbmQ8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwjZ2V0KGludCkiPmdldDwvQT48L0I+KGludCZuYnNwO3ZhbHVlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgJzxlbT48Yj5XZWIgUGFyYW0gS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+V2ViUGFyYW1LaW5kPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sI2dldChqYXZhLmxhbmcuU3RyaW5nKSI+Z2V0PC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2xpdGVyYWwpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSAnPGVtPjxiPldlYiBQYXJhbSBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5XZWJQYXJhbUtpbmQ8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwjZ2V0QnlOYW1lKGphdmEubGFuZy5TdHJpbmcpIj5nZXRCeU5hbWU8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bmFtZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlICc8ZW0+PGI+V2ViIFBhcmFtIEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEubGFuZy5TdHJpbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuaHRtbCNnZXRMaXRlcmFsKCkiPmdldExpdGVyYWw8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sI2dldE5hbWUoKSI+Z2V0TmFtZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuaHRtbCNnZXRWYWx1ZSgpIj5nZXRWYWx1ZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwjdG9TdHJpbmcoKSI+dG9TdHJpbmc8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5XZWJQYXJhbUtpbmQ8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwjdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKSI+dmFsdWVPZjwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtuYW1lKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgZW51bSBjb25zdGFudCBvZiB0aGlzIHR5cGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPldlYlBhcmFtS2luZDwvQT5bXTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sI3ZhbHVlcygpIj52YWx1ZXM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGNvbnN0YW50cyBvZiB0aGlzIGVudW0gdHlwZSwgaW4KLXRoZSBvcmRlciB0aGV5IGFyZSBkZWNsYXJlZC48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDs8QSBOQU1FPSJtZXRob2RzX2luaGVyaXRlZF9mcm9tX2NsYXNzX2phdmEubGFuZy5FbnVtIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBqYXZhLmxhbmcuRW51bTwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmNsb25lLCBjb21wYXJlVG8sIGVxdWFscywgZmluYWxpemUsIGdldERlY2xhcmluZ0NsYXNzLCBoYXNoQ29kZSwgbmFtZSwgb3JkaW5hbCwgdmFsdWVPZjwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDs8QSBOQU1FPSJtZXRob2RzX2luaGVyaXRlZF9mcm9tX2NsYXNzX2phdmEubGFuZy5PYmplY3QiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGNsYXNzIGphdmEubGFuZy5PYmplY3Q8L0I+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT5nZXRDbGFzcywgbm90aWZ5LCBub3RpZnlBbGwsIHdhaXQsIHdhaXQsIHdhaXQ8L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT09PT0gRU5VTSBDT05TVEFOVCBERVRBSUwgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImVudW1fY29uc3RhbnRfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+RW51bSBDb25zdGFudCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iSU4iPjwhLS0gLS0+PC9BPjxIMz4KLUlOPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIGZpbmFsIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPldlYlBhcmFtS2luZDwvQT4gPEI+SU48L0I+PC9QUkU+Ci08REw+Ci08REw+Ci08L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iSU5PVVQiPjwhLS0gLS0+PC9BPjxIMz4KLUlOT1VUPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIGZpbmFsIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPldlYlBhcmFtS2luZDwvQT4gPEI+SU5PVVQ8L0I+PC9QUkU+Ci08REw+Ci08REw+Ci08L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iT1VUIj48IS0tIC0tPjwvQT48SDM+Ci1PVVQ8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgZmluYWwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+V2ViUGFyYW1LaW5kPC9BPiA8Qj5PVVQ8L0I+PC9QUkU+Ci08REw+Ci08REw+Ci08L0RMPgotPC9ETD4KLQotPCEtLSA9PT09PT09PT09PT0gRklFTEQgREVUQUlMID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJmaWVsZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5GaWVsZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iSU5fVkFMVUUiPjwhLS0gLS0+PC9BPjxIMz4KLUlOX1ZBTFVFPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCA8Qj5JTl9WQUxVRTwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgJzxlbT48Yj5JTjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDxwPgotIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SU48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSA8L3A+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwjSU4iPjxDT0RFPklOPC9DT0RFPjwvQT4sIAotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29uc3RhbnQtdmFsdWVzLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5XZWJQYXJhbUtpbmQuSU5fVkFMVUUiPkNvbnN0YW50IEZpZWxkIFZhbHVlczwvQT48L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iSU5PVVRfVkFMVUUiPjwhLS0gLS0+PC9BPjxIMz4KLUlOT1VUX1ZBTFVFPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCA8Qj5JTk9VVF9WQUxVRTwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgJzxlbT48Yj5JTk9VVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDxwPgotIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SU5PVVQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSA8L3A+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwjSU5PVVQiPjxDT0RFPklOT1VUPC9DT0RFPjwvQT4sIAotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29uc3RhbnQtdmFsdWVzLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5XZWJQYXJhbUtpbmQuSU5PVVRfVkFMVUUiPkNvbnN0YW50IEZpZWxkIFZhbHVlczwvQT48L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iT1VUX1ZBTFVFIj48IS0tIC0tPjwvQT48SDM+Ci1PVVRfVkFMVUU8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IDxCPk9VVF9WQUxVRTwvQj48L1BSRT4KLTxETD4KLTxERD5UaGUgJzxlbT48Yj5PVVQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8cD4KLSBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk9VVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0gdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotIDwvcD4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuaHRtbCNPVVQiPjxDT0RFPk9VVDwvQ09ERT48L0E+LCAKLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnN0YW50LXZhbHVlcy5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV2ViUGFyYW1LaW5kLk9VVF9WQUxVRSI+Q29uc3RhbnQgRmllbGQgVmFsdWVzPC9BPjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJWQUxVRVMiPjwhLS0gLS0+PC9BPjxIMz4KLVZBTFVFUzwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuTGlzdCZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5XZWJQYXJhbUtpbmQ8L0E+Jmd0OyA8Qj5WQUxVRVM8L0I+PC9QUkU+Ci08REw+Ci08REQ+QSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPldlYiBQYXJhbSBLaW5kPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REw+Ci08L0RMPgotPC9ETD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJ2YWx1ZXMoKSI+PCEtLSAtLT48L0E+PEgzPgotdmFsdWVzPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPldlYlBhcmFtS2luZDwvQT5bXSA8Qj52YWx1ZXM8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGNvbnN0YW50cyBvZiB0aGlzIGVudW0gdHlwZSwgaW4KLXRoZSBvcmRlciB0aGV5IGFyZSBkZWNsYXJlZC4gIFRoaXMgbWV0aG9kIG1heSBiZSB1c2VkIHRvIGl0ZXJhdGUKLW92ZXIgdGhlIGNvbnN0YW50cyBhcyBmb2xsb3dzOgotPHByZT4KLWZvciAoV2ViUGFyYW1LaW5kIGMgOiBXZWJQYXJhbUtpbmQudmFsdWVzKCkpCi0mbmJzcDsgICBTeXN0ZW0ub3V0LnByaW50bG4oYyk7Ci08L3ByZT4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5hbiBhcnJheSBjb250YWluaW5nIHRoZSBjb25zdGFudHMgb2YgdGhpcyBlbnVtIHR5cGUsIGluCi10aGUgb3JkZXIgdGhleSBhcmUgZGVjbGFyZWQ8L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InZhbHVlT2YoamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLXZhbHVlT2Y8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+V2ViUGFyYW1LaW5kPC9BPiA8Qj52YWx1ZU9mPC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bmFtZSk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSBlbnVtIGNvbnN0YW50IG9mIHRoaXMgdHlwZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLVRoZSBzdHJpbmcgbXVzdCBtYXRjaCA8ST5leGFjdGx5PC9JPiBhbiBpZGVudGlmaWVyIHVzZWQgdG8gZGVjbGFyZSBhbgotZW51bSBjb25zdGFudCBpbiB0aGlzIHR5cGUuICAoRXh0cmFuZW91cyB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgYXJlIAotbm90IHBlcm1pdHRlZC4pCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPm5hbWU8L0NPREU+IC0gdGhlIG5hbWUgb2YgdGhlIGVudW0gY29uc3RhbnQgdG8gYmUgcmV0dXJuZWQuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBlbnVtIGNvbnN0YW50IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lCi08RFQ+PEI+VGhyb3dzOjwvQj4KLTxERD48Q09ERT5qYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uPC9DT0RFPiAtIGlmIHRoaXMgZW51bSB0eXBlIGhhcyBubyBjb25zdGFudAotd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUKLTxERD48Q09ERT5qYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb248L0NPREU+IC0gaWYgdGhlIGFyZ3VtZW50IGlzIG51bGw8L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldChqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0PC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPldlYlBhcmFtS2luZDwvQT4gPEI+Z2V0PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bGl0ZXJhbCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSAnPGVtPjxiPldlYiBQYXJhbSBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldEJ5TmFtZShqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0QnlOYW1lPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPldlYlBhcmFtS2luZDwvQT4gPEI+Z2V0QnlOYW1lPC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bmFtZSk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSAnPGVtPjxiPldlYiBQYXJhbSBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldChpbnQpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXQ8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+V2ViUGFyYW1LaW5kPC9BPiA8Qj5nZXQ8L0I+KGludCZuYnNwO3ZhbHVlKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgdGhlICc8ZW0+PGI+V2ViIFBhcmFtIEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0VmFsdWUoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0VmFsdWU8L0gzPgotPFBSRT4KLXB1YmxpYyBpbnQgPEI+Z2V0VmFsdWU8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REQ+PERMPgotPERUPjxCPlNwZWNpZmllZCBieTo8L0I+PEREPjxDT0RFPmdldFZhbHVlPC9DT0RFPiBpbiBpbnRlcmZhY2UgPENPREU+b3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I8L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXROYW1lKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldE5hbWU8L0gzPgotPFBSRT4KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIDxCPmdldE5hbWU8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REQ+PERMPgotPERUPjxCPlNwZWNpZmllZCBieTo8L0I+PEREPjxDT0RFPmdldE5hbWU8L0NPREU+IGluIGludGVyZmFjZSA8Q09ERT5vcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjwvQ09ERT48L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldExpdGVyYWwoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0TGl0ZXJhbDwvSDM+Ci08UFJFPgotcHVibGljIGphdmEubGFuZy5TdHJpbmcgPEI+Z2V0TGl0ZXJhbDwvQj4oKTwvUFJFPgotPERMPgotPEREPjwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08UD4KLTxERD48REw+Ci08RFQ+PEI+U3BlY2lmaWVkIGJ5OjwvQj48REQ+PENPREU+Z2V0TGl0ZXJhbDwvQ09ERT4gaW4gaW50ZXJmYWNlIDxDT0RFPm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yPC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0idG9TdHJpbmcoKSI+PCEtLSAtLT48L0E+PEgzPgotdG9TdHJpbmc8L0gzPgotPFBSRT4KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIDxCPnRvU3RyaW5nPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPFA+Ci08REQ+PERMPgotPERUPjxCPk92ZXJyaWRlczo8L0I+PEREPjxDT0RFPnRvU3RyaW5nPC9DT0RFPiBpbiBjbGFzcyA8Q09ERT5qYXZhLmxhbmcuRW51bSZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5XZWJQYXJhbUtpbmQ8L0E+Jmd0OzwvQ09ERT48L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL1dlYlBhcmFtS2luZC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IldlYlBhcmFtS2luZC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjZW51bV9jb25zdGFudF9zdW1tYXJ5Ij5FTlVNIENPTlNUQU5UUzwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2ZpZWxkX3N1bW1hcnkiPkZJRUxEPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7PEEgSFJFRj0iI2VudW1fY29uc3RhbnRfZGV0YWlsIj5FTlVNIENPTlNUQU5UUzwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2ZpZWxkX2RldGFpbCI+RklFTEQ8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNzVjZmEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjU4OjEyIEJTVCAyMDEwIC0tPgotPFRJVExFPgotV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24KLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTAtMDQtMDciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbiI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IldzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3JfZGV0YWlsIj5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08IS0tID09PT09PT09IFNUQVJUIE9GIENMQVNTIERBVEEgPT09PT09PT0gLS0+Ci08SDI+Ci08Rk9OVCBTSVpFPSItMSI+Ci1vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpPC9GT05UPgotPEJSPgotQ2xhc3MgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb248L0gyPgotPFBSRT4KLWphdmEubGFuZy5PYmplY3QKLSAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPmphdmEubGFuZy5UaHJvd2FibGUKLSAgICAgIDxJTUcgU1JDPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9yZXNvdXJjZXMvaW5oZXJpdC5naWYiIEFMVD0iZXh0ZW5kZWQgYnkgIj5qYXZhLmxhbmcuRXhjZXB0aW9uCi0gICAgICAgICAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb248L0I+Ci08L1BSRT4KLTxETD4KLTxEVD48Qj5BbGwgSW1wbGVtZW50ZWQgSW50ZXJmYWNlczo8L0I+IDxERD5qYXZhLmlvLlNlcmlhbGl6YWJsZTwvREQ+Ci08L0RMPgotPEhSPgotPERMPgotPERUPjxQUkU+cHVibGljIGNsYXNzIDxCPldzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uPC9CPjxEVD5leHRlbmRzIGphdmEubGFuZy5FeGNlcHRpb248L0RMPgotPC9QUkU+Ci0KLTxQPgotRXhjZXB0aW9uIHRocm93biBpbiBjYXNlIHRoZSBsb2FkaW5nIG9mIFdTIERPTSBoYXMgYmVlbiBjYW5jZWxsZWQKLTxQPgotCi08UD4KLTxETD4KLTxEVD48Qj5BdXRob3I6PC9CPjwvRFQ+Ci0gIDxERD5HZW9yZ2kgVmFjaGtvdjwvREQ+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uIj5TZXJpYWxpemVkIEZvcm08L0E+PC9ETD4KLTxIUj4KLQotPFA+Ci0KLTwhLS0gPT09PT09PT0gQ09OU1RSVUNUT1IgU1VNTUFSWSA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0iY29uc3RydWN0b3Jfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNvbnN0cnVjdG9yIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbi5odG1sI1dzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpIj5Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbjwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDttZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO2xvY2FsaXplZE1lc3NhZ2UpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDb25zdHJ1Y3RzIGV4Y2VwdGlvbiB3aXRoIGFiaWxpdHkgdG8gcHJvdmlkZSBsb2NhbGl6ZWQgbWVzc2FnZTwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uLmh0bWwjZ2V0TG9jYWxpemVkTWVzc2FnZSgpIj5nZXRMb2NhbGl6ZWRNZXNzYWdlPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyBsb2NhbGl6ZWQgbWVzc2FnZSB3aXRoIHdoaWNoIHRoZSBleGNlcHRpb24gd2FzIGNvbnN0cnVjdGVkLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3NfamF2YS5sYW5nLlRocm93YWJsZSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gY2xhc3MgamF2YS5sYW5nLlRocm93YWJsZTwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmZpbGxJblN0YWNrVHJhY2UsIGdldENhdXNlLCBnZXRNZXNzYWdlLCBnZXRTdGFja1RyYWNlLCBpbml0Q2F1c2UsIHByaW50U3RhY2tUcmFjZSwgcHJpbnRTdGFja1RyYWNlLCBwcmludFN0YWNrVHJhY2UsIHNldFN0YWNrVHJhY2UsIHRvU3RyaW5nPC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3NfamF2YS5sYW5nLk9iamVjdCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gY2xhc3MgamF2YS5sYW5nLk9iamVjdDwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmNsb25lLCBlcXVhbHMsIGZpbmFsaXplLCBnZXRDbGFzcywgaGFzaENvZGUsIG5vdGlmeSwgbm90aWZ5QWxsLCB3YWl0LCB3YWl0LCB3YWl0PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTwhLS0gPT09PT09PT09IENPTlNUUlVDVE9SIERFVEFJTCA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0iY29uc3RydWN0b3JfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9IldzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbjwvSDM+Ci08UFJFPgotcHVibGljIDxCPldzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uPC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bG9jYWxpemVkTWVzc2FnZSk8L1BSRT4KLTxETD4KLTxERD5Db25zdHJ1Y3RzIGV4Y2VwdGlvbiB3aXRoIGFiaWxpdHkgdG8gcHJvdmlkZSBsb2NhbGl6ZWQgbWVzc2FnZQotPFA+Ci08REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPm1lc3NhZ2U8L0NPREU+IC0gLSB0aGUgZGV0YWlsIG1lc3NhZ2UgKHdoaWNoIGlzIHNhdmVkIGZvciBsYXRlciByZXRyaWV2YWwKLSAgICAgICAgIGJ5IHRoZSA8Q09ERT5UaHJvd2FibGUuZ2V0TWVzc2FnZSgpPC9DT0RFPiBtZXRob2QpPEREPjxDT0RFPmxvY2FsaXplZE1lc3NhZ2U8L0NPREU+IC0gLSB0aGUgbG9jYWxpemVkIG1lc3NhZ2UgKHdoaWNoIGlzIHNhdmVkIGZvciBsYXRlciByZXRyaWV2YWwKLSAgICAgICAgIGJ5IHRoZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uLmh0bWwjZ2V0TG9jYWxpemVkTWVzc2FnZSgpIj48Q09ERT5nZXRMb2NhbGl6ZWRNZXNzYWdlKCk8L0NPREU+PC9BPiBtZXRob2QpCi08RFQ+PEI+VGhyb3dzOjwvQj4KLTxERD48Q09ERT5qYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb248L0NPREU+IC0gLSBpbiBjYXNlIGxvY2FsaXNlZCBtZXNzYWdlIGlzIG51bGw8L0RMPgotPC9ETD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJnZXRMb2NhbGl6ZWRNZXNzYWdlKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldExvY2FsaXplZE1lc3NhZ2U8L0gzPgotPFBSRT4KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIDxCPmdldExvY2FsaXplZE1lc3NhZ2U8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIGxvY2FsaXplZCBtZXNzYWdlIHdpdGggd2hpY2ggdGhlIGV4Y2VwdGlvbiB3YXMgY29uc3RydWN0ZWQuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+T3ZlcnJpZGVzOjwvQj48REQ+PENPREU+Z2V0TG9jYWxpemVkTWVzc2FnZTwvQ09ERT4gaW4gY2xhc3MgPENPREU+amF2YS5sYW5nLlRocm93YWJsZTwvQ09ERT48L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL1dzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV3NET01SdW50aW1lTWFuYWdlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV3NET01SdW50aW1lTWFuYWdlci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dzRE9NUnVudGltZU1hbmFnZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMxOTg2Ni4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV3NET01SdW50aW1lTWFuYWdlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8xNCkgb24gV2VkIEFwciAwNyAwNzo1ODoxMiBCU1QgMjAxMCAtLT4KLTxUSVRMRT4KLVdzRE9NUnVudGltZU1hbmFnZXIKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTAtMDQtMDciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJXc0RPTVJ1bnRpbWVNYW5hZ2VyIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9Xc0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwO05FWFQgQ0xBU1M8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iV3NET01SdW50aW1lTWFuYWdlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvRk9OVD4KLTxCUj4KLUNsYXNzIFdzRE9NUnVudGltZU1hbmFnZXI8L0gyPgotPFBSRT4KLWphdmEubGFuZy5PYmplY3QKLSAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV3NET01SdW50aW1lTWFuYWdlcjwvQj4KLTwvUFJFPgotPERMPgotPERUPjxCPkFsbCBJbXBsZW1lbnRlZCBJbnRlcmZhY2VzOjwvQj4gPEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdTRE9NUnVudGltZU1hbmFnZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV1NET01SdW50aW1lTWFuYWdlcjwvQT48L0REPgotPC9ETD4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBjbGFzcyA8Qj5Xc0RPTVJ1bnRpbWVNYW5hZ2VyPC9CPjxEVD5leHRlbmRzIGphdmEubGFuZy5PYmplY3Q8RFQ+aW1wbGVtZW50cyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXU0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdTRE9NUnVudGltZU1hbmFnZXI8L0E+PC9ETD4KLTwvUFJFPgotCi08UD4KLUZhY3RvcnkgY2xhc3MgZm9yIGluc3RhbnRpYXRpbmcgRE9NIFJ1bnRpbWVzIGFuZCBtYW5hZ2luZyB0aG9zZSBpbnN0YW5jZXMuCi08UD4KLQotPFA+Ci08REw+Ci08RFQ+PEI+QXV0aG9yOjwvQj48L0RUPgotICA8REQ+R2VvcmdpIEhyaXN0b3Y8L0REPgotPC9ETD4KLTxIUj4KLQotPFA+Ci0KLTwhLS0gPT09PT09PT0gQ09OU1RSVUNUT1IgU1VNTUFSWSA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0iY29uc3RydWN0b3Jfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNvbnN0cnVjdG9yIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wcm90ZWN0ZWQgPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV3NET01SdW50aW1lTWFuYWdlci5odG1sI1dzRE9NUnVudGltZU1hbmFnZXIoKSI+V3NET01SdW50aW1lTWFuYWdlcjwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHJvdGVjdGVkICZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRE9NUnVudGltZUV4dGVuc2lvbi5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXc0RPTVJ1bnRpbWVFeHRlbnNpb248L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV3NET01SdW50aW1lTWFuYWdlci5odG1sI2NyZWF0ZURPTVJ1bnRpbWUob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnJlZ2lzdHJ5LklXc0RPTVJ1bnRpbWVJbmZvLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikiPmNyZWF0ZURPTVJ1bnRpbWU8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcmVnaXN0cnkvSVdzRE9NUnVudGltZUluZm8uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucmVnaXN0cnkiPklXc0RPTVJ1bnRpbWVJbmZvPC9BPiZuYnNwO3J1bnRpbWVJbmZvLAotICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dzRE9NUnVudGltZU1hbmFnZXIuaHRtbCNjcmVhdGVET01SdW50aW1lcyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikiPmNyZWF0ZURPTVJ1bnRpbWVzPC9BPjwvQj4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7SW5zdGFudGlhdGVzIHRoZSBET00gUnVudGltZXMgaWYgbm90IGFscmVhZHkuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRE9NUnVudGltZUV4dGVuc2lvbi5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXc0RPTVJ1bnRpbWVFeHRlbnNpb248L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV3NET01SdW50aW1lTWFuYWdlci5odG1sI2dldERPTVJ1bnRpbWUob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnJlZ2lzdHJ5LklXc0RPTVJ1bnRpbWVJbmZvKSI+Z2V0RE9NUnVudGltZTwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9yZWdpc3RyeS9JV3NET01SdW50aW1lSW5mby5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5yZWdpc3RyeSI+SVdzRE9NUnVudGltZUluZm88L0E+Jm5ic3A7cnVudGltZUluZm8pPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRoZSBET00gcnVudGltZSBpbnN0YW5jZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBkZXNjcmlwdG9yIG9iamVjdAotIG9mIHR5cGUgSVJ1bnRpbWVJbmZvIGFuZCBpbnN0YW50aWF0ZSBzdWNoIERPTSBydW50aW1lIGluc3RhbmNlIGlmIG5vbiBleGlzdGVudCBhdCB0aGUgCi0gbW9tZW50IG9mIGludm9jYXRpb24gb2YgdGhpcyBtZXRob2QuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRE9NUnVudGltZUV4dGVuc2lvbi5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXc0RPTVJ1bnRpbWVFeHRlbnNpb248L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV3NET01SdW50aW1lTWFuYWdlci5odG1sI2dldERPTVJ1bnRpbWUoamF2YS5sYW5nLlN0cmluZykiPmdldERPTVJ1bnRpbWU8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7cnVudGltZUlkKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiB0aGUgRE9NIHJ1bnRpbWUgaW5zdGFuY2UgY29ycmVzcG9uZGluZyB0byB0aGUgcnVudGltZSBpZAotIGFuZCBpbnN0YW50aWF0ZSBzdWNoIERPTSBydW50aW1lIGluc3RhbmNlIGlmIG5vbiBleGlzdGVudCBhdCB0aGUgCi0gbW9tZW50IG9mIGludm9jYXRpb24gb2YgdGhpcyBtZXRob2QuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEudXRpbC5Db2xsZWN0aW9uJmx0OzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRE9NUnVudGltZUV4dGVuc2lvbi5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXc0RPTVJ1bnRpbWVFeHRlbnNpb248L0E+Jmd0OzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dzRE9NUnVudGltZU1hbmFnZXIuaHRtbCNnZXRET01SdW50aW1lcygpIj5nZXRET01SdW50aW1lczwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXU0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdTRE9NUnVudGltZU1hbmFnZXI8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV3NET01SdW50aW1lTWFuYWdlci5odG1sI2luc3RhbmNlKCkiPmluc3RhbmNlPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwjcmVsb2FkRE9NUnVudGltZXMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpIj5yZWxvYWRET01SdW50aW1lczwvQT48L0I+KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgbWV0aG9kIHNob3VsZCByZWxvYWQgYWxsIGluc3RhbmNlcyBvZiBET00gUnVudGltZXMuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19qYXZhLmxhbmcuT2JqZWN0Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBqYXZhLmxhbmcuT2JqZWN0PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+Y2xvbmUsIGVxdWFscywgZmluYWxpemUsIGdldENsYXNzLCBoYXNoQ29kZSwgbm90aWZ5LCBub3RpZnlBbGwsIHRvU3RyaW5nLCB3YWl0LCB3YWl0LCB3YWl0PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTwhLS0gPT09PT09PT09IENPTlNUUlVDVE9SIERFVEFJTCA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0iY29uc3RydWN0b3JfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9IldzRE9NUnVudGltZU1hbmFnZXIoKSI+PCEtLSAtLT48L0E+PEgzPgotV3NET01SdW50aW1lTWFuYWdlcjwvSDM+Ci08UFJFPgotcHJvdGVjdGVkIDxCPldzRE9NUnVudGltZU1hbmFnZXI8L0I+KCk8L1BSRT4KLTxETD4KLTwvREw+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iaW5zdGFuY2UoKSI+PCEtLSAtLT48L0E+PEgzPgotaW5zdGFuY2U8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV1NET01SdW50aW1lTWFuYWdlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXU0RPTVJ1bnRpbWVNYW5hZ2VyPC9BPiA8Qj5pbnN0YW5jZTwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iY3JlYXRlRE9NUnVudGltZXMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpIj48IS0tIC0tPjwvQT48SDM+Ci1jcmVhdGVET01SdW50aW1lczwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+Y3JlYXRlRE9NUnVudGltZXM8L0I+KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L1BSRT4KLTxETD4KLTxERD5JbnN0YW50aWF0ZXMgdGhlIERPTSBSdW50aW1lcyBpZiBub3QgYWxyZWFkeS4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5TcGVjaWZpZWQgYnk6PC9CPjxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXU0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwjY3JlYXRlRE9NUnVudGltZXMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpIj5jcmVhdGVET01SdW50aW1lczwvQT48L0NPREU+IGluIGludGVyZmFjZSA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXU0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdTRE9NUnVudGltZU1hbmFnZXI8L0E+PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iY3JlYXRlRE9NUnVudGltZShvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucmVnaXN0cnkuSVdzRE9NUnVudGltZUluZm8sIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKSI+PCEtLSAtLT48L0E+PEgzPgotY3JlYXRlRE9NUnVudGltZTwvSDM+Ci08UFJFPgotcHJvdGVjdGVkIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRE9NUnVudGltZUV4dGVuc2lvbi5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXc0RPTVJ1bnRpbWVFeHRlbnNpb248L0E+IDxCPmNyZWF0ZURPTVJ1bnRpbWU8L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9yZWdpc3RyeS9JV3NET01SdW50aW1lSW5mby5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5yZWdpc3RyeSI+SVdzRE9NUnVudGltZUluZm88L0E+Jm5ic3A7cnVudGltZUluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldERPTVJ1bnRpbWUob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnJlZ2lzdHJ5LklXc0RPTVJ1bnRpbWVJbmZvKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0RE9NUnVudGltZTwvSDM+Ci08UFJFPgotcHVibGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRE9NUnVudGltZUV4dGVuc2lvbi5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXc0RPTVJ1bnRpbWVFeHRlbnNpb248L0E+IDxCPmdldERPTVJ1bnRpbWU8L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9yZWdpc3RyeS9JV3NET01SdW50aW1lSW5mby5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5yZWdpc3RyeSI+SVdzRE9NUnVudGltZUluZm88L0E+Jm5ic3A7cnVudGltZUluZm8pPC9QUkU+Ci08REw+Ci08REQ+VGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiB0aGUgRE9NIHJ1bnRpbWUgaW5zdGFuY2UgY29ycmVzcG9uZGluZyB0byB0aGUgZGVzY3JpcHRvciBvYmplY3QKLSBvZiB0eXBlIElSdW50aW1lSW5mbyBhbmQgaW5zdGFudGlhdGUgc3VjaCBET00gcnVudGltZSBpbnN0YW5jZSBpZiBub24gZXhpc3RlbnQgYXQgdGhlIAotIG1vbWVudCBvZiBpbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5ydW50aW1lSW5mbzwvQ09ERT4gLSAtIGRlc2NyaXB0b3Igb2YgdGhlIERPTSBydW50aW1lIHRvIGJlIGluc3RhbnRpYXRlZCBhbmQgcmV0dXJuZWQKLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIERPTSBydW50aW1lIGluc3RhbmNlPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRET01SdW50aW1lKGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRET01SdW50aW1lPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV3NET01SdW50aW1lRXh0ZW5zaW9uLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdzRE9NUnVudGltZUV4dGVuc2lvbjwvQT4gPEI+Z2V0RE9NUnVudGltZTwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO3J1bnRpbWVJZCk8L1BSRT4KLTxETD4KLTxERD5UaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRoZSBET00gcnVudGltZSBpbnN0YW5jZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBydW50aW1lIGlkCi0gYW5kIGluc3RhbnRpYXRlIHN1Y2ggRE9NIHJ1bnRpbWUgaW5zdGFuY2UgaWYgbm9uIGV4aXN0ZW50IGF0IHRoZSAKLSBtb21lbnQgb2YgaW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5TcGVjaWZpZWQgYnk6PC9CPjxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXU0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwjZ2V0RE9NUnVudGltZShqYXZhLmxhbmcuU3RyaW5nKSI+Z2V0RE9NUnVudGltZTwvQT48L0NPREU+IGluIGludGVyZmFjZSA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXU0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdTRE9NUnVudGltZU1hbmFnZXI8L0E+PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cnVudGltZUlkPC9DT0RFPiAtIC0gc3RyaW5nIGlkZW50aWZpZXIgb2YgdGhlIHJ1bnRpbWUKLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIERPTSBydW50aW1lIGluc3RhbmNlPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRET01SdW50aW1lcygpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRET01SdW50aW1lczwvSDM+Ci08UFJFPgotcHVibGljIGphdmEudXRpbC5Db2xsZWN0aW9uJmx0OzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRE9NUnVudGltZUV4dGVuc2lvbi5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXc0RPTVJ1bnRpbWVFeHRlbnNpb248L0E+Jmd0OyA8Qj5nZXRET01SdW50aW1lczwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLTxEVD48Qj5TcGVjaWZpZWQgYnk6PC9CPjxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXU0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwjZ2V0RE9NUnVudGltZXMoKSI+Z2V0RE9NUnVudGltZXM8L0E+PC9DT0RFPiBpbiBpbnRlcmZhY2UgPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV1NET01SdW50aW1lTWFuYWdlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXU0RPTVJ1bnRpbWVNYW5hZ2VyPC9BPjwvQ09ERT48L0RMPgotPC9ERD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+YSBsaXN0IG9mIGFsbCBpbnN0YW50aWF0ZWQgRE9NIFJ1bnRpbWVzPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJyZWxvYWRET01SdW50aW1lcyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikiPjwhLS0gLS0+PC9BPjxIMz4KLXJlbG9hZERPTVJ1bnRpbWVzPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5yZWxvYWRET01SdW50aW1lczwvQj4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvUFJFPgotPERMPgotPEREPlRoaXMgbWV0aG9kIHNob3VsZCByZWxvYWQgYWxsIGluc3RhbmNlcyBvZiBET00gUnVudGltZXMuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+U3BlY2lmaWVkIGJ5OjwvQj48REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV1NET01SdW50aW1lTWFuYWdlci5odG1sI3JlbG9hZERPTVJ1bnRpbWVzKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKSI+cmVsb2FkRE9NUnVudGltZXM8L0E+PC9DT0RFPiBpbiBpbnRlcmZhY2UgPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV1NET01SdW50aW1lTWFuYWdlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXU0RPTVJ1bnRpbWVNYW5hZ2VyPC9BPjwvQ09ERT48L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL1dzRE9NUnVudGltZU1hbmFnZXIuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7TkVYVCBDTEFTUzwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dzRE9NUnVudGltZU1hbmFnZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJXc0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3JfZGV0YWlsIj5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvRG9tRmFjdG9yeS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL2NsYXNzLXVzZS9Eb21GYWN0b3J5Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNjViYWMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL2NsYXNzLXVzZS9Eb21GYWN0b3J5Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjU4OjE2IEJTVCAyMDEwIC0tPgotPFRJVExFPgotVXNlcyBvZiBJbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5Ci08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDEwLTA0LTA3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBJbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5IjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21GYWN0b3J5Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvXGNsYXNzLXVzZURvbUZhY3RvcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJEb21GYWN0b3J5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgSW50ZXJmYWNlPGJyPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tRmFjdG9yeTwvQj48L0gyPgotPC9DRU5URVI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotUGFja2FnZXMgdGhhdCB1c2UgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21GYWN0b3J5Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tRmFjdG9yeTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZTwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYyI+PEI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN5bmM8L0I+PC9BPjwvVEQ+Ci08VEQ+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tRmFjdG9yeS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbUZhY3Rvcnk8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+RmllbGRzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0E+IGRlY2xhcmVkIGFzIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tRmFjdG9yeS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbUZhY3Rvcnk8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbUZhY3RvcnkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21GYWN0b3J5PC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5Eb21GYWN0b3J5LjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbUZhY3RvcnkuaHRtbCNlSU5TVEFOQ0UiPmVJTlNUQU5DRTwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpPC9BPiB0aGF0IHJldHVybiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbUZhY3RvcnkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21GYWN0b3J5PC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21GYWN0b3J5Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tRmFjdG9yeTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+RG9tUGFja2FnZS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZ2V0RG9tRmFjdG9yeSgpIj5nZXREb21GYWN0b3J5PC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21GYWN0b3J5Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tRmFjdG9yeTwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZTwvQT4gdGhhdCByZXR1cm4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21GYWN0b3J5Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tRmFjdG9yeTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tRmFjdG9yeS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbUZhY3Rvcnk8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklNb2RlbEVsZW1lbnRTeW5jaHJvbml6ZXIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9JTW9kZWxFbGVtZW50U3luY2hyb25pemVyLmh0bWwjZG9tRmFjdG9yeSgpIj5kb21GYWN0b3J5PC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbUZhY3RvcnkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21GYWN0b3J5PC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN5bmM8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN5bmM8L0E+IHRoYXQgcmV0dXJuIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tRmFjdG9yeS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbUZhY3Rvcnk8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbUZhY3RvcnkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21GYWN0b3J5PC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5FbGVtZW50U3luY2hyb25pemVySW1wbC48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvRWxlbWVudFN5bmNocm9uaXplckltcGwuaHRtbCNkb21GYWN0b3J5KCkiPmRvbUZhY3Rvcnk8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21GYWN0b3J5Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tRmFjdG9yeTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+QWJzdHJhY3RNb2RlbFN5bmNocm9uaXplci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvQWJzdHJhY3RNb2RlbFN5bmNocm9uaXplci5odG1sI2RvbUZhY3RvcnkoKSI+ZG9tRmFjdG9yeTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbUZhY3RvcnkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9cY2xhc3MtdXNlRG9tRmFjdG9yeS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IkRvbUZhY3RvcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL2NsYXNzLXVzZS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4OWM2M2UuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL2NsYXNzLXVzZS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjU4OjE2IEJTVCAyMDEwIC0tPgotPFRJVExFPgotVXNlcyBvZiBJbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlLkxpdGVyYWxzCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDEwLTA0LTA3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBJbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlLkxpdGVyYWxzIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvXGNsYXNzLXVzZURvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJEb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgSW50ZXJmYWNlPGJyPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZS5MaXRlcmFsczwvQj48L0gyPgotPC9DRU5URVI+Ci1ObyB1c2FnZSBvZiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UuTGl0ZXJhbHMKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvXGNsYXNzLXVzZURvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJEb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL0RvbVBhY2thZ2UuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvRG9tUGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGU5NmJkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvRG9tUGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjM1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8xNCkgb24gV2VkIEFwciAwNyAwNzo1ODoxNiBCU1QgMjAxMCAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgSW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZQotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMC0wNC0wNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgSW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZSI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1xjbGFzcy11c2VEb21QYWNrYWdlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iRG9tUGFja2FnZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIEludGVyZmFjZTxicj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U8L0I+PC9IMj4KLTwvQ0VOVEVSPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVBhY2thZ2VzIHRoYXQgdXNlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0I+PC9BPjwvVEQ+Ci08VEQ+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWwiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsPC9CPjwvQT48L1REPgotPFREPiZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPkZpZWxkcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpPC9BPiBkZWNsYXJlZCBhcyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+RG9tUGFja2FnZS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwjZUlOU1RBTkNFIj5lSU5TVEFOQ0U8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvQT4gdGhhdCByZXR1cm4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tUGFja2FnZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkRvbUZhY3RvcnkuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tRmFjdG9yeS5odG1sI2dldERvbVBhY2thZ2UoKSI+Z2V0RG9tUGFja2FnZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS91dGlsL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbDwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5GaWVsZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsPC9BPiBkZWNsYXJlZCBhcyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHJvdGVjdGVkIHN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkRvbVN3aXRjaC48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvRG9tU3dpdGNoLmh0bWwjbW9kZWxQYWNrYWdlIj5tb2RlbFBhY2thZ2U8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSA8IS0tIGVuZC11c2VyLWRvYyAtLT48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHJvdGVjdGVkIHN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkRvbUFkYXB0ZXJGYWN0b3J5LjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdXRpbC9Eb21BZGFwdGVyRmFjdG9yeS5odG1sI21vZGVsUGFja2FnZSI+bW9kZWxQYWNrYWdlPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvXGNsYXNzLXVzZURvbVBhY2thZ2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJEb21QYWNrYWdlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL0lET00uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvSURPTS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWMzYTNiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvSURPTS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzY3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8xNCkgb24gV2VkIEFwciAwNyAwNzo1ODoxNiBCU1QgMjAxMCAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgSW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTQotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMC0wNC0wNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgSW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTSI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSURPTS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1xjbGFzcy11c2VJRE9NLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSURPTS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIEludGVyZmFjZTxicj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET008L0I+PC9IMj4KLTwvQ0VOVEVSPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVBhY2thZ2VzIHRoYXQgdXNlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSURPTS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklET008L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yIj48Qj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvcjwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZTwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpPC9CPjwvQT48L1REPgotPFREPiZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZSI+PEI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlPC9CPjwvQT48L1REPgotPFREPiZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jIj48Qj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYzwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbCI+PEI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWw8L0I+PC9BPjwvVEQ+Ci08VEQ+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lET00uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JRE9NPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3I8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3I8L0E+IHdpdGggcGFyYW1ldGVycyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSURPTS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklET008L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wcm90ZWN0ZWQgJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZVByb2plY3QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViU2VydmljZVByb2plY3Q8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkRPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9ET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlci5odG1sI2dldFdzUHJvamVjdChvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET00sIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0KSI+Z2V0V3NQcm9qZWN0PC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JRE9NLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SURPTTwvQT4mbmJzcDtkb20sCi0gICAgICAgICAgICAgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QmbmJzcDtwcm9qZWN0KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JRE9NLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SURPTTwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWU8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZTwvQT4gd2l0aCBwYXJhbWV0ZXJzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JRE9NLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SURPTTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlNlcnZpY2VQcm9qZWN0PC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5Eb21VdGlsLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvRG9tVXRpbC5odG1sI2ZpbmRQcm9qZWN0QnlOYW1lKG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTSwgamF2YS5sYW5nLlN0cmluZykiPmZpbmRQcm9qZWN0QnlOYW1lPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JRE9NLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SURPTTwvQT4mbmJzcDtkb20sCi0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bmFtZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lET00uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JRE9NPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvQT4gdGhhdCByZXR1cm4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JRE9NLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SURPTTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSURPTS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklET008L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkRvbUZhY3RvcnkuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tRmFjdG9yeS5odG1sI2NyZWF0ZUlET00oKSI+Y3JlYXRlSURPTTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SURPTTwvZW0+Jy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JRE9NLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SURPTTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVdzRE9NUnVudGltZUV4dGVuc2lvbi48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV3NET01SdW50aW1lRXh0ZW5zaW9uLmh0bWwjZ2V0RE9NKCkiPmdldERPTTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RvIGdldCBhIGhhbmRsZSB0byB0aGUgRE9NIGluc3RhbmNlIGF2YWlsYWJsZSBmb3IgdGhpcyBydW50aW1lLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSURPTS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklET008L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U8L0E+IHRoYXQgcmV0dXJuIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSURPTS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklET008L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lET00uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JRE9NPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5KZWU1V3NEb21SdW50aW1lRXh0ZW5zaW9uLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvbi5odG1sI2dldERPTSgpIj5nZXRET008L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JRE9NLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SURPTTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SmF4V3NXb3Jrc3BhY2VSZXNvdXJjZS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0pheFdzV29ya3NwYWNlUmVzb3VyY2UuaHRtbCNnZXRET00oKSI+Z2V0RE9NPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSURPTS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklET008L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklNb2RlbEVsZW1lbnRTeW5jaHJvbml6ZXIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9JTW9kZWxFbGVtZW50U3luY2hyb25pemVyLmh0bWwjZ2V0RG9tQmVpbmdMb2FkZWQoKSI+Z2V0RG9tQmVpbmdMb2FkZWQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN5bmMiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSURPTS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklET008L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYzwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYzwvQT4gdGhhdCByZXR1cm4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JRE9NLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SURPTTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSURPTS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklET008L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPk9uRXZlbnRNb2RlbFN5bmNocm9uaXplci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvT25FdmVudE1vZGVsU3luY2hyb25pemVyLmh0bWwjZ2V0RG9tQmVpbmdMb2FkZWQoKSI+Z2V0RG9tQmVpbmdMb2FkZWQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JRE9NLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SURPTTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+RWxlbWVudFN5bmNocm9uaXplckltcGwuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL0VsZW1lbnRTeW5jaHJvbml6ZXJJbXBsLmh0bWwjZ2V0RG9tQmVpbmdMb2FkZWQoKSI+Z2V0RG9tQmVpbmdMb2FkZWQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JRE9NLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SURPTTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+QWJzdHJhY3RNb2RlbFN5bmNocm9uaXplci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvQWJzdHJhY3RNb2RlbFN5bmNocm9uaXplci5odG1sI2dldERvbUJlaW5nTG9hZGVkKCkiPmdldERvbUJlaW5nTG9hZGVkPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lET00uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JRE9NPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdXRpbC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWw8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdXRpbC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWw8L0E+IHdpdGggcGFyYW1ldGVycyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSURPTS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklET008L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdXRpbC9Eb21Td2l0Y2guaHRtbCIgdGl0bGU9InR5cGUgcGFyYW1ldGVyIGluIERvbVN3aXRjaCI+VDwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+RG9tU3dpdGNoLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdXRpbC9Eb21Td2l0Y2guaHRtbCNjYXNlSURPTShvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET00pIj5jYXNlSURPTTwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSURPTS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklET008L0E+Jm5ic3A7b2JqZWN0KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SURPTTwvZW0+Jy48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JRE9NLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvXGNsYXNzLXVzZUlET00uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJRE9NLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTMyMTAxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjg3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8xNCkgb24gV2VkIEFwciAwNyAwNzo1ODoxNiBCU1QgMjAxMCAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgSW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudAotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMC0wNC0wNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgSW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudCI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1xjbGFzcy11c2VJSmF2YVdlYlNlcnZpY2VFbGVtZW50Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIEludGVyZmFjZTxicj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklKYXZhV2ViU2VydmljZUVsZW1lbnQ8L0I+PC9IMj4KLTwvQ0VOVEVSPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVBhY2thZ2VzIHRoYXQgdXNlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklKYXZhV2ViU2VydmljZUVsZW1lbnQ8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSI+PEI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lPC9CPjwvQT48L1REPgotPFREPiZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0I+PC9BPjwvVEQ+Ci08VEQ+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWwiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsPC9CPjwvQT48L1REPgotPFREPiZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklKYXZhV2ViU2VydmljZUVsZW1lbnQ8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWU8L0E+IHRoYXQgcmV0dXJuIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklKYXZhV2ViU2VydmljZUVsZW1lbnQ8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JSmF2YVdlYlNlcnZpY2VFbGVtZW50PC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5Eb21VdGlsLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvRG9tVXRpbC5odG1sI2ZpbmRKYXZhV2ViU2VydmljZUVsZW1CeUltcGxOYW1lKG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0LCBqYXZhLmxhbmcuU3RyaW5nKSI+ZmluZEphdmFXZWJTZXJ2aWNlRWxlbUJ5SW1wbE5hbWU8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlUHJvamVjdC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJTZXJ2aWNlUHJvamVjdDwvQT4mbmJzcDt3c1Byb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bmFtZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JSmF2YVdlYlNlcnZpY2VFbGVtZW50PC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPlN1YmludGVyZmFjZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JSmF2YVdlYlNlcnZpY2VFbGVtZW50Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SUphdmFXZWJTZXJ2aWNlRWxlbWVudDwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2ludGVyZmFjZTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtpbnRlcmZhY2U8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYk1ldGhvZDwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7aW50ZXJmYWNlPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlBhcmFtPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtpbnRlcmZhY2U8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJTZXJ2aWNlPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtpbnRlcmZhY2U8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViVHlwZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJUeXBlPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpPC9BPiB0aGF0IHJldHVybiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JSmF2YVdlYlNlcnZpY2VFbGVtZW50PC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JSmF2YVdlYlNlcnZpY2VFbGVtZW50Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SUphdmFXZWJTZXJ2aWNlRWxlbWVudDwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+RG9tRmFjdG9yeS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21GYWN0b3J5Lmh0bWwjY3JlYXRlSUphdmFXZWJTZXJ2aWNlRWxlbWVudCgpIj5jcmVhdGVJSmF2YVdlYlNlcnZpY2VFbGVtZW50PC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JSmF2YSBXZWIgU2VydmljZSBFbGVtZW50PC9lbT4nLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JSmF2YVdlYlNlcnZpY2VFbGVtZW50Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SUphdmFXZWJTZXJ2aWNlRWxlbWVudDwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsPC9BPiB3aXRoIHBhcmFtZXRlcnMgb2YgdHlwZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JSmF2YVdlYlNlcnZpY2VFbGVtZW50PC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvRG9tU3dpdGNoLmh0bWwiIHRpdGxlPSJ0eXBlIHBhcmFtZXRlciBpbiBEb21Td2l0Y2giPlQ8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkRvbVN3aXRjaC48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvRG9tU3dpdGNoLmh0bWwjY2FzZUlKYXZhV2ViU2VydmljZUVsZW1lbnQob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50KSI+Y2FzZUlKYXZhV2ViU2VydmljZUVsZW1lbnQ8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JSmF2YVdlYlNlcnZpY2VFbGVtZW50PC9BPiZuYnNwO29iamVjdCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklKYXZhIFdlYiBTZXJ2aWNlIEVsZW1lbnQ8L2VtPicuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1xjbGFzcy11c2VJSmF2YVdlYlNlcnZpY2VFbGVtZW50Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL2NsYXNzLXVzZS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM1ZDMxMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ2NCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMTQpIG9uIFdlZCBBcHIgMDcgMDc6NTg6MTYgQlNUIDIwMTAgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIEludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTAtMDQtMDciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIEludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9cY2xhc3MtdXNlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBJbnRlcmZhY2U8YnI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvciI+PEI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3I8L0I+PC9BPjwvVEQ+Ci08VEQ+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuYWN0aW9ucyI+PEI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuYWN0aW9uczwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZTwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpPC9CPjwvQT48L1REPgotPFREPiZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyIj48Qj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc2VyaWFsaXplcjwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3RhdGUiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zdGF0ZTwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYyI+PEI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN5bmM8L0I+PC9BPjwvVEQ+Ci08VEQ+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWwiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsPC9CPjwvQT48L1REPgotPFREPiZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvciI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yPC9BPiB0aGF0IHJldHVybiB0eXBlcyB3aXRoIGFyZ3VtZW50cyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3QmbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvQT4mZ3Q7PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklTRUlDaGlsZExpc3QuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0lTRUlDaGlsZExpc3QuaHRtbCNnZXRTRUlDaGlsZExpc3QoKSI+Z2V0U0VJQ2hpbGRMaXN0PC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvcjwvQT4gd2l0aCBwYXJhbWV0ZXJzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnByb3RlY3RlZCAmbmJzcDtqYXZhLmxhbmcuT2JqZWN0W108L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+RE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0RPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyLmh0bWwjZXh0cmFjdE1ldGhvZHMob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSI+ZXh0cmFjdE1ldGhvZHM8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9BPiZuYnNwO3NlaSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5hY3Rpb25zIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9hY3Rpb25zL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5hY3Rpb25zPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvYWN0aW9ucy9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuYWN0aW9uczwvQT4gd2l0aCBwYXJhbWV0ZXJzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+T3BlbldTUmVzb3VyY2VBY3Rpb24uPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL2FjdGlvbnMvT3BlbldTUmVzb3VyY2VBY3Rpb24uaHRtbCNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24sIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdCwgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSI+c2VsZWN0aW9uQ2hhbmdlZDwvQT48L0I+KG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24mbmJzcDtzZWxlY3Rpb24sCi0gICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdCZuYnNwO3Byb2plY3QsCi0gICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U8L0E+Jm5ic3A7c2VpKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWU8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZTwvQT4gdGhhdCByZXR1cm4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkRvbVV0aWwuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9Eb21VdGlsLmh0bWwjZmluZFNlaUJ5SW1wbE5hbWUob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3QsIGphdmEubGFuZy5TdHJpbmcpIj5maW5kU2VpQnlJbXBsTmFtZTwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlNlcnZpY2VQcm9qZWN0PC9BPiZuYnNwO3dzUHJvamVjdCwKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtuYW1lKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lPC9BPiB3aXRoIHBhcmFtZXRlcnMgb2YgdHlwZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYk1ldGhvZDwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+RG9tVXRpbC48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL0RvbVV0aWwuaHRtbCNmaW5kV2ViTWV0aG9kQnlJbXBsKG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSwgamF2YS5sYW5nLlN0cmluZykiPmZpbmRXZWJNZXRob2RCeUltcGw8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9BPiZuYnNwO3NlaSwKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO2ltcGwpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5Eb21VdGlsLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvRG9tVXRpbC5odG1sI2lzT3V0c2lkZUluV2ViU2VydmljZShvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpIj5pc091dHNpZGVJbldlYlNlcnZpY2U8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9BPiZuYnNwO3NlaSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0RlZmluZXMgaWYgdGhpcyBTRUkgaXMgcGFydCBvZiBvdXRzaWRlLWluIHdlYiBzZXJ2aWNlPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpPC9BPiB0aGF0IHJldHVybiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+RG9tRmFjdG9yeS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21GYWN0b3J5Lmh0bWwjY3JlYXRlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpIj5jcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPicuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklXZWJTZXJ2aWNlLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwjZ2V0U2VydmljZUVuZHBvaW50KCkiPmdldFNlcnZpY2VFbmRwb2ludDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpPC9BPiB0aGF0IHJldHVybiB0eXBlcyB3aXRoIGFyZ3VtZW50cyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3QmbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvQT4mZ3Q7PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklXZWJTZXJ2aWNlUHJvamVjdC48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZVByb2plY3QuaHRtbCNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkiPmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXIiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc2VyaWFsaXplcjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc2VyaWFsaXplcjwvQT4gd2l0aCBwYXJhbWV0ZXJzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnByb3RlY3RlZCAmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSUFubm90YXRpb24uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMiPklBbm5vdGF0aW9uPC9BPiZsdDs/IGV4dGVuZHMgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Jmd0OzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5TZWlTZXJpYWxpemVyQWRhcHRlci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvU2VpU2VyaWFsaXplckFkYXB0ZXIuaHRtbCNjcmVhdGVJQW5ub3RhdGlvbihvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWwpIj5jcmVhdGVJQW5ub3RhdGlvbjwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U8L0E+Jm5ic3A7c2VpLAotICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbCZuYnNwO2phdmFNb2RlbCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3RhdGUiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zdGF0ZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN0YXRlPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N0YXRlL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3RhdGU8L0E+IHdpdGggcGFyYW1ldGVycyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wcm90ZWN0ZWQgJm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5TZWlQcm9wZXJ0eVN0YXRlQWRhcHRlci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N0YXRlL1NlaVByb3BlcnR5U3RhdGVBZGFwdGVyLmh0bWwjaXNPdXRzaWRlSW5XcyhvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpIj5pc091dHNpZGVJbldzPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvQT4mbmJzcDtzZWkpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN5bmMiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYzwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYzwvQT4gd2l0aCBwYXJhbWV0ZXJzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnByb3RlY3RlZCAmbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlNlaU1lcmdlci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvU2VpTWVyZ2VyLmh0bWwjbWVyZ2Uob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb24sIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbkluc3BlY3RvcikiPm1lcmdlPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvQT4mbmJzcDtzZWksCi0gICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSUFubm90YXRpb24uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMiPklBbm5vdGF0aW9uPC9BPiZsdDtvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZSZndDsmbmJzcDt3c0Fubm90YXRpb24sCi0gICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSUFubm90YXRpb25JbnNwZWN0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMiPklBbm5vdGF0aW9uSW5zcGVjdG9yPC9BPiZuYnNwO2luc3BlY3Rvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkFic3RyYWN0TWV0aG9kU3luY2hyb25pemVyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9BYnN0cmFjdE1ldGhvZFN5bmNocm9uaXplci5odG1sI3N5bmNocm9uaXplTWV0aG9kcyhvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlLCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb25JbnNwZWN0b3IpIj5zeW5jaHJvbml6ZU1ldGhvZHM8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9BPiZuYnNwO3NlaSwKLSAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZSZuYnNwO3NlaVR5cGUsCi0gICAgICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0lBbm5vdGF0aW9uSW5zcGVjdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zIj5JQW5ub3RhdGlvbkluc3BlY3RvcjwvQT4mbmJzcDtpbnNwZWN0b3IpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS91dGlsL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbDwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS91dGlsL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbDwvQT4gd2l0aCBwYXJhbWV0ZXJzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS91dGlsL0RvbVN3aXRjaC5odG1sIiB0aXRsZT0idHlwZSBwYXJhbWV0ZXIgaW4gRG9tU3dpdGNoIj5UPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5Eb21Td2l0Y2guPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS91dGlsL0RvbVN3aXRjaC5odG1sI2Nhc2VJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSkiPmNhc2VJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvQT4mbmJzcDtvYmplY3QpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPicuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1xjbGFzcy11c2VJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL2NsYXNzLXVzZS9JV1NET01SdW50aW1lTWFuYWdlci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL2NsYXNzLXVzZS9JV1NET01SdW50aW1lTWFuYWdlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzY1YzdiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvSVdTRE9NUnVudGltZU1hbmFnZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMTQpIG9uIFdlZCBBcHIgMDcgMDc6NTg6MTYgQlNUIDIwMTAgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIEludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXU0RPTVJ1bnRpbWVNYW5hZ2VyCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDEwLTA0LTA3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBJbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV1NET01SdW50aW1lTWFuYWdlciI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdTRE9NUnVudGltZU1hbmFnZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9cY2xhc3MtdXNlSVdTRE9NUnVudGltZU1hbmFnZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJV1NET01SdW50aW1lTWFuYWdlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIEludGVyZmFjZTxicj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXU0RPTVJ1bnRpbWVNYW5hZ2VyPC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXU0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdTRE9NUnVudGltZU1hbmFnZXI8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0I+PC9BPjwvVEQ+Ci08VEQ+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdTRE9NUnVudGltZU1hbmFnZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV1NET01SdW50aW1lTWFuYWdlcjwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5DbGFzc2VzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0E+IHRoYXQgaW1wbGVtZW50IDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdTRE9NUnVudGltZU1hbmFnZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV1NET01SdW50aW1lTWFuYWdlcjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2NsYXNzPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV3NET01SdW50aW1lTWFuYWdlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+V3NET01SdW50aW1lTWFuYWdlcjwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtGYWN0b3J5IGNsYXNzIGZvciBpbnN0YW50aWF0aW5nIERPTSBSdW50aW1lcyBhbmQgbWFuYWdpbmcgdGhvc2UgaW5zdGFuY2VzLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpPC9BPiB0aGF0IHJldHVybiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXU0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdTRE9NUnVudGltZU1hbmFnZXI8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXU0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdTRE9NUnVudGltZU1hbmFnZXI8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPldzRE9NUnVudGltZU1hbmFnZXIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV3NET01SdW50aW1lTWFuYWdlci5odG1sI2luc3RhbmNlKCkiPmluc3RhbmNlPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdTRE9NUnVudGltZU1hbmFnZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9cY2xhc3MtdXNlSVdTRE9NUnVudGltZU1hbmFnZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJV1NET01SdW50aW1lTWFuYWdlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL2NsYXNzLXVzZS9JV2ViTWV0aG9kLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL0lXZWJNZXRob2QuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhlOTE5MC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL0lXZWJNZXRob2QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1NyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMTQpIG9uIFdlZCBBcHIgMDcgMDc6NTg6MTYgQlNUIDIwMTAgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIEludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2QKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTAtMDQtMDciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIEludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2QiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9cY2xhc3MtdXNlSVdlYk1ldGhvZC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklXZWJNZXRob2QuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBJbnRlcmZhY2U8YnI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kPC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViTWV0aG9kPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvciI+PEI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3I8L0I+PC9BPjwvVEQ+Ci08VEQ+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lIj48Qj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWU8L0I+PC9BPjwvVEQ+Ci08VEQ+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZTwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc2VyaWFsaXplciI+PEI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXI8L0I+PC9BPjwvVEQ+Ci08VEQ+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN0YXRlIj48Qj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3RhdGU8L0I+PC9BPjwvVEQ+Ci08VEQ+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN5bmMiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jPC9CPjwvQT48L1REPgotPFREPiZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsIj48Qj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbDwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJNZXRob2Q8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvcjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvcjwvQT4gd2l0aCBwYXJhbWV0ZXJzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYk1ldGhvZDwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnByb3RlY3RlZCAmbmJzcDtqYXZhLmxhbmcuT2JqZWN0W108L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+RE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0RPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyLmh0bWwjZXh0cmFjdFBhcmFtcyhvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2QpIj5leHRyYWN0UGFyYW1zPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYk1ldGhvZDwvQT4mbmJzcDttZXRob2QpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHJvdGVjdGVkICZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+V2ViU2VydmljZVByb2JsZW1zRGVjb3JhdG9yLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9XZWJTZXJ2aWNlUHJvYmxlbXNEZWNvcmF0b3IuaHRtbCNpc1JlbGV2YW50Rm9yTWV0aG9kKG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCwgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcikiPmlzUmVsZXZhbnRGb3JNZXRob2Q8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViTWV0aG9kPC9BPiZuYnNwO3dlYk1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlciZuYnNwO21hcmtlcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0RlZmluZXMgaWYgPGNvZGU+bWFya2VyPC9jb2RlPiBpcyByZWxldmFudCBmb3IgPGNvZGU+d2ViTWV0aG9kPC9jb2RlPi48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViTWV0aG9kPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lPC9BPiB0aGF0IHJldHVybiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViTWV0aG9kPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYk1ldGhvZDwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+RG9tVXRpbC48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL0RvbVV0aWwuaHRtbCNmaW5kV2ViTWV0aG9kQnlJbXBsKG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSwgamF2YS5sYW5nLlN0cmluZykiPmZpbmRXZWJNZXRob2RCeUltcGw8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9BPiZuYnNwO3NlaSwKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO2ltcGwpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWU8L0E+IHdpdGggcGFyYW1ldGVycyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJNZXRob2Q8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkRvbVV0aWwuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9Eb21VdGlsLmh0bWwjZmluZE1ldGhvZChvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZSwgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kKSI+ZmluZE1ldGhvZDwvQT48L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlJm5ic3A7c2VpVHlwZSwKLSAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYk1ldGhvZDwvQT4mbmJzcDt3ZWJNZXRob2QpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYk1ldGhvZDwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0E+IHRoYXQgcmV0dXJuIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJNZXRob2Q8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViTWV0aG9kPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5Eb21GYWN0b3J5LjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbUZhY3RvcnkuaHRtbCNjcmVhdGVJV2ViTWV0aG9kKCkiPmNyZWF0ZUlXZWJNZXRob2Q8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklXZWIgTWV0aG9kPC9lbT4nLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpPC9BPiB0aGF0IHJldHVybiB0eXBlcyB3aXRoIGFyZ3VtZW50cyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJNZXRob2Q8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3QmbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYk1ldGhvZDwvQT4mZ3Q7PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sI2dldFdlYk1ldGhvZHMoKSI+Z2V0V2ViTWV0aG9kczwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJNZXRob2Q8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U8L0E+IHdpdGggcGFyYW1ldGVycyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJNZXRob2Q8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkpheFdzRGVmYXVsdHNDYWxjdWxhdG9yLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3IuaHRtbCNjYWxjV2ViUGFyYW1EZWZhdWx0TmFtZShvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2QsIGludCkiPmNhbGNXZWJQYXJhbURlZmF1bHROYW1lPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYk1ldGhvZDwvQT4mbmJzcDt3ZWJNZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQmbmJzcDtwYXJhbVBvc2l0aW9uKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7RGVmaW5lcyB0aGUgZGVmYXVsdCBvcGVyYXRpb24gcGFyYW1ldGVyIG5hbWUgYWNjb3JkaW5nIHRvIEpTUi0xODEgcG9pbnQgNC40IC0gV2ViUGFyYW0gbmFtZQotIGF0dHJpYnV0ZTwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkpheFdzRGVmYXVsdHNDYWxjdWxhdG9yLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3IuaHRtbCNjYWxjV2ViUGFyYW1EZWZhdWx0VGFyZ2V0TlMob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kLCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSkiPmNhbGNXZWJQYXJhbURlZmF1bHRUYXJnZXROUzwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJNZXRob2Q8L0E+Jm5ic3A7d2ViTWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlBhcmFtPC9BPiZuYnNwO3dlYlBhcmFtKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7RGVmaW5lcyB0aGUgZGVmYXVsdCBvcGVyYXRpb24gcGFyYW1ldGVyIG5hbWUgYWNjb3JkaW5nIHRvIEpTUi0xODEgcG9pbnQgNC40IC0gV2ViUGFyYW0gdGFyZ2V0IE5TLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkpheFdzRGVmYXVsdHNDYWxjdWxhdG9yLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3IuaHRtbCNjYWxjV2ViUmVzdWx0RGVmYXVsdE5hbWUob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kKSI+Y2FsY1dlYlJlc3VsdERlZmF1bHROYW1lPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYk1ldGhvZDwvQT4mbmJzcDt3ZWJNZXRob2QpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtEZWZpbmVzIHRoZSBkZWZhdWx0IG9wZXJhdGlvbiBwYXJhbWV0ZXIgbmFtZSBhY2NvcmRpbmcgdG8gSlNSLTE4MSBwb2ludCA0LjUgLSBXZWJSZXN1bHQgbmFtZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHJvdGVjdGVkICZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5KYXhXc0RlZmF1bHRzQ2FsY3VsYXRvci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0pheFdzRGVmYXVsdHNDYWxjdWxhdG9yLmh0bWwjZ2V0UGFyYW1Qb3NpdGlvbihvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2QsIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtKSI+Z2V0UGFyYW1Qb3NpdGlvbjwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJNZXRob2Q8L0E+Jm5ic3A7d2ViTWV0aG9kLAotICAgICAgICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJQYXJhbTwvQT4mbmJzcDtwYXJhbSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NhbGN1bGF0ZXMgdGhlIHBvc2l0aW9uIG9mIDxjb2RlPnBhcmFtPC9jb2RlPiBpbiA8Y29kZT5tZXRob2Q8L2NvZGU+IHNpZ25hdHVyZSBzdGFydGluZyBmcm9tIDA8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXIiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJNZXRob2Q8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc2VyaWFsaXplcjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc2VyaWFsaXplcjwvQT4gd2l0aCBwYXJhbWV0ZXJzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYk1ldGhvZDwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnByb3RlY3RlZCAmbmJzcDtqYXZhLnV0aWwuU2V0Jmx0OzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JUGFyYW1WYWx1ZVBhaXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMiPklQYXJhbVZhbHVlUGFpcjwvQT4mZ3Q7PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlBhcmFtZXRlclNlcmlhbGl6ZXJBZGFwdGVyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9QYXJhbWV0ZXJTZXJpYWxpemVyQWRhcHRlci5odG1sI2RlZmluZVBhcmFtVmFsdWVzKG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtLCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2QpIj5kZWZpbmVQYXJhbVZhbHVlczwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlBhcmFtPC9BPiZuYnNwO3dlYlBhcmFtLAotICAgICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYk1ldGhvZDwvQT4mbmJzcDt3ZWJNZXRob2QpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN0YXRlIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViTWV0aG9kPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3RhdGUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zdGF0ZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zdGF0ZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN0YXRlPC9BPiB3aXRoIHBhcmFtZXRlcnMgb2YgdHlwZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViTWV0aG9kPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHJvdGVjdGVkICZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+UGFyYW1ldGVyUHJvcGVydHlTdGF0ZUFkYXB0ZXIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zdGF0ZS9QYXJhbWV0ZXJQcm9wZXJ0eVN0YXRlQWRhcHRlci5odG1sI2lzRG9jdW1lbnRMaXRlcmFsV3JhcHBlZChvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2QpIj5pc0RvY3VtZW50TGl0ZXJhbFdyYXBwZWQ8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViTWV0aG9kPC9BPiZuYnNwO3dlYk1ldGhvZCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYk1ldGhvZDwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jPC9BPiB3aXRoIHBhcmFtZXRlcnMgb2YgdHlwZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViTWV0aG9kPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5QYXJhbWV0ZXJTeW5jaHJvbml6ZXIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL1BhcmFtZXRlclN5bmNocm9uaXplci5odG1sI3N5bmNocm9uaXplUGFyYW1ldGVycyhvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2QsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2QsIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbkluc3BlY3RvcikiPnN5bmNocm9uaXplUGFyYW1ldGVyczwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJNZXRob2Q8L0E+Jm5ic3A7d20sCi0gICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZCZuYnNwO21ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSUFubm90YXRpb25JbnNwZWN0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMiPklBbm5vdGF0aW9uSW5zcGVjdG9yPC9BPiZuYnNwO2luc3BlY3Rvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYk1ldGhvZDwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsPC9BPiB3aXRoIHBhcmFtZXRlcnMgb2YgdHlwZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViTWV0aG9kPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvRG9tU3dpdGNoLmh0bWwiIHRpdGxlPSJ0eXBlIHBhcmFtZXRlciBpbiBEb21Td2l0Y2giPlQ8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkRvbVN3aXRjaC48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvRG9tU3dpdGNoLmh0bWwjY2FzZUlXZWJNZXRob2Qob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kKSI+Y2FzZUlXZWJNZXRob2Q8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViTWV0aG9kPC9BPiZuYnNwO29iamVjdCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklXZWIgTWV0aG9kPC9lbT4nLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9cY2xhc3MtdXNlSVdlYk1ldGhvZC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklXZWJNZXRob2QuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvSVdlYlBhcmFtLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL0lXZWJQYXJhbS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2I3MzhmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvSVdlYlBhcmFtLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MzAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjU4OjE2IEJTVCAyMDEwIC0tPgotPFRJVExFPgotVXNlcyBvZiBJbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0KLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTAtMDQtMDciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIEludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvXGNsYXNzLXVzZUlXZWJQYXJhbS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklXZWJQYXJhbS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIEludGVyZmFjZTxicj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTwvQj48L0gyPgotPC9DRU5URVI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotUGFja2FnZXMgdGhhdCB1c2UgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViUGFyYW08L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yIj48Qj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvcjwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpPC9CPjwvQT48L1REPgotPFREPiZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZSI+PEI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlPC9CPjwvQT48L1REPgotPFREPiZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyIj48Qj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc2VyaWFsaXplcjwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3RhdGUiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zdGF0ZTwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbCI+PEI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWw8L0I+PC9BPjwvVEQ+Ci08VEQ+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJQYXJhbTwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yPC9BPiB3aXRoIHBhcmFtZXRlcnMgb2YgdHlwZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJQYXJhbTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnByb3RlY3RlZCAmbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPldlYlNlcnZpY2VQcm9ibGVtc0RlY29yYXRvci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvV2ViU2VydmljZVByb2JsZW1zRGVjb3JhdG9yLmh0bWwjaXNSZWxldmFudEZvclBhcmFtZXRlcihvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSwgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcikiPmlzUmVsZXZhbnRGb3JQYXJhbWV0ZXI8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJQYXJhbTwvQT4mbmJzcDt3ZWJQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlciZuYnNwO21hcmtlcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJQYXJhbTwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0E+IHRoYXQgcmV0dXJuIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlBhcmFtPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViUGFyYW08L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkRvbUZhY3RvcnkuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tRmFjdG9yeS5odG1sI2NyZWF0ZUlXZWJQYXJhbSgpIj5jcmVhdGVJV2ViUGFyYW08L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklXZWIgUGFyYW08L2VtPicuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0E+IHRoYXQgcmV0dXJuIHR5cGVzIHdpdGggYXJndW1lbnRzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViUGFyYW08L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3QmbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViUGFyYW08L0E+Jmd0OzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JV2ViTWV0aG9kLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCNnZXRQYXJhbWV0ZXJzKCkiPmdldFBhcmFtZXRlcnM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJQYXJhbTwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZTwvQT4gd2l0aCBwYXJhbWV0ZXJzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViUGFyYW08L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkpheFdzRGVmYXVsdHNDYWxjdWxhdG9yLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3IuaHRtbCNjYWxjV2ViUGFyYW1EZWZhdWx0TmFtZShvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSkiPmNhbGNXZWJQYXJhbURlZmF1bHROYW1lPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViUGFyYW08L0E+Jm5ic3A7d2ViUGFyYW0pPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtEZWZpbmVzIHRoZSBkZWZhdWx0IG9wZXJhdGlvbiBwYXJhbWV0ZXIgbmFtZSBhY2NvcmRpbmcgdG8gSlNSLTE4MSBwb2ludCA0LjQgLSBXZWJQYXJhbSBuYW1lCi0gYXR0cmlidXRlPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEubGFuZy5TdHJpbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SmF4V3NEZWZhdWx0c0NhbGN1bGF0b3IuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9KYXhXc0RlZmF1bHRzQ2FsY3VsYXRvci5odG1sI2NhbGNXZWJQYXJhbURlZmF1bHRUYXJnZXROUyhvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2QsIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtKSI+Y2FsY1dlYlBhcmFtRGVmYXVsdFRhcmdldE5TPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYk1ldGhvZDwvQT4mbmJzcDt3ZWJNZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViUGFyYW08L0E+Jm5ic3A7d2ViUGFyYW0pPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtEZWZpbmVzIHRoZSBkZWZhdWx0IG9wZXJhdGlvbiBwYXJhbWV0ZXIgbmFtZSBhY2NvcmRpbmcgdG8gSlNSLTE4MSBwb2ludCA0LjQgLSBXZWJQYXJhbSB0YXJnZXQgTlMuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnByb3RlY3RlZCAmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SmF4V3NEZWZhdWx0c0NhbGN1bGF0b3IuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9KYXhXc0RlZmF1bHRzQ2FsY3VsYXRvci5odG1sI2dldFBhcmFtUG9zaXRpb24ob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kLCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSkiPmdldFBhcmFtUG9zaXRpb248L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViTWV0aG9kPC9BPiZuYnNwO3dlYk1ldGhvZCwKLSAgICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViUGFyYW08L0E+Jm5ic3A7cGFyYW0pPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDYWxjdWxhdGVzIHRoZSBwb3NpdGlvbiBvZiA8Y29kZT5wYXJhbTwvY29kZT4gaW4gPGNvZGU+bWV0aG9kPC9jb2RlPiBzaWduYXR1cmUgc3RhcnRpbmcgZnJvbSAwPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJQYXJhbTwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyPC9BPiB3aXRoIHBhcmFtZXRlcnMgb2YgdHlwZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJQYXJhbTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnByb3RlY3RlZCAmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSVBhcmFtVmFsdWVQYWlyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zIj5JUGFyYW1WYWx1ZVBhaXI8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlBhcmFtZXRlclNlcmlhbGl6ZXJBZGFwdGVyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9QYXJhbWV0ZXJTZXJpYWxpemVyQWRhcHRlci5odG1sI2NyZWF0ZU1vZGVWYWx1ZVBhaXIob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0pIj5jcmVhdGVNb2RlVmFsdWVQYWlyPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViUGFyYW08L0E+Jm5ic3A7d2ViUGFyYW0pPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHJvdGVjdGVkICZuYnNwO2phdmEudXRpbC5TZXQmbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0lQYXJhbVZhbHVlUGFpci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucyI+SVBhcmFtVmFsdWVQYWlyPC9BPiZndDs8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+UGFyYW1ldGVyU2VyaWFsaXplckFkYXB0ZXIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL1BhcmFtZXRlclNlcmlhbGl6ZXJBZGFwdGVyLmh0bWwjZGVmaW5lUGFyYW1WYWx1ZXMob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0sIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCkiPmRlZmluZVBhcmFtVmFsdWVzPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViUGFyYW08L0E+Jm5ic3A7d2ViUGFyYW0sCi0gICAgICAgICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViTWV0aG9kPC9BPiZuYnNwO3dlYk1ldGhvZCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wcm90ZWN0ZWQgJm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5QYXJhbWV0ZXJTZXJpYWxpemVyQWRhcHRlci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvUGFyYW1ldGVyU2VyaWFsaXplckFkYXB0ZXIuaHRtbCNoYXNQYXJhbVdpdGhTYW1lTmFtZShvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSwgamF2YS5sYW5nLlN0cmluZykiPmhhc1BhcmFtV2l0aFNhbWVOYW1lPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViUGFyYW08L0E+Jm5ic3A7cGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bmV3TmFtZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3RhdGUiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlBhcmFtPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3RhdGUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zdGF0ZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zdGF0ZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN0YXRlPC9BPiB3aXRoIHBhcmFtZXRlcnMgb2YgdHlwZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJQYXJhbTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnByb3RlY3RlZCAmbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlBhcmFtZXRlclByb3BlcnR5U3RhdGVBZGFwdGVyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3RhdGUvUGFyYW1ldGVyUHJvcGVydHlTdGF0ZUFkYXB0ZXIuaHRtbCNpc05hbWVDaGFuZ2VhYmxlKG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtKSI+aXNOYW1lQ2hhbmdlYWJsZTwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlBhcmFtPC9BPiZuYnNwO3dlYlBhcmFtKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnByb3RlY3RlZCAmbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlBhcmFtZXRlclByb3BlcnR5U3RhdGVBZGFwdGVyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3RhdGUvUGFyYW1ldGVyUHJvcGVydHlTdGF0ZUFkYXB0ZXIuaHRtbCNpc091dHNpZGVJbldlYlNlcnZpY2Uob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0pIj5pc091dHNpZGVJbldlYlNlcnZpY2U8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJQYXJhbTwvQT4mbmJzcDt3ZWJQYXJhbSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wcm90ZWN0ZWQgJm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5QYXJhbWV0ZXJQcm9wZXJ0eVN0YXRlQWRhcHRlci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N0YXRlL1BhcmFtZXRlclByb3BlcnR5U3RhdGVBZGFwdGVyLmh0bWwjaXNQYXJ0TmFtZUNoYW5nZWFibGUob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0pIj5pc1BhcnROYW1lQ2hhbmdlYWJsZTwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlBhcmFtPC9BPiZuYnNwO3dlYlBhcmFtKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnByb3RlY3RlZCAmbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlBhcmFtZXRlclByb3BlcnR5U3RhdGVBZGFwdGVyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3RhdGUvUGFyYW1ldGVyUHJvcGVydHlTdGF0ZUFkYXB0ZXIuaHRtbCNpc1RhcmdldE5TQ2hhbmdlYWJsZShvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSkiPmlzVGFyZ2V0TlNDaGFuZ2VhYmxlPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViUGFyYW08L0E+Jm5ic3A7d2ViUGFyYW0pPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlBhcmFtPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdXRpbC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWw8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdXRpbC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWw8L0E+IHdpdGggcGFyYW1ldGVycyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlBhcmFtPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvRG9tU3dpdGNoLmh0bWwiIHRpdGxlPSJ0eXBlIHBhcmFtZXRlciBpbiBEb21Td2l0Y2giPlQ8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkRvbVN3aXRjaC48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvRG9tU3dpdGNoLmh0bWwjY2FzZUlXZWJQYXJhbShvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSkiPmNhc2VJV2ViUGFyYW08L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJQYXJhbTwvQT4mbmJzcDtvYmplY3QpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JV2ViIFBhcmFtPC9lbT4nLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkplZTVEb21VdGlscy48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvSmVlNURvbVV0aWxzLmh0bWwjaXNOYW1lUmVxdWlyZWQob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0pIj5pc05hbWVSZXF1aXJlZDwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlBhcmFtPC9BPiZuYnNwO3dlYlBhcmFtKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7TWV0aG9kIHRoYXQgZGVjaWRlcyBpZiB0aGUgcGFyYW0gbmFtZSBpcyByZXF1aXJlZCB0byBiZSBwdXQgaW4gdGhlIGFubm90YXRpb24gYWNjb3JkaW5nIAotIHRvIEpTUi0xODEgc2VjdGlvbiA0LjQuMSAtIGF0dHJpYnV0ZSAnbmFtZScgY29sdW1uICdtZWFuaW5nJy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5KZWU1RG9tVXRpbHMuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS91dGlsL0plZTVEb21VdGlscy5odG1sI2lzTmFtZVVzZWQob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0pIj5pc05hbWVVc2VkPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViUGFyYW08L0E+Jm5ic3A7d2ViUGFyYW0pPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtNZXRob2QgdGhhdCBkZWNpZGVzIGlzIHRoZSBhdHRyaWJ1dGUgJ25hbWUnIGlzIHVzZWQgYXQgYWxsCi0gYWNjb3JkaW5nIHRvIEpTUi0xODEgc2VjdGlvbiA0LjQuMSAtIGF0dHJpYnV0ZSAnbmFtZScgY29sdW1uICdtZWFuaW5nJzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkplZTVEb21VdGlscy48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvSmVlNURvbVV0aWxzLmh0bWwjaXNQYXJ0TmFtZVVzZWQob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0pIj5pc1BhcnROYW1lVXNlZDwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlBhcmFtPC9BPiZuYnNwO3dlYlBhcmFtKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7TWV0aG9kIHRoYXQgZGVjaWRlcyBpZiB0aGUgYXR0cmlidXRlICdwYXJ0TmFtZScgaXMgdXNlZCBhdCBhbGwgYWNjb3JkaW5nIAotIHRvIEpTUi0xODEgc2VjdGlvbiA0LjQuMSAtIGF0dHJpYnV0ZSAncGFydE5hbWUnIGNvbHVtbiAnbWVhbmluZycuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvXGNsYXNzLXVzZUlXZWJQYXJhbS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklXZWJQYXJhbS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL2NsYXNzLXVzZS9JV2ViU2VydmljZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL2NsYXNzLXVzZS9JV2ViU2VydmljZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGYzYmYyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvSVdlYlNlcnZpY2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMTQpIG9uIFdlZCBBcHIgMDcgMDc6NTg6MTYgQlNUIDIwMTAgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIEludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDEwLTA0LTA3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBJbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9cY2xhc3MtdXNlSVdlYlNlcnZpY2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJV2ViU2VydmljZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIEludGVyZmFjZTxicj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlPC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlNlcnZpY2U8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yIj48Qj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvcjwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5hY3Rpb25zIj48Qj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5hY3Rpb25zPC9CPjwvQT48L1REPgotPFREPiZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSI+PEI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lPC9CPjwvQT48L1REPgotPFREPiZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0I+PC9BPjwvVEQ+Ci08VEQ+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlIj48Qj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U8L0I+PC9BPjwvVEQ+Ci08VEQ+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXIiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyPC9CPjwvQT48L1REPgotPFREPiZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zdGF0ZSI+PEI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN0YXRlPC9CPjwvQT48L1REPgotPFREPiZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jIj48Qj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYzwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbCI+PEI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWw8L0I+PC9BPjwvVEQ+Ci08VEQ+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlNlcnZpY2U8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvcjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvcjwvQT4gdGhhdCByZXR1cm4gdHlwZXMgd2l0aCBhcmd1bWVudHMgb2YgdHlwZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlNlcnZpY2U8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3QmbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJTZXJ2aWNlPC9BPiZndDs8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVdlYlNlcnZpY2VDaGlsZExpc3QuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0lXZWJTZXJ2aWNlQ2hpbGRMaXN0Lmh0bWwjZ2V0V1NDaGlsZExpc3QoKSI+Z2V0V1NDaGlsZExpc3Q8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuYWN0aW9ucyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJTZXJ2aWNlPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9hY3Rpb25zL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5hY3Rpb25zPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvYWN0aW9ucy9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuYWN0aW9uczwvQT4gdGhhdCByZXR1cm4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJTZXJ2aWNlPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHJvdGVjdGVkICZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViU2VydmljZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+TmF2aWdhdGVUb0ltcGxlbWVudGF0aW9uQWN0aW9uLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9hY3Rpb25zL05hdmlnYXRlVG9JbXBsZW1lbnRhdGlvbkFjdGlvbi5odG1sI2dldFdlYlNlcnZpY2Uob3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4pIj5nZXRXZWJTZXJ2aWNlPC9BPjwvQj4ob3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4mbmJzcDtzZXNzaW9uQmVhbik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgSVdlYlNlcnZpY2UgaWYgc2Vzc2lvbkJlYW4gaGFzIGJlZW4gZXhwb3NlZCBhcyB3ZWIgc2VydmljZS48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlNlcnZpY2U8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWU8L0E+IHRoYXQgcmV0dXJuIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViU2VydmljZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViU2VydmljZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+RG9tVXRpbC48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL0RvbVV0aWwuaHRtbCNmaW5kV3NCeUltcGxOYW1lKG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0LCBqYXZhLmxhbmcuU3RyaW5nKSI+ZmluZFdzQnlJbXBsTmFtZTwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlNlcnZpY2VQcm9qZWN0PC9BPiZuYnNwO3dzUHJvamVjdCwKLSAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO25hbWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJTZXJ2aWNlPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvQT4gdGhhdCByZXR1cm4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJTZXJ2aWNlPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJTZXJ2aWNlPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5Eb21GYWN0b3J5LjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbUZhY3RvcnkuaHRtbCNjcmVhdGVJV2ViU2VydmljZSgpIj5jcmVhdGVJV2ViU2VydmljZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SVdlYiBTZXJ2aWNlPC9lbT4nLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpPC9BPiB0aGF0IHJldHVybiB0eXBlcyB3aXRoIGFyZ3VtZW50cyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViU2VydmljZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO29yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdCZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlNlcnZpY2U8L0E+Jmd0OzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCNnZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpIj5nZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlczwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3QmbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJTZXJ2aWNlPC9BPiZndDs8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVdlYlNlcnZpY2VQcm9qZWN0LjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlUHJvamVjdC5odG1sI2dldFdlYlNlcnZpY2VzKCkiPmdldFdlYlNlcnZpY2VzPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJTZXJ2aWNlPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlPC9BPiB0aGF0IHJldHVybiB0eXBlcyB3aXRoIGFyZ3VtZW50cyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViU2VydmljZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEudXRpbC5Db2xsZWN0aW9uJmx0OzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViU2VydmljZTwvQT4mZ3Q7PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkpheFdzV29ya3NwYWNlUmVzb3VyY2UuU2VydmljZU1vZGVsRGF0YS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0pheFdzV29ya3NwYWNlUmVzb3VyY2UuU2VydmljZU1vZGVsRGF0YS5odG1sI2dldEltcGxlbWVudGluZ1dzKGphdmEubGFuZy5TdHJpbmcpIj5nZXRJbXBsZW1lbnRpbmdXczwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtzZWlJbWwpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U8L0E+IHdpdGggcGFyYW1ldGVycyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViU2VydmljZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPihwYWNrYWdlIHByaXZhdGUpICZuYnNwO2phdmEubGFuZy5TdHJpbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SmF4V3NXb3Jrc3BhY2VSZXNvdXJjZS5TZXJ2aWNlTW9kZWxEYXRhLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZS5TZXJ2aWNlTW9kZWxEYXRhLmh0bWwjZ2V0U2VpSW1wbChvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlKSI+Z2V0U2VpSW1wbDwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViU2VydmljZTwvQT4mbmJzcDt3cyk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkpheFdzV29ya3NwYWNlUmVzb3VyY2UuU2VydmljZU1vZGVsRGF0YS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0pheFdzV29ya3NwYWNlUmVzb3VyY2UuU2VydmljZU1vZGVsRGF0YS5odG1sI21hcChvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlLCBqYXZhLmxhbmcuU3RyaW5nKSI+bWFwPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJTZXJ2aWNlPC9BPiZuYnNwO3dzLAotICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtzZWlJbXBsKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SmF4V3NXb3Jrc3BhY2VSZXNvdXJjZS5TZXJ2aWNlTW9kZWxEYXRhLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZS5TZXJ2aWNlTW9kZWxEYXRhLmh0bWwjdW5tYXAob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSkiPnVubWFwPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJTZXJ2aWNlPC9BPiZuYnNwO3dzKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlNlcnZpY2U8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc2VyaWFsaXplcjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc2VyaWFsaXplcjwvQT4gd2l0aCBwYXJhbWV0ZXJzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJTZXJ2aWNlPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHJvdGVjdGVkICZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JQW5ub3RhdGlvbi5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucyI+SUFubm90YXRpb248L0E+Jmx0Oz8gZXh0ZW5kcyBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQmZ3Q7PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPldzU2VyaWFsaXplckFkYXB0ZXIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL1dzU2VyaWFsaXplckFkYXB0ZXIuaHRtbCNjcmVhdGVJQW5ub3RhdGlvbihvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsKSI+Y3JlYXRlSUFubm90YXRpb248L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlNlcnZpY2U8L0E+Jm5ic3A7d3MsCi0gICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsJm5ic3A7amF2YU1vZGVsKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zdGF0ZSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJTZXJ2aWNlPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3RhdGUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zdGF0ZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zdGF0ZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN0YXRlPC9BPiB3aXRoIHBhcmFtZXRlcnMgb2YgdHlwZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlNlcnZpY2U8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wcm90ZWN0ZWQgJm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5Xc1Byb3BlcnR5U3RhdGVBZGFwdGVyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3RhdGUvV3NQcm9wZXJ0eVN0YXRlQWRhcHRlci5odG1sI2lzT3V0c2lkZUluV3Mob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSkiPmlzT3V0c2lkZUluV3M8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlNlcnZpY2U8L0E+Jm5ic3A7d3MpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN5bmMiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViU2VydmljZTwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jPC9BPiB0aGF0IHJldHVybiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlNlcnZpY2U8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlNlcnZpY2U8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPldzU3luY2hyb25pemVyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9Xc1N5bmNocm9uaXplci5odG1sI3N5bmNocm9uaXplV2ViU2VydmljZShvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdCwgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uLCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb25JbnNwZWN0b3IpIj5zeW5jaHJvbml6ZVdlYlNlcnZpY2U8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlUHJvamVjdC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJTZXJ2aWNlUHJvamVjdDwvQT4mbmJzcDt3c1Byb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0lBbm5vdGF0aW9uLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zIj5JQW5ub3RhdGlvbjwvQT4mbHQ7b3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGUmZ3Q7Jm5ic3A7d3NBbm5vdGF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JQW5ub3RhdGlvbkluc3BlY3Rvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucyI+SUFubm90YXRpb25JbnNwZWN0b3I8L0E+Jm5ic3A7aW5zcGVjdG9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlNlcnZpY2U8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS91dGlsL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbDwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS91dGlsL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbDwvQT4gd2l0aCBwYXJhbWV0ZXJzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJTZXJ2aWNlPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvRG9tU3dpdGNoLmh0bWwiIHRpdGxlPSJ0eXBlIHBhcmFtZXRlciBpbiBEb21Td2l0Y2giPlQ8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkRvbVN3aXRjaC48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvRG9tU3dpdGNoLmh0bWwjY2FzZUlXZWJTZXJ2aWNlKG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2UpIj5jYXNlSVdlYlNlcnZpY2U8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlNlcnZpY2U8L0E+Jm5ic3A7b2JqZWN0KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVdlYiBTZXJ2aWNlPC9lbT4nLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvXGNsYXNzLXVzZUlXZWJTZXJ2aWNlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVdlYlNlcnZpY2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL0lXZWJTZXJ2aWNlUHJvamVjdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWY1NTI4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0ODggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjU4OjE2IEJTVCAyMDEwIC0tPgotPFRJVExFPgotVXNlcyBvZiBJbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3QKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTAtMDQtMDciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIEludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdCI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvXGNsYXNzLXVzZUlXZWJTZXJ2aWNlUHJvamVjdC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklXZWJTZXJ2aWNlUHJvamVjdC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIEludGVyZmFjZTxicj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDwvQj48L0gyPgotPC9DRU5URVI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotUGFja2FnZXMgdGhhdCB1c2UgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZVByb2plY3QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViU2VydmljZVByb2plY3Q8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yIj48Qj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvcjwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZTwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpPC9CPjwvQT48L1REPgotPFREPiZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jIj48Qj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYzwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbCI+PEI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWw8L0I+PC9BPjwvVEQ+Ci08VEQ+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlUHJvamVjdC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJTZXJ2aWNlUHJvamVjdDwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yPC9BPiB0aGF0IHJldHVybiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlUHJvamVjdC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJTZXJ2aWNlUHJvamVjdDwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnByb3RlY3RlZCAmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlUHJvamVjdC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJTZXJ2aWNlUHJvamVjdDwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+RE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0RPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyLmh0bWwjZ2V0V3NQcm9qZWN0KG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTSwgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QpIj5nZXRXc1Byb2plY3Q8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lET00uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JRE9NPC9BPiZuYnNwO2RvbSwKLSAgICAgICAgICAgICBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCZuYnNwO3Byb2plY3QpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yPC9BPiB3aXRoIHBhcmFtZXRlcnMgb2YgdHlwZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlUHJvamVjdC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJTZXJ2aWNlUHJvamVjdDwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnByb3RlY3RlZCAmbmJzcDtvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkN1c3RvbURvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9DdXN0b21Eb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5odG1sI2FkYXB0SVNFSUNoaWxkTGlzdChvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdCkiPmFkYXB0SVNFSUNoaWxkTGlzdDwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlNlcnZpY2VQcm9qZWN0PC9BPiZuYnNwO3dzUHJvamVjdCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wcm90ZWN0ZWQgJm5ic3A7b3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5DdXN0b21Eb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvQ3VzdG9tRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuaHRtbCNhZGFwdElXZWJTZXJ2aWNlQ2hpbGRMaXN0KG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0KSI+YWRhcHRJV2ViU2VydmljZUNoaWxkTGlzdDwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlNlcnZpY2VQcm9qZWN0PC9BPiZuYnNwO3dzUHJvamVjdCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wcm90ZWN0ZWQgJm5ic3A7b3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5DdXN0b21Eb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvQ3VzdG9tRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuaHRtbCNjcmVhdGVJU0VJQ2hpbGRMaXN0QWRhcHRlcihvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdCkiPmNyZWF0ZUlTRUlDaGlsZExpc3RBZGFwdGVyPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZVByb2plY3QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViU2VydmljZVByb2plY3Q8L0E+Jm5ic3A7d3NQcm9qKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnByb3RlY3RlZCAmbmJzcDtvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkN1c3RvbURvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9DdXN0b21Eb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5odG1sI2NyZWF0ZUlXZWJTZXJ2aWNlQ2hpbGRMaXN0QWRhcHRlcihvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdCkiPmNyZWF0ZUlXZWJTZXJ2aWNlQ2hpbGRMaXN0QWRhcHRlcjwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlNlcnZpY2VQcm9qZWN0PC9BPiZuYnNwO3dzUHJvaik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlNlcnZpY2VQcm9qZWN0PC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lPC9BPiB0aGF0IHJldHVybiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlUHJvamVjdC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJTZXJ2aWNlUHJvamVjdDwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlNlcnZpY2VQcm9qZWN0PC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5Eb21VdGlsLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvRG9tVXRpbC5odG1sI2ZpbmRQcm9qZWN0QnlOYW1lKG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTSwgamF2YS5sYW5nLlN0cmluZykiPmZpbmRQcm9qZWN0QnlOYW1lPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JRE9NLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SURPTTwvQT4mbmJzcDtkb20sCi0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bmFtZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlUHJvamVjdC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJTZXJ2aWNlUHJvamVjdDwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+RG9tVXRpbC48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL0RvbVV0aWwuaHRtbCNmaW5kV3NQcm9qZWN0KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSI+ZmluZFdzUHJvamVjdDwvQT48L0I+KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Jm5ic3A7ZU9iamVjdCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0V4dHJhY3QgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZVByb2plY3QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Q09ERT5JV2ViU2VydmljZVByb2plY3Q8L0NPREU+PC9BPiBvdXQgb2YgRE9NIG9iamVjdCBieSByZWN1cnNpdmVseQotIGl0ZXJhdGluZyBwYXJlbnQgb2JqZWN0cy48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWU8L0E+IHdpdGggcGFyYW1ldGVycyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlNlcnZpY2VQcm9qZWN0PC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JSmF2YVdlYlNlcnZpY2VFbGVtZW50Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SUphdmFXZWJTZXJ2aWNlRWxlbWVudDwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+RG9tVXRpbC48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL0RvbVV0aWwuaHRtbCNmaW5kSmF2YVdlYlNlcnZpY2VFbGVtQnlJbXBsTmFtZShvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdCwgamF2YS5sYW5nLlN0cmluZykiPmZpbmRKYXZhV2ViU2VydmljZUVsZW1CeUltcGxOYW1lPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZVByb2plY3QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViU2VydmljZVByb2plY3Q8L0E+Jm5ic3A7d3NQcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO25hbWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+RG9tVXRpbC48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL0RvbVV0aWwuaHRtbCNmaW5kU2VpQnlJbXBsTmFtZShvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdCwgamF2YS5sYW5nLlN0cmluZykiPmZpbmRTZWlCeUltcGxOYW1lPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZVByb2plY3QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViU2VydmljZVByb2plY3Q8L0E+Jm5ic3A7d3NQcm9qZWN0LAotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO25hbWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJTZXJ2aWNlPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5Eb21VdGlsLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvRG9tVXRpbC5odG1sI2ZpbmRXc0J5SW1wbE5hbWUob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3QsIGphdmEubGFuZy5TdHJpbmcpIj5maW5kV3NCeUltcGxOYW1lPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZVByb2plY3QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViU2VydmljZVByb2plY3Q8L0E+Jm5ic3A7d3NQcm9qZWN0LAotICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bmFtZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlUHJvamVjdC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJTZXJ2aWNlUHJvamVjdDwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0E+IHRoYXQgcmV0dXJuIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlNlcnZpY2VQcm9qZWN0PC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZVByb2plY3QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViU2VydmljZVByb2plY3Q8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkRvbUZhY3RvcnkuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tRmFjdG9yeS5odG1sI2NyZWF0ZUlXZWJTZXJ2aWNlUHJvamVjdCgpIj5jcmVhdGVJV2ViU2VydmljZVByb2plY3Q8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklXZWIgU2VydmljZSBQcm9qZWN0PC9lbT4nLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpPC9BPiB0aGF0IHJldHVybiB0eXBlcyB3aXRoIGFyZ3VtZW50cyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlNlcnZpY2VQcm9qZWN0PC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7b3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Jmx0OzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlNlcnZpY2VQcm9qZWN0PC9BPiZndDs8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SURPTS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JRE9NLmh0bWwjZ2V0V2ViU2VydmljZVByb2plY3RzKCkiPmdldFdlYlNlcnZpY2VQcm9qZWN0czwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldlYiBTZXJ2aWNlIFByb2plY3RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN5bmMiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlNlcnZpY2VQcm9qZWN0PC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN5bmM8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+RmllbGRzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYzwvQT4gZGVjbGFyZWQgYXMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZVByb2plY3QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViU2VydmljZVByb2plY3Q8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wcm90ZWN0ZWQgJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZVByb2plY3QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViU2VydmljZVByb2plY3Q8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkFic3RyYWN0TW9kZWxTeW5jaHJvbml6ZXIuTG9hZGVyQ29tcGlsYXRpb25Vbml0SGFuZGxlci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvQWJzdHJhY3RNb2RlbFN5bmNocm9uaXplci5Mb2FkZXJDb21waWxhdGlvblVuaXRIYW5kbGVyLmh0bWwjd3NQcm9qZWN0Ij53c1Byb2plY3Q8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYzwvQT4gdGhhdCByZXR1cm4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZVByb2plY3QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViU2VydmljZVByb2plY3Q8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wcm90ZWN0ZWQgJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZVByb2plY3QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViU2VydmljZVByb2plY3Q8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkFic3RyYWN0TW9kZWxTeW5jaHJvbml6ZXIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL0Fic3RyYWN0TW9kZWxTeW5jaHJvbml6ZXIuaHRtbCNjcmVhdGVQcm9qZWN0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdCkiPmNyZWF0ZVByb2plY3Q8L0E+PC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3QmbmJzcDtqcHJqKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnByb3RlY3RlZCAmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlUHJvamVjdC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJTZXJ2aWNlUHJvamVjdDwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+T25FdmVudE1vZGVsU3luY2hyb25pemVyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9PbkV2ZW50TW9kZWxTeW5jaHJvbml6ZXIuaHRtbCNmaW5kUHJvamVjdEJ5RGVsdGEob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50RGVsdGEpIj5maW5kUHJvamVjdEJ5RGVsdGE8L0E+PC9CPihvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnREZWx0YSZuYnNwO3Jvb3REZWx0YSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN5bmM8L0E+IHdpdGggcGFyYW1ldGVycyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlNlcnZpY2VQcm9qZWN0PC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHJvdGVjdGVkICZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+QWJzdHJhY3RNb2RlbFN5bmNocm9uaXplci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvQWJzdHJhY3RNb2RlbFN5bmNocm9uaXplci5odG1sI3Byb2Nlc3NDb21waWxhdGlvblVuaXQob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3QsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQpIj5wcm9jZXNzQ29tcGlsYXRpb25Vbml0PC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZVByb2plY3QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViU2VydmljZVByb2plY3Q8L0E+Jm5ic3A7d3NQcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Jm5ic3A7Y3UpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHJvdGVjdGVkICZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+QWJzdHJhY3RNb2RlbFN5bmNocm9uaXplci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvQWJzdHJhY3RNb2RlbFN5bmNocm9uaXplci5odG1sI3JlbW92ZVNlaU1vZGVsRWxlbWVudHMob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3QsIGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4sIGJvb2xlYW4pIj5yZW1vdmVTZWlNb2RlbEVsZW1lbnRzPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZVByb2plY3QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViU2VydmljZVByb2plY3Q8L0E+Jm5ic3A7d3NQcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7aW1wbEJhc2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuJm5ic3A7aXNGb3JQYWNrYWdlLAotICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuJm5ic3A7b25seUV4cGxpY2l0KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmVtb3ZlcyBTRUkncyB3aXRoIDxjb2RlPmltcGxCYXNlTmFtZTwvY29kZT4gaW1wbGVtZW50YXRpb24gZnJvbSB0aGUgbW9kZWwuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnByb3RlY3RlZCAmbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkFic3RyYWN0TW9kZWxTeW5jaHJvbml6ZXIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL0Fic3RyYWN0TW9kZWxTeW5jaHJvbml6ZXIuaHRtbCNyZW1vdmVXc01vZGVsRWxlbWVudHMob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3QsIGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4pIj5yZW1vdmVXc01vZGVsRWxlbWVudHM8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlUHJvamVjdC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJTZXJ2aWNlUHJvamVjdDwvQT4mbmJzcDt3c1Byb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO2ltcGxCYXNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBib29sZWFuJm5ic3A7aXNGb3JQYWNrYWdlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmVtb3ZlcyB3ZWIgc2VydmljZXMgZnJvbSB0aGUgbW9kZWwuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPihwYWNrYWdlIHByaXZhdGUpICZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+U2VpU3luY2hyb25pemVyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9TZWlTeW5jaHJvbml6ZXIuaHRtbCNzeW5jaHJvbml6ZUludGVyZmFjZShvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdCwgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uLCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb25JbnNwZWN0b3IpIj5zeW5jaHJvbml6ZUludGVyZmFjZTwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlNlcnZpY2VQcm9qZWN0PC9BPiZuYnNwO3dzUHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JQW5ub3RhdGlvbi5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucyI+SUFubm90YXRpb248L0E+Jmx0O29yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlJmd0OyZuYnNwO3dzQW5ub3RhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JQW5ub3RhdGlvbkluc3BlY3Rvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucyI+SUFubm90YXRpb25JbnNwZWN0b3I8L0E+Jm5ic3A7aW5zcGVjdG9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViU2VydmljZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+V3NTeW5jaHJvbml6ZXIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL1dzU3luY2hyb25pemVyLmh0bWwjc3luY2hyb25pemVXZWJTZXJ2aWNlKG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0LCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb24sIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbkluc3BlY3RvcikiPnN5bmNocm9uaXplV2ViU2VydmljZTwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlNlcnZpY2VQcm9qZWN0PC9BPiZuYnNwO3dzUHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSUFubm90YXRpb24uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMiPklBbm5vdGF0aW9uPC9BPiZsdDtvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZSZndDsmbmJzcDt3c0Fubm90YXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0lBbm5vdGF0aW9uSW5zcGVjdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zIj5JQW5ub3RhdGlvbkluc3BlY3RvcjwvQT4mbmJzcDtpbnNwZWN0b3IpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlNlcnZpY2VQcm9qZWN0PC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdXRpbC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWw8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdXRpbC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWw8L0E+IHdpdGggcGFyYW1ldGVycyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlNlcnZpY2VQcm9qZWN0PC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvRG9tU3dpdGNoLmh0bWwiIHRpdGxlPSJ0eXBlIHBhcmFtZXRlciBpbiBEb21Td2l0Y2giPlQ8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkRvbVN3aXRjaC48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvRG9tU3dpdGNoLmh0bWwjY2FzZUlXZWJTZXJ2aWNlUHJvamVjdChvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdCkiPmNhc2VJV2ViU2VydmljZVByb2plY3Q8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlUHJvamVjdC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJTZXJ2aWNlUHJvamVjdDwvQT4mbmJzcDtvYmplY3QpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JV2ViIFNlcnZpY2UgUHJvamVjdDwvZW0+Jy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7b3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+RG9tMlJlc291cmNlTWFwcGVyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdXRpbC9Eb20yUmVzb3VyY2VNYXBwZXIuaHRtbCNmaW5kUHJvamVjdChvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdCkiPmZpbmRQcm9qZWN0PC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZVByb2plY3QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViU2VydmljZVByb2plY3Q8L0E+Jm5ic3A7d3NQcm9qZWN0KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7RmluZHMgSVByb2plY3QgaW5zdGFuY2UgZm9yIHRoZSB3ZWIgc2VydmljZSBwcm9qZWN0IHJlcHJlc2VudGVkIGJ5IDxjb2RlPndzUHJvamVjdDwvY29kZT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZVByb2plY3QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9cY2xhc3MtdXNlSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL0lXZWJUeXBlLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL0lXZWJUeXBlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYzFjNWMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL2NsYXNzLXVzZS9JV2ViVHlwZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8xNCkgb24gV2VkIEFwciAwNyAwNzo1ODoxNiBCU1QgMjAxMCAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgSW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlR5cGUKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTAtMDQtMDciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIEludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJUeXBlIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViVHlwZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1xjbGFzcy11c2VJV2ViVHlwZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklXZWJUeXBlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgSW50ZXJmYWNlPGJyPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlR5cGU8L0I+PC9IMj4KLTwvQ0VOVEVSPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVBhY2thZ2VzIHRoYXQgdXNlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlR5cGUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViVHlwZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbCI+PEI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWw8L0I+PC9BPjwvVEQ+Ci08VEQ+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlR5cGUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViVHlwZTwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0E+IHRoYXQgcmV0dXJuIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlR5cGUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViVHlwZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlR5cGUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViVHlwZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+RG9tRmFjdG9yeS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21GYWN0b3J5Lmh0bWwjY3JlYXRlSVdlYlR5cGUoKSI+Y3JlYXRlSVdlYlR5cGU8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklXZWIgVHlwZTwvZW0+Jy48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlR5cGUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViVHlwZTwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsPC9BPiB3aXRoIHBhcmFtZXRlcnMgb2YgdHlwZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJUeXBlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlR5cGU8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdXRpbC9Eb21Td2l0Y2guaHRtbCIgdGl0bGU9InR5cGUgcGFyYW1ldGVyIGluIERvbVN3aXRjaCI+VDwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+RG9tU3dpdGNoLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdXRpbC9Eb21Td2l0Y2guaHRtbCNjYXNlSVdlYlR5cGUob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViVHlwZSkiPmNhc2VJV2ViVHlwZTwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlR5cGUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViVHlwZTwvQT4mbmJzcDtvYmplY3QpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JV2ViIFR5cGU8L2VtPicuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlR5cGUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9cY2xhc3MtdXNlSVdlYlR5cGUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJV2ViVHlwZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL2NsYXNzLXVzZS9JV3NET01SdW50aW1lRXh0ZW5zaW9uLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFlMzk5Ni4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMTQpIG9uIFdlZCBBcHIgMDcgMDc6NTg6MTYgQlNUIDIwMTAgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIEludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXc0RPTVJ1bnRpbWVFeHRlbnNpb24KLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTAtMDQtMDciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIEludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXc0RPTVJ1bnRpbWVFeHRlbnNpb24iOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9cY2xhc3MtdXNlSVdzRE9NUnVudGltZUV4dGVuc2lvbi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklXc0RPTVJ1bnRpbWVFeHRlbnNpb24uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBJbnRlcmZhY2U8YnI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV3NET01SdW50aW1lRXh0ZW5zaW9uPC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV3NET01SdW50aW1lRXh0ZW5zaW9uPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvciI+PEI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3I8L0I+PC9BPjwvVEQ+Ci08VEQ+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuYWN0aW9ucyI+PEI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuYWN0aW9uczwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpPC9CPjwvQT48L1REPgotPFREPiZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZSI+PEI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlPC9CPjwvQT48L1REPgotPFREPiZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5yZWdpc3RyeSI+PEI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnJlZ2lzdHJ5PC9CPjwvQT48L1REPgotPFREPiZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvciI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV3NET01SdW50aW1lRXh0ZW5zaW9uLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdzRE9NUnVudGltZUV4dGVuc2lvbjwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yPC9BPiB0aGF0IHJldHVybiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV3NET01SdW50aW1lRXh0ZW5zaW9uPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHJvdGVjdGVkICZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRE9NUnVudGltZUV4dGVuc2lvbi5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXc0RPTVJ1bnRpbWVFeHRlbnNpb248L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkRPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9ET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlci5odG1sI2dldERvbVJ1bnRpbWUoamF2YS5sYW5nLlN0cmluZykiPmdldERvbVJ1bnRpbWU8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7cnVudGltZUlkKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnByb3RlY3RlZCAmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV3NET01SdW50aW1lRXh0ZW5zaW9uPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5ET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIuaHRtbCNnZXRTdXBwb3J0aW5nUnVudGltZShvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCkiPmdldFN1cHBvcnRpbmdSdW50aW1lPC9BPjwvQj4ob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QmbmJzcDtwcm9qZWN0KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvcjwvQT4gd2l0aCBwYXJhbWV0ZXJzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV3NET01SdW50aW1lRXh0ZW5zaW9uLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdzRE9NUnVudGltZUV4dGVuc2lvbjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnByb3RlY3RlZCAmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RvbUxvYWRMaXN0ZW5lci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXc0RvbUxvYWRMaXN0ZW5lcjwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+RE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0RPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyLmh0bWwjYWRkUnVudGltZUxvYWRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXc0RPTVJ1bnRpbWVFeHRlbnNpb24pIj5hZGRSdW50aW1lTG9hZExpc3RlbmVyPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV3NET01SdW50aW1lRXh0ZW5zaW9uLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdzRE9NUnVudGltZUV4dGVuc2lvbjwvQT4mbmJzcDtydW50aW1lKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5Db25zdHJ1Y3RvcnMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yPC9BPiB3aXRoIHBhcmFtZXRlcnMgb2YgdHlwZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV3NET01SdW50aW1lRXh0ZW5zaW9uPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0RPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyLkxvYWRMaXN0ZW5lci5odG1sI0RPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyLkxvYWRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXc0RPTVJ1bnRpbWVFeHRlbnNpb24pIj5ET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlci5Mb2FkTGlzdGVuZXI8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV3NET01SdW50aW1lRXh0ZW5zaW9uPC9BPiZuYnNwO3J1bnRpbWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuYWN0aW9ucyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV3NET01SdW50aW1lRXh0ZW5zaW9uLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdzRE9NUnVudGltZUV4dGVuc2lvbjwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvYWN0aW9ucy9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuYWN0aW9uczwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL2FjdGlvbnMvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLmFjdGlvbnM8L0E+IHRoYXQgcmV0dXJuIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRE9NUnVudGltZUV4dGVuc2lvbi5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXc0RPTVJ1bnRpbWVFeHRlbnNpb248L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wcm90ZWN0ZWQgJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV3NET01SdW50aW1lRXh0ZW5zaW9uLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdzRE9NUnVudGltZUV4dGVuc2lvbjwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+TmF2aWdhdGVUb0ltcGxlbWVudGF0aW9uQWN0aW9uLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9hY3Rpb25zL05hdmlnYXRlVG9JbXBsZW1lbnRhdGlvbkFjdGlvbi5odG1sI2dldERvbVJ1bnRpbWUoKSI+Z2V0RG9tUnVudGltZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV3NET01SdW50aW1lRXh0ZW5zaW9uPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvQT4gdGhhdCByZXR1cm4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV3NET01SdW50aW1lRXh0ZW5zaW9uLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdzRE9NUnVudGltZUV4dGVuc2lvbjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnByb3RlY3RlZCAmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV3NET01SdW50aW1lRXh0ZW5zaW9uPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5Xc0RPTVJ1bnRpbWVNYW5hZ2VyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dzRE9NUnVudGltZU1hbmFnZXIuaHRtbCNjcmVhdGVET01SdW50aW1lKG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5yZWdpc3RyeS5JV3NET01SdW50aW1lSW5mbywgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpIj5jcmVhdGVET01SdW50aW1lPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3JlZ2lzdHJ5L0lXc0RPTVJ1bnRpbWVJbmZvLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnJlZ2lzdHJ5Ij5JV3NET01SdW50aW1lSW5mbzwvQT4mbmJzcDtydW50aW1lSW5mbywKLSAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRE9NUnVudGltZUV4dGVuc2lvbi5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXc0RPTVJ1bnRpbWVFeHRlbnNpb248L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPldzRE9NUnVudGltZU1hbmFnZXIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV3NET01SdW50aW1lTWFuYWdlci5odG1sI2dldERPTVJ1bnRpbWUob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnJlZ2lzdHJ5LklXc0RPTVJ1bnRpbWVJbmZvKSI+Z2V0RE9NUnVudGltZTwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9yZWdpc3RyeS9JV3NET01SdW50aW1lSW5mby5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5yZWdpc3RyeSI+SVdzRE9NUnVudGltZUluZm88L0E+Jm5ic3A7cnVudGltZUluZm8pPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRoZSBET00gcnVudGltZSBpbnN0YW5jZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBkZXNjcmlwdG9yIG9iamVjdAotIG9mIHR5cGUgSVJ1bnRpbWVJbmZvIGFuZCBpbnN0YW50aWF0ZSBzdWNoIERPTSBydW50aW1lIGluc3RhbmNlIGlmIG5vbiBleGlzdGVudCBhdCB0aGUgCi0gbW9tZW50IG9mIGludm9jYXRpb24gb2YgdGhpcyBtZXRob2QuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRE9NUnVudGltZUV4dGVuc2lvbi5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXc0RPTVJ1bnRpbWVFeHRlbnNpb248L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPldzRE9NUnVudGltZU1hbmFnZXIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV3NET01SdW50aW1lTWFuYWdlci5odG1sI2dldERPTVJ1bnRpbWUoamF2YS5sYW5nLlN0cmluZykiPmdldERPTVJ1bnRpbWU8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7cnVudGltZUlkKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiB0aGUgRE9NIHJ1bnRpbWUgaW5zdGFuY2UgY29ycmVzcG9uZGluZyB0byB0aGUgcnVudGltZSBpZAotIGFuZCBpbnN0YW50aWF0ZSBzdWNoIERPTSBydW50aW1lIGluc3RhbmNlIGlmIG5vbiBleGlzdGVudCBhdCB0aGUgCi0gbW9tZW50IG9mIGludm9jYXRpb24gb2YgdGhpcyBtZXRob2QuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRE9NUnVudGltZUV4dGVuc2lvbi5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXc0RPTVJ1bnRpbWVFeHRlbnNpb248L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklXU0RPTVJ1bnRpbWVNYW5hZ2VyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXU0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwjZ2V0RE9NUnVudGltZShqYXZhLmxhbmcuU3RyaW5nKSI+Z2V0RE9NUnVudGltZTwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtydW50aW1lSWQpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRoZSBET00gcnVudGltZSBpbnN0YW5jZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBydW50aW1lIGlkCi0gYW5kIGluc3RhbnRpYXRlIHN1Y2ggRE9NIHJ1bnRpbWUgaW5zdGFuY2UgaWYgbm9uIGV4aXN0ZW50IGF0IHRoZSAKLSBtb21lbnQgb2YgaW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZC48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvQT4gdGhhdCByZXR1cm4gdHlwZXMgd2l0aCBhcmd1bWVudHMgb2YgdHlwZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV3NET01SdW50aW1lRXh0ZW5zaW9uPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS51dGlsLkNvbGxlY3Rpb24mbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV3NET01SdW50aW1lRXh0ZW5zaW9uLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdzRE9NUnVudGltZUV4dGVuc2lvbjwvQT4mZ3Q7PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPldzRE9NUnVudGltZU1hbmFnZXIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV3NET01SdW50aW1lTWFuYWdlci5odG1sI2dldERPTVJ1bnRpbWVzKCkiPmdldERPTVJ1bnRpbWVzPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEudXRpbC5Db2xsZWN0aW9uJmx0OzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRE9NUnVudGltZUV4dGVuc2lvbi5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXc0RPTVJ1bnRpbWVFeHRlbnNpb248L0E+Jmd0OzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JV1NET01SdW50aW1lTWFuYWdlci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV1NET01SdW50aW1lTWFuYWdlci5odG1sI2dldERPTVJ1bnRpbWVzKCkiPmdldERPTVJ1bnRpbWVzPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV3NET01SdW50aW1lRXh0ZW5zaW9uLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdzRE9NUnVudGltZUV4dGVuc2lvbjwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+Q2xhc3NlcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZTwvQT4gdGhhdCBpbXBsZW1lbnQgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV3NET01SdW50aW1lRXh0ZW5zaW9uLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdzRE9NUnVudGltZUV4dGVuc2lvbjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2NsYXNzPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9KZWU1V3NEb21SdW50aW1lRXh0ZW5zaW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UiPkplZTVXc0RvbVJ1bnRpbWVFeHRlbnNpb248L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5yZWdpc3RyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV3NET01SdW50aW1lRXh0ZW5zaW9uLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdzRE9NUnVudGltZUV4dGVuc2lvbjwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3JlZ2lzdHJ5L3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucmVnaXN0cnk8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcmVnaXN0cnkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5yZWdpc3RyeTwvQT4gdGhhdCByZXR1cm4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV3NET01SdW50aW1lRXh0ZW5zaW9uLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdzRE9NUnVudGltZUV4dGVuc2lvbjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRE9NUnVudGltZUV4dGVuc2lvbi5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXc0RPTVJ1bnRpbWVFeHRlbnNpb248L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPldzRE9NUnVudGltZVJlZ2lzdHJ5LjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcmVnaXN0cnkvV3NET01SdW50aW1lUmVnaXN0cnkuaHRtbCNpbnN0YW50aWF0ZVJ1bnRpbWUob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnJlZ2lzdHJ5LklXc0RPTVJ1bnRpbWVJbmZvKSI+aW5zdGFudGlhdGVSdW50aW1lPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3JlZ2lzdHJ5L0lXc0RPTVJ1bnRpbWVJbmZvLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnJlZ2lzdHJ5Ij5JV3NET01SdW50aW1lSW5mbzwvQT4mbmJzcDtpbmZvKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgZXhlY3V0YWJsZSBleHRlbnNpb24uPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRE9NUnVudGltZUV4dGVuc2lvbi5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1xjbGFzcy11c2VJV3NET01SdW50aW1lRXh0ZW5zaW9uLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVdzRE9NUnVudGltZUV4dGVuc2lvbi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL2NsYXNzLXVzZS9JV3NEb21Mb2FkTGlzdGVuZXIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvSVdzRG9tTG9hZExpc3RlbmVyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5N2VjMzAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL2NsYXNzLXVzZS9JV3NEb21Mb2FkTGlzdGVuZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMTQpIG9uIFdlZCBBcHIgMDcgMDc6NTg6MTYgQlNUIDIwMTAgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIEludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXc0RvbUxvYWRMaXN0ZW5lcgotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMC0wNC0wNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgSW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdzRG9tTG9hZExpc3RlbmVyIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV3NEb21Mb2FkTGlzdGVuZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9cY2xhc3MtdXNlSVdzRG9tTG9hZExpc3RlbmVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVdzRG9tTG9hZExpc3RlbmVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgSW50ZXJmYWNlPGJyPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdzRG9tTG9hZExpc3RlbmVyPC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RvbUxvYWRMaXN0ZW5lci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXc0RvbUxvYWRMaXN0ZW5lcjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yPC9CPjwvQT48L1REPgotPFREPiZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0I+PC9BPjwvVEQ+Ci08VEQ+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlIj48Qj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U8L0I+PC9BPjwvVEQ+Ci08VEQ+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RvbUxvYWRMaXN0ZW5lci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXc0RvbUxvYWRMaXN0ZW5lcjwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPkNsYXNzZXMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yPC9BPiB0aGF0IGltcGxlbWVudCA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RvbUxvYWRMaXN0ZW5lci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXc0RvbUxvYWRMaXN0ZW5lcjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnByb3RlY3RlZCAmbmJzcDtjbGFzczwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9ET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlci5Mb2FkTGlzdGVuZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yIj5ET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlci5Mb2FkTGlzdGVuZXI8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q2xhc3MgdGhhdCBpcyB1c2VkIHRvIGxpc3RlbiB3aGVuIHRoZSBET00gbG9hZCB3aWxsIGJlIGZpbmlzaGVkLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3I8L0E+IHRoYXQgcmV0dXJuIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRG9tTG9hZExpc3RlbmVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdzRG9tTG9hZExpc3RlbmVyPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHJvdGVjdGVkICZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRG9tTG9hZExpc3RlbmVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdzRG9tTG9hZExpc3RlbmVyPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5ET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIuaHRtbCNhZGRSdW50aW1lTG9hZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdzRE9NUnVudGltZUV4dGVuc2lvbikiPmFkZFJ1bnRpbWVMb2FkTGlzdGVuZXI8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV3NET01SdW50aW1lRXh0ZW5zaW9uPC9BPiZuYnNwO3J1bnRpbWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV3NEb21Mb2FkTGlzdGVuZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV3NEb21Mb2FkTGlzdGVuZXI8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpPC9BPiB3aXRoIHBhcmFtZXRlcnMgb2YgdHlwZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RvbUxvYWRMaXN0ZW5lci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXc0RvbUxvYWRMaXN0ZW5lcjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVdzRE9NUnVudGltZUV4dGVuc2lvbi48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV3NET01SdW50aW1lRXh0ZW5zaW9uLmh0bWwjYWRkTG9hZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdzRG9tTG9hZExpc3RlbmVyKSI+YWRkTG9hZExpc3RlbmVyPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV3NEb21Mb2FkTGlzdGVuZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV3NEb21Mb2FkTGlzdGVuZXI8L0E+Jm5ic3A7bGlzdGVuZXIpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBZGRzIGEgbG9hZCBsaXN0ZW5lciB0byBiZSBub3RpZmllZCBpbiBsb2FkIGV2ZW50cy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JV3NET01SdW50aW1lRXh0ZW5zaW9uLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uaHRtbCNyZW1vdmVMb2FkTGlzdGVuZXIob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV3NEb21Mb2FkTGlzdGVuZXIpIj5yZW1vdmVMb2FkTGlzdGVuZXI8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RvbUxvYWRMaXN0ZW5lci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXc0RvbUxvYWRMaXN0ZW5lcjwvQT4mbmJzcDtsaXN0ZW5lcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JlbW92ZXMgdGhlIGxpc3RlbmVyIGZyb20gRE9NIGxvYWRpbmcgbGlzdGVuZXJzIGxpc3Q8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RvbUxvYWRMaXN0ZW5lci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXc0RvbUxvYWRMaXN0ZW5lcjwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZTwvQT4gd2l0aCBwYXJhbWV0ZXJzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV3NEb21Mb2FkTGlzdGVuZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV3NEb21Mb2FkTGlzdGVuZXI8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkplZTVXc0RvbVJ1bnRpbWVFeHRlbnNpb24uPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9KZWU1V3NEb21SdW50aW1lRXh0ZW5zaW9uLmh0bWwjYWRkTG9hZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdzRG9tTG9hZExpc3RlbmVyKSI+YWRkTG9hZExpc3RlbmVyPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV3NEb21Mb2FkTGlzdGVuZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV3NEb21Mb2FkTGlzdGVuZXI8L0E+Jm5ic3A7bGlzdGVuZXIpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5KZWU1V3NEb21SdW50aW1lRXh0ZW5zaW9uLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvbi5odG1sI3JlbW92ZUxvYWRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXc0RvbUxvYWRMaXN0ZW5lcikiPnJlbW92ZUxvYWRMaXN0ZW5lcjwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRG9tTG9hZExpc3RlbmVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdzRG9tTG9hZExpc3RlbmVyPC9BPiZuYnNwO2xpc3RlbmVyKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRG9tTG9hZExpc3RlbmVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvXGNsYXNzLXVzZUlXc0RvbUxvYWRMaXN0ZW5lci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklXc0RvbUxvYWRMaXN0ZW5lci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL2NsYXNzLXVzZS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUwMTIxMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMTQpIG9uIFdlZCBBcHIgMDcgMDc6NTg6MTYgQlNUIDIwMTAgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZQotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMC0wNC0wNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1xjbGFzcy11c2VTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIENsYXNzPGJyPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTwvQj48L0gyPgotPC9DRU5URVI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotUGFja2FnZXMgdGhhdCB1c2UgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0I+PC9BPjwvVEQ+Ci08VEQ+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlIj48Qj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U8L0I+PC9BPjwvVEQ+Ci08VEQ+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPkZpZWxkcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpPC9BPiB3aXRoIHR5cGUgcGFyYW1ldGVycyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7amF2YS51dGlsLkxpc3QmbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU8L0E+Jmd0OzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuaHRtbCNWQUxVRVMiPlZBTFVFUzwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicgZW51bWVyYXRvcnMuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0E+IHRoYXQgcmV0dXJuIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sI2dldChpbnQpIj5nZXQ8L0E+PC9CPihpbnQmbmJzcDt2YWx1ZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sI2dldChqYXZhLmxhbmcuU3RyaW5nKSI+Z2V0PC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2xpdGVyYWwpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSAnPGVtPjxiPlNPQVAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuaHRtbCNnZXRCeU5hbWUoamF2YS5sYW5nLlN0cmluZykiPmdldEJ5TmFtZTwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtuYW1lKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgJzxlbT48Yj5TT0FQIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVdlYk1ldGhvZC48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmh0bWwjZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpIj5nZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwjZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpIj5nZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwjdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKSI+dmFsdWVPZjwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtuYW1lKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgZW51bSBjb25zdGFudCBvZiB0aGlzIHR5cGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlPC9BPltdPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sI3ZhbHVlcygpIj52YWx1ZXM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGNvbnN0YW50cyBvZiB0aGlzIGVudW0gdHlwZSwgaW4KLXRoZSBvcmRlciB0aGV5IGFyZSBkZWNsYXJlZC48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvQT4gd2l0aCBwYXJhbWV0ZXJzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklXZWJNZXRob2QuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sI3NldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlKSI+c2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlPC9BPiZuYnNwO3ZhbHVlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2V0cyB0aGUgdmFsdWUgb2YgdGhlICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkiPjxDT0RFPjxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT48L0NPREU+PC9BPicgYXR0cmlidXRlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sI3NldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlKSI+c2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlPC9BPiZuYnNwO3ZhbHVlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2V0cyB0aGUgdmFsdWUgb2YgdGhlICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkiPjxDT0RFPjxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT48L0NPREU+PC9BPicgYXR0cmlidXRlLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlPC9BPiB0aGF0IHJldHVybiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5KYXhXc0RlZmF1bHRzQ2FsY3VsYXRvci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0pheFdzRGVmYXVsdHNDYWxjdWxhdG9yLmh0bWwjZGVmaW5lU0JQYXJhbWV0ZXJTdHlsZShvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb24pIj5kZWZpbmVTQlBhcmFtZXRlclN0eWxlPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0lBbm5vdGF0aW9uLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zIj5JQW5ub3RhdGlvbjwvQT4mbHQ7PyBleHRlbmRzIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCZndDsmbmJzcDtzYkFubm90YXRpb24pPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtEZWZpbmVzIHRoZSBTT0FQQmluZGluZ1VzZS48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1xjbGFzcy11c2VTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL2NsYXNzLXVzZS9TT0FQQmluZGluZ1N0eWxlLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL1NPQVBCaW5kaW5nU3R5bGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM5NzkzZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL1NPQVBCaW5kaW5nU3R5bGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMTQpIG9uIFdlZCBBcHIgMDcgMDc6NTg6MTYgQlNUIDIwMTAgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZQotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMC0wNC0wNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1xjbGFzcy11c2VTT0FQQmluZGluZ1N0eWxlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iU09BUEJpbmRpbmdTdHlsZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIENsYXNzPGJyPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZTwvQj48L0gyPgotPC9DRU5URVI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotUGFja2FnZXMgdGhhdCB1c2UgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nU3R5bGU8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0I+PC9BPjwvVEQ+Ci08VEQ+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlIj48Qj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U8L0I+PC9BPjwvVEQ+Ci08VEQ+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1N0eWxlPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPkZpZWxkcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpPC9BPiB3aXRoIHR5cGUgcGFyYW1ldGVycyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1N0eWxlPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7amF2YS51dGlsLkxpc3QmbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nU3R5bGU8L0E+Jmd0OzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5TT0FQQmluZGluZ1N0eWxlLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuaHRtbCNWQUxVRVMiPlZBTFVFUzwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFN0eWxlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvQT4gdGhhdCByZXR1cm4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nU3R5bGU8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdTdHlsZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+U09BUEJpbmRpbmdTdHlsZS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwjZ2V0KGludCkiPmdldDwvQT48L0I+KGludCZuYnNwO3ZhbHVlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgJzxlbT48Yj5TT0FQIEJpbmRpbmcgU3R5bGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1N0eWxlPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5TT0FQQmluZGluZ1N0eWxlLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuaHRtbCNnZXQoamF2YS5sYW5nLlN0cmluZykiPmdldDwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtsaXRlcmFsKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgJzxlbT48Yj5TT0FQIEJpbmRpbmcgU3R5bGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1N0eWxlPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5TT0FQQmluZGluZ1N0eWxlLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuaHRtbCNnZXRCeU5hbWUoamF2YS5sYW5nLlN0cmluZykiPmdldEJ5TmFtZTwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtuYW1lKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgJzxlbT48Yj5TT0FQIEJpbmRpbmcgU3R5bGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1N0eWxlPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JV2ViTWV0aG9kLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCNnZXRTb2FwQmluZGluZ1N0eWxlKCkiPmdldFNvYXBCaW5kaW5nU3R5bGU8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgU3R5bGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nU3R5bGU8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sI2dldFNvYXBCaW5kaW5nU3R5bGUoKSI+Z2V0U29hcEJpbmRpbmdTdHlsZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdTdHlsZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+U09BUEJpbmRpbmdTdHlsZS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwjdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKSI+dmFsdWVPZjwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtuYW1lKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgZW51bSBjb25zdGFudCBvZiB0aGlzIHR5cGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1N0eWxlPC9BPltdPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlNPQVBCaW5kaW5nU3R5bGUuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sI3ZhbHVlcygpIj52YWx1ZXM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGNvbnN0YW50cyBvZiB0aGlzIGVudW0gdHlwZSwgaW4KLXRoZSBvcmRlciB0aGV5IGFyZSBkZWNsYXJlZC48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvQT4gd2l0aCBwYXJhbWV0ZXJzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nU3R5bGU8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklXZWJNZXRob2QuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sI3NldFNvYXBCaW5kaW5nU3R5bGUob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlKSI+c2V0U29hcEJpbmRpbmdTdHlsZTwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1N0eWxlPC9BPiZuYnNwO3ZhbHVlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2V0cyB0aGUgdmFsdWUgb2YgdGhlICc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCNnZXRTb2FwQmluZGluZ1N0eWxlKCkiPjxDT0RFPjxlbT5Tb2FwIEJpbmRpbmcgU3R5bGU8L2VtPjwvQ09ERT48L0E+JyBhdHRyaWJ1dGUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwjc2V0U29hcEJpbmRpbmdTdHlsZShvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGUpIj5zZXRTb2FwQmluZGluZ1N0eWxlPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nU3R5bGU8L0E+Jm5ic3A7dmFsdWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sI2dldFNvYXBCaW5kaW5nU3R5bGUoKSI+PENPREU+PGVtPlNvYXAgQmluZGluZyBTdHlsZTwvZW0+PC9DT0RFPjwvQT4nIGF0dHJpYnV0ZS48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdTdHlsZTwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZTwvQT4gdGhhdCByZXR1cm4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nU3R5bGU8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdTdHlsZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SmF4V3NEZWZhdWx0c0NhbGN1bGF0b3IuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9KYXhXc0RlZmF1bHRzQ2FsY3VsYXRvci5odG1sI2RlZmluZVNCU3R5bGUob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uKSI+ZGVmaW5lU0JTdHlsZTwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JQW5ub3RhdGlvbi5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucyI+SUFubm90YXRpb248L0E+Jmx0Oz8gZXh0ZW5kcyBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQmZ3Q7Jm5ic3A7c2JBbm5vdGF0aW9uKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7RGVmaW5lcyB0aGUgU09BUEJpbmRpbmdTdHlsZS48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1xjbGFzcy11c2VTT0FQQmluZGluZ1N0eWxlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iU09BUEJpbmRpbmdTdHlsZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL2NsYXNzLXVzZS9TT0FQQmluZGluZ1VzZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL2NsYXNzLXVzZS9TT0FQQmluZGluZ1VzZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTE5ZTU4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvU09BUEJpbmRpbmdVc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMTQpIG9uIFdlZCBBcHIgMDcgMDc6NTg6MTYgQlNUIDIwMTAgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdVc2UKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTAtMDQtMDciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdVc2UiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1xjbGFzcy11c2VTT0FQQmluZGluZ1VzZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlNPQVBCaW5kaW5nVXNlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgQ2xhc3M8YnI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZTwvQj48L0gyPgotPC9DRU5URVI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotUGFja2FnZXMgdGhhdCB1c2UgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1VzZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZTwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1VzZTwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5GaWVsZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvQT4gd2l0aCB0eXBlIHBhcmFtZXRlcnMgb2YgdHlwZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nVXNlPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7amF2YS51dGlsLkxpc3QmbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1VzZTwvQT4mZ3Q7PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlNPQVBCaW5kaW5nVXNlLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwjVkFMVUVTIj5WQUxVRVM8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlNPQVAgQmluZGluZyBVc2U8L2I+PC9lbT4nIGVudW1lcmF0b3JzLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpPC9BPiB0aGF0IHJldHVybiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nVXNlPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1VzZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+U09BUEJpbmRpbmdVc2UuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuaHRtbCNnZXQoaW50KSI+Z2V0PC9BPjwvQj4oaW50Jm5ic3A7dmFsdWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSAnPGVtPjxiPlNPQVAgQmluZGluZyBVc2U8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdVc2U8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlNPQVBCaW5kaW5nVXNlLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwjZ2V0KGphdmEubGFuZy5TdHJpbmcpIj5nZXQ8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bGl0ZXJhbCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFVzZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1VzZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+U09BUEJpbmRpbmdVc2UuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuaHRtbCNnZXRCeU5hbWUoamF2YS5sYW5nLlN0cmluZykiPmdldEJ5TmFtZTwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtuYW1lKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgJzxlbT48Yj5TT0FQIEJpbmRpbmcgVXNlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nVXNlPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JV2ViTWV0aG9kLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCNnZXRTb2FwQmluZGluZ1VzZSgpIj5nZXRTb2FwQmluZGluZ1VzZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBVc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1VzZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwjZ2V0U29hcEJpbmRpbmdVc2UoKSI+Z2V0U29hcEJpbmRpbmdVc2U8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgVXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdVc2U8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlNPQVBCaW5kaW5nVXNlLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwjdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKSI+dmFsdWVPZjwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtuYW1lKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgZW51bSBjb25zdGFudCBvZiB0aGlzIHR5cGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdVc2U8L0E+W108L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+U09BUEJpbmRpbmdVc2UuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuaHRtbCN2YWx1ZXMoKSI+dmFsdWVzPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBjb25zdGFudHMgb2YgdGhpcyBlbnVtIHR5cGUsIGluCi10aGUgb3JkZXIgdGhleSBhcmUgZGVjbGFyZWQuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0E+IHdpdGggcGFyYW1ldGVycyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdVc2U8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklXZWJNZXRob2QuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sI3NldFNvYXBCaW5kaW5nVXNlKG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdVc2UpIj5zZXRTb2FwQmluZGluZ1VzZTwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdVc2U8L0E+Jm5ic3A7dmFsdWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sI2dldFNvYXBCaW5kaW5nVXNlKCkiPjxDT0RFPjxlbT5Tb2FwIEJpbmRpbmcgVXNlPC9lbT48L0NPREU+PC9BPicgYXR0cmlidXRlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sI3NldFNvYXBCaW5kaW5nVXNlKG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdVc2UpIj5zZXRTb2FwQmluZGluZ1VzZTwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdVc2U8L0E+Jm5ic3A7dmFsdWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sI2dldFNvYXBCaW5kaW5nVXNlKCkiPjxDT0RFPjxlbT5Tb2FwIEJpbmRpbmcgVXNlPC9lbT48L0NPREU+PC9BPicgYXR0cmlidXRlLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdVc2U8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U8L0E+IHRoYXQgcmV0dXJuIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdVc2U8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nVXNlPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5KYXhXc0RlZmF1bHRzQ2FsY3VsYXRvci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0pheFdzRGVmYXVsdHNDYWxjdWxhdG9yLmh0bWwjZGVmaW5lU0JVc2Uob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uKSI+ZGVmaW5lU0JVc2U8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSUFubm90YXRpb24uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMiPklBbm5vdGF0aW9uPC9BPiZsdDs/IGV4dGVuZHMgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Jmd0OyZuYnNwO3NiQW5ub3RhdGlvbik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0RlZmluZXMgdGhlIFNPQVBCaW5kaW5nVXNlLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1xjbGFzcy11c2VTT0FQQmluZGluZ1VzZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlNPQVBCaW5kaW5nVXNlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL1dlYlBhcmFtS2luZC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL2NsYXNzLXVzZS9XZWJQYXJhbUtpbmQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEzMWE1NC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL1dlYlBhcmFtS2luZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8xNCkgb24gV2VkIEFwciAwNyAwNzo1ODoxNiBCU1QgMjAxMCAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5XZWJQYXJhbUtpbmQKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTAtMDQtMDciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV2ViUGFyYW1LaW5kIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvXGNsYXNzLXVzZVdlYlBhcmFtS2luZC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IldlYlBhcmFtS2luZC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIENsYXNzPGJyPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV2ViUGFyYW1LaW5kPC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5XZWJQYXJhbUtpbmQ8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0I+PC9BPjwvVEQ+Ci08VEQ+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlIj48Qj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U8L0I+PC9BPjwvVEQ+Ci08VEQ+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN5bmMiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jPC9CPjwvQT48L1REPgotPFREPiZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5XZWJQYXJhbUtpbmQ8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+RmllbGRzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0E+IHdpdGggdHlwZSBwYXJhbWV0ZXJzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+V2ViUGFyYW1LaW5kPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7amF2YS51dGlsLkxpc3QmbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+V2ViUGFyYW1LaW5kPC9BPiZndDs8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+V2ViUGFyYW1LaW5kLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sI1ZBTFVFUyI+VkFMVUVTPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0EgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5XZWIgUGFyYW0gS2luZDwvYj48L2VtPicgZW51bWVyYXRvcnMuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0E+IHRoYXQgcmV0dXJuIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPldlYlBhcmFtS2luZDwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPldlYlBhcmFtS2luZDwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+V2ViUGFyYW1LaW5kLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sI2dldChpbnQpIj5nZXQ8L0E+PC9CPihpbnQmbmJzcDt2YWx1ZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlICc8ZW0+PGI+V2ViIFBhcmFtIEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPldlYlBhcmFtS2luZDwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+V2ViUGFyYW1LaW5kLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sI2dldChqYXZhLmxhbmcuU3RyaW5nKSI+Z2V0PC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2xpdGVyYWwpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSAnPGVtPjxiPldlYiBQYXJhbSBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5XZWJQYXJhbUtpbmQ8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPldlYlBhcmFtS2luZC48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuaHRtbCNnZXRCeU5hbWUoamF2YS5sYW5nLlN0cmluZykiPmdldEJ5TmFtZTwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtuYW1lKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgJzxlbT48Yj5XZWIgUGFyYW0gS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+V2ViUGFyYW1LaW5kPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JV2ViUGFyYW0uPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwjZ2V0S2luZCgpIj5nZXRLaW5kPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPldlYlBhcmFtS2luZDwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+V2ViUGFyYW1LaW5kLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sI3ZhbHVlT2YoamF2YS5sYW5nLlN0cmluZykiPnZhbHVlT2Y8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bmFtZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIGVudW0gY29uc3RhbnQgb2YgdGhpcyB0eXBlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5XZWJQYXJhbUtpbmQ8L0E+W108L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+V2ViUGFyYW1LaW5kLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sI3ZhbHVlcygpIj52YWx1ZXM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGNvbnN0YW50cyBvZiB0aGlzIGVudW0gdHlwZSwgaW4KLXRoZSBvcmRlciB0aGV5IGFyZSBkZWNsYXJlZC48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvQT4gd2l0aCBwYXJhbWV0ZXJzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+V2ViUGFyYW1LaW5kPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JV2ViUGFyYW0uPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwjc2V0S2luZChvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldlYlBhcmFtS2luZCkiPnNldEtpbmQ8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5XZWJQYXJhbUtpbmQ8L0E+Jm5ic3A7dmFsdWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwjZ2V0S2luZCgpIj48Q09ERT48ZW0+S2luZDwvZW0+PC9DT0RFPjwvQT4nIGF0dHJpYnV0ZS48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5XZWJQYXJhbUtpbmQ8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U8L0E+IHRoYXQgcmV0dXJuIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPldlYlBhcmFtS2luZDwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPldlYlBhcmFtS2luZDwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SmF4V3NEZWZhdWx0c0NhbGN1bGF0b3IuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9KYXhXc0RlZmF1bHRzQ2FsY3VsYXRvci5odG1sI2dldERlZmF1bHRQYXJhbUtpbmQoKSI+Z2V0RGVmYXVsdFBhcmFtS2luZDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+V2ViUGFyYW1LaW5kPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN5bmM8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN5bmM8L0E+IHRoYXQgcmV0dXJuIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPldlYlBhcmFtS2luZDwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnByb3RlY3RlZCAmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5XZWJQYXJhbUtpbmQ8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlBhcmFtZXRlclN5bmNocm9uaXplci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvUGFyYW1ldGVyU3luY2hyb25pemVyLmh0bWwjY2FsY0tpbmQob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kLCBqYXZhLmxhbmcuU3RyaW5nKSI+Y2FsY0tpbmQ8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSUFubm90YXRpb24uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMiPklBbm5vdGF0aW9uPC9BPiZsdDtvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZVBhcmFtZXRlciZndDsmbmJzcDtwYXJtQW5ub3RhdGlvbiwKLSAgICAgICAgIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2QmbmJzcDttZXRob2QsCi0gICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7dHlwZVNpZ25hdHVyZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9cY2xhc3MtdXNlV2ViUGFyYW1LaW5kLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iV2ViUGFyYW1LaW5kLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL1dzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL1dzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNTZhOWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL2NsYXNzLXVzZS9Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8xNCkgb24gV2VkIEFwciAwNyAwNzo1ODoxNiBCU1QgMjAxMCAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbgotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMC0wNC0wNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbiI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1xjbGFzcy11c2VXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IldzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgQ2xhc3M8YnI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbjwvQj48L0gyPgotPC9DRU5URVI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotUGFja2FnZXMgdGhhdCB1c2UgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+V3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb248L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0I+PC9BPjwvVEQ+Ci08VEQ+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlIj48Qj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U8L0I+PC9BPjwvVEQ+Ci08VEQ+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN5bmMiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jPC9CPjwvQT48L1REPgotPFREPiZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbjwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0E+IHRoYXQgdGhyb3cgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+V3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb248L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklXc0RPTVJ1bnRpbWVFeHRlbnNpb24uPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRE9NUnVudGltZUV4dGVuc2lvbi5odG1sI2NyZWF0ZURPTShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikiPmNyZWF0ZURPTTwvQT48L0I+KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgbWV0aG9kIHNob3VsZCBpbnN0YW50aWF0ZSB0aGUgRE9NIGluc3RhbmNlIGZvciB0aGUgcnVudGltZSBhbmQgbG9hZHMgdGhlCi0gZGF0YSBpbnRvIGl0LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lET00uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JRE9NPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JV3NET01SdW50aW1lRXh0ZW5zaW9uLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uaHRtbCNnZXRET00oKSI+Z2V0RE9NPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VG8gZ2V0IGEgaGFuZGxlIHRvIHRoZSBET00gaW5zdGFuY2UgYXZhaWxhYmxlIGZvciB0aGlzIHJ1bnRpbWUuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+V3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb248L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U8L0E+IHRoYXQgdGhyb3cgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+V3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb248L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wcm90ZWN0ZWQgJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPldvcmtzcGFjZUNVRmluZGVyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvV29ya3NwYWNlQ1VGaW5kZXIuaHRtbCNhc3N1bWVXb3JrKCkiPmFzc3VtZVdvcms8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5KZWU1V3NEb21SdW50aW1lRXh0ZW5zaW9uLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvbi5odG1sI2NyZWF0ZURPTShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikiPmNyZWF0ZURPTTwvQT48L0I+KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPldvcmtzcGFjZUNVRmluZGVyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvV29ya3NwYWNlQ1VGaW5kZXIuaHRtbCNmaW5kKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSUNvbXBpbGF0aW9uVW5pdEhhbmRsZXIpIj5maW5kPC9BPjwvQj4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yLAotICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSUNvbXBpbGF0aW9uVW5pdEhhbmRsZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UiPklDb21waWxhdGlvblVuaXRIYW5kbGVyPC9BPiZuYnNwO2N1SGFuZGxlcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklDb21waWxhdGlvblVuaXRGaW5kZXIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9JQ29tcGlsYXRpb25Vbml0RmluZGVyLmh0bWwjZmluZChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLklDb21waWxhdGlvblVuaXRIYW5kbGVyKSI+ZmluZDwvQT48L0I+KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvciwKLSAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0lDb21waWxhdGlvblVuaXRIYW5kbGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlIj5JQ29tcGlsYXRpb25Vbml0SGFuZGxlcjwvQT4mbmJzcDtjdUhhbmRsZXIpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTdGFydHMgdGhlIHRyYXZlcnNhbCBvZiBjb21waWxhdGlvbiB1bml0czwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lET00uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JRE9NPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5KZWU1V3NEb21SdW50aW1lRXh0ZW5zaW9uLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvbi5odG1sI2dldERPTSgpIj5nZXRET008L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN5bmMiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPldzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN5bmM8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN5bmM8L0E+IHRoYXQgdGhyb3cgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+V3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb248L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4ocGFja2FnZSBwcml2YXRlKSAmbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPk9uRXZlbnRNb2RlbFN5bmNocm9uaXplci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvT25FdmVudE1vZGVsU3luY2hyb25pemVyLmh0bWwjaGFuZGxlQ2hhbmdlZFByb2plY3Qob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50RGVsdGEpIj5oYW5kbGVDaGFuZ2VkUHJvamVjdDwvQT48L0I+KG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudERlbHRhJm5ic3A7cHJvamVjdERlbHRhKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SW5pdGlhbE1vZGVsU3luY2hyb25pemVyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9Jbml0aWFsTW9kZWxTeW5jaHJvbml6ZXIuaHRtbCNsb2FkKGphdmEudXRpbC5NYXAsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKSI+bG9hZDwvQT48L0I+KGphdmEudXRpbC5NYXAmbHQ7Pyw/Jmd0OyZuYnNwO29wdGlvbnMsCi0gICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9cY2xhc3MtdXNlV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL2NsYXNzLXVzZS9Xc0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL1dzRE9NUnVudGltZU1hbmFnZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFiZWY5NC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL1dzRE9NUnVudGltZU1hbmFnZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMTQpIG9uIFdlZCBBcHIgMDcgMDc6NTg6MTYgQlNUIDIwMTAgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV3NET01SdW50aW1lTWFuYWdlcgotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMC0wNC0wNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Xc0RPTVJ1bnRpbWVNYW5hZ2VyIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9cY2xhc3MtdXNlV3NET01SdW50aW1lTWFuYWdlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IldzRE9NUnVudGltZU1hbmFnZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBDbGFzczxicj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldzRE9NUnVudGltZU1hbmFnZXI8L0I+PC9IMj4KLTwvQ0VOVEVSPgotTm8gdXNhZ2Ugb2Ygb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Xc0RPTVJ1bnRpbWVNYW5hZ2VyCi08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV3NET01SdW50aW1lTWFuYWdlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvXGNsYXNzLXVzZVdzRE9NUnVudGltZU1hbmFnZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJXc0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS1mcmFtZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL3BhY2thZ2UtZnJhbWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhZmU3Mi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS1mcmFtZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjU4OjE0IEJTVCAyMDEwIC0tPgotPFRJVExFPgotb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaQotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMC0wNC0wNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIj4KLTxGT05UIHNpemU9IisxIiBDTEFTUz0iRnJhbWVUaXRsZUZvbnQiPgotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpPC9BPjwvRk9OVD4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIE5PV1JBUD48Rk9OVCBzaXplPSIrMSIgQ0xBU1M9IkZyYW1lSGVhZGluZ0ZvbnQiPgotSW50ZXJmYWNlczwvRk9OVD4mbmJzcDsKLTxGT05UIENMQVNTPSJGcmFtZUl0ZW1Gb250Ij4KLTxCUj4KLTxBIEhSRUY9IkRvbUZhY3RvcnkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjxJPkRvbUZhY3Rvcnk8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0iRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiIHRhcmdldD0iY2xhc3NGcmFtZSI+PEk+RG9tUGFja2FnZTwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJEb21QYWNrYWdlLkxpdGVyYWxzLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5Eb21QYWNrYWdlLkxpdGVyYWxzPC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9IklET00uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjxJPklET008L0k+PC9BPgotPEJSPgotPEEgSFJFRj0iSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiIHRhcmdldD0iY2xhc3NGcmFtZSI+PEk+SUphdmFXZWJTZXJ2aWNlRWxlbWVudDwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9IklXZWJNZXRob2QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjxJPklXZWJNZXRob2Q8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0iSVdlYlBhcmFtLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5JV2ViUGFyYW08L0k+PC9BPgotPEJSPgotPEEgSFJFRj0iSVdlYlNlcnZpY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjxJPklXZWJTZXJ2aWNlPC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9IklXZWJTZXJ2aWNlUHJvamVjdC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiIHRhcmdldD0iY2xhc3NGcmFtZSI+PEk+SVdlYlNlcnZpY2VQcm9qZWN0PC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9IklXZWJUeXBlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5JV2ViVHlwZTwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJJV3NEb21Mb2FkTGlzdGVuZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjxJPklXc0RvbUxvYWRMaXN0ZW5lcjwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJJV3NET01SdW50aW1lRXh0ZW5zaW9uLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5JV3NET01SdW50aW1lRXh0ZW5zaW9uPC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9IklXU0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5JV1NET01SdW50aW1lTWFuYWdlcjwvST48L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLQotCi08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBOT1dSQVA+PEZPTlQgc2l6ZT0iKzEiIENMQVNTPSJGcmFtZUhlYWRpbmdGb250Ij4KLUNsYXNzZXM8L0ZPTlQ+Jm5ic3A7Ci08Rk9OVCBDTEFTUz0iRnJhbWVJdGVtRm9udCI+Ci08QlI+Ci08QSBIUkVGPSJXc0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPldzRE9NUnVudGltZU1hbmFnZXI8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLQotCi08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBOT1dSQVA+PEZPTlQgc2l6ZT0iKzEiIENMQVNTPSJGcmFtZUhlYWRpbmdGb250Ij4KLUVudW1zPC9GT05UPiZuYnNwOwotPEZPTlQgQ0xBU1M9IkZyYW1lSXRlbUZvbnQiPgotPEJSPgotPEEgSFJFRj0iU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU8L0E+Ci08QlI+Ci08QSBIUkVGPSJTT0FQQmluZGluZ1N0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiIHRhcmdldD0iY2xhc3NGcmFtZSI+U09BUEJpbmRpbmdTdHlsZTwvQT4KLTxCUj4KLTxBIEhSRUY9IlNPQVBCaW5kaW5nVXNlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiIHRhcmdldD0iY2xhc3NGcmFtZSI+U09BUEJpbmRpbmdVc2U8L0E+Ci08QlI+Ci08QSBIUkVGPSJXZWJQYXJhbUtpbmQuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5XZWJQYXJhbUtpbmQ8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLQotCi08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBOT1dSQVA+PEZPTlQgc2l6ZT0iKzEiIENMQVNTPSJGcmFtZUhlYWRpbmdGb250Ij4KLUV4Y2VwdGlvbnM8L0ZPTlQ+Jm5ic3A7Ci08Rk9OVCBDTEFTUz0iRnJhbWVJdGVtRm9udCI+Ci08QlI+Ci08QSBIUkVGPSJXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbjwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotCi0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9wYWNrYWdlLXN1bW1hcnkuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQyZTM3Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzE0KSBvbiBXZWQgQXByIDA3IDA3OjU4OjE0IEJTVCAyMDEwIC0tPgotPFRJVExFPgotb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaQotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMC0wNC0wNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5QYWNrYWdlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS11c2UuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEI+UFJFViBQQUNLQUdFPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEI+TkVYVCBQQUNLQUdFPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08SDI+Ci1QYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkKLTwvSDI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+SW50ZXJmYWNlIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21GYWN0b3J5Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+RG9tRmFjdG9yeTwvQT48L0I+PC9URD4KLTxURD5UaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIxNSUiPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPkRvbVBhY2thZ2U8L0E+PC9CPjwvVEQ+Ci08VEQ+VGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuTGl0ZXJhbHMuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5Eb21QYWNrYWdlLkxpdGVyYWxzPC9BPjwvQj48L1REPgotPFREPkRlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKLSAKLSAgIGVhY2ggY2xhc3MsCi0gICBlYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcywKLSAgIGVhY2ggZW51bSwKLSAgIGFuZCBlYWNoIGRhdGEgdHlwZQotIAotIDwhLS0gZW5kLXVzZXItZG9jIC0tPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JRE9NLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SURPTTwvQT48L0I+PC9URD4KLTxURD5BIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JRE9NPC9iPjwvZW0+Jy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIxNSUiPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklKYXZhV2ViU2VydmljZUVsZW1lbnQ8L0E+PC9CPjwvVEQ+Ci08VEQ+Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9BPjwvQj48L1REPgotPFREPiZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYk1ldGhvZDwvQT48L0I+PC9URD4KLTxURD4mbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIxNSUiPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlBhcmFtPC9BPjwvQj48L1REPgotPFREPiZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXZWJTZXJ2aWNlPC9BPjwvQj48L1REPgotPFREPiZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZVByb2plY3QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV2ViU2VydmljZVByb2plY3Q8L0E+PC9CPjwvVEQ+Ci08VEQ+Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJUeXBlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdlYlR5cGU8L0E+PC9CPjwvVEQ+Ci08VEQ+Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RvbUxvYWRMaXN0ZW5lci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXc0RvbUxvYWRMaXN0ZW5lcjwvQT48L0I+PC9URD4KLTxURD5JbnRlcmZhY2UgdG8gYmUgaW1wbGVtZW50ZWQgYnkgaW50ZXJlc3RlZCBpbiBET00gbG9hZCBwcm9jZXNzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV3NET01SdW50aW1lRXh0ZW5zaW9uLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+SVdzRE9NUnVudGltZUV4dGVuc2lvbjwvQT48L0I+PC9URD4KLTxURD5UaGlzIGludGVyZmFjZSBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkgYWxsIHJ1bnRpbWUgd2hpY2ggd2FudCB0byBoYXZlIERPTSBUcmVlIAotIHJlcHJlc2VudGF0aW9uIG9uIHRvcCBvZiB0aGVtLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV1NET01SdW50aW1lTWFuYWdlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPklXU0RPTVJ1bnRpbWVNYW5hZ2VyPC9BPjwvQj48L1REPgotPFREPiZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotCi08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5DbGFzcyBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIxNSUiPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV3NET01SdW50aW1lTWFuYWdlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+V3NET01SdW50aW1lTWFuYWdlcjwvQT48L0I+PC9URD4KLTxURD5GYWN0b3J5IGNsYXNzIGZvciBpbnN0YW50aWF0aW5nIERPTSBSdW50aW1lcyBhbmQgbWFuYWdpbmcgdGhvc2UgaW5zdGFuY2VzLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotCi08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5FbnVtIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU8L0E+PC9CPjwvVEQ+Ci08VEQ+QSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+U09BUCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicsCi0gYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+U09BUEJpbmRpbmdTdHlsZTwvQT48L0I+PC9URD4KLTxURD5BIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5TT0FQIEJpbmRpbmcgU3R5bGU8L2I+PC9lbT4nLAotIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5TT0FQQmluZGluZ1VzZTwvQT48L0I+PC9URD4KLTxURD5BIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5TT0FQIEJpbmRpbmcgVXNlPC9iPjwvZW0+JywKLSBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIxNSUiPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPldlYlBhcmFtS2luZDwvQT48L0I+PC9URD4KLTxURD4mbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLQotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+RXhjZXB0aW9uIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+V3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb248L0E+PC9CPjwvVEQ+Ci08VEQ+RXhjZXB0aW9uIHRocm93biBpbiBjYXNlIHRoZSBsb2FkaW5nIG9mIFdTIERPTSBoYXMgYmVlbiBjYW5jZWxsZWQ8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLQotPFA+Ci08REw+Ci08L0RMPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdXNlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxCPlBSRVYgUEFDS0FHRTwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxCPk5FWFQgUEFDS0FHRTwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS10cmVlLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS10cmVlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZTI4YjkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL3BhY2thZ2UtdHJlZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8xNCkgb24gV2VkIEFwciAwNyAwNzo1ODoxNCBCU1QgMjAxMCAtLT4KLTxUSVRMRT4KLW9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkgQ2xhc3MgSGllcmFyY2h5Ci08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDEwLTA0LTA3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSBDbGFzcyBIaWVyYXJjaHkiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5UcmVlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGFja2FnZS10cmVlLmh0bWwiPjxCPlBSRVY8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3BhY2thZ2UtdHJlZS5odG1sIj48Qj5ORVhUPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9wYWNrYWdlLXRyZWUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgyPgotSGllcmFyY2h5IEZvciBQYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkKLTwvSDI+Ci08L0NFTlRFUj4KLTxETD4KLTxEVD48Qj5QYWNrYWdlIEhpZXJhcmNoaWVzOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctdHJlZS5odG1sIj5BbGwgUGFja2FnZXM8L0E+PC9ETD4KLTxIUj4KLTxIMj4KLUNsYXNzIEhpZXJhcmNoeQotPC9IMj4KLTxVTD4KLTxMSSBUWVBFPSJjaXJjbGUiPmphdmEubGFuZy5PYmplY3Q8VUw+Ci08TEkgVFlQRT0iY2lyY2xlIj5qYXZhLmxhbmcuVGhyb3dhYmxlIChpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlKQotPFVMPgotPExJIFRZUEU9ImNpcmNsZSI+amF2YS5sYW5nLkV4Y2VwdGlvbjxVTD4KLTxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+V3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb248L0I+PC9BPjwvVUw+Ci08L1VMPgotPExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dzRE9NUnVudGltZU1hbmFnZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPldzRE9NUnVudGltZU1hbmFnZXI8L0I+PC9BPiAoaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdTRE9NUnVudGltZU1hbmFnZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV1NET01SdW50aW1lTWFuYWdlcjwvQT4pCi08L1VMPgotPC9VTD4KLTxIMj4KLUludGVyZmFjZSBIaWVyYXJjaHkKLTwvSDI+Ci08VUw+Ci08TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPkRvbVBhY2thZ2UuTGl0ZXJhbHM8L0I+PC9BPjxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV3NEb21Mb2FkTGlzdGVuZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5JV3NEb21Mb2FkTGlzdGVuZXI8L0I+PC9BPjxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV3NET01SdW50aW1lRXh0ZW5zaW9uLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+SVdzRE9NUnVudGltZUV4dGVuc2lvbjwvQj48L0E+PExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXU0RPTVJ1bnRpbWVNYW5hZ2VyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+SVdTRE9NUnVudGltZU1hbmFnZXI8L0I+PC9BPjxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyPFVMPgotPExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q8VUw+Ci08TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDxVTD4KLTxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTxVTD4KLTxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21GYWN0b3J5Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+RG9tRmFjdG9yeTwvQj48L0E+PC9VTD4KLTxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50PFVMPgotPExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlPFVMPgotPExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5Eb21QYWNrYWdlPC9CPjwvQT48L1VMPgotPC9VTD4KLTwvVUw+Ci08TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSURPTS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPklET008L0I+PC9BPjxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JSmF2YVdlYlNlcnZpY2VFbGVtZW50Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+SUphdmFXZWJTZXJ2aWNlRWxlbWVudDwvQj48L0E+PFVMPgotPExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9CPjwvQT48TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPklXZWJNZXRob2Q8L0I+PC9BPjxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5JV2ViUGFyYW08L0I+PC9BPjxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPklXZWJTZXJ2aWNlPC9CPjwvQT48TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlR5cGUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5JV2ViVHlwZTwvQj48L0E+PC9VTD4KLTxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZVByb2plY3QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5JV2ViU2VydmljZVByb2plY3Q8L0I+PC9BPjwvVUw+Ci08L1VMPgotPC9VTD4KLTxIMj4KLUVudW0gSGllcmFyY2h5Ci08L0gyPgotPFVMPgotPExJIFRZUEU9ImNpcmNsZSI+amF2YS5sYW5nLk9iamVjdDxVTD4KLTxMSSBUWVBFPSJjaXJjbGUiPmphdmEubGFuZy5FbnVtJmx0O0UmZ3Q7IChpbXBsZW1lbnRzIGphdmEubGFuZy5Db21wYXJhYmxlJmx0O1QmZ3Q7LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSkKLTxVTD4KLTxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+V2ViUGFyYW1LaW5kPC9CPjwvQT4gKGltcGxlbWVudHMgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3IpCi08TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+U09BUEJpbmRpbmdVc2U8L0I+PC9BPiAoaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcikKLTxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPlNPQVBCaW5kaW5nU3R5bGU8L0I+PC9BPiAoaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcikKLTxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU8L0I+PC9BPiAoaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcikKLTwvVUw+Ci08L1VMPgotPC9VTD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlRyZWU8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wYWNrYWdlLXRyZWUuaHRtbCI+PEI+UFJFVjwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvcGFja2FnZS10cmVlLmh0bWwiPjxCPk5FWFQ8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL3BhY2thZ2UtdHJlZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL3BhY2thZ2UtdXNlLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS11c2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM5MGUwZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS11c2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDczMCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMTQpIG9uIFdlZCBBcHIgMDcgMDc6NTg6MTcgQlNUIDIwMTAgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIFBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaQotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMC0wNC0wNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgUGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL3BhY2thZ2UtdXNlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0icGFja2FnZS11c2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBQYWNrYWdlPGJyPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0I+PC9IMj4KLTwvQ0VOVEVSPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVBhY2thZ2VzIHRoYXQgdXNlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yIj48Qj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvcjwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5hY3Rpb25zIj48Qj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5hY3Rpb25zPC9CPjwvQT48L1REPgotPFREPiZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSI+PEI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lPC9CPjwvQT48L1REPgotPFREPiZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0I+PC9BPjwvVEQ+Ci08VEQ+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlIj48Qj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U8L0I+PC9BPjwvVEQ+Ci08VEQ+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXIiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyPC9CPjwvQT48L1REPgotPFREPiZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zdGF0ZSI+PEI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN0YXRlPC9CPjwvQT48L1REPgotPFREPiZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jIj48Qj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYzwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucmVnaXN0cnkiPjxCPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5yZWdpc3RyeTwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbCI+PEI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWw8L0I+PC9BPjwvVEQ+Ci08VEQ+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotQ2xhc3NlcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpPC9BPiB1c2VkIGJ5IDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvcjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL2NsYXNzLXVzZS9JRE9NLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IiPjxCPklET008L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SURPTTwvYj48L2VtPicuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL2NsYXNzLXVzZS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IiPjxCPklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U8L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL2NsYXNzLXVzZS9JV2ViTWV0aG9kLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IiPjxCPklXZWJNZXRob2Q8L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL2NsYXNzLXVzZS9JV2ViUGFyYW0uaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvciI+PEI+SVdlYlBhcmFtPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvSVdlYlNlcnZpY2UuaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvciI+PEI+SVdlYlNlcnZpY2U8L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL2NsYXNzLXVzZS9JV2ViU2VydmljZVByb2plY3QuaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvciI+PEI+SVdlYlNlcnZpY2VQcm9qZWN0PC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvSVdzRG9tTG9hZExpc3RlbmVyLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IiPjxCPklXc0RvbUxvYWRMaXN0ZW5lcjwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtJbnRlcmZhY2UgdG8gYmUgaW1wbGVtZW50ZWQgYnkgaW50ZXJlc3RlZCBpbiBET00gbG9hZCBwcm9jZXNzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvSVdzRE9NUnVudGltZUV4dGVuc2lvbi5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yIj48Qj5JV3NET01SdW50aW1lRXh0ZW5zaW9uPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgaW50ZXJmYWNlIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSBhbGwgcnVudGltZSB3aGljaCB3YW50IHRvIGhhdmUgRE9NIFRyZWUgCi0gcmVwcmVzZW50YXRpb24gb24gdG9wIG9mIHRoZW0uPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLmFjdGlvbnMiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1DbGFzc2VzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0E+IHVzZWQgYnkgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvYWN0aW9ucy9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuYWN0aW9uczwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL2NsYXNzLXVzZS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuYWN0aW9ucyI+PEI+SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL0lXZWJTZXJ2aWNlLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuYWN0aW9ucyI+PEI+SVdlYlNlcnZpY2U8L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL2NsYXNzLXVzZS9JV3NET01SdW50aW1lRXh0ZW5zaW9uLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuYWN0aW9ucyI+PEI+SVdzRE9NUnVudGltZUV4dGVuc2lvbjwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGlzIGludGVyZmFjZSBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkgYWxsIHJ1bnRpbWUgd2hpY2ggd2FudCB0byBoYXZlIERPTSBUcmVlIAotIHJlcHJlc2VudGF0aW9uIG9uIHRvcCBvZiB0aGVtLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1DbGFzc2VzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0E+IHVzZWQgYnkgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWU8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvSURPTS5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSI+PEI+SURPTTwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JRE9NPC9iPjwvZW0+Jy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUiPjxCPklKYXZhV2ViU2VydmljZUVsZW1lbnQ8L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL2NsYXNzLXVzZS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lIj48Qj5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvSVdlYk1ldGhvZC5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSI+PEI+SVdlYk1ldGhvZDwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL0lXZWJTZXJ2aWNlLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lIj48Qj5JV2ViU2VydmljZTwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL0lXZWJTZXJ2aWNlUHJvamVjdC5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSI+PEI+SVdlYlNlcnZpY2VQcm9qZWN0PC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotQ2xhc3NlcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpPC9BPiB1c2VkIGJ5IDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvRG9tRmFjdG9yeS5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPkRvbUZhY3Rvcnk8L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL2NsYXNzLXVzZS9Eb21QYWNrYWdlLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+RG9tUGFja2FnZTwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL0lET00uaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5JRE9NPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0EgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPklET008L2I+PC9lbT4nLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPklKYXZhV2ViU2VydmljZUVsZW1lbnQ8L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL2NsYXNzLXVzZS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL0lXZWJNZXRob2QuaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5JV2ViTWV0aG9kPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvSVdlYlBhcmFtLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+SVdlYlBhcmFtPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvSVdlYlNlcnZpY2UuaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5JV2ViU2VydmljZTwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL0lXZWJTZXJ2aWNlUHJvamVjdC5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPklXZWJTZXJ2aWNlUHJvamVjdDwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL0lXZWJUeXBlLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+SVdlYlR5cGU8L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL2NsYXNzLXVzZS9JV3NEb21Mb2FkTGlzdGVuZXIuaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5JV3NEb21Mb2FkTGlzdGVuZXI8L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7SW50ZXJmYWNlIHRvIGJlIGltcGxlbWVudGVkIGJ5IGludGVyZXN0ZWQgaW4gRE9NIGxvYWQgcHJvY2Vzcy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5JV3NET01SdW50aW1lRXh0ZW5zaW9uPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgaW50ZXJmYWNlIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSBhbGwgcnVudGltZSB3aGljaCB3YW50IHRvIGhhdmUgRE9NIFRyZWUgCi0gcmVwcmVzZW50YXRpb24gb24gdG9wIG9mIHRoZW0uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL2NsYXNzLXVzZS9JV1NET01SdW50aW1lTWFuYWdlci5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPklXU0RPTVJ1bnRpbWVNYW5hZ2VyPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU8L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+U09BUCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicsCi0gYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL2NsYXNzLXVzZS9TT0FQQmluZGluZ1N0eWxlLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+U09BUEJpbmRpbmdTdHlsZTwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5TT0FQIEJpbmRpbmcgU3R5bGU8L2I+PC9lbT4nLAotIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvU09BUEJpbmRpbmdVc2UuaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5TT0FQQmluZGluZ1VzZTwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5TT0FQIEJpbmRpbmcgVXNlPC9iPjwvZW0+JywKLSBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL1dlYlBhcmFtS2luZC5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPldlYlBhcmFtS2luZDwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL1dzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+V3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb248L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7RXhjZXB0aW9uIHRocm93biBpbiBjYXNlIHRoZSBsb2FkaW5nIG9mIFdTIERPTSBoYXMgYmVlbiBjYW5jZWxsZWQ8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotQ2xhc3NlcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpPC9BPiB1c2VkIGJ5IDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL0RvbUZhY3RvcnkuaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UiPjxCPkRvbUZhY3Rvcnk8L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL2NsYXNzLXVzZS9JRE9NLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlIj48Qj5JRE9NPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0EgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPklET008L2I+PC9lbT4nLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvSVdlYk1ldGhvZC5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZSI+PEI+SVdlYk1ldGhvZDwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL0lXZWJQYXJhbS5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZSI+PEI+SVdlYlBhcmFtPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvSVdlYlNlcnZpY2UuaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UiPjxCPklXZWJTZXJ2aWNlPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvSVdzRG9tTG9hZExpc3RlbmVyLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlIj48Qj5JV3NEb21Mb2FkTGlzdGVuZXI8L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7SW50ZXJmYWNlIHRvIGJlIGltcGxlbWVudGVkIGJ5IGludGVyZXN0ZWQgaW4gRE9NIGxvYWQgcHJvY2Vzcy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UiPjxCPklXc0RPTVJ1bnRpbWVFeHRlbnNpb248L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhpcyBpbnRlcmZhY2Ugc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IGFsbCBydW50aW1lIHdoaWNoIHdhbnQgdG8gaGF2ZSBET00gVHJlZSAKLSByZXByZXNlbnRhdGlvbiBvbiB0b3Agb2YgdGhlbS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UiPjxCPlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU8L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+U09BUCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicsCi0gYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL2NsYXNzLXVzZS9TT0FQQmluZGluZ1N0eWxlLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlIj48Qj5TT0FQQmluZGluZ1N0eWxlPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0EgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlNPQVAgQmluZGluZyBTdHlsZTwvYj48L2VtPicsCi0gYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL2NsYXNzLXVzZS9TT0FQQmluZGluZ1VzZS5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZSI+PEI+U09BUEJpbmRpbmdVc2U8L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+U09BUCBCaW5kaW5nIFVzZTwvYj48L2VtPicsCi0gYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL2NsYXNzLXVzZS9XZWJQYXJhbUtpbmQuaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UiPjxCPldlYlBhcmFtS2luZDwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL1dzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlIj48Qj5Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbjwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtFeGNlcHRpb24gdGhyb3duIGluIGNhc2UgdGhlIGxvYWRpbmcgb2YgV1MgRE9NIGhhcyBiZWVuIGNhbmNlbGxlZDwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc2VyaWFsaXplciI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLUNsYXNzZXMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvQT4gdXNlZCBieSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXI8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyIj48Qj5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvSVdlYk1ldGhvZC5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyIj48Qj5JV2ViTWV0aG9kPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvSVdlYlBhcmFtLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXIiPjxCPklXZWJQYXJhbTwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL0lXZWJTZXJ2aWNlLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXIiPjxCPklXZWJTZXJ2aWNlPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3RhdGUiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1DbGFzc2VzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0E+IHVzZWQgYnkgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N0YXRlL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3RhdGU8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zdGF0ZSI+PEI+SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL0lXZWJNZXRob2QuaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3RhdGUiPjxCPklXZWJNZXRob2Q8L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL2NsYXNzLXVzZS9JV2ViUGFyYW0uaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3RhdGUiPjxCPklXZWJQYXJhbTwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL0lXZWJTZXJ2aWNlLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN0YXRlIj48Qj5JV2ViU2VydmljZTwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN5bmMiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1DbGFzc2VzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0E+IHVzZWQgYnkgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL0RvbUZhY3RvcnkuaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYyI+PEI+RG9tRmFjdG9yeTwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL0lET00uaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYyI+PEI+SURPTTwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JRE9NPC9iPjwvZW0+Jy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYyI+PEI+SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL0lXZWJNZXRob2QuaHRtbCNvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYyI+PEI+SVdlYk1ldGhvZDwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL0lXZWJTZXJ2aWNlLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN5bmMiPjxCPklXZWJTZXJ2aWNlPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN5bmMiPjxCPklXZWJTZXJ2aWNlUHJvamVjdDwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL1dlYlBhcmFtS2luZC5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jIj48Qj5XZWJQYXJhbUtpbmQ8L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL2NsYXNzLXVzZS9Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbi5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jIj48Qj5Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbjwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtFeGNlcHRpb24gdGhyb3duIGluIGNhc2UgdGhlIGxvYWRpbmcgb2YgV1MgRE9NIGhhcyBiZWVuIGNhbmNlbGxlZDwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucmVnaXN0cnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1DbGFzc2VzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0E+IHVzZWQgYnkgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3JlZ2lzdHJ5L3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucmVnaXN0cnk8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvSVdzRE9NUnVudGltZUV4dGVuc2lvbi5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5yZWdpc3RyeSI+PEI+SVdzRE9NUnVudGltZUV4dGVuc2lvbjwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGlzIGludGVyZmFjZSBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkgYWxsIHJ1bnRpbWUgd2hpY2ggd2FudCB0byBoYXZlIERPTSBUcmVlIAotIHJlcHJlc2VudGF0aW9uIG9uIHRvcCBvZiB0aGVtLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLUNsYXNzZXMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTwvQT4gdXNlZCBieSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdXRpbC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWw8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvRG9tUGFja2FnZS5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsIj48Qj5Eb21QYWNrYWdlPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvSURPTS5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsIj48Qj5JRE9NPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0EgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPklET008L2I+PC9lbT4nLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsIj48Qj5JSmF2YVdlYlNlcnZpY2VFbGVtZW50PC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsIj48Qj5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvSVdlYk1ldGhvZC5odG1sI29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsIj48Qj5JV2ViTWV0aG9kPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvSVdlYlBhcmFtLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWwiPjxCPklXZWJQYXJhbTwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL0lXZWJTZXJ2aWNlLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWwiPjxCPklXZWJTZXJ2aWNlPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9jbGFzcy11c2UvSVdlYlNlcnZpY2VQcm9qZWN0Lmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWwiPjxCPklXZWJTZXJ2aWNlUHJvamVjdDwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvY2xhc3MtdXNlL0lXZWJUeXBlLmh0bWwjb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWwiPjxCPklXZWJUeXBlPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS11c2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXVzZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvY2xhc3MtdXNlL0lOYW1lZEV4dGVuc2lvbkluZm8uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2NsYXNzLXVzZS9JTmFtZWRFeHRlbnNpb25JbmZvLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNGQ2ZGIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvY2xhc3MtdXNlL0lOYW1lZEV4dGVuc2lvbkluZm8uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjBfMjIpIG9uIFNhdCBBcHIgMTcgMTg6NDY6MzYgSVNUIDIwMTAgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIEludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuSU5hbWVkRXh0ZW5zaW9uSW5mbwotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgSW50ZXJmYWNlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5JTmFtZWRFeHRlbnNpb25JbmZvIjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvSU5hbWVkRXh0ZW5zaW9uSW5mby5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvY2xhc3MtdXNlL0lOYW1lZEV4dGVuc2lvbkluZm8uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJTmFtZWRFeHRlbnNpb25JbmZvLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgSW50ZXJmYWNlPGJyPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5JTmFtZWRFeHRlbnNpb25JbmZvPC9CPjwvSDI+Ci08L0NFTlRFUj4KLU5vIHVzYWdlIG9mIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5JTmFtZWRFeHRlbnNpb25JbmZvCi08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JTmFtZWRFeHRlbnNpb25JbmZvLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9jbGFzcy11c2UvSU5hbWVkRXh0ZW5zaW9uSW5mby5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklOYW1lZEV4dGVuc2lvbkluZm8uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2NsYXNzLXVzZS9JUHJvcGVydHlEZWZhdWx0cy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvY2xhc3MtdXNlL0lQcm9wZXJ0eURlZmF1bHRzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlM2U2YjguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvY2xhc3MtdXNlL0lQcm9wZXJ0eURlZmF1bHRzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wXzIyKSBvbiBTYXQgQXByIDE3IDE4OjQ2OjM2IElTVCAyMDEwIC0tPgotPFRJVExFPgotVXNlcyBvZiBJbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklQcm9wZXJ0eURlZmF1bHRzCi08L1RJVExFPgotCi0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBJbnRlcmZhY2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklQcm9wZXJ0eURlZmF1bHRzIjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvSVByb3BlcnR5RGVmYXVsdHMuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2NsYXNzLXVzZS9JUHJvcGVydHlEZWZhdWx0cy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklQcm9wZXJ0eURlZmF1bHRzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgSW50ZXJmYWNlPGJyPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5JUHJvcGVydHlEZWZhdWx0czwvQj48L0gyPgotPC9DRU5URVI+Ci1ObyB1c2FnZSBvZiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuSVByb3BlcnR5RGVmYXVsdHMKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL0lQcm9wZXJ0eURlZmF1bHRzLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9jbGFzcy11c2UvSVByb3BlcnR5RGVmYXVsdHMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJUHJvcGVydHlEZWZhdWx0cy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvY2xhc3MtdXNlL0lQcm9wZXJ0eVN0YXRlLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9jbGFzcy11c2UvSVByb3BlcnR5U3RhdGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRjZGY3MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9jbGFzcy11c2UvSVByb3BlcnR5U3RhdGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjBfMjIpIG9uIFNhdCBBcHIgMTcgMTg6NDY6MzYgSVNUIDIwMTAgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIEludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuSVByb3BlcnR5U3RhdGUKLTwvVElUTEU+Ci0KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIEludGVyZmFjZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuSVByb3BlcnR5U3RhdGUiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JUHJvcGVydHlTdGF0ZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvY2xhc3MtdXNlL0lQcm9wZXJ0eVN0YXRlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVByb3BlcnR5U3RhdGUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBJbnRlcmZhY2U8YnI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklQcm9wZXJ0eVN0YXRlPC9CPjwvSDI+Ci08L0NFTlRFUj4KLU5vIHVzYWdlIG9mIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5JUHJvcGVydHlTdGF0ZQotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvSVByb3BlcnR5U3RhdGUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2NsYXNzLXVzZS9JUHJvcGVydHlTdGF0ZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklQcm9wZXJ0eVN0YXRlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wYWNrYWdlLWZyYW1lLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wYWNrYWdlLWZyYW1lLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzODAxN2UuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGFja2FnZS1mcmFtZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wXzIyKSBvbiBTYXQgQXByIDE3IDE4OjQ2OjM2IElTVCAyMDEwIC0tPgotPFRJVExFPgotb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJrZXl3b3JkcyIgQ09OVEVOVD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lIHBhY2thZ2UiPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSI+Ci08Rk9OVCBzaXplPSIrMSIgQ0xBU1M9IkZyYW1lVGl0bGVGb250Ij4KLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWU8L0E+PC9GT05UPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgTk9XUkFQPjxGT05UIHNpemU9IisxIiBDTEFTUz0iRnJhbWVIZWFkaW5nRm9udCI+Ci1JbnRlcmZhY2VzPC9GT05UPiZuYnNwOwotPEZPTlQgQ0xBU1M9IkZyYW1lSXRlbUZvbnQiPgotPEJSPgotPEEgSFJFRj0iSU5hbWVkRXh0ZW5zaW9uSW5mby5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5JTmFtZWRFeHRlbnNpb25JbmZvPC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9IklQcm9wZXJ0eURlZmF1bHRzLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjxJPklQcm9wZXJ0eURlZmF1bHRzPC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9IklQcm9wZXJ0eVN0YXRlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjxJPklQcm9wZXJ0eVN0YXRlPC9JPjwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotCi0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BhY2thZ2Utc3VtbWFyeS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNmRiZjIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wXzIyKSBvbiBTYXQgQXByIDE3IDE4OjQ2OjM2IElTVCAyMDEwIC0tPgotPFRJVExFPgotb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJrZXl3b3JkcyIgQ09OVEVOVD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lIHBhY2thZ2UiPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdXNlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWIFBBQ0tBR0UmbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxCPk5FWFQgUEFDS0FHRTwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08SDI+Ci1QYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZQotPC9IMj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5JbnRlcmZhY2UgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvSU5hbWVkRXh0ZW5zaW9uSW5mby5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSI+SU5hbWVkRXh0ZW5zaW9uSW5mbzwvQT48L0I+PC9URD4KLTxURD5JbnRlcmZhY2UgcmVwcmVzZW50aWcgYW5kIGV4dGVudGlvbi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIxNSUiPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JUHJvcGVydHlEZWZhdWx0cy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSI+SVByb3BlcnR5RGVmYXVsdHM8L0E+PC9CPjwvVEQ+Ci08VEQ+SW50ZXJmYWNlIHRoYXQgcHJvdmlkZXMgZGVmYXVsdCB2YWx1ZXMgZm9yIERPTSBvYmplY3QncyBwcm9wZXJ0aWVzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL0lQcm9wZXJ0eVN0YXRlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lIj5JUHJvcGVydHlTdGF0ZTwvQT48L0I+PC9URD4KLTxURD5JbnRlcmZhY2UgZm9yIGNoZWNraW5nIHRoZSBzdGF0ZSBvZiBzb21lIHByb3BlcnR5IGZvciBjb25jcmV0ZSBET00gb2JqZWN0LjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotCi08UD4KLTxETD4KLTwvREw+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5QYWNrYWdlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS11c2UuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYgUEFDS0FHRSZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEI+TkVYVCBQQUNLQUdFPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BhY2thZ2Utc3VtbWFyeS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGFja2FnZS10cmVlLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wYWNrYWdlLXRyZWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFkYTBhYy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wYWNrYWdlLXRyZWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjBfMjIpIG9uIFNhdCBBcHIgMTcgMTg6NDY6MzYgSVNUIDIwMTAgLS0+Ci08VElUTEU+Ci1vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUgQ2xhc3MgSGllcmFyY2h5Ci08L1RJVExFPgotCi0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lIENsYXNzIEhpZXJhcmNoeSI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VHJlZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9wYWNrYWdlLXRyZWUuaHRtbCI+PEI+TkVYVDwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wYWNrYWdlLXRyZWUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgyPgotSGllcmFyY2h5IEZvciBQYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZQotPC9IMj4KLTwvQ0VOVEVSPgotPERMPgotPERUPjxCPlBhY2thZ2UgSGllcmFyY2hpZXM6PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy10cmVlLmh0bWwiPkFsbCBQYWNrYWdlczwvQT48L0RMPgotPEhSPgotPEgyPgotSW50ZXJmYWNlIEhpZXJhcmNoeQotPC9IMj4KLTxVTD4KLTxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvSU5hbWVkRXh0ZW5zaW9uSW5mby5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSI+PEI+SU5hbWVkRXh0ZW5zaW9uSW5mbzwvQj48L0E+PExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JUHJvcGVydHlEZWZhdWx0cy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSI+PEI+SVByb3BlcnR5RGVmYXVsdHM8L0I+PC9BPjxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvSVByb3BlcnR5U3RhdGUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUiPjxCPklQcm9wZXJ0eVN0YXRlPC9CPjwvQT48L1VMPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VHJlZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9wYWNrYWdlLXRyZWUuaHRtbCI+PEI+TkVYVDwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wYWNrYWdlLXRyZWUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BhY2thZ2UtdXNlLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wYWNrYWdlLXVzZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTA5YjVjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BhY2thZ2UtdXNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wXzIyKSBvbiBTYXQgQXByIDE3IDE4OjQ2OjM2IElTVCAyMDEwIC0tPgotPFRJVExFPgotVXNlcyBvZiBQYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZQotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgUGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BhY2thZ2UtdXNlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0icGFja2FnZS11c2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBQYWNrYWdlPGJyPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZTwvQj48L0gyPgotPC9DRU5URVI+Ci1ObyB1c2FnZSBvZiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGFja2FnZS11c2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXVzZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vdmVydmlldy1mcmFtZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vdmVydmlldy1mcmFtZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTQwMTNhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3ZlcnZpZXctZnJhbWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMF8yMikgb24gU2F0IEFwciAxNyAxODo0NjozNiBJU1QgMjAxMCAtLT4KLTxUSVRMRT4KLU92ZXJ2aWV3Ci08L1RJVExFPgotCi08TUVUQSBOQU1FPSJrZXl3b3JkcyIgQ09OVEVOVD0iT3ZlcnZpZXciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0ic3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSI+Ci0KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBTVU1NQVJZPSIiPgotPFRSPgotPFRIIEFMSUdOPSJsZWZ0IiBOT1dSQVA+PEZPTlQgc2l6ZT0iKzEiIENMQVNTPSJGcmFtZVRpdGxlRm9udCI+Ci08Qj48L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgTk9XUkFQPjxGT05UIENMQVNTPSJGcmFtZUl0ZW1Gb250Ij48QSBIUkVGPSJhbGxjbGFzc2VzLWZyYW1lLmh0bWwiIHRhcmdldD0icGFja2FnZUZyYW1lIj5BbGwgQ2xhc3NlczwvQT48L0ZPTlQ+Ci08UD4KLTxGT05UIHNpemU9IisxIiBDTEFTUz0iRnJhbWVIZWFkaW5nRm9udCI+Ci1QYWNrYWdlczwvRk9OVD4KLTxCUj4KLTxGT05UIENMQVNTPSJGcmFtZUl0ZW1Gb250Ij48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGFja2FnZS1mcmFtZS5odG1sIiB0YXJnZXQ9InBhY2thZ2VGcmFtZSI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lPC9BPjwvRk9OVD4KLTxCUj4KLTxGT05UIENMQVNTPSJGcmFtZUl0ZW1Gb250Ij48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL3BhY2thZ2UtZnJhbWUuaHRtbCIgdGFyZ2V0PSJwYWNrYWdlRnJhbWUiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0E+PC9GT05UPgotPEJSPgotPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotCi08UD4KLSZuYnNwOwotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vdmVydmlldy1zdW1tYXJ5Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL292ZXJ2aWV3LXN1bW1hcnkuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdkOGZmMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL292ZXJ2aWV3LXN1bW1hcnkuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjBfMjIpIG9uIFNhdCBBcHIgMTcgMTg6NDY6MzYgSVNUIDIwMTAgLS0+Ci08VElUTEU+Ci1PdmVydmlldwotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0ia2V5d29yZHMiIENPTlRFTlQ9Ik92ZXJ2aWV3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9InN0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJPdmVydmlldyI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5PdmVydmlldzwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Im92ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImRlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImhlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iaW5kZXguaHRtbD9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSJhbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5QYWNrYWdlczwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMjAlIj48Qj48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZTwvQT48L0I+PC9URD4KLTxURD4mbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIyMCUiPjxCPjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0E+PC9CPjwvVEQ+Ci08VEQ+Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotCi08UD4KLSZuYnNwOzxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJvdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJkZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImluZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJoZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9ImluZGV4Lmh0bWw/b3ZlcnZpZXctc3VtbWFyeS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSJhbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3ZlcnZpZXctdHJlZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vdmVydmlldy10cmVlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYjA0MGQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vdmVydmlldy10cmVlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wXzIyKSBvbiBTYXQgQXByIDE3IDE4OjQ2OjM2IElTVCAyMDEwIC0tPgotPFRJVExFPgotQ2xhc3MgSGllcmFyY2h5Ci08L1RJVExFPgotCi0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSJzdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iQ2xhc3MgSGllcmFyY2h5IjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJvdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5UcmVlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJpbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSJpbmRleC5odG1sP292ZXJ2aWV3LXRyZWUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJvdmVydmlldy10cmVlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLUhpZXJhcmNoeSBGb3IgQWxsIFBhY2thZ2VzPC9IMj4KLTwvQ0VOVEVSPgotPERMPgotPERUPjxCPlBhY2thZ2UgSGllcmFyY2hpZXM6PC9CPjxERD48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGFja2FnZS10cmVlLmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZTwvQT4sIDxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvcGFja2FnZS10cmVlLmh0bWwiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0E+PC9ETD4KLTxIUj4KLTxIMj4KLUNsYXNzIEhpZXJhcmNoeQotPC9IMj4KLTxVTD4KLTxMSSBUWVBFPSJjaXJjbGUiPmphdmEubGFuZy5PYmplY3Q8VUw+Ci08TEkgVFlQRT0iY2lyY2xlIj5qYXZhLmxhbmcuVGhyb3dhYmxlIChpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlKQotPFVMPgotPExJIFRZUEU9ImNpcmNsZSI+amF2YS5sYW5nLkV4Y2VwdGlvbjxVTD4KLTxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+V3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb248L0I+PC9BPjwvVUw+Ci08L1VMPgotPExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dzRE9NUnVudGltZU1hbmFnZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPldzRE9NUnVudGltZU1hbmFnZXI8L0I+PC9BPiAoaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdTRE9NUnVudGltZU1hbmFnZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj5JV1NET01SdW50aW1lTWFuYWdlcjwvQT4pCi08L1VMPgotPC9VTD4KLTxIMj4KLUludGVyZmFjZSBIaWVyYXJjaHkKLTwvSDI+Ci08VUw+Ci08TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5MaXRlcmFscy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPkRvbVBhY2thZ2UuTGl0ZXJhbHM8L0I+PC9BPjxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvSU5hbWVkRXh0ZW5zaW9uSW5mby5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSI+PEI+SU5hbWVkRXh0ZW5zaW9uSW5mbzwvQj48L0E+PExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JUHJvcGVydHlEZWZhdWx0cy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSI+PEI+SVByb3BlcnR5RGVmYXVsdHM8L0I+PC9BPjxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvSVByb3BlcnR5U3RhdGUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUiPjxCPklQcm9wZXJ0eVN0YXRlPC9CPjwvQT48TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRG9tTG9hZExpc3RlbmVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+SVdzRG9tTG9hZExpc3RlbmVyPC9CPjwvQT48TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRE9NUnVudGltZUV4dGVuc2lvbi5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPklXc0RPTVJ1bnRpbWVFeHRlbnNpb248L0I+PC9BPjxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV1NET01SdW50aW1lTWFuYWdlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPklXU0RPTVJ1bnRpbWVNYW5hZ2VyPC9CPjwvQT48TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjxVTD4KLTxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21GYWN0b3J5Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+RG9tRmFjdG9yeTwvQj48L0E+PExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5Eb21QYWNrYWdlPC9CPjwvQT48TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk8VUw+Ci08TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tRmFjdG9yeS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPkRvbUZhY3Rvcnk8L0I+PC9BPjwvVUw+Ci08TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDxVTD4KLTxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21GYWN0b3J5Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+RG9tRmFjdG9yeTwvQj48L0E+PExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5Eb21QYWNrYWdlPC9CPjwvQT48TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk8VUw+Ci08TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tRmFjdG9yeS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPkRvbUZhY3Rvcnk8L0I+PC9BPjwvVUw+Ci08TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudDxVTD4KLTxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+RG9tUGFja2FnZTwvQj48L0E+PExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlPFVMPgotPExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5Eb21QYWNrYWdlPC9CPjwvQT48L1VMPgotPC9VTD4KLTxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTxVTD4KLTxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+RG9tUGFja2FnZTwvQj48L0E+PC9VTD4KLTwvVUw+Ci08TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudDxVTD4KLTxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+RG9tUGFja2FnZTwvQj48L0E+PExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlPFVMPgotPExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5Eb21QYWNrYWdlPC9CPjwvQT48L1VMPgotPC9VTD4KLTxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0PFVMPgotPExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbUZhY3RvcnkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5Eb21GYWN0b3J5PC9CPjwvQT48TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPkRvbVBhY2thZ2U8L0I+PC9BPjxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTxVTD4KLTxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21GYWN0b3J5Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+RG9tRmFjdG9yeTwvQj48L0E+PC9VTD4KLTxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50PFVMPgotPExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbUZhY3RvcnkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5Eb21GYWN0b3J5PC9CPjwvQT48TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPkRvbVBhY2thZ2U8L0I+PC9BPjxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTxVTD4KLTxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21GYWN0b3J5Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+RG9tRmFjdG9yeTwvQj48L0E+PC9VTD4KLTxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50PFVMPgotPExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5Eb21QYWNrYWdlPC9CPjwvQT48TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U8VUw+Ci08TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPkRvbVBhY2thZ2U8L0I+PC9BPjwvVUw+Ci08L1VMPgotPExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlPFVMPgotPExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5Eb21QYWNrYWdlPC9CPjwvQT48L1VMPgotPC9VTD4KLTxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50PFVMPgotPExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5Eb21QYWNrYWdlPC9CPjwvQT48TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U8VUw+Ci08TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPkRvbVBhY2thZ2U8L0I+PC9BPjwvVUw+Ci08L1VMPgotPExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlPFVMPgotPExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5Eb21QYWNrYWdlPC9CPjwvQT48L1VMPgotPExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lET00uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5JRE9NPC9CPjwvQT48TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPklKYXZhV2ViU2VydmljZUVsZW1lbnQ8L0I+PC9BPjxVTD4KLTxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvQj48L0E+PExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5JV2ViTWV0aG9kPC9CPjwvQT48TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+SVdlYlBhcmFtPC9CPjwvQT48TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5JV2ViU2VydmljZTwvQj48L0E+PExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJUeXBlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+SVdlYlR5cGU8L0I+PC9BPjwvVUw+Ci08TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U8L0I+PC9BPjxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+SVdlYk1ldGhvZDwvQj48L0E+PExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPklXZWJQYXJhbTwvQj48L0E+PExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+SVdlYlNlcnZpY2U8L0I+PC9BPjxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZVByb2plY3QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5JV2ViU2VydmljZVByb2plY3Q8L0I+PC9BPjxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViVHlwZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPklXZWJUeXBlPC9CPjwvQT48L1VMPgotPExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlPFVMPgotPExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5Eb21QYWNrYWdlPC9CPjwvQT48L1VMPgotPExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lET00uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5JRE9NPC9CPjwvQT48TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPklKYXZhV2ViU2VydmljZUVsZW1lbnQ8L0I+PC9BPjxVTD4KLTxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvQj48L0E+PExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5JV2ViTWV0aG9kPC9CPjwvQT48TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+SVdlYlBhcmFtPC9CPjwvQT48TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5JV2ViU2VydmljZTwvQj48L0E+PExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJUeXBlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+SVdlYlR5cGU8L0I+PC9BPjwvVUw+Ci08TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U8L0I+PC9BPjxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+SVdlYk1ldGhvZDwvQj48L0E+PExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPklXZWJQYXJhbTwvQj48L0E+PExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS48QSBIUkVGPSJvcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+SVdlYlNlcnZpY2U8L0I+PC9BPjxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZVByb2plY3QuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpIj48Qj5JV2ViU2VydmljZVByb2plY3Q8L0I+PC9BPjxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViVHlwZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPklXZWJUeXBlPC9CPjwvQT48L1VMPgotPC9VTD4KLTxIMj4KLUVudW0gSGllcmFyY2h5Ci08L0gyPgotPFVMPgotPExJIFRZUEU9ImNpcmNsZSI+amF2YS5sYW5nLk9iamVjdDxVTD4KLTxMSSBUWVBFPSJjaXJjbGUiPmphdmEubGFuZy5FbnVtJmx0O0UmZ3Q7IChpbXBsZW1lbnRzIGphdmEubGFuZy5Db21wYXJhYmxlJmx0O1QmZ3Q7LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSkKLTxVTD4KLTxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+V2ViUGFyYW1LaW5kPC9CPjwvQT4gKGltcGxlbWVudHMgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3IpCi08TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLjxBIEhSRUY9Im9yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+PEI+U09BUEJpbmRpbmdVc2U8L0I+PC9BPiAoaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcikKLTxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPlNPQVBCaW5kaW5nU3R5bGU8L0I+PC9BPiAoaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcikKLTxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkiPjxCPlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU8L0I+PC9BPiAoaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcikKLTwvVUw+Ci08L1VMPgotPC9VTD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlRyZWU8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJkZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImluZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJoZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9ImluZGV4Lmh0bWw/b3ZlcnZpZXctdHJlZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9Im92ZXJ2aWV3LXRyZWUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSJhbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvcGFja2FnZS1saXN0IGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9wYWNrYWdlLWxpc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZTBiOWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9wYWNrYWdlLWxpc3QKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLW9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZQotb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9yZXNvdXJjZXMvaW5oZXJpdC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL3Jlc291cmNlcy9pbmhlcml0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgxNDg2Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL3Jlc291cmNlcy9pbmhlcml0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvc2VyaWFsaXplZC1mb3JtLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL3NlcmlhbGl6ZWQtZm9ybS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTJlNDg2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvc2VyaWFsaXplZC1mb3JtLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wXzIyKSBvbiBTYXQgQXByIDE3IDE4OjQ2OjM2IElTVCAyMDEwIC0tPgotPFRJVExFPgotU2VyaWFsaXplZCBGb3JtCi08L1RJVExFPgotCi0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSJzdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iU2VyaWFsaXplZCBGb3JtIjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJvdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0ib3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJpbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSJpbmRleC5odG1sP3NlcmlhbGl6ZWQtZm9ybS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9InNlcmlhbGl6ZWQtZm9ybS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSJhbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDE+Ci1TZXJpYWxpemVkIEZvcm08L0gxPgotPC9DRU5URVI+Ci08SFIgU0laRT0iNCIgTk9TSEFERT4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJjZW50ZXIiPjxGT05UIFNJWkU9IisyIj4KLTxCPlBhY2thZ2U8L0I+IDxCPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q2xhc3MgPEEgSFJFRj0ib3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbjwvQT4gZXh0ZW5kcyBqYXZhLmxhbmcuRXhjZXB0aW9uIGltcGxlbWVudHMgU2VyaWFsaXphYmxlPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxQPgotPEI+c2VyaWFsVmVyc2lvblVJRDombmJzcDs8L0I+MUwKLQotPFA+Ci08QSBOQU1FPSJzZXJpYWxpemVkRm9ybSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPlNlcmlhbGl6ZWQgRmllbGRzPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxIMz4KLWxvY2FsaXplZE1lc3NhZ2U8L0gzPgotPFBSRT4KLWphdmEubGFuZy5TdHJpbmcgPEI+bG9jYWxpemVkTWVzc2FnZTwvQj48L1BSRT4KLTxETD4KLTxETD4KLTwvREw+Ci08L0RMPgotCi08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJvdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJkZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImluZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJoZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9ImluZGV4Lmh0bWw/c2VyaWFsaXplZC1mb3JtLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0ic2VyaWFsaXplZC1mb3JtLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL3N0eWxlc2hlZXQuY3NzIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9zdHlsZXNoZWV0LmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQzMWZkYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL3N0eWxlc2hlZXQuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyogSmF2YWRvYyBzdHlsZSBzaGVldCAqLwotCi0vKiBEZWZpbmUgY29sb3JzLCBmb250cyBhbmQgb3RoZXIgc3R5bGUgYXR0cmlidXRlcyBoZXJlIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0cyAqLwotCi0vKiBQYWdlIGJhY2tncm91bmQgY29sb3IgKi8KLWJvZHkgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGIH0KLQotLyogSGVhZGluZ3MgKi8KLWgxIHsgZm9udC1zaXplOiAxNDUlIH0KLQotLyogVGFibGUgY29sb3JzICovCi0uVGFibGVIZWFkaW5nQ29sb3IgICAgIHsgYmFja2dyb3VuZDogI0NDQ0NGRiB9IC8qIERhcmsgbWF1dmUgKi8KLS5UYWJsZVN1YkhlYWRpbmdDb2xvciAgeyBiYWNrZ3JvdW5kOiAjRUVFRUZGIH0gLyogTGlnaHQgbWF1dmUgKi8KLS5UYWJsZVJvd0NvbG9yICAgICAgICAgeyBiYWNrZ3JvdW5kOiAjRkZGRkZGIH0gLyogV2hpdGUgKi8KLQotLyogRm9udCB1c2VkIGluIGxlZnQtaGFuZCBmcmFtZSBsaXN0cyAqLwotLkZyYW1lVGl0bGVGb250ICAgeyBmb250LXNpemU6IDEwMCU7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmIH0KLS5GcmFtZUhlYWRpbmdGb250IHsgZm9udC1zaXplOiAgOTAlOyBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZiB9Ci0uRnJhbWVJdGVtRm9udCAgICB7IGZvbnQtc2l6ZTogIDkwJTsgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYgfQotCi0vKiBOYXZpZ2F0aW9uIGJhciBmb250cyBhbmQgY29sb3JzICovCi0uTmF2QmFyQ2VsbDEgICAgeyBiYWNrZ3JvdW5kLWNvbG9yOiNFRUVFRkY7fSAvKiBMaWdodCBtYXV2ZSAqLwotLk5hdkJhckNlbGwxUmV2IHsgYmFja2dyb3VuZC1jb2xvcjojMDAwMDhCO30gLyogRGFyayBCbHVlICovCi0uTmF2QmFyRm9udDEgICAgeyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgY29sb3I6IzAwMDAwMDt9Ci0uTmF2QmFyRm9udDFSZXYgeyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgY29sb3I6I0ZGRkZGRjt9Ci0KLS5OYXZCYXJDZWxsMiAgICB7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBiYWNrZ3JvdW5kLWNvbG9yOiNGRkZGRkY7fQotLk5hdkJhckNlbGwzICAgIHsgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGJhY2tncm91bmQtY29sb3I6I0ZGRkZGRjt9Ci0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9leHRlbnNpb24tcG9pbnRzL2luZGV4Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvZXh0ZW5zaW9uLXBvaW50cy9pbmRleC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2Y2YTIyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9leHRlbnNpb24tcG9pbnRzL2luZGV4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWwgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgU2hhbmUgQ2xhcmtlIDIwMTAuIiA+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5KQVgtV1MgRE9NIEV4dGVuc2lvbiBQb2ludHM8L3RpdGxlPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vYm9vay5jc3MiPgotPC9oZWFkPgotPGJvZHk+Ci08aDE+SkFYLVdTIERPTSBFeHRlbnNpb24gUG9pbnRzPC9oMT4KLTxwPlRoZSBmb2xsb3dpbmcgZXh0ZW5zaW9uIHBvaW50IGNhbiBiZSB1c2VkIHRvIGNvbnRyaWJ1dGUgYXJ0aWZhY3RzIGluIHRoZSB3ZWIgc2VydmljZSBkb21haW4gb2JqZWN0IG1vZGVsLgotVGhlIGNvbnRyaWJ1dGVkIGFydGlmYWN0cyBhcmUgdmlzaWJsZSB1bmRlciB0aGUgIkpBWC1XUyBXZWIgU2VydmljZXMiIG5vZGUgaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldy48L3A+Ci08dWw+Ci0gIDxsaT48YSBocmVmPSJvcmdfZWNsaXBzZV9qc3Rfd3NfamF4d3NfZG9tX3J1bnRpbWVfcnVudGltZXMuaHRtbCI+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmRvbXJ1bnRpbWVzPC9hPjwvbGk+Ci08L3VsPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9yZWZlcmVuY2UvZXh0ZW5zaW9uLXBvaW50cy9vcmdfZWNsaXBzZV9qc3Rfd3NfamF4d3NfZG9tX3J1bnRpbWVfcnVudGltZXMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9leHRlbnNpb24tcG9pbnRzL29yZ19lY2xpcHNlX2pzdF93c19qYXh3c19kb21fcnVudGltZV9ydW50aW1lcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDRjNGI2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3JlZmVyZW5jZS9leHRlbnNpb24tcG9pbnRzL29yZ19lY2xpcHNlX2pzdF93c19qYXh3c19kb21fcnVudGltZV9ydW50aW1lcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+U3VwcG9ydGVkIFJ1bnRpbWVzPC90aXRsZT4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+QGltcG9ydCB1cmwoIi4uLy4uL2Jvb2suY3NzIik7PC9zdHlsZT4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+QGltcG9ydCB1cmwoIi4uLy4uL3NjaGVtYS5jc3MiKTs8L3N0eWxlPgotPC9IRUFEPgotPEJPRFk+Ci08SDEgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyIj5TdXBwb3J0ZWQgUnVudGltZXM8L0gxPgotPHA+PC9wPgotPGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+SWRlbnRpZmllcjogPC9oNj5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuc3VwcG9ydGVkcnVudGltZXM8cD48L3A+Ci08aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5TaW5jZTogPC9oNj4xLjAKLTxwPjwvcD4KLQotPGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+RGVzY3JpcHRpb246IDwvaDY+VGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIGNvbnRyaWJ1dGluZyB3ZWIgc2VydmljZSBydW50aW1lIGV4dGVuc2lvbnMgKGltcGxlbWVudGF0aW9ucyBvZiB0aGUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV3NET01SdW50aW1lRXh0ZW5zaW9uIGludGVmYWNlKSBwZXIgYSBnaXZlbiBwcm9qZWN0IGZhY2V0IHZlcnNpb24uCi1SdW50aW1lIGV4dGVuc2lvbnMgYXJlIHJlc3BvbnNpYmxlIGZvciBwcm92aWRpbmcgYXJ0aWZhY3RzIGZvciB3ZWIgc2VydmljZXMgaW1wbGVtZW50ZWQgdmlhIGEgZ2l2ZW4gd2ViIHNlcnZpY2UgdGVjaG5vbG9neSAoSkFYLVdTLCBKQVgtUlBDLCBldGMuKTxwPjwvcD4KLTxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPkNvbmZpZ3VyYXRpb24gTWFya3VwOjwvaDY+Ci08cD48L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLmV4dGVuc2lvbiI+ZXh0ZW5zaW9uPC9hPiAoPGEgaHJlZj0iI2UuaW1wbGVtZW50YXRpb24iPmltcGxlbWVudGF0aW9uPC9hPiAsIDxhIGhyZWY9IiNlLnByb2plY3RfZmFjZXQiPnByb2plY3RfZmFjZXQ8L2E+KykmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgZXh0ZW5zaW9uPC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+cG9pbnQmbmJzcDtDREFUQSAjUkVRVUlSRUQ8L3A+PHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+aWQmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjUkVRVUlSRUQ8L3A+PHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+bmFtZSZuYnNwOyZuYnNwO0NEQVRBICNJTVBMSUVEPC9wPiZndDs8L3A+Ci08cD48L3A+Ci08dWwgY2xhc3M9IkNvbmZpZ01hcmt1cEF0dGxpc3REZXNjIj4KLTwvdWw+Ci08YnI+PHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5pbXBsZW1lbnRhdGlvbiI+aW1wbGVtZW50YXRpb248L2E+IEVNUFRZJmd0OzwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFBVFRMSVNUIGltcGxlbWVudGF0aW9uPC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+Y2xhc3MmbmJzcDtDREFUQSAjUkVRVUlSRUQ8L3A+Jmd0OzwvcD4KLTxwPjwvcD4KLTxwIGNsYXNzPSJDb25maWdNYXJrdXBFbGVtZW50RGVzYyI+Ci1UaGlzIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBjb250cmlidXRlZCBydW50aW1lIGV4dGVuc2lvbiBjbGFzczwvcD4KLTxicj4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPmNsYXNzPC9iPiAtIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3Mgd2hpY2ggaW1wbGVtZW50cyB0aGUgcnVudGltZSBleHRlbnNpb248L2xpPgotPC91bD4KLTxicj48cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLnByb2plY3RfZmFjZXQiPnByb2plY3RfZmFjZXQ8L2E+IEVNUFRZJmd0OzwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFBVFRMSVNUIHByb2plY3RfZmFjZXQ8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5pZCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRDwvcD48cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij52ZXJzaW9uJm5ic3A7Q0RBVEEgI0lNUExJRUQ8L3A+Jmd0OzwvcD4KLTxwPjwvcD4KLTxwIGNsYXNzPSJDb25maWdNYXJrdXBFbGVtZW50RGVzYyI+Ci1UaGlzIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBwcm9qZWN0IGZhY2V0IHZlcnNpb24gdGhpcyBydW50aW1lIGV4dGVuc2lvbiBpcyBhcHBsaWNhYmxlIGZvci4gQSBydW50aW1lIGV4dGVuc2lvbiBtYXkgYmUgYXBwbGljYWJsZSBmb3Igb25lIG9yIG1vcmUgcHJvamVjdCBmYWNldCB2ZXJzaW9uczwvcD4KLTxicj4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPmlkPC9iPiAtIFRoZSBJRCBvZiB0aGUgcHJvamVjdCBmYWNldDwvbGk+Ci08bGk+PGI+dmVyc2lvbjwvYj4gLSBUaGUgdmVyc2lvbiBvZiB0aGUgcHJvamVjdCBmYWNldDwvbGk+Ci08L3VsPgotPGJyPjxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPkV4YW1wbGVzOiA8L2g2PjxwPgotPHByZSBjbGFzcz0iRXhhbXBsZSI+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hVGFnIj4KLSAgICZsdDtleHRlbnNpb24KLSAgICAgIGlkPTwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFDc3RyaW5nIj4mcXVvdDtvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmplZTUmcXVvdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hVGFnIj4gCi0gICAgICBuYW1lPTwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFDc3RyaW5nIj4mcXVvdDtKRUU1IERPTSBjb250cmlidXRpb24mcXVvdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hVGFnIj4KLSAgICAgIHBvaW50PTwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFDc3RyaW5nIj4mcXVvdDtvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuZG9tcnVudGltZXMmcXVvdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hVGFnIj4mZ3Q7Ci0gICAgICAmbHQ7aW1wbGVtZW50YXRpb24gY2xhc3M9PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYUNzdHJpbmciPiZxdW90O29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KZWU1V3NEb21SdW50aW1lRXh0ZW5zaW9uJnF1b3Q7PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYVRhZyI+LyZndDsKLSAgICAgICZsdDtwcm9qZWN0X2ZhY2V0IGlkPTwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFDc3RyaW5nIj4mcXVvdDtqc3QuZWpiJnF1b3Q7PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYVRhZyI+IHZlcnNpb249PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYUNzdHJpbmciPiZxdW90OzMuMCZxdW90Ozwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFUYWciPi8mZ3Q7Ci0gICAgICAmbHQ7cHJvamVjdF9mYWNldCBpZD08L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hQ3N0cmluZyI+JnF1b3Q7anN0LndlYiZxdW90Ozwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFUYWciPiB2ZXJzaW9uPTwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFDc3RyaW5nIj4mcXVvdDsyLjUmcXVvdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hVGFnIj4vJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7PC9zcGFuPjwvcHJlPgotPC9wPgotPHA+PC9wPgotCi08aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5BUEkgSW5mb3JtYXRpb246IDwvaDY+VGhlIGludGVyZmFjZXMgb2YgdGhlIHdlYiBzZXJ2aWNlIG1vZGVsIGFyZSBsb2NhdGVkIGluIHRoZSAib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSIgcGFja2FnZS4KLUluIG9yZGVyIHRvIGFjY2VzcyB0aGUgY29udHJpYnV0ZWQgcnVudGltZSBleHRlbnNpb25zIHVzZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldzRE9NUnVudGltZU1hbmFnZXIKLTxwPjwvcD4KLQotPGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+U3VwcGxpZWQgSW1wbGVtZW50YXRpb246IDwvaDY+W0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLTxwPjwvcD4KLQotPGJyPgotPHAgY2xhc3M9Im5vdGUgU2NoZW1hQ29weXJpZ2h0Ij4KLUNvcHlyaWdodCAoYykgMjAwOSBTQVAgQUcsIFdhbGxkb3JmLjxicj4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCA8YQotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPgotCi08L3A+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9zY2hlbWEuY3NzIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3Yvc2NoZW1hLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EyNWJhMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi9zY2hlbWEuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi1INi5TY2hlbWFIZWFkZXIgew0KLQlmb250LXNpemU6MTZweDsgDQotCWRpc3BsYXk6aW5saW5lDQotfQ0KLQ0KLVAuU2NoZW1hQ29weXJpZ2h0IHsNCi0JZm9udC1zaXplOiBzbWFsbGVyOyANCi0JZm9udC1zdHlsZTogbm9ybWFsOw0KLQljb2xvcjogIzMzNjY5OTsgDQotCWRpc3BsYXk6aW5saW5lOw0KLQltYXJnaW4tdG9wOiAzLjAwMDAwMHB0Ow0KLQltYXJnaW4tYm90dG9tOiAxMS4wMDAwMDBwdDsNCi0JbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tbGVmdDogMC4wMDAwMDBwdDsNCi19DQotDQotUC5TY2hlbWFEdGQgew0KLQljb2xvcjogIzgwMDAwMDsgDQotCW1hcmdpbi10b3A6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1ib3R0b206IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWxlZnQ6IDEwLjAwMDAwMHB0Ow0KLX0NCi0NCi1QLlNjaGVtYUR0ZEF0dGxpc3Qgew0KLQljb2xvcjogIzgwMDAwMDsgDQotCW1hcmdpbi10b3A6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1ib3R0b206IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWxlZnQ6IDIwLjAwMDAwMHB0Ow0KLX0NCi0NCi1zcGFuLlNjaGVtYVRhZyB7DQotCWNvbG9yOiAjMDAwMDgwOw0KLX0NCi0NCi1zcGFuLlNjaGVtYUNzdHJpbmcgew0KLQljb2xvcjogIzAwODAwMDsNCi19DQotDQotcHJlLkV4YW1wbGUgew0KLQltYXJnaW4tdG9wOiAwLjAwMDAwMHB0Ow0KLX0NCi0NCi0uQ29uZmlnTWFya3VwRWxlbWVudERlc2Mgew0KLQljb2xvcjogYmxhY2s7DQotCW1hcmdpbi10b3A6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1ib3R0b206IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWxlZnQ6IDEwLjAwMDAwMHB0Ow0KLX0NCi0NCi0uQ29uZmlnTWFya3VwQXR0bGlzdERlc2Mgew0KLQljb2xvcjogYmxhY2s7DQotCW1hcmdpbi10b3A6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1ib3R0b206IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWxlZnQ6IDMyLjAwMDAwMHB0Ow0KLX0NCi0NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi90b3BpY3NfYXBpX3JlZmVyZW5jZS54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZG9jLmlzdi90b3BpY3NfYXBpX3JlZmVyZW5jZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZTE4NzEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvdG9waWNzX2FwaV9yZWZlcmVuY2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci0KLTx0b2MgbGFiZWw9IlJlZmVyZW5jZSIgbGlua190bz0iLi4vb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3RvY3JlZmVyZW5jZS54bWwjYXBpX3JlZmVyZW5jZSI+Ci0JPHRvcGljIGxhYmVsPSJKQVgtV1MgRE9NIEFQSSBSZWZlcmVuY2UiIGhyZWY9InJlZmVyZW5jZS9hcGkvb3ZlcnZpZXctc3VtbWFyeS5odG1sIj4KLSAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiIGxhYmVsPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUiLz4KLSAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL3BhY2thZ2Utc3VtbWFyeS5odG1sIiBsYWJlbD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSIvPgotCTwvdG9waWM+Ci0KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvdG9waWNzX2V4dGVuc2lvbl9wb2ludHNfcmVmZXJlbmNlLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5kb2MuaXN2L3RvcGljc19leHRlbnNpb25fcG9pbnRzX3JlZmVyZW5jZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMjgyOGEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmRvYy5pc3YvdG9waWNzX2V4dGVuc2lvbl9wb2ludHNfcmVmZXJlbmNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci0KLTx0b2MgbGFiZWw9IlJlZmVyZW5jZSIgbGlua190bz0iLi4vb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3RvY3JlZmVyZW5jZS54bWwjZXh0ZW5zaW9uX3BvaW50c19yZWZlcmVuY2UiPgotCi0JPHRvcGljIGxhYmVsPSJKQVgtV1MgRE9NIEV4dGVuc2lvbiBQb2ludHMgUmVmZXJlbmNlIiBocmVmPSJyZWZlcmVuY2UvZXh0ZW5zaW9uLXBvaW50cy9pbmRleC5odG1sIj4KLQkgICAgIDx0b3BpYyBsYWJlbD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmRvbXJ1bnRpbWVzIiBocmVmPSJyZWZlcmVuY2UvZXh0ZW5zaW9uLXBvaW50cy9vcmdfZWNsaXBzZV9qc3Rfd3NfamF4d3NfZG9tX3J1bnRpbWVfcnVudGltZXMuaHRtbCIvPgotCTwvdG9waWM+Ci08L3RvYz4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfdGVzdHMuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfdGVzdHMuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRmZDcyYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Rlc3RzLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Rlc3RzLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Rlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfdGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGUxOWU1Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfdGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Rlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfdGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfdGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl90ZXN0cy5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfdGVzdHMuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl90ZXN0cy5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdiMjRjMi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUNYRiBXZWIgU2VydmljZXMgVGVzdHMKLQotIyAiZmVhdHVyZVByb3ZpZGVyIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotZmVhdHVyZVByb3ZpZGVyPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1DWEYgV2ViIFNlcnZpY2VzIFRlc3RzCi0KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTENcblwKLSBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi0gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi0gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50XG5cCi1BcHJpbCAxNCwgMjAxMFxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGVcblwKLUVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG5cCi10aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpc1xuXAotcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgICAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAgICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEoVE0pIEFSY2hpdmUpXG5cCi0gICAgICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAgICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgICAgICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAgICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgICAgICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAgICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAgICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAgICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLVByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBcblwKLVVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLlxuXAotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZVxuXAotdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdFxuXAotZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLVxuXFVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotXG5cCi1UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsXG5cCi1idXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvclxuXAotdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yXG5cCi1vdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGhcblwKLXRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLlxuXAotSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCAoIlNwZWNpZmljYXRpb24iKS5cblwKLVxuXAotWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlXG5cCi1JbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZFxuXAotbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKLWFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzpcblwKLVxuXAotICAgICAgIDEuIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGVcblwKLSAgICAgICAgICB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZyxcblwKLSAgICAgICAgICBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAotICAgICAgIDIuIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHlcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKLSAgICAgICAzLiBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdFxuXAotICAgICAgICAgIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoXG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2VcblwKLSAgICAgICAgICB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGVcblwKLSAgICAgICAgICB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5XG5cCi0gICAgICAgICAgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoXG5cCi0gICAgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvblxuXAotICAgICAgICAgIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZFxuXAotcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZTgyMWEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zl90ZXN0cy5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjEuMC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVmZWF0dXJlUHJvdmlkZXIiCi0gICAgICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl90ZXN0cy5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfdGVzdHMuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxODRjYTMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl90ZXN0cy5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgotPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+QXByaWwgMTQsIDIwMTA8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+Ci0KLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0gICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgotCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLSAgICAgICA8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLQotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCi0gICAgICAgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS48L3A+Ci0KLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKLSAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKLSAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KLQotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKLSAgICAgICBwcm9kdWN0LjwvbGk+Ci0gICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKLSAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgotICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKLSAgICAgICBTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseS5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5LmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZDljMzAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5LmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHkuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjEzNzg5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NjIyNzYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHkuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSJBc3NlbWJseSBGZWF0dXJlIgotICAgICAgdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iV2VidG9vbHMgUGxhdGZvcm0gUHJvamVjdCI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgIFRoaXMgZmVhdHVyZSBpcyBmb3IgYnVpbGRpbmcgb25seSwgdG8gYXNzZW1ibGUgdGhlIHJlbGVhdGVkIGZlYXR1cmVzLCB3aXRob3V0IGZvcmNlaW5nIHRoZW0gdG8gZW5jb2RpbmcgZGVwZW5kZW5jaWVzIG9uIGVhY2ggb3RoZXIuIAotVGhpcyBmZWF0dXJlIHNob3VsZCBuZXZlciBhcHBlYXIgaW4gYnVpbGQgZGlzdHJpYnV0aW9ucyBvciB1cGRhdGUgc2l0ZXMuCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0gICAgICAgICAKLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseV9zZGsuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseV9zZGsuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNhODk2Mi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHlfc2RrLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHlfc2RrLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHlfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseV9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjEzNzg5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseV9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHlfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHlfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYThhMWYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5X3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5X3Nkay5mZWF0dXJlIgotICAgICAgbGFiZWw9IkFzc2VtYmx5IEZlYXR1cmUiCi0gICAgICB2ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSJXZWJ0b29scyBQbGF0Zm9ybSBQcm9qZWN0Ij4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgVGhpcyBmZWF0dXJlIGlzIGZvciBidWlsZGluZyBvbmx5LCB0byBhc3NlbWJsZSB0aGUgcmVsZWF0ZWQgZmVhdHVyZXMsIHdpdGhvdXQgZm9yY2VpbmcgdGhlbSB0byBlbmNvZGluZyBkZXBlbmRlbmNpZXMgb24gZWFjaCBvdGhlci4gCi1UaGlzIGZlYXR1cmUgc2hvdWxkIG5ldmVyIGFwcGVhciBpbiBidWlsZCBkaXN0cmlidXRpb25zIG9yIHVwZGF0ZSBzaXRlcy4KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3Nfc2RrLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotICAgICAgICAgCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Nkay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLSAgICAgICAgIAotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV9zZGsuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseV90ZXN0cy5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5X3Rlc3RzLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMDNkYjMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5X3Rlc3RzLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHlfdGVzdHMuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseV90ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHlfdGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjEzNzg5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseV90ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseV90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5X3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMTdjNTQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5X3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHlfdGVzdHMuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSJBc3NlbWJseSBGZWF0dXJlIgotICAgICAgdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iV2VidG9vbHMgUGxhdGZvcm0gUHJvamVjdCI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgIFRoaXMgZmVhdHVyZSBpcyBmb3IgYnVpbGRpbmcgb25seSwgdG8gYXNzZW1ibGUgdGhlIHJlbGVhdGVkIGZlYXR1cmVzLCB3aXRob3V0IGZvcmNlaW5nIHRoZW0gdG8gZW5jb2RpbmcgZGVwZW5kZW5jaWVzIG9uIGVhY2ggb3RoZXIuIAotVGhpcyBmZWF0dXJlIHNob3VsZCBuZXZlciBhcHBlYXIgaW4gYnVpbGQgZGlzdHJpYnV0aW9ucyBvciB1cGRhdGUgc2l0ZXMuCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPGluY2x1ZGVzIAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3c190ZXN0cy5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLSAgICAgICAgIAotICAgPGluY2x1ZGVzIAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGZfdGVzdHMuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0gICAgICAgICAKLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fdGVzdHMuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzBmYTI1Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzOTllYTRiLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcDQotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcDQotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwNCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbA0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmM4OTc2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUpBWC1XUyBET00gVG9vbHMKLQotIyAiZmVhdHVyZVByb3ZpZGVyIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotZmVhdHVyZVByb3ZpZGVyPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1KQVgtV1MgRE9NIFRvb2xzCi0KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotIENvcHlyaWdodCAoYykgMjAwOSBTQVAgQUcsIFdhbGxkb3JmLlxuXAotIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLSBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLSB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnRcblwKLUFwcmlsIDE0LCAyMDEwXG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZVxuXAotRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcblwKLXRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzXG5cCi1wcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGVcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAgICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgICAgICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YShUTSkgQVJjaGl2ZSlcblwKLSAgICAgICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgICAgICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgICAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgICAgICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgICAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgICAgICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgICAgICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgICAgICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFxuXAotVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuXG5cCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlXG5cCi10ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0XG5cCi1nb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotXG5cVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1cblwKLVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSxcblwKLWJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yXG5cCi10aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3JcblwKLW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aFxuXAotdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuXG5cCi1JbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sICgiU3BlY2lmaWNhdGlvbiIpLlxuXAotXG5cCi1Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1Zb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGVcblwKLUluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1pbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kXG5cCi1tYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAotYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOlxuXAotXG5cCi0gICAgICAgMS4gQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZVxuXAotICAgICAgICAgIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLFxuXAotICAgICAgICAgIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCi0gICAgICAgMi4gRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eVxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLlxuXAotICAgICAgIDMuIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0XG5cCi0gICAgICAgICAgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2hcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZVxuXAotICAgICAgICAgIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZVxuXAotICAgICAgICAgIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnlcblwKLSAgICAgICAgICB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2hcblwKLSAgICAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uXG5cCi0gICAgICAgICAgb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kXG5cCi1yZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzlkNTUzYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJWZlYXR1cmVQcm92aWRlciIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamR0LmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5pZGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZHQudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlIiB2ZXJzaW9uPSIxLjEuMjAwIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpIiB2ZXJzaW9uPSIxLjAuMTAwIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MiIHZlcnNpb249IjEuMC4zMDQiIG1hdGNoPSJncmVhdGVyT3JFcXVhbCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmplbS51dGlsIiB2ZXJzaW9uPSIyLjAuMTAwIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYiIHZlcnNpb249IjIuNS4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uIiB2ZXJzaW9uPSIyLjUuMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlIiB2ZXJzaW9uPSIyLjUuMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamR0LmNvcmUiIHZlcnNpb249IjMuNS4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIgdmVyc2lvbj0iMy41LjAiIG1hdGNoPSJncmVhdGVyT3JFcXVhbCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIiB2ZXJzaW9uPSIzLjUuMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamZhY2UudGV4dCIgdmVyc2lvbj0iMy41LjAiIG1hdGNoPSJncmVhdGVyT3JFcXVhbCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5lZGl0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamZhY2UiIHZlcnNpb249IjMuNS4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiIHZlcnNpb249IjMuNS4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS50ZXh0IiB2ZXJzaW9uPSIzLjUuMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuaWRlIiB2ZXJzaW9uPSIzLjUuMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUiIHZlcnNpb249IjEuNC4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxODRjYTMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgotPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+QXByaWwgMTQsIDIwMTA8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+Ci0KLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0gICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgotCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLSAgICAgICA8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLQotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCi0gICAgICAgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS48L3A+Ci0KLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKLSAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKLSAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KLQotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKLSAgICAgICBwcm9kdWN0LjwvbGk+Ci0gICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKLSAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgotICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKLSAgICAgICBTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MTBhZmIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+QXVndXN0IDE1LCAyMDA5PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZmVmZWIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciBmZWF0dXJlIGRldGFpbHMgaW4gdGhlICJBYm91dCIgCi0jIGRpYWxvZyAodHJhbnNsYXRlZCkuICBNYXhpbXVtIDE1IGxpbmVzIGFuZCA3NSBjaGFyYWN0ZXJzIHBlciBsaW5lLgotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9d3RwX3Byb2QzMi5wbmcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2RhNGQzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9SkFYLVdTIERPTSBUb29scyBTb3VyY2VcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IFNBUCBBRywgV2FsbGRvcmYuIDIwMDkuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy9cblwKLVxuCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWQ1MTJkLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCB3dHBfcHJvZDMyLnBuZywgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRmOWMyODkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIExhbmd1YWdlIEZpbGUgZm9yIHRoaXMgUGx1Z2luDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLSMgR2VuZXJpYyBMYWJlbCBhbmQgRGVzY3JpcHRpb24NCi1CdW5kbGUtTmFtZS4wPUpBWC1XUyBET00gVG9vbHMgU291cmNlDQotQnVuZGxlLVZlbmRvci4wPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtDQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWZiNDRhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjZWFiMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM5OWVhNGIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcDQotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcDQotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwNCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbA0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MGQ1MzcuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUpBWC1XUyBET00gVG9vbHMgRGV2ZWxvcGVyIFJlc291cmNlcwotCi0jICJmZWF0dXJlUHJvdmlkZXIiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1mZWF0dXJlUHJvdmlkZXI9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIGZvciBKQVgtV1MgRE9NIFRvb2xzCi0KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotIENvcHlyaWdodCAoYykgMjAwOSBTQVAgQUcsIFdhbGxkb3JmLlxuXAotIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLSBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLSB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnRcblwKLUFwcmlsIDE0LCAyMDEwXG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZVxuXAotRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcblwKLXRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzXG5cCi1wcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGVcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAgICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgICAgICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YShUTSkgQVJjaGl2ZSlcblwKLSAgICAgICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgICAgICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgICAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgICAgICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgICAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgICAgICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgICAgICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgICAgICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFxuXAotVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuXG5cCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlXG5cCi10ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0XG5cCi1nb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotXG5cVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1cblwKLVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSxcblwKLWJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yXG5cCi10aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3JcblwKLW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aFxuXAotdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuXG5cCi1JbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sICgiU3BlY2lmaWNhdGlvbiIpLlxuXAotXG5cCi1Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1Zb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGVcblwKLUluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1pbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kXG5cCi1tYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAotYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOlxuXAotXG5cCi0gICAgICAgMS4gQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZVxuXAotICAgICAgICAgIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLFxuXAotICAgICAgICAgIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCi0gICAgICAgMi4gRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eVxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLlxuXAotICAgICAgIDMuIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0XG5cCi0gICAgICAgICAgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2hcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZVxuXAotICAgICAgICAgIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZVxuXAotICAgICAgICAgIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnlcblwKLSAgICAgICAgICB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2hcblwKLSAgICAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uXG5cCi0gICAgICAgICAgb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kXG5cCi1yZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxODRjYTMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPz4KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIgLz4KLTx0aXRsZT5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkFwcmlsIDE0LCAyMDEwPC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLQotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgotCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZQotICAgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gc29mdHdhcmUgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotICAgICAgIDxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLSAgICAgICA8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotICAgICAgIDxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4KLQotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLSAgICAgICA8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotICAgICAgIDxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLSAgICAgICA8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotICAgICAgIDxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi0KLTxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZQotICAgVXBkYXRlIE1hbmFnZXIgKCZxdW90O1Byb3Zpc2lvbmluZyBUZWNobm9sb2d5JnF1b3Q7KSBmb3IgdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCi0gICBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSZxdW90OykuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bwotICAgaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YQotICAgICAgIGhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+Ci0gICAoJnF1b3Q7U3BlY2lmaWNhdGlvbiZxdW90OykuPC9wPgotCi08cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlCi0gICBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCi0gICBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+Ci0KLTxvbD4KLSAgICAgICA8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCZxdW90O1Byb3Zpc2lvbmluZyBQcm9jZXNzJnF1b3Q7KSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICAgICAgb24gYSBtYWNoaW5lICgmcXVvdDtUYXJnZXQgTWFjaGluZSZxdW90Oykgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkCi0gICAgICAgcHJvZHVjdC48L2xpPgotICAgICAgIDxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCi0gICAgICAgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KLSAgICAgICA8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCi0gICAgICAgU29mdHdhcmUgKCZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCZxdW90OykgYW5kIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAotICAgICAgIE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4KLSAgICAgICB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaAotICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLjwvbGk+Ci08L29sPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLQotPHA+PHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDEwYWZiLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkF1Z3VzdCAxNSwgMjAwOTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWZlZmViLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgZmVhdHVyZSBkZXRhaWxzIGluIHRoZSAiQWJvdXQiIAotIyBkaWFsb2cgKHRyYW5zbGF0ZWQpLiAgTWF4aW11bSAxNSBsaW5lcyBhbmQgNzUgY2hhcmFjdGVycyBwZXIgbGluZS4KLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPXd0cF9wcm9kMzIucG5nCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdkYTRkMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPUpBWC1XUyBET00gVG9vbHMgU291cmNlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBTQVAgQUcsIFdhbGxkb3JmLiAyMDA5LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvXG5cCi1cbgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFkNTEyZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCwgYWJvdXQuaW5pLCBhYm91dC5tYXBwaW5ncywgYWJvdXQucHJvcGVydGllcywgd3RwX3Byb2QzMi5wbmcsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZjljMjg5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBMYW5ndWFnZSBGaWxlIGZvciB0aGlzIFBsdWdpbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi0jIEdlbmVyaWMgTGFiZWwgYW5kIERlc2NyaXB0aW9uDQotQnVuZGxlLU5hbWUuMD1KQVgtV1MgRE9NIFRvb2xzIFNvdXJjZQ0KLUJ1bmRsZS1WZW5kb3IuMD1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQ0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmYjQ0YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmY2VhYjMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Rlc3RzLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdGVzdHMuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUyMTY1Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdGVzdHMuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3c190ZXN0cy5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Rlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c190ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNTAyNjAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Rlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Rlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c190ZXN0cy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Rlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c190ZXN0cy5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c190ZXN0cy5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdGVzdHMuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTRhNjkzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c190ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUpBWC1XUyBUb29scyBUZXN0cwotCi0jICJmZWF0dXJlUHJvdmlkZXIiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1mZWF0dXJlUHJvdmlkZXI9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUpBWC1XUyBUb29scyBUZXN0cwotCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLSBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycy5cblwKLSBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi0gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi0gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50XG5cCi1BcHJpbCAxNCwgMjAxMFxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGVcblwKLUVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG5cCi10aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpc1xuXAotcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgICAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAgICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEoVE0pIEFSY2hpdmUpXG5cCi0gICAgICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAgICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgICAgICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAgICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgICAgICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAgICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAgICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAgICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLVByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBcblwKLVVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLlxuXAotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZVxuXAotdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdFxuXAotZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLVxuXFVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotXG5cCi1UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsXG5cCi1idXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvclxuXAotdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yXG5cCi1vdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGhcblwKLXRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLlxuXAotSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCAoIlNwZWNpZmljYXRpb24iKS5cblwKLVxuXAotWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlXG5cCi1JbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZFxuXAotbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKLWFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzpcblwKLVxuXAotICAgICAgIDEuIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGVcblwKLSAgICAgICAgICB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZyxcblwKLSAgICAgICAgICBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAotICAgICAgIDIuIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHlcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKLSAgICAgICAzLiBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdFxuXAotICAgICAgICAgIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoXG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2VcblwKLSAgICAgICAgICB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGVcblwKLSAgICAgICAgICB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5XG5cCi0gICAgICAgICAgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoXG5cCi0gICAgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvblxuXAotICAgICAgICAgIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZFxuXAotcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c190ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGMyNzQ5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c190ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Rlc3RzLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJWZlYXR1cmVQcm92aWRlciIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdGVzdHMuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdGVzdHMuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxODRjYTMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Rlc3RzLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+Ci08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+Ci08dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5BcHJpbCAxNCwgMjAxMDwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0KLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KLQotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUKLSAgIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIHNvZnR3YXJlIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLSAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0gICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+Ci0KLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0gICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLSAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0gICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotICAgICAgIDxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotCi08aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UKLSAgIFVwZGF0ZSBNYW5hZ2VyICgmcXVvdDtQcm92aXNpb25pbmcgVGVjaG5vbG9neSZxdW90OykgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgotICAgb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUmcXVvdDspLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KLSAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEKLSAgICAgICBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgotICAgKCZxdW90O1NwZWNpZmljYXRpb24mcXVvdDspLjwvcD4KLQotPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQotICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQotICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgotCi08b2w+Ci0gICAgICAgPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgmcXVvdDtQcm92aXNpb25pbmcgUHJvY2VzcyZxdW90OykgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgICAgIG9uIGEgbWFjaGluZSAoJnF1b3Q7VGFyZ2V0IE1hY2hpbmUmcXVvdDspIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAotICAgICAgIHByb2R1Y3QuPC9saT4KLSAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQotICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+Ci0gICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQotICAgICAgIFNvZnR3YXJlICgmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQmcXVvdDspIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKLSAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuCi0gICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2gKLSAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgotPC9vbD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0KLTxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGM1ZTMxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzLy5jdnNpZ25vcmUgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYwNDViNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEwOWYzNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmp1bml0O2J1bmRsZS12ZXJzaW9uPSIzLjguMCIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHM7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHM7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cztidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cztidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cztidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMS4xLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvYWJvdXQuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRmOTBkOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotc291cmNlLi4gPSBzcmMvCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdjOTk2OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotI1Byb3BlcnRpZXMgZmlsZSBmb3Igb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cwotQnVuZGxlLU5hbWUuMCA9IENYRiBXZWIgU2VydmljZXMgVGVzdHMKLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2N4Zi90ZXN0cy9BbGxUZXN0c1N1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvY3hmL3Rlc3RzL0FsbFRlc3RzU3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY1NDhkYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvY3hmL3Rlc3RzL0FsbFRlc3RzU3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMuSkFYQkNvcmVUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzLkpBWFdTQW5ub3RhdGlvblZhbGlkYXRpb25UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMuSkFYV1NDb3JlVGVzdFN1aXRlOwotCi0vKioKLSAqIFRoaXMgY2xhc3Mgc3BlY2lmaWVzIGFsbCB0aGUgYnVuZGxlcyBvZiB0aGlzIGNvbXBvbmVudCB0aGF0IHByb3ZpZGUgYSB0ZXN0Ci0gKiBzdWl0ZSB0byBydW4gZHVyaW5nIGF1dG9tYXRlZCB0ZXN0aW5nLgotICovCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHNTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQWxsVGVzdHNTdWl0ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBBbGxUZXN0c1N1aXRlKCkgewotICAgICAgICBzdXBlcigiQWxsIEpBWFdTIGFuZCBKQVhCIFRlc3QgU3VpdGVzIik7Ci0gICAgICAgIGFkZFRlc3QoSkFYV1NDb3JlVGVzdFN1aXRlLnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KEpBWFdTQW5ub3RhdGlvblZhbGlkYXRpb25UZXN0U3VpdGUuc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QoSkFYQkNvcmVUZXN0U3VpdGUuc3VpdGUoKSk7Ci0KLSAgICAgICAgLy9BZGRpbmcgSkFYLVdTIERPTSBUb29scyB0ZXN0IHN1aXRlcwotICAgICAgICBhZGRUZXN0KG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMuZG9tLkFsbFRlc3RzU3VpdGUuc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3Qob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLkFsbFRlc3RzU3VpdGUuc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3Qob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy5BbGxUZXN0c1N1aXRlLnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5BbGxUZXN0c1N1aXRlLnN1aXRlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMganVzdCBuZWVkIHRvIHJ1biBpbiBhIGRldmVsb3BtZW50IGVudmlyb25tZW50IHdvcmtiZW5jaC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWxsKCkgewotICAgICAgICAvLyB0aGlzIG1ldGhvZCBuZWVkcyB0byBleGlzdCwgYnV0IGRvZXNuJ3QgcmVhbGx5IGRvIGFueXRoaW5nCi0gICAgICAgIC8vIG90aGVyIHRoYW4gdG8gc2lnbmFsIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgotICAgICAgICAvLyBUaGUgcmVzdCBpdCBhdXRvbWF0aWMgZnJvbSB0aGUgdGVzdHMgYWRkZWQgaW4gY29uc3RydWN0b3IuCi0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvY3hmL3Rlc3RzL0Vhc3lUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvY3hmL3Rlc3RzL0Vhc3lUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMmU3MDQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2N4Zi90ZXN0cy9FYXN5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgRWFzeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBzaW1wbGUgdGVzdCBqdXN0IHRvIGFsd2F5cyBzdWNjZWVkIHRvIGRlbW9uc3RyYXRlIHRlc3RzIGFyZSBiZWluZyBjYWxsZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0VGhhdFRlc3RzUnVuKCkgewotCQlhc3NlcnRUcnVlKHRydWUpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvdGVzdC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGJhZmU0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvdGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0Ci0gICAgbmFtZT0idGVzdHN1aXRlIgotICAgIGRlZmF1bHQ9InJ1biIKLSAgICBiYXNlZGlyPSIuIj4KLQotICAgIDwhLS0gCi0gICAgICAgICBUaGUgZm9sbG93aW5nIHByb3BlcnRpZXMgc2hvdWxkIGJlIHBhc3NlZCBpbnRvIHRoaXMgc2NyaXB0Ci0gICAgICAgICBzbyB3ZSdsbCBmYWlsIGZhc3QgaWYgbm90LiAKLSAgICAgICAgICAgICAke2VjbGlwc2UtaG9tZX0gICAKLSAgICAgICAgICAgICAke2J1aWxkRGlyZWN0b3J5fQotICAgICAgICAgICAgICR7YnVpbGRMYWJlbH0gICAgICAgIAotICAgIC0tPgotICAKLSAgCTxmYWlsCi0gICAgICAgIG1lc3NhZ2U9IkVycm9yOiBtaXNzaW5nIHByb3BlcnR5LiBlY2xpcHNlLWhvbWUgbXVzdCBiZSBwcm92aWRlZCIKLSAgICAgICAgdW5sZXNzPSJlY2xpcHNlLWhvbWUiIC8+Ci0gICAgPGZhaWwKLSAgICAgICAgbWVzc2FnZT0iRXJyb3I6IG1pc3NpbmcgcHJvcGVydHkuIGJ1aWxkRGlyZWN0b3J5IG11c3QgYmUgcHJvdmlkZWQiCi0gICAgICAgIHVubGVzcz0iYnVpbGREaXJlY3RvcnkiIC8+Ci0gICAgPGZhaWwKLSAgICAgICAgbWVzc2FnZT0iRXJyb3I6IG1pc3NpbmcgcHJvcGVydHkuIGJ1aWxkTGFiZWwgbXVzdCBiZSBwcm92aWRlZCIKLSAgICAgICAgdW5sZXNzPSJidWlsZExhYmVsIiAvPgotCQotICAgIDwhLS0gc2hvdWxkIGJlIGxpdHRsZSBuZWVkIHRvIGNoYW5nZSB3aGF0J3MgYWJvdmUgIC0tPgotCQotICAgIDxwcm9wZXJ0eQotICAgICAgICBuYW1lPSJwbHVnaW4tbmFtZSIKLSAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMiLz4KLSAgICA8cHJvcGVydHkKLSAgICAgICAgbmFtZT0iY2xhc3NuYW1lIgotICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy5BbGxUZXN0c1N1aXRlIi8+Ci0gICAgPHByb3BlcnR5Ci0gICAgICAgIG5hbWU9InRlc3RUeXBlIgotICAgICAgICB2YWx1ZT0idWktdGVzdCIvPgotCi0gICAgPCEtLSBzaG91bGQgYmUgbGl0dGxlIG5lZWQgdG8gY2hhbmdlIHdoYXQncyBiZWxvdyAtLT4KLSAgICA8ZWNobwotICAgICAgICBtZXNzYWdlPSJiYXNlZGlyOiAke2Jhc2VkaXJ9Ii8+Ci0gICAgPGVjaG8KLSAgICAgICAgbWVzc2FnZT0iZWNsaXBzZS1ob21lOiAke2VjbGlwc2UtaG9tZX0iLz4KLSAgICA8ZWNobwotICAgICAgICBtZXNzYWdlPSJidWlsZERpcmVjdG9yeTogJHtidWlsZERpcmVjdG9yeX0iLz4KLSAgICA8ZWNobwotICAgICAgICBtZXNzYWdlPSJwbHVnaW4tbmFtZTogJHtwbHVnaW4tbmFtZX0iLz4KLSAgICA8ZWNobwotICAgICAgICBtZXNzYWdlPSJjbGFzc25hbWU6ICR7Y2xhc3NuYW1lfSIvPgotICAgIDxlY2hvCi0gICAgICAgIG1lc3NhZ2U9InRlc3RUeXBlICR7dGVzdFR5cGV9Ii8+Ci0gICAgPHByb3BlcnR5Ci0gICAgICAgIG5hbWU9ImxpYnJhcnktZmlsZSIKLSAgICAgICAgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLnRlc3RfMy4xLjAvbGlicmFyeS54bWwiLz4KLSAgICA8cHJvcGVydHkKLSAgICAgICAgbmFtZT0id29ya3NwYWNlIgotICAgICAgICB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L2p1bml0d29ya3NwYWNlcy8ke3BsdWdpbi1uYW1lfSIvPgotCSAgPGVjaG8gCi0JICAgICAgbWVzc2FnZT0id29ya3NwYWNlOiAke3dvcmtzcGFjZX0iIC8+Ci0gICAgPCEtLQotICAgICAgICBUaGlzIGluaXQgdGFyZ2V0IGhvbGRzIGFsbCBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZQotICAgICAgICBmb3IgYWxsIHRlc3RzIHRoYXQgYXJlIHRvIGJlIHJ1bi4gSW5pdGlhbGl6YXRpb24gZm9yIGluZGl2aWR1YWwKLSAgICAgICAgdGVzdHMgc2hvdWxkIGJlIGRvbmUgd2l0aGluIHRoZSBib2R5IG9mIHRoZSBzdWl0ZSB0YXJnZXQuIAotICAgIC0tPgotICAgIDx0YXJnZXQKLSAgICAgICAgbmFtZT0iaW5pdCI+Ci0gICAgICAgIDx0c3RhbXAvPgotICAgICAgICA8ZGVsZXRlPgotICAgICAgICAgICAgPGZpbGVzZXQKLSAgICAgICAgICAgICAgICBkaXI9IiR7ZWNsaXBzZS1ob21lfSIKLSAgICAgICAgICAgICAgICBpbmNsdWRlcz0iJHtwbHVnaW4tbmFtZX0uKnhtbCIvPgotICAgICAgICA8L2RlbGV0ZT4KLSAgICAgICAgPCEtLSBtYWtlIGRpcmVjdG9yeSwgaW4gY2FzZSBwYXRoIGRvZXNuJ3QgZXhpc3QgeWV0IC0tPgotICAgICAgICA8bWtkaXIKLSAgICAgICAgICAgIGRpcj0iJHt3b3Jrc3BhY2V9Ii8+Ci0gICAgICAgIDwhLS0gIGJ1dCBkZWxldGUgdG8gbWFrZSBzdXJlIGZyZXNoIGNvbnRlbnRzLS0+Ci0gICAgICAgIDxkZWxldGUKLSAgICAgICAgICAgIGRpcj0iJHt3b3Jrc3BhY2V9IgotICAgICAgICAgICAgcXVpZXQ9InRydWUiLz4KLSAgICA8L3RhcmdldD4KLQotICAgIDwhLS0gVGhpcyB0YXJnZXQgZGVmaW5lcyB0aGUgdGVzdHMgdGhhdCBuZWVkIHRvIGJlIHJ1bi4gLS0+Ci0gICAgPHRhcmdldAotICAgICAgICBuYW1lPSJzdWl0ZSI+Ci0gICAgICAgIDxhbnQKLSAgICAgICAgICAgIHRhcmdldD0iJHt0ZXN0VHlwZX0iCi0gICAgICAgICAgICBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iCi0gICAgICAgICAgICBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgICBuYW1lPSJkYXRhLWRpciIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iJHt3b3Jrc3BhY2V9Ii8+Ci0gICAgICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgICBuYW1lPSJwbHVnaW4tbmFtZSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eQotICAgICAgICAgICAgICAgIG5hbWU9ImNsYXNzbmFtZSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iJHtjbGFzc25hbWV9Ii8+Ci0gICAgICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgICBuYW1lPSJwbHVnaW4tcGF0aCIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgICAgPC9hbnQ+Ci0gICAgICAgIDxjb3B5Ci0gICAgICAgICAgICBmYWlsb25lcnJvcj0iZmFsc2UiCi0gICAgICAgICAgICBmaWxlPSIke3dvcmtzcGFjZX0vLm1ldGFkYXRhLy5sb2ciCi0gICAgICAgICAgICB0b2ZpbGU9IiR7YnVpbGREaXJlY3Rvcnl9LyR7YnVpbGRMYWJlbH0vdGVzdFJlc3VsdHMvY29uc29sZWxvZ3MvJHtwbHVnaW4tbmFtZX0uY29uc29sZWxvZy50eHQiLz4KLSAgICA8L3RhcmdldD4KLQotICAgIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgY29kZSB0byBjbGVhbnVwIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGFmdGVyIC0tPgotICAgIDwhLS0KLSAgICAgICAgYWZ0ZXIgYWxsIG9mIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuLiBZb3UgY2FuIHVzZSB0aGlzIHRhcmdldCB0bwotICAgIC0tPgotICAgIDwhLS0gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkLiAtLT4KLSAgICA8dGFyZ2V0Ci0gICAgICAgIG5hbWU9ImNsZWFudXAiPgotICAgICAgICA8IS0tCi0gICAgICAgICAgICB1c3VhbGx5IG5vIG5lZWQgdG8gZGVsZXRlIHdvcmtzcGFjZSB1bnRpbCBuZXh0IHJ1biwgYW5kCi0gICAgICAgICAgICBsZWF2aW5nIGl0IGFsbG93cyBpbnNwZWN0aW9uCi0gICAgICAgIC0tPgotICAgICAgICA8IS0tIDxkZWxldGUgZGlyPSIke3dvcmtzcGFjZX0iIHF1aWV0PSJ0cnVlIiAvPiAtLT4KLSAgICA8L3RhcmdldD4KLSAgICA8IS0tCi0gICAgICAgIFRoaXMgdGFyZ2V0IHJ1bnMgdGhlIHRlc3Qgc3VpdGUuIEFueSBhY3Rpb25zIHRoYXQgbmVlZCB0byBoYXBwZW4KLSAgICAtLT4KLSAgICA8IS0tIGFmdGVyIGFsbCB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0+Ci0gICAgPHRhcmdldAotICAgICAgICBuYW1lPSJydW4iCi0gICAgICAgIGRlcGVuZHM9ImluaXQsc3VpdGUsY2xlYW51cCI+Ci0gICAgICAgIDxhbnQKLSAgICAgICAgICAgIHRhcmdldD0iY29sbGVjdCIKLSAgICAgICAgICAgIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIKLSAgICAgICAgICAgIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgICAgICAgIDxwcm9wZXJ0eQotICAgICAgICAgICAgICAgIG5hbWU9ImluY2x1ZGVzIgotICAgICAgICAgICAgICAgIHZhbHVlPSIke3BsdWdpbi1uYW1lfS4qeG1sIi8+Ci0gICAgICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgICBuYW1lPSJvdXRwdXQtZmlsZSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0ueG1sIi8+Ci0gICAgICAgIDwvYW50PgotICAgIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkzMGNiNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZTRhZGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA0MDAyMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI1RodSBNYXkgMDcgMTU6NDA6MjMgSVNUIDIwMDkKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU2NTEwZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmp1bml0O2J1bmRsZS12ZXJzaW9uPSIzLjguMCIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3Jpbmc7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmx0ay51aS5yZWZhY3RvcmluZztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMy4xMDAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiCi1JbXBvcnQtUGFja2FnZTogamF2YXgueG1sLmJpbmQ7dmVyc2lvbj0iWzIuMS4wLDIuMi4wKSIsCi0gamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbjt2ZXJzaW9uPSJbMi4xLjAsMi4yLjApIiwKLSBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzO3ZlcnNpb249IlsyLjEuMCwyLjIuMCkiLAotIGphdmF4LnhtbC5iaW5kLmF0dGFjaG1lbnQ7dmVyc2lvbj0iWzIuMS4wLDIuMi4wKSIsCi0gamF2YXgueG1sLmJpbmQuaGVscGVyczt2ZXJzaW9uPSJbMi4xLjAsMi4yLjApIiwKLSBqYXZheC54bWwuYmluZC51dGlsO3ZlcnNpb249IlsyLjEuMCwyLjIuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9hYm91dC5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjZhMDMxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAxOSwgMjAwOTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQzYmM3NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBidWlsZC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjI1MDMzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOSBQcm9ncmVzcyBTb2Z0d2FyZQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jcHJvcGVydGllcyBmaWxlIGZvciBKQVhCIFRvb2xzIFRlc3RzCi1wbHVnaW5OYW1lPUpBWEIgVG9vbHMgVGVzdHMKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheGIvY29yZS90ZXN0cy9BYnN0cmFjdEFubm90YXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4Yi9jb3JlL3Rlc3RzL0Fic3RyYWN0QW5ub3RhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg0ODE1Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4Yi9jb3JlL3Rlc3RzL0Fic3RyYWN0QW5ub3RhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFByb2dyZXNzIFNvZnR3YXJlCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLnJld3JpdGUuQVNUUmV3cml0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuU2hhcmVkQVNUUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlBlcmZvcm1DaGFuZ2VPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dEZpbGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBbm5vdGF0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcm90ZWN0ZWQgVGVzdEphdmFQcm9qZWN0IHRlc3RKYXZhUHJvamVjdDsKLSAgICBwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2U7Ci0gICAgcHJvdGVjdGVkIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQ7Ci0gICAgcHJvdGVjdGVkIEFTVCBhc3Q7Ci0gICAgcHJvdGVjdGVkIEFTVFJld3JpdGUgcmV3cml0ZXI7Ci0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gYW5ub3RhdGlvbjsKLSAgICBwcm90ZWN0ZWQgVGV4dEZpbGVDaGFuZ2UgdGV4dEZpbGVDaGFuZ2U7Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdEphdmFQcm9qZWN0ID0gbmV3IFRlc3RKYXZhUHJvamVjdCgiSmF2YVByb2plY3QiKTsKLSAgICAgICAgdGVzdEphdmFQcm9qZWN0LnNldEF1dG9CdWlsZGluZyhpc0F1dG9CdWlsZGluZ0VuYWJsZWQoKSk7Ci0gICAgICAgIHRlc3RKYXZhUHJvamVjdC5lbmFibGVBbm5vdGF0aW9uUHJvY2Vzc2luZyhpc0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpKTsKLQotICAgICAgICBzb3VyY2UgPSB0ZXN0SmF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KGdldFBhY2thZ2VOYW1lKCksIGdldENsYXNzTmFtZSgpLCBnZXRDbGFzc0NvbnRlbnRzKCkpOwotICAgICAgICAKLSAgICAgICAgY29tcGlsYXRpb25Vbml0ID0gU2hhcmVkQVNUUHJvdmlkZXIuZ2V0QVNUKHNvdXJjZSwgU2hhcmVkQVNUUHJvdmlkZXIuV0FJVF9ZRVMsIG51bGwpOwotICAgICAgICBhc3QgPSBjb21waWxhdGlvblVuaXQuZ2V0QVNUKCk7Ci0gICAgICAgIHJld3JpdGVyID0gQVNUUmV3cml0ZS5jcmVhdGUoYXN0KTsKLSAgICAgICAgYW5ub3RhdGlvbiA9IGdldEFubm90YXRpb24oKTsKLSAgICAgICAgdGV4dEZpbGVDaGFuZ2UgPSBuZXcgVGV4dEZpbGVDaGFuZ2UoIkFkZCBhbm5vdGF0aW9uIiwgKElGaWxlKSBzb3VyY2UuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgIE11bHRpVGV4dEVkaXQgbXVsdGlUZXh0RWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0gICAgICAgIHRleHRGaWxlQ2hhbmdlLnNldEVkaXQobXVsdGlUZXh0RWRpdCk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBib29sZWFuIGlzQXV0b0J1aWxkaW5nRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzQW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpOwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCk7Ci0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCk7Ci0gICAgcHJvdGVjdGVkIGFic3RyYWN0IEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpOwotICAgIAotICAgIHByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGVDaGFuZ2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBDaGFuZ2UgY2hhbmdlKSB7Ci0gICAgICAgIGlmIChjaGFuZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgY2hhbmdlLmluaXRpYWxpemVWYWxpZGF0aW9uRGF0YShtb25pdG9yKTsKLQotICAgICAgICBQZXJmb3JtQ2hhbmdlT3BlcmF0aW9uIGNoYW5nZU9wZXJhdGlvbiA9IG5ldyBQZXJmb3JtQ2hhbmdlT3BlcmF0aW9uKGNoYW5nZSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNoYW5nZU9wZXJhdGlvbi5ydW4obW9uaXRvcik7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGNlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaGFuZ2VPcGVyYXRpb24uY2hhbmdlRXhlY3V0ZWQoKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJZGVsZXRlUHJvamVjdCh0ZXN0SmF2YVByb2plY3QuZ2V0UHJvamVjdCgpKTsKLSAgICAJCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBkZWxldGVQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgCWludCBub0F0dGVtcHRzID0gMDsKLSAgICAJd2hpbGUgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmV4aXN0cygpICYmIG5vQXR0ZW1wdHMgPCA1KSB7Ci0gICAgCQl0cnkgewotICAgIAkJCW5vQXR0ZW1wdHMrKzsKLSAgICAJCQlpZiAocHJvamVjdC5pc09wZW4oKSkgewotICAgIAkJCQlwcm9qZWN0LmNsb3NlKG51bGwpOyAgICAJCQkJCi0gICAgCQkJfQotICAgIAkJCXByb2plY3QuZGVsZXRlKHRydWUsIHRydWUsIG51bGwpOwotICAgIAkJfSBjYXRjaCAoUmVzb3VyY2VFeGNlcHRpb24gcmUpIHsKLSAgICAJCQlTeXN0ZW0ub3V0LnByaW50bG4ocmUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAJCQlUaHJlYWQuc2xlZXAoMSk7Ci0gICAgCQl9Ci0gICAgCX0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXhiL2NvcmUvdGVzdHMvQWRkQW5ub3RhdGlvblRvUGFja2FnZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXhiL2NvcmUvdGVzdHMvQWRkQW5ub3RhdGlvblRvUGFja2FnZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE2ZDkxZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4Yi9jb3JlL3Rlc3RzL0FkZEFubm90YXRpb25Ub1BhY2thZ2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFByb2dyZXNzIFNvZnR3YXJlCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxTY2hlbWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLQotcHVibGljIGNsYXNzIEFkZEFubm90YXRpb25Ub1BhY2thZ2VUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJwYWNrYWdlLWluZm8uamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICByZXR1cm4gInBhY2thZ2UgY29tLmV4YW1wbGU7XG4iOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIGxvY2F0aW9uVlAgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAibG9jYXRpb24iLCAidXJpOnNvbWVTY2hlbWEiKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbmFtZXNwYWNlVlAgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAibmFtZXNwYWNlIiwgInVyaTp0ZXN0TlMiKTsKLQotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChsb2NhdGlvblZQKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQobmFtZXNwYWNlVlApOwotCi0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFhtbFNjaGVtYS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG1lbWJlclZhbHVlUGFpcnMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBbm5vdGF0aW9uVG9QYWNrYWdlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhYbWxTY2hlbWEuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotICAgICAgICAgICAgSVBhY2thZ2VEZWNsYXJhdGlvbiBteVBhY2thZ2UgPSBzb3VyY2UuZ2V0UGFja2FnZURlY2xhcmF0aW9uKGdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChteVBhY2thZ2UpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQobXlQYWNrYWdlLCBhbm5vdGF0aW9uKSk7Ci0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChteVBhY2thZ2UsIFhtbFNjaGVtYS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobXlQYWNrYWdlLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChYbWxTY2hlbWEuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheGIvY29yZS90ZXN0cy9KQVhCQ29yZVRlc3RTdWl0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheGIvY29yZS90ZXN0cy9KQVhCQ29yZVRlc3RTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2VhMDExLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXhiL2NvcmUvdGVzdHMvSkFYQkNvcmVUZXN0U3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgUHJvZ3Jlc3MgU29mdHdhcmUKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgT2lzaW4gSHVybGV5IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKQVhCQ29yZVRlc3RTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkNvcmVUZXN0U3VpdGUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEpBWEJDb3JlVGVzdFN1aXRlKCkgewotICAgICAgICBzdXBlcigiSkFYQiBDb3JlIFRlc3RzIik7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShBZGRBbm5vdGF0aW9uVG9QYWNrYWdlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShSZW1vdmVBbm5vdGF0aW9uRnJvbVBhY2thZ2VUZXN0LmNsYXNzKTsgICAgCi0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheGIvY29yZS90ZXN0cy9SZW1vdmVBbm5vdGF0aW9uRnJvbVBhY2thZ2VUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4Yi9jb3JlL3Rlc3RzL1JlbW92ZUFubm90YXRpb25Gcm9tUGFja2FnZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhYWQ3MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4Yi9jb3JlL3Rlc3RzL1JlbW92ZUFubm90YXRpb25Gcm9tUGFja2FnZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgUHJvZ3Jlc3MgU29mdHdhcmUKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0czsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2NoZW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotCi1wdWJsaWMgY2xhc3MgUmVtb3ZlQW5ub3RhdGlvbkZyb21QYWNrYWdlVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAicGFja2FnZS1pbmZvLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoIkBYbWxTY2hlbWFcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNjaGVtYTtcblxuIik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgWG1sU2NoZW1hLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb25Gcm9tUGFja2FnZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoWG1sU2NoZW1hLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLSAgICAgICAgICAgIElQYWNrYWdlRGVjbGFyYXRpb24gbXlQYWNrYWdlID0gc291cmNlLmdldFBhY2thZ2VEZWNsYXJhdGlvbihnZXRQYWNrYWdlTmFtZSgpKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobXlQYWNrYWdlKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChteVBhY2thZ2UsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlUmVtb3ZlQW5ub3RhdGlvblRleHRFZGl0KG15UGFja2FnZSwgYW5ub3RhdGlvbikpOwotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlUmVtb3ZlSW1wb3J0VGV4dEVkaXQobXlQYWNrYWdlLCBYbWxTY2hlbWEuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRGYWxzZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChteVBhY2thZ2UsIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0RmFsc2Uoc291cmNlLmdldEltcG9ydChYbWxTY2hlbWEuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXhiL2NvcmUvdGVzdHMvVGVzdEphdmFQcm9qZWN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4Yi9jb3JlL3Rlc3RzL1Rlc3RKYXZhUHJvamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGY0ZmM0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXhiL2NvcmUvdGVzdHMvVGVzdEphdmFQcm9qZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBQcm9ncmVzcyBTb2Z0d2FyZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZS51dGlsLkFwdENvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotCi1wdWJsaWMgY2xhc3MgVGVzdEphdmFQcm9qZWN0IGV4dGVuZHMgVGVzdFByb2plY3QgewotICAgIHByaXZhdGUgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0OwotICAgIAotICAgIHB1YmxpYyBUZXN0SmF2YVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKHByb2plY3ROYW1lKTsKLSAgICAgICAgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUoZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgYWRkUHJvamVjdE5hdHVyZShnZXRQcm9qZWN0KCksIEphdmFDb3JlLk5BVFVSRV9JRCk7Ci0KLSAgICAgICAgamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ldyBJQ2xhc3NwYXRoRW50cnlbMF0sIG51bGwpOwotCi0gICAgICAgIGNyZWF0ZVNvdXJjZUZvbGRlcigpOwotICAgICAgICBhZGRUb0NsYXNzcGF0aChqYXZhUHJvamVjdCwgZ2V0SlJFQ29udGFpbmVyRW50cnkoKSk7Ci0gICAgICAgIGNyZWF0ZU91dHB1dEZvbGRlcigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRBdXRvQnVpbGRpbmcoYm9vbGVhbiBhdXRvQnVpbGQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSVdvcmtzcGFjZURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGRlc2NyaXB0aW9uLnNldEF1dG9CdWlsZGluZyhhdXRvQnVpbGQpOwotICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBlbmFibGVBbm5vdGF0aW9uUHJvY2Vzc2luZyhib29sZWFuIGVuYWJsZSkgewotICAgICAgICBBcHRDb25maWcuc2V0RW5hYmxlZChqYXZhUHJvamVjdCwgZW5hYmxlKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBJQ2xhc3NwYXRoRW50cnkgZ2V0SlJFQ29udGFpbmVyRW50cnkoKSB7Ci0gICAgICAgIElWTUluc3RhbGwgZGVmYXVsdFZNSW5zdGFsbCA9IEphdmFSdW50aW1lLmdldERlZmF1bHRWTUluc3RhbGwoKTsKLSAgICAgICAgaWYgKGRlZmF1bHRWTUluc3RhbGwgIT0gbnVsbCAmJiBpc0phdmE2T3JHcmVhdGVySlJFKGRlZmF1bHRWTUluc3RhbGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gSmF2YVJ1bnRpbWUuZ2V0RGVmYXVsdEpSRUNvbnRhaW5lckVudHJ5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIElWTUluc3RhbGxUeXBlW10gaW5zdGFsbFR5cGVzID0gSmF2YVJ1bnRpbWUuZ2V0Vk1JbnN0YWxsVHlwZXMoKTsKLSAgICAgICAgZm9yIChJVk1JbnN0YWxsVHlwZSBpbnN0YWxsVHlwZSA6IGluc3RhbGxUeXBlcykgewotICAgICAgICAgICAgSVZNSW5zdGFsbFtdIHZtSW5zdGFsbHMgPSBpbnN0YWxsVHlwZS5nZXRWTUluc3RhbGxzKCk7Ci0gICAgICAgICAgICBmb3IgKElWTUluc3RhbGwgdm1JbnN0YWxsIDogdm1JbnN0YWxscykgewotICAgICAgICAgICAgICAgIGlmIChpc0phdmE2T3JHcmVhdGVySlJFKHZtSW5zdGFsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEphdmFDb3JlLm5ld0NvbnRhaW5lckVudHJ5KEphdmFSdW50aW1lLm5ld0pSRUNvbnRhaW5lclBhdGgoaW5zdGFsbFR5cGUuZ2V0SWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bUluc3RhbGwuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gSmF2YVJ1bnRpbWUuZ2V0RGVmYXVsdEpSRUNvbnRhaW5lckVudHJ5KCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc0phdmE2T3JHcmVhdGVySlJFKElWTUluc3RhbGwgdm1JbnN0YWxsKSB7Ci0gICAgICAgIGlmICh2bUluc3RhbGwgaW5zdGFuY2VvZiBJVk1JbnN0YWxsMikgewotICAgICAgICAgICAgSVZNSW5zdGFsbDIgdm1JbnN0YWxsMiA9IChJVk1JbnN0YWxsMikgdm1JbnN0YWxsOwotICAgICAgICAgICAgaWYgKHZtSW5zdGFsbDIuZ2V0SmF2YVZlcnNpb24oKS5jb21wYXJlVG8oSmF2YUNvcmUuVkVSU0lPTl8xXzYpID4gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVDb21waWxhdGlvblVuaXQoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGNvbnRlbnRzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldFBhY2thZ2VGcmFnbWVudChwYWNrYWdlTmFtZSkuY3JlYXRlQ29tcGlsYXRpb25Vbml0KG5hbWUsIGNvbnRlbnRzLCBmYWxzZSwgbW9uaXRvcik7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgSVBhY2thZ2VGcmFnbWVudCBnZXRQYWNrYWdlRnJhZ21lbnQoU3RyaW5nIHBhY2thZ2VOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKS5jcmVhdGVQYWNrYWdlRnJhZ21lbnQocGFja2FnZU5hbWUsIHRydWUsIG1vbml0b3IpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIElQYWNrYWdlRnJhZ21lbnRSb290IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKSB7Ci0gICAgICAgIHJldHVybiBnZXRKYXZhUHJvamVjdCgpLmdldFBhY2thZ2VGcmFnbWVudFJvb3QoZ2V0UHJvamVjdCgpLmdldEZvbGRlcigic3JjIikpOyAgICAgCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVTb3VyY2VGb2xkZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElGb2xkZXIgc3JjRGlyID0gZ2V0UHJvamVjdCgpLmdldEZvbGRlcigic3JjIik7Ci0gICAgICAgIG1rZGlycyhzcmNEaXIpOyAgICAKLSAgICAgICAgYWRkVG9DbGFzc3BhdGgoamF2YVByb2plY3QsIEphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KHNyY0Rpci5nZXRGdWxsUGF0aCgpKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZU91dHB1dEZvbGRlcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSUZvbGRlciBvdXRwdXREaXIgPSBnZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJiaW4iKTsKLSAgICAgICAgbWtkaXJzKG91dHB1dERpcik7Ci0gICAgICAgIGdldEphdmFQcm9qZWN0KCkuc2V0T3V0cHV0TG9jYXRpb24ob3V0cHV0RGlyLmdldEZ1bGxQYXRoKCksIG1vbml0b3IpOwotICAgIH0KLQotICAgIHB1YmxpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0gICAgICAgIHJldHVybiBqYXZhUHJvamVjdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkVG9DbGFzc3BhdGgoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBJQ2xhc3NwYXRoRW50cnkgY2xhc3NwYXRoRW50cnkpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElDbGFzc3BhdGhFbnRyeVtdIGN1cnJlbnRDbGFzc3BhdGhFbnRyaWVzID0gamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0gICAgICAgICAgICBJQ2xhc3NwYXRoRW50cnlbXSBuZXdDbGFzc3BhdGhFbnRyaWVzID0gbmV3IElDbGFzc3BhdGhFbnRyeVtjdXJyZW50Q2xhc3NwYXRoRW50cmllcy5sZW5ndGggKyAxXTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY3VycmVudENsYXNzcGF0aEVudHJpZXMsIDAsIG5ld0NsYXNzcGF0aEVudHJpZXMsIDAsIAotICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3NwYXRoRW50cmllcy5sZW5ndGgpOwotICAgICAgICAgICAgbmV3Q2xhc3NwYXRoRW50cmllc1tjdXJyZW50Q2xhc3NwYXRoRW50cmllcy5sZW5ndGhdID0gY2xhc3NwYXRoRW50cnk7Ci0gICAgICAgICAgICBqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3Q2xhc3NwYXRoRW50cmllcywgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIGptZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheGIvY29yZS90ZXN0cy9UZXN0UHJvamVjdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheGIvY29yZS90ZXN0cy9UZXN0UHJvamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjNiMTUyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXhiL2NvcmUvdGVzdHMvVGVzdFByb2plY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgUHJvZ3Jlc3MgU29mdHdhcmUKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0UHJvamVjdCB7Ci0gICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQotICAgIHByaXZhdGUgSVByb2plY3QgdGVzdFByb2plY3Q7Ci0gICAgCi0gICAgcHVibGljIFRlc3RQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICAgICAgdGVzdFByb2plY3QgPSB3b3Jrc3BhY2VSb290LmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICB0ZXN0UHJvamVjdC5jcmVhdGUobW9uaXRvcik7Ci0gICAgICAgIHRlc3RQcm9qZWN0Lm9wZW4obW9uaXRvcik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotICAgICAgICByZXR1cm4gdGVzdFByb2plY3Q7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZFByb2plY3ROYXR1cmUoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIG5hdHVyZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSVByb2plY3REZXNjcmlwdGlvbiBwcm9qZWN0RGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBwcmV2aW91c05hdHVyZXMgPSBwcm9qZWN0RGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBuZXdOYXR1cmVzID0gbmV3IFN0cmluZ1twcmV2aW91c05hdHVyZXMubGVuZ3RoICsgMV07Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHByZXZpb3VzTmF0dXJlcywgMCwgbmV3TmF0dXJlcywgMCwgcHJldmlvdXNOYXR1cmVzLmxlbmd0aCk7Ci0gICAgICAgICAgICBuZXdOYXR1cmVzW3ByZXZpb3VzTmF0dXJlcy5sZW5ndGhdID0gbmF0dXJlOwotICAgICAgICAgICAgcHJvamVjdERlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhuZXdOYXR1cmVzKTsKLSAgICAgICAgICAgIHByb2plY3Quc2V0RGVzY3JpcHRpb24ocHJvamVjdERlc2NyaXB0aW9uLCBudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgY2UucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgbWtkaXJzKGZpbmFsIElGb2xkZXIgZm9sZGVyKSB7Ci0gICAgCXRyeSB7Ci0JICAgICAgICBpZiAoIWZvbGRlci5leGlzdHMoKSAmJiBmb2xkZXIuZ2V0UGFyZW50KCkuaXNBY2Nlc3NpYmxlKCkpIHsKLQkgICAgICAgICAgICBmb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG51bGwpOwotCSAgICAgICAgfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQljZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTMwY2I3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvLnByb2plY3QgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I0M2ZjYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA0MDAyMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNUaHUgTWF5IDA3IDE1OjQwOjIzIElTVCAyMDA5Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJlMTMyYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cwotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuanVuaXQ7YnVuZGxlLXZlcnNpb249IjMuOC4wIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmFwdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjEwMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIKLUltcG9ydC1QYWNrYWdlOiBqYXZheC5qd3MsCi0gamF2YXguandzLnNvYXAsCi0gamF2YXgueG1sLndzO3ZlcnNpb249IjIuMS4wIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0cywKLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvYWJvdXQuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNmEwMzEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAxOSwgMjAwOTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDNiYzc1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBidWlsZC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NzIzOTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UgYW5kIG90aGVycwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jcHJvcGVydGllcyBmaWxlIGZvciBKQVgtV1MgVG9vbHMgVGVzdHMKLXBsdWdpbk5hbWU9SkFYLVdTIFRvb2xzIFRlc3RzCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE1YWQwMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0Fic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMuQWJzdHJhY3RBbm5vdGF0aW9uVGVzdDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0F1dG9CdWlsZGluZ0VuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzQW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvQWJzdHJhY3REb2N1bWVudEJhcmVWYWxpZGF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9BYnN0cmFjdERvY3VtZW50QmFyZVZhbGlkYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNGZmNTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9BYnN0cmFjdERvY3VtZW50QmFyZVZhbGlkYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlVzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REb2N1bWVudEJhcmVWYWxpZGF0aW9uVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0gICAgICAgIAotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgc3R5bGVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCAic3R5bGUiLCBTdHlsZS5ET0NVTUVOVCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHVzZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVFbnVtTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksICJ1c2UiLCBVc2UuTElURVJBTCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHBhcmFtZXRlclN0eWxlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgInBhcmFtZXRlclN0eWxlIiwgUGFyYW1ldGVyU3R5bGUuQkFSRSk7Ci0KLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoc3R5bGVWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZCh1c2VWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChwYXJhbWV0ZXJTdHlsZVZhbHVlUGFpcik7Ci0KLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLAotICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcnMpOwotCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgTXlDbGFzcyB7XG5cblx0Iik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgU3RyaW5nIG9uZUlOKFN0cmluZyBpbk9uZSwgU3RyaW5nIGluVHdvKSB7XG5cdFx0cmV0dXJuIFwidHh0XCI7XG5cdH0iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15Q2xhc3MuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0Fic3RyYWN0T25ld2F5VmFsaWRhdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvQWJzdHJhY3RPbmV3YXlWYWxpZGF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWRlMzA4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvQWJzdHJhY3RPbmV3YXlWYWxpZGF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmF4Lmp3cy5PbmV3YXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPbmV3YXlWYWxpZGF0aW9uVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIE9uZXdheS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG51bGwpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15Q2xhc3MuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBJTWV0aG9kIGdldE1ldGhvZFRvVGVzdCgpOwotCi0gICAgcHVibGljIHZvaWQgdGVzdE9uZXdheVJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKE9uZXdheS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gZ2V0TWV0aG9kVG9UZXN0KCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KG1ldGhvZCwgT25ld2F5LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQobWV0aG9kLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KG1ldGhvZCwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KE9uZXdheS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhnZXRFcnJvck1lc3NhZ2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9BYnN0cmFjdFNPQVBCaW5kaW5nVmFsaWRhdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvQWJzdHJhY3RTT0FQQmluZGluZ1ZhbGlkYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNWUyNzYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9BYnN0cmFjdFNPQVBCaW5kaW5nVmFsaWRhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNPQVBCaW5kaW5nVmFsaWRhdGlvblRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBNeUNsYXNzIHtcblxuXHRwdWJsaWMgU3RyaW5nIG15TWV0aG9kKFN0cmluZyBpbikgeyIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXG5cdFx0cmV0dXJuIFwidHh0XCI7XG5cdH1cblxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15Q2xhc3MuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9BYnN0cmFjdFdlYk1ldGhvZFB1YmxpY1N0YXRpY0ZpbmFsUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvQWJzdHJhY3RXZWJNZXRob2RQdWJsaWNTdGF0aWNGaW5hbFJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYWU4YzEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9BYnN0cmFjdFdlYk1ldGhvZFB1YmxpY1N0YXRpY0ZpbmFsUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0V2ViTWV0aG9kUHVibGljU3RhdGljRmluYWxSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFdlYk1ldGhvZC5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG51bGwpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIkBXZWJTZXJ2aWNlKG5hbWU9XCJNeUNsYXNzXCIpXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBNeUNsYXNzIHtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcdFN0cmluZyBteVBhY2thZ2VQcml2YXRlTWV0aG9kKCkge1xuXHRcdHJldHVybiBcInBhY2thZ2UtcHJpdmF0ZVwiO1xuXHR9XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXHRwcml2YXRlIFN0cmluZyBteVByaXZhdGVNZXRob2QoKSB7XG5cdFx0cmV0dXJuIFwicHJpdmF0ZVwiO1xuXHR9XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXHRwcm90ZWN0ZWQgU3RyaW5nIG15UHJvdGVjdGVkTWV0aG9kKCkge1xuXHRcdG15UHJpdmF0ZU1ldGhvZCgpO1xuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcdFx0cmV0dXJuIFwicHJvdGVjdGVkXCI7XG5cdH1cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXHRwdWJsaWMgc3RhdGljIFN0cmluZyBteVN0YXRpY01ldGhvZCgpIHtcblx0XHRyZXR1cm4gXCJzdGF0aWNcIjtcblx0fVxuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlx0cHVibGljIGZpbmFsIFN0cmluZyBteUZpbmFsTWV0aG9kKCkge1xuXHRcdHJldHVybiBcImZpbmFsXCI7XG5cdH1cblxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15Q2xhc3MuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IElNZXRob2QgZ2V0TWV0aG9kVG9UZXNldCgpOwotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViTWV0aG9kUmVzdHJpY3Rpb24oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYk1ldGhvZC5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gZ2V0TWV0aG9kVG9UZXNldCgpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChtZXRob2QsIFdlYk1ldGhvZC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KG1ldGhvZCwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChXZWJNZXRob2QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0RXJyb3JNZXNzYWdlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0Fic3RyYWN0V2ViU2VydmljZVB1YmxpY0Fic3RyYWN0RmluYWxSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9BYnN0cmFjdFdlYlNlcnZpY2VQdWJsaWNBYnN0cmFjdEZpbmFsUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODViNjE5Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0Fic3RyYWN0V2ViU2VydmljZVB1YmxpY0Fic3RyYWN0RmluYWxSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RXZWJTZXJ2aWNlUHVibGljQWJzdHJhY3RGaW5hbFJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCAibmFtZSIsICJNeUNsYXNzIik7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHBvcnROYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsICJwb3J0TmFtZSIsCi0gICAgICAgICAgICAgICAgIk15Q2xhc3NQb3J0Iik7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHNlcnZpY2VOYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgInNlcnZpY2VOYW1lIiwgIk15Q2xhc3NTZXJ2aWNlIik7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHRhcmdldE5hbWVzcGFjZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgICJ0YXJnZXROYW1lc3BhY2UiLCAiaHR0cDovL2V4YW1wbGUuY29tLyIpOwotCi0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKG5hbWVWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZCh0YXJnZXROYW1lc3BhY2VWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChwb3J0TmFtZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHNlcnZpY2VOYW1lVmFsdWVQYWlyKTsKLQotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBXZWJTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbWVtYmVyVmFsdWVQYWlycyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiTXlDbGFzcy5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViU2VydmljZVB1YmxpY0Fic3RyYWN0RmluYWxSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQoc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBXZWJTZXJ2aWNlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQoc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KHNvdXJjZSwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KFdlYlNlcnZpY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9QVUJMSUNfQUJTVFJBQ1RfRklOQUwsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvQWJzdHJhY3RXZWJTZXJ2aWNlU0VJUnVsZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9BYnN0cmFjdFdlYlNlcnZpY2VTRUlSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYTBkOGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9BYnN0cmFjdFdlYlNlcnZpY2VTRUlSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RXZWJTZXJ2aWNlU0VJUnVsZSBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIHRlc3RKYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoZ2V0UGFja2FnZU5hbWUoKSwgZ2V0SW50ZXJmYWNlTmFtZSgpLCBnZXRJbnRlcmZhY2VDb250ZW50cygpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJAV2ViU2VydmljZShlbmRwb2ludEludGVyZmFjZT1cImNvbS5leGFtcGxlLk15SW50ZXJmYWNlXCIsICIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgidGFyZ2V0TmFtZXNwYWNlPVwiaHR0cDovL2V4YW1wbGUuY29tL1wiLCBwb3J0TmFtZT1cIk15Q2xhc3NQb3J0XCIsICIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgic2VydmljZU5hbWU9XCJNeUNsYXNzU2VydmljZVwiKVxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgTXlDbGFzcyB7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXHRwdWJsaWMgdm9pZCBtZXRob2RPbmUoU3RyaW5nIGluKSB7XG5cdH1cblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcdHB1YmxpYyBTdHJpbmcgbXlNZXRob2QoU3RyaW5nIGluKSB7IiArICJcblx0XHRyZXR1cm4gXCJ0eHRcIjtcblx0fVxuXG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGdldEludGVyZmFjZUNvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHNlaUNvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBzZWlDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTtcblxuIik7Ci0gICAgICAgIHNlaUNvbnRlbnRzLmFwcGVuZCgiQFdlYlNlcnZpY2UobmFtZT1cIk15SW50ZXJmYWNlXCIsIHRhcmdldE5hbWVzcGFjZT1cImh0dHA6Ly9leGFtcGxlLmNvbS9cIilcbiIpOwotICAgICAgICBzZWlDb250ZW50cy5hcHBlbmQoInB1YmxpYyBpbnRlcmZhY2UgTXlJbnRlcmZhY2Uge1xuXG4iKTsKLSAgICAgICAgc2VpQ29udGVudHMuYXBwZW5kKCJcdHB1YmxpYyBTdHJpbmcgbXlNZXRob2QoU3RyaW5nIGluKTtcblxufSIpOwotICAgICAgICByZXR1cm4gc2VpQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiTXlDbGFzcy5qYXZhIjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEludGVyZmFjZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiTXlJbnRlcmZhY2UuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0RvY0JhcmVOb25Wb2lkTm9PdXRQYXJhbWV0ZXJzUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvRG9jQmFyZU5vblZvaWROb091dFBhcmFtZXRlcnNSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmY2NDIyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvRG9jQmFyZU5vblZvaWROb091dFBhcmFtZXRlcnNSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBEb2NCYXJlTm9uVm9pZE5vT3V0UGFyYW1ldGVyc1J1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3REb2N1bWVudEJhcmVWYWxpZGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07XG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBNeUNsYXNzIHtcblxuXHQiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBTdHJpbmcgbm9PdXQoU3RyaW5nIGluLCBAV2ViUGFyYW0obmFtZT1cIm91dFwiLCBtb2RlPVdlYlBhcmFtLk1vZGUuT1VUKSAiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlN0cmluZyBvdXQpIHtcblx0XHRyZXR1cm4gXCJ0eHRcIjtcblx0fVxuXG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5vblZvaWROb09VVFBhcmFtZXRlclJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJub091dCIsIG5ldyBTdHJpbmdbXSB7ICJRU3RyaW5nOyIsCi0gICAgICAgICAgICAgICAgICAgICJRU3RyaW5nOyAifSk7Ci0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQobWV0aG9kLCBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KG1ldGhvZCwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5ET0NfQkFSRV9OT05fVk9JRF9SRVRVUk5fTk9fSU5PVVRfT1VUX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvRG9jQmFyZU9uZU5vbkhlYWRlcklOUGFyYW1ldGVyUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvRG9jQmFyZU9uZU5vbkhlYWRlcklOUGFyYW1ldGVyUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDViODQ1OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0RvY0JhcmVPbmVOb25IZWFkZXJJTlBhcmFtZXRlclJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBEb2NCYXJlT25lTm9uSGVhZGVySU5QYXJhbWV0ZXJSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0RG9jdW1lbnRCYXJlVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXguandzLldlYlBhcmFtO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBNeUNsYXNzIHtcblxuXHQiKTsKLSAgICAgICAgLy9jbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIFN0cmluZyBvbmVJTigpIHtcblx0XHRyZXR1cm4gXCJ0eHRcIjtcblx0fVxuXG5cdCIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIFN0cmluZyBvbmVNb3JlKEBXZWJQYXJhbShuYW1lPVwiaW5PbmVcIiwgbW9kZT1XZWJQYXJhbS5Nb2RlLklOKSBTdHJpbmcgIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbk9uZSwgQFdlYlBhcmFtKG5hbWU9XCJpblR3b1wiLCBtb2RlPVdlYlBhcmFtLk1vZGUuSU4pU3RyaW5nIGluVHdvKSB7XG5cdFx0Iik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJyZXR1cm4gXCJ0eHRcIjtcblx0fVxuXG5cdHB1YmxpYyBTdHJpbmcgb25seU9uZUlOKFN0cmluZyBpbk9uZSwgU3RyaW5nIGluVHdvKSB7Iik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcblx0XHRyZXR1cm4gXCJ0eHRcIjtcblx0fVxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qCi0gICAgcHVibGljIHZvaWQgdGVzdE9uZU5vbkhlYWRlcklOUGFyYW1ldGVyUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlNPQVBCaW5kaW5nIiwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJvbmVJTiIsIG5ldyBTdHJpbmdbMF0pOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMuZ2V0SW1wb3J0Q2hhbmdlKGNvbXBpbGF0aW9uVW5pdCwgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLCB0cnVlKTsKLQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLmNyZWF0ZU1ldGhvZEFubm90YXRpb25DaGFuZ2Uoc291cmNlLCBjb21waWxhdGlvblVuaXQsIHJld3JpdGVyLCBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb24sIHRleHRGaWxlQ2hhbmdlKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuRE9DX0JBUkVfT05FX05PTl9IRUFERVJfSU5fUEFSQU1FVEVSX0VSUk9SX01FU1NBR0UsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ki8KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPbmx5T25lTm9uSGVhZGVySU5QYXJhbWV0ZXJSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhTT0FQQmluZGluZy5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgib25seU9uZUlOIiwgbmV3IFN0cmluZ1tdIHsgIlFTdHJpbmc7IiwKLSAgICAgICAgICAgICAgICAgICAgIlFTdHJpbmc7IiB9KTsKLQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChtZXRob2QsIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQobWV0aG9kLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KG1ldGhvZCwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLkRPQ19CQVJFX09OTFlfT05FX05PTl9IRUFERVJfSU5fUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE9ubHlPbmVOb25IZWFkZXJJTlBhcmFtZXRlcldpdGhXZWJQYXJhbXNSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhTT0FQQmluZGluZy5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgib25lTW9yZSIsIG5ldyBTdHJpbmdbXSB7ICJRU3RyaW5nOyIsCi0gICAgICAgICAgICAgICAgICAgICJRU3RyaW5nOyIgfSk7Ci0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQobWV0aG9kLCBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KG1ldGhvZCwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5ET0NfQkFSRV9PTkxZX09ORV9OT05fSEVBREVSX0lOX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9Eb2NCYXJlVm9pZE9uZUlOT25lT3V0UGFyYW1ldGVyUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvRG9jQmFyZVZvaWRPbmVJTk9uZU91dFBhcmFtZXRlclJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NjUxMjMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9Eb2NCYXJlVm9pZE9uZUlOT25lT3V0UGFyYW1ldGVyUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIERvY0JhcmVWb2lkT25lSU5PbmVPdXRQYXJhbWV0ZXJSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0RG9jdW1lbnRCYXJlVmFsaWRhdGlvblRlc3QgewotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTtcbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIE15Q2xhc3Mge1xuXG5cdCIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIHZvaWQgb25lSW4oQFdlYlBhcmFtKG5hbWU9XCJpbk9uZVwiLCBtb2RlPVdlYlBhcmFtLk1vZGUuSU5PVVQpICIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiSG9sZGVyPFN0cmluZz4gaW5PbmUsIEBXZWJQYXJhbShuYW1lPVwiaW5Ud29cIiwgbW9kZT1XZWJQYXJhbS5Nb2RlLklOKSAiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlN0cmluZyBpblR3bykge1xuXG5cdH1cblxuXHQiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyB2b2lkIG9uZU91dChAV2ViUGFyYW0obmFtZT1cIm91dE9uZVwiLCBtb2RlPVdlYlBhcmFtLk1vZGUuSU5PVVQpICIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiSG9sZGVyPFN0cmluZz4gb3V0T25lLCBAV2ViUGFyYW0obmFtZT1cIm91dFR3b1wiLCBtb2RlPVdlYlBhcmFtLk1vZGUuT1VUKSAiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIkhvbGRlcjxTdHJpbmc+IG91dFR3bykge1xuXG5cdH1cblxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWb2lkT25lSW5QYXJhbWV0ZXJSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhTT0FQQmluZGluZy5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgib25lSW4iLCBuZXcgU3RyaW5nW10geyAiUUhvbGRlcjxRU3RyaW5nOz47IiwKLSAgICAgICAgICAgICAgICAgICAgIlFTdHJpbmc7In0pOwotCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KG1ldGhvZCwgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChtZXRob2QsIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuRE9DX0JBUkVfVk9JRF9SRVRVUk5fT05FX0lOX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWb2lkT25lT3V0UGFyYW1ldGVyUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmcuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoIm9uZU91dCIsIG5ldyBTdHJpbmdbXSB7ICJRSG9sZGVyPFFTdHJpbmc7PjsiLAotICAgICAgICAgICAgICAgICAgICAiUUhvbGRlcjxRU3RyaW5nOz47In0pOwotCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KG1ldGhvZCwgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChtZXRob2QsIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuRE9DX0JBUkVfVk9JRF9SRVRVUk5fT05FX09VVF9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvSG9sZGVyVHlwZVBhcmFtZXRlclJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0hvbGRlclR5cGVQYXJhbWV0ZXJSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjdkNTE1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvSG9sZGVyVHlwZVBhcmFtZXRlclJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIEhvbGRlclR5cGVQYXJhbWV0ZXJSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFdlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJNeUNsYXNzLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTtcbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIE15Q2xhc3Mge1xuXG5cdHB1YmxpYyB2b2lkIG15TWV0aG9kKCIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiQFdlYlBhcmFtKG1vZGU9V2ViUGFyYW0uTW9kZS5JTikgSG9sZGVyPGphdmEubGFuZy5TdHJpbmc+IHBhcmFtKSB7XG5cblx0fVxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RIb2xkZXJUeXBlUGFyYW1ldGVyUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgV2ViU2VydmljZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChzb3VyY2UsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChXZWJTZXJ2aWNlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLkhPTERFUl9UWVBFX01VU1RfQkVfT1VUX0lOT1VULAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfWNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0pBWFdTQW5ub3RhdGlvblZhbGlkYXRpb25UZXN0U3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvSkFYV1NBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3RTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjg0YTFkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvSkFYV1NBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKQVhXU0Fubm90YXRpb25WYWxpZGF0aW9uVGVzdFN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhXU0Fubm90YXRpb25WYWxpZGF0aW9uVGVzdFN1aXRlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEpBWFdTQW5ub3RhdGlvblZhbGlkYXRpb25UZXN0U3VpdGUoKSB7Ci0gICAgICAgIHN1cGVyKCJKQVgtV1MgQW5ub3RhdGlvbiBWYWxpZGF0aW9uIFRlc3RzIik7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShEb2NCYXJlTm9uVm9pZE5vT3V0UGFyYW1ldGVyc1J1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKERvY0JhcmVPbmVOb25IZWFkZXJJTlBhcmFtZXRlclJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKERvY0JhcmVWb2lkT25lSU5PbmVPdXRQYXJhbWV0ZXJSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShPbmV3YXlOb1JldHVyblZhbHVlUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoT25ld2F5Tm9DaGVja2VkRXhjZXB0aW9uc1J1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKEhvbGRlclR5cGVQYXJhbWV0ZXJSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShPbmV3YXlOb0hvbGRlclBhcmFtZXRlcnNSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShTT0FQQmluZGluZ1JQQ1N0eWxlT25NZXRob2RSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShTT0FQQmluZGluZ1JQQ0VuY29kZWRSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShTT0FQQmluZGluZ0RvY3VtZW50RW5jb2RlZFJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFNPQVBCaW5kaW5nUkNQQmFyZVJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFNPQVBCaW5kaW5nTWl4ZWRCaW5kaW5nc1J1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFdlYk1ldGhvZENoZWNrRm9yV2ViU2VydmljZVJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFdlYk1ldGhvZEV4Y2x1ZGVSdWxlT25TRUlUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFdlYk1ldGhvZEV4Y2x1ZGVSdWxlT25JbXBsVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShXZWJNZXRob2ROb1BhY2thZ2VQcml2YXRlTWV0aG9kUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoV2ViTWV0aG9kTm9Qcml2YXRlTWV0aG9kUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoV2ViTWV0aG9kTm9Qcm90ZWN0ZWRNZXRob2RSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShXZWJNZXRob2ROb0ZpbmFsTW9kaWZpZXJSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShXZWJNZXRob2ROb1N0YXRpY01vZGlmaWVyUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoV2ViUGFyYW1Nb2RlSG9sZGVyVHlwZVJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFdlYlNlcnZpY2VEZWZhdWx0UHVibGljQ29uc3RydWN0b3JSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShXZWJTZXJ2aWNlTm9GaW5hbGl6ZU1ldGhvZFJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFdlYlNlcnZpY2VOb0ZpbmFsTW9kaWZlclJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFdlYlNlcnZpY2VOb0Fic3RyYWN0TW9kaWZpZXJSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShXZWJTZXJ2aWNlU0VJTm9TZXJ2aWNlTmFtZVJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFdlYlNlcnZpY2VTRUlOb0VuZHBvaW50SW50ZXJmYWNlUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoV2ViU2VydmljZVNFSU5vUG9ydE5hbWVSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShXZWJTZXJ2aWNlU0VJTm9XZWJNZXRob2RSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShXZWJTZXJ2aWNlU0VJTm9XZWJSZXN1bHRSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShXZWJTZXJ2aWNlU0VJTm9XZWJQYXJhbVJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFdlYlNlcnZpY2VTRUlOb09uZXdheVJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFdlYlNlcnZpY2VTRUlOb1NPQVBCaW5kaW5nUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoV2ViU2VydmljZVdlYlNlcnZpY2VQcm92aWRlckNvRXhpc3RSdWxlVGVzdC5jbGFzcyk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL09uZXdheU5vQ2hlY2tlZEV4Y2VwdGlvbnNSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9PbmV3YXlOb0NoZWNrZWRFeGNlcHRpb25zUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY5ZDA5YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL09uZXdheU5vQ2hlY2tlZEV4Y2VwdGlvbnNSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBPbmV3YXlOb0NoZWNrZWRFeGNlcHRpb25zUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdE9uZXdheVZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIE15Q2xhc3Mge1xuXG5cdHB1YmxpYyB2b2lkIG15TWV0aG9kKGludCBpKSB0aHJvd3MgRXhjZXB0aW9uIHtcblx0fVxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotICAgICAgICByZXR1cm4gSkFYV1NDb3JlTWVzc2FnZXMuT05FV0FZX05PX0NIRUNLRURfRVhDRVBUSU9OUzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSU1ldGhvZCBnZXRNZXRob2RUb1Rlc3QoKSB7Ci0gICAgICAgIHJldHVybiBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJteU1ldGhvZCIsIG5ldyBTdHJpbmdbXXsiSSJ9KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvT25ld2F5Tm9Ib2xkZXJQYXJhbWV0ZXJzUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvT25ld2F5Tm9Ib2xkZXJQYXJhbWV0ZXJzUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVmNGE4YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL09uZXdheU5vSG9sZGVyUGFyYW1ldGVyc1J1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIE9uZXdheU5vSG9sZGVyUGFyYW1ldGVyc1J1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RPbmV3YXlWYWxpZGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBNeUNsYXNzIHtcblxuXHRwdWJsaWMgdm9pZCBteU1ldGhvZCgiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIkhvbGRlcjxTdHJpbmc+IGluKSB7XG5cdH1cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIEpBWFdTQ29yZU1lc3NhZ2VzLk9ORVdBWV9OT19IT0xERVJfUEFSQU1FVEVSUzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSU1ldGhvZCBnZXRNZXRob2RUb1Rlc3QoKSB7Ci0gICAgICAgIHJldHVybiBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJteU1ldGhvZCIsIG5ldyBTdHJpbmdbXXsiUUhvbGRlcjxRU3RyaW5nOz47In0pOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9PbmV3YXlOb1JldHVyblZhbHVlUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvT25ld2F5Tm9SZXR1cm5WYWx1ZVJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYTBmOTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9PbmV3YXlOb1JldHVyblZhbHVlUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgT25ld2F5Tm9SZXR1cm5WYWx1ZVJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RPbmV3YXlWYWxpZGF0aW9uVGVzdCB7Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0JICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLQkgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBNeUNsYXNzIHtcblxuXHRwdWJsaWMgaW50IG15TWV0aG9kKGludCBpKSB7XG5cdFx0cmV0dXJuIDA7XG5cdH1cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLQl9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIEpBWFdTQ29yZU1lc3NhZ2VzLk9ORVdBWV9OT19SRVRVUk5fVkFMVUU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElNZXRob2QgZ2V0TWV0aG9kVG9UZXN0KCkgewotICAgICAgICByZXR1cm4gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgibXlNZXRob2QiLCBuZXcgU3RyaW5nW117IkkifSk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9TT0FQQmluZGluZ0RvY3VtZW50RW5jb2RlZFJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1NPQVBCaW5kaW5nRG9jdW1lbnRFbmNvZGVkUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVmODQyMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1NPQVBCaW5kaW5nRG9jdW1lbnRFbmNvZGVkUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGU7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGU7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuVXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQQmluZGluZ0RvY3VtZW50RW5jb2RlZFJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RTT0FQQmluZGluZ1ZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHN0eWxlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgInN0eWxlIiwgU3R5bGUuRE9DVU1FTlQpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciB1c2VWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCAidXNlIiwgVXNlLkVOQ09ERUQpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBwYXJhbWV0ZXJTdHlsZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVFbnVtTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksICJwYXJhbWV0ZXJTdHlsZSIsIFBhcmFtZXRlclN0eWxlLkJBUkUpOwotCi0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHN0eWxlVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQodXNlVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQocGFyYW1ldGVyU3R5bGVWYWx1ZVBhaXIpOwotCi0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFNPQVBCaW5kaW5nLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbWVtYmVyVmFsdWVQYWlycyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNPQVBCaW5kaW5nRG9jdW1lbnRFbmNvZGVkUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmcuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoIm15TWV0aG9kIiwgbmV3IFN0cmluZ1tdIHsgIlFTdHJpbmc7IiB9KTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQobWV0aG9kLCBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KG1ldGhvZCwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5TT0FQQklORElOR19ET0NVTUVOVF9FTkNPREVEX05PVF9TVVBQT1JURUQsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1NPQVBCaW5kaW5nTWl4ZWRCaW5kaW5nc1J1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1NPQVBCaW5kaW5nTWl4ZWRCaW5kaW5nc1J1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4OTAwY2UuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9TT0FQQmluZGluZ01peGVkQmluZGluZ3NSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGU7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGU7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuVXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQQmluZGluZ01peGVkQmluZGluZ3NSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0U09BUEJpbmRpbmdWYWxpZGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBzdHlsZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVFbnVtTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksICJzdHlsZSIsIFN0eWxlLkRPQ1VNRU5UKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgdXNlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgInVzZSIsIFVzZS5MSVRFUkFMKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgcGFyYW1ldGVyU3R5bGVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCAicGFyYW1ldGVyU3R5bGUiLCBQYXJhbWV0ZXJTdHlsZS5XUkFQUEVEKTsKLQotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChzdHlsZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHVzZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHBhcmFtZXRlclN0eWxlVmFsdWVQYWlyKTsKLQotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBTT0FQQmluZGluZy5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG1lbWJlclZhbHVlUGFpcnMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIkBTT0FQQmluZGluZyhzdHlsZT1TT0FQQmluZGluZy5TdHlsZS5SUEMsIHVzZT1TT0FQQmluZGluZy5Vc2UuTElURVJBTCwgIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwYXJhbWV0ZXJTdHlsZT1TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5XUkFQUEVEKVxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgTXlDbGFzcyB7XG5cblx0cHVibGljIFN0cmluZyBteU1ldGhvZChTdHJpbmcgaW4pIHsiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlxuXHRcdHJldHVybiBcInR4dFwiO1xuXHR9XG5cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U09BUEJpbmRpbmdNaXhlZEJpbmRpbmdzUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmcuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoIm15TWV0aG9kIiwgbmV3IFN0cmluZ1tdIHsgIlFTdHJpbmc7IiB9KTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQobWV0aG9kLCBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KG1ldGhvZCwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5TT0FQQklORElOR19OT19NSVhFRF9CSU5ESU5HUywKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvU09BUEJpbmRpbmdSQ1BCYXJlUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvU09BUEJpbmRpbmdSQ1BCYXJlUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg2MjY5NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1NPQVBCaW5kaW5nUkNQQmFyZVJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlVzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFNPQVBCaW5kaW5nUkNQQmFyZVJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RTT0FQQmluZGluZ1ZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHN0eWxlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgInN0eWxlIiwgU3R5bGUuUlBDKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgdXNlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgInVzZSIsIFVzZS5MSVRFUkFMKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgcGFyYW1ldGVyU3R5bGVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCAicGFyYW1ldGVyU3R5bGUiLCBQYXJhbWV0ZXJTdHlsZS5CQVJFKTsKLQotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChzdHlsZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHVzZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHBhcmFtZXRlclN0eWxlVmFsdWVQYWlyKTsKLQotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBTT0FQQmluZGluZy5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG1lbWJlclZhbHVlUGFpcnMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTT0FQQmluZGluZ1JQQ0JhcmVSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhTT0FQQmluZGluZy5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChzb3VyY2UuZmluZFByaW1hcnlUeXBlKCksIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQoc291cmNlLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuU09BUEJJTkRJTkdfUlBDX05PX0JBUkVfUEFSQU1FVEVSX1NUWUxFLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1NPQVBCaW5kaW5nUlBDRW5jb2RlZFJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1NPQVBCaW5kaW5nUlBDRW5jb2RlZFJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxYjBhMjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9TT0FQQmluZGluZ1JQQ0VuY29kZWRSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5Vc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQQmluZGluZ1JQQ0VuY29kZWRSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0U09BUEJpbmRpbmdWYWxpZGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBzdHlsZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVFbnVtTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksICJzdHlsZSIsIFN0eWxlLlJQQyk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHVzZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVFbnVtTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksICJ1c2UiLCBVc2UuRU5DT0RFRCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHBhcmFtZXRlclN0eWxlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgInBhcmFtZXRlclN0eWxlIiwgUGFyYW1ldGVyU3R5bGUuV1JBUFBFRCk7Ci0KLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoc3R5bGVWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZCh1c2VWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChwYXJhbWV0ZXJTdHlsZVZhbHVlUGFpcik7Ci0KLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgU09BUEJpbmRpbmcuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U09BUEJpbmRpbmdSUENFbmNvZGVkUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmcuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChzb3VyY2UuZmluZFByaW1hcnlUeXBlKCksIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQoc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KHNvdXJjZSwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLlNPQVBCSU5ESU5HX1JQQ19FTkNPREVEX05PVF9TVVBQT1JURUQsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvU09BUEJpbmRpbmdSUENTdHlsZU9uTWV0aG9kUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvU09BUEJpbmRpbmdSUENTdHlsZU9uTWV0aG9kUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk0MjRhMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1NPQVBCaW5kaW5nUlBDU3R5bGVPbk1ldGhvZFJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlVzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgU09BUEJpbmRpbmdSUENTdHlsZU9uTWV0aG9kUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNPQVBCaW5kaW5nVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgc3R5bGVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCAic3R5bGUiLCBTdHlsZS5SUEMpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciB1c2VWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCAidXNlIiwgVXNlLkxJVEVSQUwpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBwYXJhbWV0ZXJTdHlsZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVFbnVtTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksICJwYXJhbWV0ZXJTdHlsZSIsIFBhcmFtZXRlclN0eWxlLldSQVBQRUQpOwotCi0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHN0eWxlVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQodXNlVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQocGFyYW1ldGVyU3R5bGVWYWx1ZVBhaXIpOwotCi0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFNPQVBCaW5kaW5nLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbWVtYmVyVmFsdWVQYWlycyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNPQVBCaW5kaW5nUlBDU3R5bGVPbk1ldGhvZHNSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhTT0FQQmluZGluZy5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgibXlNZXRob2QiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiIH0pOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChtZXRob2QsIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQobWV0aG9kLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KG1ldGhvZCwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLlNPQVBCSU5ESU5HX05PX1JQQ19TVFlMRV9PTl9NRVRIT0RTLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYk1ldGhvZENoZWNrRm9yV2ViU2VydmljZVJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYk1ldGhvZENoZWNrRm9yV2ViU2VydmljZVJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NDBjNGQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2RDaGVja0ZvcldlYlNlcnZpY2VSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdlYk1ldGhvZENoZWNrRm9yV2ViU2VydmljZVJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgb3BlcmF0aW9uVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgIm9wZXJhdGlvbk5hbWUiLCAibXlNZXRob2QiKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgYWN0aW9uVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsICJhY3Rpb24iLAotICAgICAgICAgICAgICAgICJ1cm46TXlNZXRob2QiKTsKLQotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChvcGVyYXRpb25WYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChhY3Rpb25WYWx1ZVBhaXIpOwotCi0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFdlYk1ldGhvZC5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG1lbWJlclZhbHVlUGFpcnMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIE15Q2xhc3Mge1xuXG5cdHB1YmxpYyBTdHJpbmcgbXlNZXRob2QoKSB7Iik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcblx0XHRyZXR1cm4gXCJ0eHRcIjtcblx0fVxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15Q2xhc3MuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYk1ldGhvZENoZWNrRm9yV2ViU2VydmljZVJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYk1ldGhvZC5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgibXlNZXRob2QiLCBuZXcgU3RyaW5nWzBdKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQobWV0aG9kLCBXZWJNZXRob2QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChtZXRob2QsIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoV2ViTWV0aG9kLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQk1FVEhPRF9PTkxZX1NVUFBPUlRFRF9PTl9DTEFTU0VTX1dJVEhfV0VCU0VSVklDRSwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViTWV0aG9kRXhjbHVkZVJ1bGVPbkltcGxUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYk1ldGhvZEV4Y2x1ZGVSdWxlT25JbXBsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGU4OGJhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViTWV0aG9kRXhjbHVkZVJ1bGVPbkltcGxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgV2ViTWV0aG9kRXhjbHVkZVJ1bGVPbkltcGxUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgb3BlcmF0aW9uVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgIm9wZXJhdGlvbk5hbWUiLCAibXlNZXRob2QiKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgYWN0aW9uVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsICJhY3Rpb24iLAotICAgICAgICAgICAgICAgICJ1cm46TXlNZXRob2QiKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgZXhjbHVkZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVCb29sZWFuTWVtYmVyVmFsdWVQYWlyKGFzdCwgImV4Y2x1ZGUiLAotICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRSk7Ci0KLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQob3BlcmF0aW9uVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoYWN0aW9uVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoZXhjbHVkZVZhbHVlUGFpcik7Ci0KLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgV2ViTWV0aG9kLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbWVtYmVyVmFsdWVQYWlycyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiQFdlYlNlcnZpY2UobmFtZT1cIk15Q2xhc3NcIilcbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIE15Q2xhc3Mge1xuXG5cdHB1YmxpYyBTdHJpbmcgbXlNZXRob2QoKSB7Iik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcblx0XHRyZXR1cm4gXCJ0eHRcIjtcblx0fVxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15Q2xhc3MuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYk1ldGhvZENoZWNrRm9yV2ViU2VydmljZVJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYk1ldGhvZC5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgibXlNZXRob2QiLCBuZXcgU3RyaW5nWzBdKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQobWV0aG9kLCBXZWJNZXRob2QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChtZXRob2QsIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoV2ViTWV0aG9kLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQk1FVEhPRF9FWENMVURFX1NQRUNJRklFRF9OT19PVEhFUl9BVFRSSUJVVEVTX0FMTE9XRUQsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYk1ldGhvZEV4Y2x1ZGVSdWxlT25TRUlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYk1ldGhvZEV4Y2x1ZGVSdWxlT25TRUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiODAyNDkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2RFeGNsdWRlUnVsZU9uU0VJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdlYk1ldGhvZEV4Y2x1ZGVSdWxlT25TRUlUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgZXhjbHVkZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVCb29sZWFuTWVtYmVyVmFsdWVQYWlyKGFzdCwgImV4Y2x1ZGUiLAotICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRSk7Ci0KLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoZXhjbHVkZVZhbHVlUGFpcik7Ci0KLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgV2ViTWV0aG9kLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbWVtYmVyVmFsdWVQYWlycyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiQFdlYlNlcnZpY2UobmFtZT1cIk15SW50ZXJmYWNlXCIpXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBpbnRlcmZhY2UgTXlDbGFzcyB7XG5cblx0cHVibGljIFN0cmluZyBteU1ldGhvZCgpO1xufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15Q2xhc3MuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYk1ldGhvZEV4Y2x1ZGVSdWxlT25JbnRlcmZhY2UoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYk1ldGhvZC5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgibXlNZXRob2QiLCBuZXcgU3RyaW5nWzBdKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQoc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBXZWJNZXRob2QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChtZXRob2QsIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoV2ViTWV0aG9kLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQk1FVEhPRF9FWENMVURFX05PVF9BTExPV0VEX09OX1NFSSwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2ROb0ZpbmFsTW9kaWZpZXJSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2ROb0ZpbmFsTW9kaWZpZXJSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDRkNTZkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViTWV0aG9kTm9GaW5hbE1vZGlmaWVyUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgV2ViTWV0aG9kTm9GaW5hbE1vZGlmaWVyUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFdlYk1ldGhvZFB1YmxpY1N0YXRpY0ZpbmFsUnVsZVRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElNZXRob2QgZ2V0TWV0aG9kVG9UZXNldCgpIHsKLSAgICAgICAgcmV0dXJuIHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoIm15RmluYWxNZXRob2QiLCBuZXcgU3RyaW5nWzBdKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIEpBWFdTQ29yZU1lc3NhZ2VzLldFQk1FVEhPRF9OT19GSU5BTF9NT0RJRklFUl9BTExPV0VEOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2ROb1BhY2thZ2VQcml2YXRlTWV0aG9kUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViTWV0aG9kTm9QYWNrYWdlUHJpdmF0ZU1ldGhvZFJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ZThlYjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2ROb1BhY2thZ2VQcml2YXRlTWV0aG9kUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgV2ViTWV0aG9kTm9QYWNrYWdlUHJpdmF0ZU1ldGhvZFJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RXZWJNZXRob2RQdWJsaWNTdGF0aWNGaW5hbFJ1bGVUZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJTWV0aG9kIGdldE1ldGhvZFRvVGVzZXQoKSB7Ci0gICAgICAgIHJldHVybiBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJteVBhY2thZ2VQcml2YXRlTWV0aG9kIiwgbmV3IFN0cmluZ1swXSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBKQVhXU0NvcmVNZXNzYWdlcy5XRUJNRVRIT0RfT05MWV9PTl9QVUJMSUNfTUVUSE9EUzsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViTWV0aG9kTm9Qcml2YXRlTWV0aG9kUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViTWV0aG9kTm9Qcml2YXRlTWV0aG9kUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgyNDFjMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYk1ldGhvZE5vUHJpdmF0ZU1ldGhvZFJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdlYk1ldGhvZE5vUHJpdmF0ZU1ldGhvZFJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RXZWJNZXRob2RQdWJsaWNTdGF0aWNGaW5hbFJ1bGVUZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJTWV0aG9kIGdldE1ldGhvZFRvVGVzZXQoKSB7Ci0gICAgICAgIHJldHVybiBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJteVByaXZhdGVNZXRob2QiLCBuZXcgU3RyaW5nWzBdKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIEpBWFdTQ29yZU1lc3NhZ2VzLldFQk1FVEhPRF9PTkxZX09OX1BVQkxJQ19NRVRIT0RTOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2ROb1Byb3RlY3RlZE1ldGhvZFJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYk1ldGhvZE5vUHJvdGVjdGVkTWV0aG9kUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E1ODM1NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYk1ldGhvZE5vUHJvdGVjdGVkTWV0aG9kUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgV2ViTWV0aG9kTm9Qcm90ZWN0ZWRNZXRob2RSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0V2ViTWV0aG9kUHVibGljU3RhdGljRmluYWxSdWxlVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSU1ldGhvZCBnZXRNZXRob2RUb1Rlc2V0KCkgewotICAgICAgICByZXR1cm4gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgibXlQcm90ZWN0ZWRNZXRob2QiLCBuZXcgU3RyaW5nWzBdKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIEpBWFdTQ29yZU1lc3NhZ2VzLldFQk1FVEhPRF9PTkxZX09OX1BVQkxJQ19NRVRIT0RTOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2ROb1N0YXRpY01vZGlmaWVyUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViTWV0aG9kTm9TdGF0aWNNb2RpZmllclJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhYWU1M2UuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2ROb1N0YXRpY01vZGlmaWVyUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgV2ViTWV0aG9kTm9TdGF0aWNNb2RpZmllclJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RXZWJNZXRob2RQdWJsaWNTdGF0aWNGaW5hbFJ1bGVUZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJTWV0aG9kIGdldE1ldGhvZFRvVGVzZXQoKSB7Ci0gICAgICAgIHJldHVybiBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJteVN0YXRpY01ldGhvZCIsIG5ldyBTdHJpbmdbMF0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotICAgICAgICByZXR1cm4gSkFYV1NDb3JlTWVzc2FnZXMuV0VCTUVUSE9EX05PX1NUQVRJQ19NT0RJRklFUl9BTExPV0VEOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJQYXJhbU1vZGVIb2xkZXJUeXBlUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViUGFyYW1Nb2RlSG9sZGVyVHlwZVJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MjNmMDIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJQYXJhbU1vZGVIb2xkZXJUeXBlUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW0uTW9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTG9jYWxWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdlYlBhcmFtTW9kZUhvbGRlclR5cGVSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG1vZGVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgV2ViUGFyYW0uY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCAibW9kZSIsIE1vZGUuT1VUKTsKLQotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChtb2RlVmFsdWVQYWlyKTsKLQotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBXZWJQYXJhbS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG1lbWJlclZhbHVlUGFpcnMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15Q2xhc3MuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiQFdlYlNlcnZpY2UobmFtZT1cIk15Q2xhc3NcIilcbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIE15Q2xhc3Mge1xuXG5cdHB1YmxpYyBTdHJpbmcgbXlNZXRob2QoU3RyaW5nIHBhcmFtKSB7Iik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcblx0XHRyZXR1cm4gXCJ0eHRcIjtcblx0fVxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJQYXJhbU1vZGVIb2xkZXJUeXBlUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoV2ViUGFyYW0uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoIm15TWV0aG9kIiwgbmV3IFN0cmluZ1tdIHsgIlFTdHJpbmc7IiB9KTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgSUxvY2FsVmFyaWFibGUgbG9jYWxWYXJpYWJsZSA9IEFubm90YXRpb25VdGlscy5nZXRMb2NhbFZhcmlhYmxlKG1ldGhvZCwgInBhcmFtIik7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KGxvY2FsVmFyaWFibGUsIFdlYlBhcmFtLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQobG9jYWxWYXJpYWJsZSwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChsb2NhbFZhcmlhYmxlLCBhbm5vdGF0aW9uKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoV2ViUGFyYW0uY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCUEFSQU1fTU9ERV9PVVRfSU5PVVRfSE9MREVSX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Y2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZURlZmF1bHRQdWJsaWNDb25zdHJ1Y3RvclJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VEZWZhdWx0UHVibGljQ29uc3RydWN0b3JSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmE4ZmRmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZURlZmF1bHRQdWJsaWNDb25zdHJ1Y3RvclJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlRGVmYXVsdFB1YmxpY0NvbnN0cnVjdG9yUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBuYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsICJuYW1lIiwgIk15Q2xhc3MiKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgcG9ydE5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgInBvcnROYW1lIiwKLSAgICAgICAgICAgICAgICAiTXlDbGFzc1BvcnQiKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgc2VydmljZU5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAic2VydmljZU5hbWUiLCAiTXlDbGFzc1NlcnZpY2UiKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgdGFyZ2V0TmFtZXNwYWNlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgInRhcmdldE5hbWVzcGFjZSIsICJodHRwOi8vZXhhbXBsZS5jb20vIik7Ci0KLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQobmFtZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHRhcmdldE5hbWVzcGFjZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHBvcnROYW1lVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoc2VydmljZU5hbWVWYWx1ZVBhaXIpOwotCi0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFdlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBNeUNsYXNzIHtcblxuXHRwdWJsaWMgTXlDbGFzcyhTdHJpbmcgYXJnKSB7XG5cdH1cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJNeUNsYXNzLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUiOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJTZXJ2aWNlRGVmYXVsdFB1YmxpY0NvbnN0cnVjdG9yUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgV2ViU2VydmljZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChzb3VyY2UsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KFdlYlNlcnZpY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9ERUZBVUxUX1BVQkxJQ19DT05TVFJVQ1RPUiwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlTm9BYnN0cmFjdE1vZGlmaWVyUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZU5vQWJzdHJhY3RNb2RpZmllclJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMDgzMjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlTm9BYnN0cmFjdE1vZGlmaWVyUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlTm9BYnN0cmFjdE1vZGlmaWVyUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFdlYlNlcnZpY2VQdWJsaWNBYnN0cmFjdEZpbmFsUnVsZVRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTXlDbGFzcyB7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXHRwdWJsaWMgU3RyaW5nIG15TWV0aG9kKCkgeyIgKyAiXG5cdFx0cmV0dXJuIFwidHh0XCI7XG5cdH1cblxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlTm9GaW5hbE1vZGlmZXJSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlTm9GaW5hbE1vZGlmZXJSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmM5MWY3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZU5vRmluYWxNb2RpZmVyUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlTm9GaW5hbE1vZGlmZXJSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0V2ViU2VydmljZVB1YmxpY0Fic3RyYWN0RmluYWxSdWxlVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBmaW5hbCBjbGFzcyBNeUNsYXNzIHtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcdHB1YmxpYyBTdHJpbmcgbXlNZXRob2QoKSB7IiArICJcblx0XHRyZXR1cm4gXCJ0eHRcIjtcblx0fVxuXG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlTm9GaW5hbGl6ZU1ldGhvZFJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VOb0ZpbmFsaXplTWV0aG9kUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg0YzQzMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VOb0ZpbmFsaXplTWV0aG9kUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VOb0ZpbmFsaXplTWV0aG9kUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBuYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsICJuYW1lIiwgIk15Q2xhc3MiKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgcG9ydE5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgInBvcnROYW1lIiwKLSAgICAgICAgICAgICAgICAiTXlDbGFzc1BvcnQiKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgc2VydmljZU5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAic2VydmljZU5hbWUiLCAiTXlDbGFzc1NlcnZpY2UiKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgdGFyZ2V0TmFtZXNwYWNlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgInRhcmdldE5hbWVzcGFjZSIsICJodHRwOi8vZXhhbXBsZS5jb20vIik7Ci0KLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQobmFtZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHRhcmdldE5hbWVzcGFjZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHBvcnROYW1lVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoc2VydmljZU5hbWVWYWx1ZVBhaXIpOwotCi0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFdlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBNeUNsYXNzIHtcblxuXHRwdWJsaWMgdm9pZCBmaW5hbGl6ZSgpIHtcblx0fVxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15Q2xhc3MuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYlNlcnZpY2VOb0ZpbmFsaXplTWV0aG9kUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgV2ViU2VydmljZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChzb3VyY2UsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChXZWJTZXJ2aWNlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfT1ZFUlJJREVfRklOQUxJWkUsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vRW5kcG9pbnRJbnRlcmZhY2VSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9FbmRwb2ludEludGVyZmFjZVJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMGRlMWUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9FbmRwb2ludEludGVyZmFjZVJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlU0VJTm9FbmRwb2ludEludGVyZmFjZVJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCAibmFtZSIsICJNeUNsYXNzIik7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIGVuZHBvaW50SW50ZXJmYWNlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgImVuZHBvaW50SW50ZXJmYWNlIiwgIk15SW50ZXJmYWNlIik7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHRhcmdldE5hbWVzcGFjZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgICJ0YXJnZXROYW1lc3BhY2UiLCAiaHR0cDovL2V4YW1wbGUuY29tLyIpOwotCi0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKG5hbWVWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChlbmRwb2ludEludGVyZmFjZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHRhcmdldE5hbWVzcGFjZVZhbHVlUGFpcik7Ci0KLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG1lbWJlclZhbHVlUGFpcnMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGludGVyZmFjZSBNeUludGVyZmFjZSB7XG5cblx0cHVibGljIFN0cmluZyBteWVNZXRob2QoKTtcblxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15SW50ZXJmYWNlLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUiOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJTZXJ2aWNlU0VJTm9FbmRwb2ludEludGVyZmFjZVJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChzb3VyY2UuZmluZFByaW1hcnlUeXBlKCksIFdlYlNlcnZpY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChzb3VyY2UuZmluZFByaW1hcnlUeXBlKCksIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQoc291cmNlLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoV2ViU2VydmljZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VORFBPSU5USU5URVJGQUNFX1NFSSwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9PbmV3YXlSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9PbmV3YXlSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGM3ZjM3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vT25ld2F5UnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZheC5qd3MuT25ld2F5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VTRUlOb09uZXdheVJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RXZWJTZXJ2aWNlU0VJUnVsZSB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBPbmV3YXkuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViU2VydmljZVNFSVByZXNlbnROb09uZXdheVJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKE9uZXdheS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgibWV0aG9kT25lIiwgbmV3IFN0cmluZ1tdIHsgIlFTdHJpbmc7IiB9KTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQobWV0aG9kLCBPbmV3YXkuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChtZXRob2QsIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoT25ld2F5LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19PTkVXQVksCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vUG9ydE5hbWVSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9Qb3J0TmFtZVJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmOWYwNDUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9Qb3J0TmFtZVJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlU0VJTm9Qb3J0TmFtZVJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCAibmFtZSIsICJNeUNsYXNzIik7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHRhcmdldE5hbWVzcGFjZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgICJ0YXJnZXROYW1lc3BhY2UiLCAiaHR0cDovL2V4YW1wbGUuY29tLyIpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBwb3J0TmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCAicG9ydE5hbWUiLAotICAgICAgICAiTXlDbGFzc1BvcnQiKTsKLQotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChuYW1lVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQodGFyZ2V0TmFtZXNwYWNlVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQocG9ydE5hbWVWYWx1ZVBhaXIpOwotCi0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFdlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBpbnRlcmZhY2UgTXlJbnRlcmZhY2Uge1xuXG5cdHB1YmxpYyBTdHJpbmcgbXllTWV0aG9kKCk7XG5cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJNeUludGVyZmFjZS5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViU2VydmljZVNFSU5vUG9ydE5hbWVSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQoc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBXZWJTZXJ2aWNlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQoc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KHNvdXJjZSwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KFdlYlNlcnZpY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9QT1JUTkFNRV9TRUksCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vU09BUEJpbmRpbmdSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9TT0FQQmluZGluZ1J1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZDFiOTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9TT0FQQmluZGluZ1J1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVNFSU5vU09BUEJpbmRpbmdSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0V2ViU2VydmljZVNFSVJ1bGUgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgU09BUEJpbmRpbmcuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9TT0FQQmluZGluZ09uTWV0aG9kUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmcuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoIm15TWV0aG9kIiwgbmV3IFN0cmluZ1tdIHsgIlFTdHJpbmc7IiB9KTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQobWV0aG9kLCBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KG1ldGhvZCwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fU09BUEJJTkRJTkcsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9TT0FQQmluZGluZ09uVHlwZVJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQoc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChzb3VyY2UsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fU09BUEJJTkRJTkcsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vU2VydmljZU5hbWVSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9TZXJ2aWNlTmFtZVJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MzM1ZmIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9TZXJ2aWNlTmFtZVJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlU0VJTm9TZXJ2aWNlTmFtZVJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCAibmFtZSIsICJNeUNsYXNzIik7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHRhcmdldE5hbWVzcGFjZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgICJ0YXJnZXROYW1lc3BhY2UiLCAiaHR0cDovL2V4YW1wbGUuY29tLyIpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBzZXJ2aWNlTmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgICJzZXJ2aWNlTmFtZSIsICJNeUNsYXNzU2VydmljZSIpOwotCi0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKG5hbWVWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZCh0YXJnZXROYW1lc3BhY2VWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChzZXJ2aWNlTmFtZVZhbHVlUGFpcik7Ci0KLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG1lbWJlclZhbHVlUGFpcnMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGludGVyZmFjZSBNeUludGVyZmFjZSB7XG5cblx0cHVibGljIFN0cmluZyBteWVNZXRob2QoKTtcblxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15SW50ZXJmYWNlLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUiOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJTZXJ2aWNlU0VJTm9TZXJ2aWNlTmFtZVJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChzb3VyY2UuZmluZFByaW1hcnlUeXBlKCksIFdlYlNlcnZpY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChzb3VyY2UuZmluZFByaW1hcnlUeXBlKCksIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQoc291cmNlLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoV2ViU2VydmljZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX1NFUlZJQ0VOQU1FX1NFSSwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9XZWJNZXRob2RSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9XZWJNZXRob2RSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTQ5MjA5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vV2ViTWV0aG9kUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VTRUlOb1dlYk1ldGhvZFJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RXZWJTZXJ2aWNlU0VJUnVsZSB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBXZWJNZXRob2QuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViU2VydmljZVNFSVByZXNlbnROb1dlYk1ldGhvZFJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYk1ldGhvZC5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgibXlNZXRob2QiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiIH0pOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChtZXRob2QsIFdlYk1ldGhvZC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KG1ldGhvZCwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChXZWJNZXRob2QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX1dFQk1FVEhPRFMsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vV2ViUGFyYW1SdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9XZWJQYXJhbVJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4Yjk0YzkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9XZWJQYXJhbVJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklMb2NhbFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VTRUlOb1dlYlBhcmFtUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFdlYlNlcnZpY2VTRUlSdWxlIHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFdlYlBhcmFtLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYlNlcnZpY2VTRUlQcmVzZW50Tm9XZWJQYXJhbVJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlBhcmFtLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJtZXRob2RPbmUiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiIH0pOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgICAgICAgICBJTG9jYWxWYXJpYWJsZSBsb2NhbFZhcmlhYmxlID0gQW5ub3RhdGlvblV0aWxzLmdldExvY2FsVmFyaWFibGUobWV0aG9kLCAiaW4iKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQobG9jYWxWYXJpYWJsZSwgV2ViUGFyYW0uY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChsb2NhbFZhcmlhYmxlLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KGxvY2FsVmFyaWFibGUsIGFubm90YXRpb24pKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChXZWJQYXJhbS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fV0VCUEFSQU0sCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VTRUlOb1dlYlJlc3VsdFJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VTRUlOb1dlYlJlc3VsdFJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMGYyOGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9XZWJSZXN1bHRSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVNFSU5vV2ViUmVzdWx0UnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFdlYlNlcnZpY2VTRUlSdWxlIHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFdlYlJlc3VsdC5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJTZXJ2aWNlU0VJUHJlc2VudE5vV2ViUmVzdWx0UnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoV2ViUmVzdWx0LmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJteU1ldGhvZCIsIG5ldyBTdHJpbmdbXSB7ICJRU3RyaW5nOyIgfSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KG1ldGhvZCwgV2ViUmVzdWx0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQobWV0aG9kLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KG1ldGhvZCwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KFdlYlJlc3VsdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fV0VCUkVTVUxULAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlV2ViU2VydmljZVByb3ZpZGVyQ29FeGlzdFJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VXZWJTZXJ2aWNlUHJvdmlkZXJDb0V4aXN0UnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUwZDM0MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VXZWJTZXJ2aWNlUHJvdmlkZXJDb0V4aXN0UnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlV2ViU2VydmljZVByb3ZpZGVyQ29FeGlzdFJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG51bGwpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlO1xuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXgueG1sLndzLlByb3ZpZGVyO1xuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VQcm92aWRlcjtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJAV2ViU2VydmljZVByb3ZpZGVyXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBNeUNsYXNzIGltcGxlbWVudHMgUHJvdmlkZXI8U291cmNlPiB7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXHRwdWJsaWMgU291cmNlIGludm9rZShTb3VyY2UgYXJnMCkgeyIgKyAiXG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15Q2xhc3MuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYlNlcnZpY2VXZWJTZXJ2aWNlUHJvdmlkZXJDb0V4aXN0UnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgV2ViU2VydmljZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChzb3VyY2UsIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KFdlYlNlcnZpY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9XRUJTRVJWSUNFUFJPVklERVJfQ09NQklOQVRJT04sCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9BYnN0cmFjdEFubm90YXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvQWJzdHJhY3RBbm5vdGF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGZiMzc4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9BYnN0cmFjdEFubm90YXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLnJld3JpdGUuQVNUUmV3cml0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuU2hhcmVkQVNUUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlBlcmZvcm1DaGFuZ2VPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dEZpbGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBbm5vdGF0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcm90ZWN0ZWQgVGVzdEphdmFQcm9qZWN0IHRlc3RKYXZhUHJvamVjdDsKLSAgICBwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2U7Ci0gICAgcHJvdGVjdGVkIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQ7Ci0gICAgcHJvdGVjdGVkIEFTVCBhc3Q7Ci0gICAgcHJvdGVjdGVkIEFTVFJld3JpdGUgcmV3cml0ZXI7Ci0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gYW5ub3RhdGlvbjsKLSAgICBwcm90ZWN0ZWQgVGV4dEZpbGVDaGFuZ2UgdGV4dEZpbGVDaGFuZ2U7Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdEphdmFQcm9qZWN0ID0gbmV3IFRlc3RKYXZhUHJvamVjdCgiSmF2YVByb2plY3QiKTsKLSAgICAgICAgdGVzdEphdmFQcm9qZWN0LnNldEF1dG9CdWlsZGluZyhpc0F1dG9CdWlsZGluZ0VuYWJsZWQoKSk7Ci0gICAgICAgIHRlc3RKYXZhUHJvamVjdC5lbmFibGVBbm5vdGF0aW9uUHJvY2Vzc2luZyhpc0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpKTsKLQotICAgICAgICBzb3VyY2UgPSB0ZXN0SmF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KGdldFBhY2thZ2VOYW1lKCksIGdldENsYXNzTmFtZSgpLCBnZXRDbGFzc0NvbnRlbnRzKCkpOwotCi0gICAgICAgIGNvbXBpbGF0aW9uVW5pdCA9IFNoYXJlZEFTVFByb3ZpZGVyLmdldEFTVChzb3VyY2UsIFNoYXJlZEFTVFByb3ZpZGVyLldBSVRfWUVTLCBudWxsKTsKLSAgICAgICAgYXN0ID0gY29tcGlsYXRpb25Vbml0LmdldEFTVCgpOwotICAgICAgICByZXdyaXRlciA9IEFTVFJld3JpdGUuY3JlYXRlKGFzdCk7Ci0gICAgICAgIGFubm90YXRpb24gPSBnZXRBbm5vdGF0aW9uKCk7Ci0gICAgICAgIHRleHRGaWxlQ2hhbmdlID0gbmV3IFRleHRGaWxlQ2hhbmdlKCJBZGQgYW5ub3RhdGlvbiIsIChJRmlsZSkgc291cmNlLmdldFJlc291cmNlKCkpOwotICAgICAgICBNdWx0aVRleHRFZGl0IG11bHRpVGV4dEVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotICAgICAgICB0ZXh0RmlsZUNoYW5nZS5zZXRFZGl0KG11bHRpVGV4dEVkaXQpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0F1dG9CdWlsZGluZ0VuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKTsKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldENsYXNzTmFtZSgpOwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpOwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKTsKLSAgICAKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBleGVjdXRlQ2hhbmdlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgQ2hhbmdlIGNoYW5nZSkgewotICAgICAgICBpZiAoY2hhbmdlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGNoYW5nZS5pbml0aWFsaXplVmFsaWRhdGlvbkRhdGEobW9uaXRvcik7Ci0KLSAgICAgICAgUGVyZm9ybUNoYW5nZU9wZXJhdGlvbiBjaGFuZ2VPcGVyYXRpb24gPSBuZXcgUGVyZm9ybUNoYW5nZU9wZXJhdGlvbihjaGFuZ2UpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjaGFuZ2VPcGVyYXRpb24ucnVuKG1vbml0b3IpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBjZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2hhbmdlT3BlcmF0aW9uLmNoYW5nZUV4ZWN1dGVkKCk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgCWRlbGV0ZVByb2plY3QodGVzdEphdmFQcm9qZWN0LmdldFByb2plY3QoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRlbGV0ZVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAJaW50IG5vQXR0ZW1wdHMgPSAwOwotICAgIAl3aGlsZSAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuZXhpc3RzKCkgJiYgbm9BdHRlbXB0cyA8IDUpIHsKLSAgICAJCXRyeSB7Ci0gICAgCQkJbm9BdHRlbXB0cysrOwotICAgIAkJCWlmIChwcm9qZWN0LmlzT3BlbigpKSB7Ci0gICAgCQkJCXByb2plY3QuY2xvc2UobnVsbCk7ICAgIAkJCQkKLSAgICAJCQl9Ci0gICAgCQkJcHJvamVjdC5kZWxldGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0gICAgCQl9IGNhdGNoIChSZXNvdXJjZUV4Y2VwdGlvbiByZSkgewotICAgIAkJCVN5c3RlbS5vdXQucHJpbnRsbihyZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgIAkJCVRocmVhZC5zbGVlcCgxKTsKLSAgICAJCX0KLSAgICAJfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9BZGRBbm5vdGF0aW9uVG9GaWVsZFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9BZGRBbm5vdGF0aW9uVG9GaWVsZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFjNjkyZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvQWRkQW5ub3RhdGlvblRvRmllbGRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VSZWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotCi1wdWJsaWMgY2xhc3MgQWRkQW5ub3RhdGlvblRvRmllbGRUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJNeUNsYXNzLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgcmV0dXJuICJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG5wdWJsaWMgY2xhc3MgTXlDbGFzcyB7XG5cblx0c3RhdGljIFN0cmluZyBzZXJ2aWNlO1xuXG59IjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciB3c2RsTG9jYXRpb25WYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAid3NkbExvY2F0aW9uIiwgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4My9TZXJ2aWNlUHJvamVjdC9zZXJ2aXZlcy9NeVNlcnZpY2U/V1NETCIpOwotCi0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHdzZGxMb2NhdGlvblZhbHVlUGFpcik7Ci0KLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgV2ViU2VydmljZVJlZi5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG1lbWJlclZhbHVlUGFpcnMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBbm5vdGF0aW9uVG9GaWVsZCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoV2ViU2VydmljZVJlZi5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElGaWVsZCBmaWVsZCA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRGaWVsZCgic2VydmljZSIpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChmaWVsZCk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KGZpZWxkLCBXZWJTZXJ2aWNlUmVmLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KGZpZWxkLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KGZpZWxkLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChXZWJTZXJ2aWNlUmVmLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9BZGRBbm5vdGF0aW9uVG9NZXRob2RQYXJhbWV0ZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvQWRkQW5ub3RhdGlvblRvTWV0aG9kUGFyYW1ldGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTIyOTViLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9BZGRBbm5vdGF0aW9uVG9NZXRob2RQYXJhbWV0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUxvY2FsVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBBZGRBbm5vdGF0aW9uVG9NZXRob2RQYXJhbWV0ZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJDYWxjdWxhdG9yLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIENhbGN1bGF0b3Ige1xuXG5cdHB1YmxpYyBpbnQgYWRkKGludCBpLCBpbnQgaykgeyIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXG5cdFx0cmV0dXJuIGkgKyBrO1xuXHR9XG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCAibmFtZSIsICJpIik7Ci0KLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQobmFtZVZhbHVlUGFpcik7Ci0KLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgV2ViUGFyYW0uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQW5ub3RhdGlvblRvTWV0aG9kUGFyYW1ldGVyKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJQYXJhbS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgiYWRkIiwgbmV3IFN0cmluZ1tdIHsgIkkiLCAiSSIgfSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIElMb2NhbFZhcmlhYmxlIGxvY2FsVmFyaWFibGUgID0gQW5ub3RhdGlvblV0aWxzLmdldExvY2FsVmFyaWFibGUobWV0aG9kLCAiaSIpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChsb2NhbFZhcmlhYmxlLCBXZWJQYXJhbS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChsb2NhbFZhcmlhYmxlLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KGxvY2FsVmFyaWFibGUsIGFubm90YXRpb24pKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChXZWJQYXJhbS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL0FkZEFubm90YXRpb25Ub01ldGhvZFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9BZGRBbm5vdGF0aW9uVG9NZXRob2RUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZmU2MWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL0FkZEFubm90YXRpb25Ub01ldGhvZFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBBZGRBbm5vdGF0aW9uVG9NZXRob2RUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJDYWxjdWxhdG9yLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIENhbGN1bGF0b3Ige1xuXG5cdHB1YmxpYyBpbnQgYWRkKGludCBpLCBpbnQgaykgeyIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXG5cdFx0cmV0dXJuIGkgKyBrO1xuXHR9XG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgb3BlcmF0aW9uVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgIm9wZXJhdGlvbk5hbWUiLCAiYWRkIik7Ci0KLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQob3BlcmF0aW9uVmFsdWVQYWlyKTsKLQotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBXZWJNZXRob2QuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQW5ub3RhdGlvblRvTWV0aG9kKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJNZXRob2QuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoImFkZCIsIG5ldyBTdHJpbmdbXSB7ICJJIiwgIkkiIH0pOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChtZXRob2QsIFdlYk1ldGhvZC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChtZXRob2QsIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChXZWJNZXRob2QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9BZGRBbm5vdGF0aW9uVG9UeXBlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL0FkZEFubm90YXRpb25Ub1R5cGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NGZhZDMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL0FkZEFubm90YXRpb25Ub1R5cGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBBZGRBbm5vdGF0aW9uVG9UeXBlVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiQ2FsY3VsYXRvci5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBDYWxjdWxhdG9yIHtcblxuXHRwdWJsaWMgaW50IGFkZChpbnQgaSwgaW50IGspIHsiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlxuXHRcdHJldHVybiBpICsgaztcblx0fVxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUKLSAgICAgICAgICAgICAgICAuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgIm5hbWUiLCAiQ2FsY3VsYXRvciIpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciB0YXJnZXROYW1lc3BhY2VWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAidGFyZ2V0TmFtZXNwYWNlIiwgSkRUVXRpbHMuZ2V0VGFyZ2V0TmFtZXNwYWNlRnJvbVBhY2thZ2VOYW1lKGdldFBhY2thZ2VOYW1lKCkpKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgcG9ydE5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgInBvcnROYW1lIiwKLSAgICAgICAgICAgICAgICAiQ2FsY3VsYXRvclBvcnQiKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgc2VydmljZU5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAic2VydmljZU5hbWUiLCAiQ2FsY3VsYXRvclNlcnZpY2UiKTsKLQotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChuYW1lVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQodGFyZ2V0TmFtZXNwYWNlVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQocG9ydE5hbWVWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChzZXJ2aWNlTmFtZVZhbHVlUGFpcik7Ci0KLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG1lbWJlclZhbHVlUGFpcnMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBbm5vdGF0aW9uVG9UeXBlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQoc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBXZWJTZXJ2aWNlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChzb3VyY2UsIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KFdlYlNlcnZpY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9BZGRNZW1iZXJWYWx1ZVBhaXJUb0Fubm90YXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvQWRkTWVtYmVyVmFsdWVQYWlyVG9Bbm5vdGF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmZmNTE5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9BZGRNZW1iZXJWYWx1ZVBhaXJUb0Fubm90YXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0czsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsNCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VSZWY7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklMb2NhbFZhcmlhYmxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsNCi0NCi1wdWJsaWMgY2xhc3MgQWRkTWVtYmVyVmFsdWVQYWlyVG9Bbm5vdGF0aW9uVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblRlc3Qgew0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsNCi0JICAgIHJldHVybiBudWxsOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7DQotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7DQotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlO1xuIik7DQotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7XG4iKTsNCi0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXguandzLldlYlBhcmFtO1xuIik7DQotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUmVmO1xuXG4iKTsNCi0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJAV2ViU2VydmljZSgpXG4iKTsNCi0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgQ2FsY3VsYXRvciB7XG5cbiIpOw0KLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlx0QFdlYlNlcnZpY2VSZWYoKVxuIik7DQotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXHRwdWJsaWMgU3RyaW5nIG15RmllbGQ7XG5cbiIpOw0KLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlx0QFdlYk1ldGhvZCgpXG4iKTsNCi0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcdHB1YmxpYyBpbnQgYWRkKEBXZWJQYXJhbSgpIGludCBpLCBpbnQgaykgeyIpOw0KLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlxuXHRcdHJldHVybiBpICsgaztcblx0fVxufSIpOw0KLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7DQotCQlyZXR1cm4gIkNhbGN1bGF0b3IuamF2YSI7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7DQotCQlyZXR1cm4gImNvbS5leGFtcGxlIjsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEFkZE1lbWJlclZhbHVlUGFpclRvQW5ub3RhdGlvbigpIHsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgLy9AV2ViU2VydmljZQ0KLSAgICAgICAgICAgIElUeXBlIHR5cGUgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChzb3VyY2UsICJXZWJTZXJ2aWNlIikpOw0KLSAgICAgICAgICAgIEFubm90YXRpb24gd2ViU2VydmljZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHR5cGUsIFdlYlNlcnZpY2UuY2xhc3MpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwod2ViU2VydmljZSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh3ZWJTZXJ2aWNlIGluc3RhbmNlb2YgTm9ybWFsQW5ub3RhdGlvbik7DQotDQotICAgICAgICAgICAgTm9ybWFsQW5ub3RhdGlvbiB3ZWJTZXJ2aWNlQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSB3ZWJTZXJ2aWNlOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUod2ViU2VydmljZUFubm90YXRpb24udmFsdWVzKCkuc2l6ZSgpID09IDApOw0KLSAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgIm5hbWUiLCAiQ2FsY3VsYXRvciIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5hZGRNZW1iZXJWYWx1ZVBhaXIod2ViU2VydmljZUFubm90YXRpb24sIG5hbWVWYWx1ZVBhaXIpOw0KLSAgICAgICAgICAgIHdlYlNlcnZpY2VBbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHR5cGUsIFdlYlNlcnZpY2UuY2xhc3MpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUod2ViU2VydmljZUFubm90YXRpb24udmFsdWVzKCkuc2l6ZSgpID09IDEpOw0KLQ0KLSAgICAgICAgICAgIC8vQFdlYlNlcnZpY2VSZWYNCi0gICAgICAgICAgICBJRmllbGQgZmllbGQgPSB0eXBlLmdldEZpZWxkKCJteUZpZWxkIik7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChmaWVsZCwgIldlYlNlcnZpY2VSZWYiKSk7DQotICAgICAgICAgICAgQW5ub3RhdGlvbiB3ZWJTZXJ2aWNlUmVmID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oZmllbGQsIFdlYlNlcnZpY2VSZWYuY2xhc3MpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwod2ViU2VydmljZVJlZik7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh3ZWJTZXJ2aWNlUmVmIGluc3RhbmNlb2YgTm9ybWFsQW5ub3RhdGlvbik7DQotDQotICAgICAgICAgICAgTm9ybWFsQW5ub3RhdGlvbiB3ZWJTZXJ2aWNlUmVmQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSB3ZWJTZXJ2aWNlUmVmOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUod2ViU2VydmljZVJlZkFubm90YXRpb24udmFsdWVzKCkuc2l6ZSgpID09IDApOw0KLSAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG1hcHBlZE5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgIm1hcHBlZE5hbWUiLCAibXlGaWVsZCIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5hZGRNZW1iZXJWYWx1ZVBhaXIod2ViU2VydmljZVJlZkFubm90YXRpb24sIG1hcHBlZE5hbWVWYWx1ZVBhaXIpOw0KLSAgICAgICAgICAgIHdlYlNlcnZpY2VSZWZBbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKGZpZWxkLCBXZWJTZXJ2aWNlUmVmLmNsYXNzKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHdlYlNlcnZpY2VSZWZBbm5vdGF0aW9uLnZhbHVlcygpLnNpemUoKSA9PSAxKTsNCi0NCi0gICAgICAgICAgICAvL0BXZWJNZXRob2QNCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHR5cGUuZ2V0TWV0aG9kKCJhZGQiLCBuZXcgU3RyaW5nW10geyAiSSIsICJJIiB9KTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KG1ldGhvZCwgIldlYk1ldGhvZCIpKTsNCi0gICAgICAgICAgICBBbm5vdGF0aW9uIHdlYk1ldGhvZCA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKG1ldGhvZCwgV2ViTWV0aG9kLmNsYXNzKTsNCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHdlYk1ldGhvZCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh3ZWJNZXRob2QgaW5zdGFuY2VvZiBOb3JtYWxBbm5vdGF0aW9uKTsNCi0NCi0gICAgICAgICAgICBOb3JtYWxBbm5vdGF0aW9uIHdlYk1ldGhvZEFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgd2ViTWV0aG9kOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUod2ViTWV0aG9kQW5ub3RhdGlvbi52YWx1ZXMoKS5zaXplKCkgPT0gMCk7DQotICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgb3BlcmF0aW9uTmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCAib3BlcmF0aW9uTmFtZSIsICJhZGQiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMuYWRkTWVtYmVyVmFsdWVQYWlyKHdlYk1ldGhvZEFubm90YXRpb24sIG9wZXJhdGlvbk5hbWVWYWx1ZVBhaXIpOw0KLSAgICAgICAgICAgIHdlYk1ldGhvZEFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obWV0aG9kLCBXZWJNZXRob2QuY2xhc3MpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUod2ViTWV0aG9kQW5ub3RhdGlvbi52YWx1ZXMoKS5zaXplKCkgPT0gMSk7DQotDQotICAgICAgICAgICAgLy9AV2ViUGFyYW0NCi0gICAgICAgICAgICBJTG9jYWxWYXJpYWJsZSBsb2NhbFZhcmlhYmxlID0gQW5ub3RhdGlvblV0aWxzLmdldExvY2FsVmFyaWFibGUobWV0aG9kLCAiaSIpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobG9jYWxWYXJpYWJsZSwgIldlYlBhcmFtIikpOw0KLSAgICAgICAgICAgIEFubm90YXRpb24gd2ViUGFyYW0gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihsb2NhbFZhcmlhYmxlLCBXZWJQYXJhbS5jbGFzcyk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh3ZWJQYXJhbSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh3ZWJQYXJhbSBpbnN0YW5jZW9mIE5vcm1hbEFubm90YXRpb24pOw0KLQ0KLSAgICAgICAgICAgIE5vcm1hbEFubm90YXRpb24gd2ViUGFyYW1Bbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIHdlYlBhcmFtOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUod2ViUGFyYW1Bbm5vdGF0aW9uLnZhbHVlcygpLnNpemUoKSA9PSAwKTsNCi0gICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciBwYXJ0TmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCAicGFydE5hbWUiLCAiaSIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5hZGRNZW1iZXJWYWx1ZVBhaXIod2ViUGFyYW1Bbm5vdGF0aW9uLCBwYXJ0TmFtZVZhbHVlUGFpcik7DQotICAgICAgICAgICAgd2ViUGFyYW1Bbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKGxvY2FsVmFyaWFibGUsIFdlYlBhcmFtLmNsYXNzKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHdlYlBhcmFtQW5ub3RhdGlvbi52YWx1ZXMoKS5zaXplKCkgPT0gMSk7DQotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7DQotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOw0KLSAgICAgICAgfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9KQVhXU0NvcmVUZXN0U3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9KQVhXU0NvcmVUZXN0U3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJlYmYxNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvSkFYV1NDb3JlVGVzdFN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgSkFYV1NDb3JlVGVzdFN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhXU0NvcmVUZXN0U3VpdGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSkFYV1NDb3JlVGVzdFN1aXRlKCkgewotICAgICAgICBzdXBlcigiSkFYLVdTIENvcmUgVGVzdHMiKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKEFkZEFubm90YXRpb25Ub1R5cGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFJlbW92ZUFubm90YXRpb25Gcm9tVHlwZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoQWRkQW5ub3RhdGlvblRvRmllbGRUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFJlbW92ZUFubm90YXRpb25Gcm9tRmllbGRUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKEFkZEFubm90YXRpb25Ub01ldGhvZFRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoUmVtb3ZlQW5ub3RhdGlvbkZyb21NZXRob2RUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKEFkZEFubm90YXRpb25Ub01ldGhvZFBhcmFtZXRlclRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoUmVtb3ZlQW5ub3RhdGlvbkZyb21NZXRob2RQYXJhbWV0ZXJUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKEFkZE1lbWJlclZhbHVlUGFpclRvQW5ub3RhdGlvblRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoUmVtb3ZlTWVtYmVyVmFsdWVQYWlyVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShVcGRhdGVNZW1iZXJWYWx1ZVBhaXJUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFVwZGF0ZVNpbmdsZU1lbWJlckFubm90YXRpb25UZXN0LmNsYXNzKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9SZW1vdmVBbm5vdGF0aW9uRnJvbUZpZWxkVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL1JlbW92ZUFubm90YXRpb25Gcm9tRmllbGRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYmZkZjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL1JlbW92ZUFubm90YXRpb25Gcm9tRmllbGRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHM7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVJlZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotCi1wdWJsaWMgY2xhc3MgUmVtb3ZlQW5ub3RhdGlvbkZyb21GaWVsZFRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15Q2xhc3MuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VSZWY7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIE15Q2xhc3Mge1xuXG5cdEBXZWJTZXJ2aWNlUmVmKClcblx0c3RhdGljIFN0cmluZyBzZXJ2aWNlO1xuXG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgV2ViU2VydmljZVJlZi5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uRnJvbUZpZWxkKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJTZXJ2aWNlUmVmLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgSUZpZWxkIGZpZWxkID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldEZpZWxkKCJzZXJ2aWNlIik7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGZpZWxkKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChmaWVsZCwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHNvdXJjZS5nZXRJbXBvcnQoV2ViU2VydmljZVJlZi5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlUmVtb3ZlQW5ub3RhdGlvblRleHRFZGl0KGZpZWxkLCBhbm5vdGF0aW9uKSk7Ci0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVSZW1vdmVJbXBvcnRUZXh0RWRpdChmaWVsZCwgV2ViU2VydmljZVJlZi5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEZhbHNlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KGZpZWxkLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKHNvdXJjZS5nZXRJbXBvcnQoV2ViU2VydmljZVJlZi5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL1JlbW92ZUFubm90YXRpb25Gcm9tTWV0aG9kUGFyYW1ldGVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL1JlbW92ZUFubm90YXRpb25Gcm9tTWV0aG9kUGFyYW1ldGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDcwYjE0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9SZW1vdmVBbm5vdGF0aW9uRnJvbU1ldGhvZFBhcmFtZXRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0czsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklMb2NhbFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLQotcHVibGljIGNsYXNzIFJlbW92ZUFubm90YXRpb25Gcm9tTWV0aG9kUGFyYW1ldGVyVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiQ2FsY3VsYXRvci5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIENhbGN1bGF0b3Ige1xuXG5cdHB1YmxpYyBpbnQgYWRkKEBXZWJQYXJhbShuYW1lPVwiaVwiKSIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW50IGksIGludCBrKSB7XG5cdFx0cmV0dXJuIGkgKyBrO1xuXHR9XG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgV2ViUGFyYW0uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbkZyb21NZXRob2RQYXJhbWV0ZXIoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlBhcmFtLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJhZGQiLCBuZXcgU3RyaW5nW10geyAiSSIsICJJIiB9KTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgSUxvY2FsVmFyaWFibGUgbG9jYWxWYXJpYWJsZSA9IEFubm90YXRpb25VdGlscy5nZXRMb2NhbFZhcmlhYmxlKG1ldGhvZCwgImkiKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChsb2NhbFZhcmlhYmxlLCBhbm5vdGF0aW9uKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHNvdXJjZS5nZXRJbXBvcnQoV2ViUGFyYW0uY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZVJlbW92ZUFubm90YXRpb25UZXh0RWRpdChsb2NhbFZhcmlhYmxlLCBhbm5vdGF0aW9uKSk7Ci0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVSZW1vdmVJbXBvcnRUZXh0RWRpdChsb2NhbFZhcmlhYmxlLCBXZWJQYXJhbS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEZhbHNlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KGxvY2FsVmFyaWFibGUsIGFubm90YXRpb24pKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKHNvdXJjZS5nZXRJbXBvcnQoV2ViUGFyYW0uY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvUmVtb3ZlQW5ub3RhdGlvbkZyb21NZXRob2RUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvUmVtb3ZlQW5ub3RhdGlvbkZyb21NZXRob2RUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MmExYTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL1JlbW92ZUFubm90YXRpb25Gcm9tTWV0aG9kVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzOwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLQotcHVibGljIGNsYXNzIFJlbW92ZUFubm90YXRpb25Gcm9tTWV0aG9kVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiQ2FsY3VsYXRvci5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBDYWxjdWxhdG9yIHtcblxuXHRAV2ViTWV0aG9kXG5cdHB1YmxpYyBpbnQgYWRkKGludCBpLCBpbnQgaykgeyIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXG5cdFx0cmV0dXJuIGkgKyBrO1xuXHR9XG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgV2ViTWV0aG9kLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb25Gcm9tTWV0aG9kKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJNZXRob2QuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoImFkZCIsIG5ldyBTdHJpbmdbXSB7ICJJIiwgIkkiIH0pOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KG1ldGhvZCwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChzb3VyY2UuZ2V0SW1wb3J0KFdlYk1ldGhvZC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlUmVtb3ZlQW5ub3RhdGlvblRleHRFZGl0KG1ldGhvZCwgYW5ub3RhdGlvbikpOwotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlUmVtb3ZlSW1wb3J0VGV4dEVkaXQobWV0aG9kLCBXZWJNZXRob2QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRGYWxzZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKHNvdXJjZS5nZXRJbXBvcnQoV2ViTWV0aG9kLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvUmVtb3ZlQW5ub3RhdGlvbkZyb21UeXBlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL1JlbW92ZUFubm90YXRpb25Gcm9tVHlwZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkzMzdkNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvUmVtb3ZlQW5ub3RhdGlvbkZyb21UeXBlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzOwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotCi1wdWJsaWMgY2xhc3MgUmVtb3ZlQW5ub3RhdGlvbkZyb21UeXBlVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiTXlDbGFzcy5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJAV2ViU2VydmljZShuYW1lPVwiTXlDbGFzc1wiLCBlbmRwb2ludEludGVyZmFjZT1cIk15SW50ZXJmYWNlXCIsICIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgidGFyZ2V0TmFtZXNwYWNlPVwiaHR0cDovL2V4YW1wbGUuY29tL1wiLCBwb3J0TmFtZT1cIk15Q2xhc3NQb3J0XCIsICIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgic2VydmljZU5hbWU9XCJNeUNsYXNzU2VydmljZVwiKVxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgTXlDbGFzcyB7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXHRwdWJsaWMgU3RyaW5nIG15TWV0aG9kKCkgeyIgKyAiXG5cdFx0cmV0dXJuIFwidHh0XCI7XG5cdH1cblxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFdlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbkZyb21UeXBlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChzb3VyY2UsIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChzb3VyY2UuZ2V0SW1wb3J0KFdlYlNlcnZpY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZVJlbW92ZUFubm90YXRpb25UZXh0RWRpdChzb3VyY2UuZmluZFByaW1hcnlUeXBlKCksIGFubm90YXRpb24pKTsKLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZVJlbW92ZUltcG9ydFRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgV2ViU2VydmljZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEZhbHNlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KHNvdXJjZSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShzb3VyY2UuZ2V0SW1wb3J0KFdlYlNlcnZpY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9SZW1vdmVNZW1iZXJWYWx1ZVBhaXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvUmVtb3ZlTWVtYmVyVmFsdWVQYWlyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDAzMmY0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9SZW1vdmVNZW1iZXJWYWx1ZVBhaXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHM7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLQotcHVibGljIGNsYXNzIFJlbW92ZU1lbWJlclZhbHVlUGFpclRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIkBXZWJTZXJ2aWNlKG5hbWU9XCJDYWxjdWxhdG9yXCIpXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBDYWxjdWxhdG9yIHtcbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJDYWxjdWxhdG9yLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUiOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVNZW1iZXJWYWx1ZVBhaXJGcm9tQW5ub3RhdGlvbigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElUeXBlIHR5cGUgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KHNvdXJjZSwgIldlYlNlcnZpY2UiKSk7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uIHdlYlNlcnZpY2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbih0eXBlLCBXZWJTZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwod2ViU2VydmljZSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHdlYlNlcnZpY2UgaW5zdGFuY2VvZiBOb3JtYWxBbm5vdGF0aW9uKTsKLQotICAgICAgICAgICAgTm9ybWFsQW5ub3RhdGlvbiB3ZWJTZXJ2aWNlQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSB3ZWJTZXJ2aWNlOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh3ZWJTZXJ2aWNlQW5ub3RhdGlvbi52YWx1ZXMoKS5zaXplKCkgPT0gMSk7Ci0KLSAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciBuYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvblV0aWxzLmdldE1lbWJlclZhbHVlUGFpcih3ZWJTZXJ2aWNlQW5ub3RhdGlvbiwgIm5hbWUiKTsKLQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLnJlbW92ZU1lbWJlclZhbHVlUGFpcih3ZWJTZXJ2aWNlQW5ub3RhdGlvbiwgbmFtZVZhbHVlUGFpcik7Ci0gICAgICAgICAgICB3ZWJTZXJ2aWNlQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbih0eXBlLCBXZWJTZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUod2ViU2VydmljZUFubm90YXRpb24udmFsdWVzKCkuc2l6ZSgpID09IDApOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9UZXN0SmF2YVByb2plY3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9UZXN0SmF2YVByb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEwYjViOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvVGVzdEphdmFQcm9qZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZS51dGlsLkFwdENvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotCi1wdWJsaWMgY2xhc3MgVGVzdEphdmFQcm9qZWN0IGV4dGVuZHMgVGVzdFByb2plY3QgewotICAgIHByaXZhdGUgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0OwotICAgIAotICAgIHB1YmxpYyBUZXN0SmF2YVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKHByb2plY3ROYW1lKTsKLSAgICAgICAgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUoZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgYWRkUHJvamVjdE5hdHVyZShnZXRQcm9qZWN0KCksIEphdmFDb3JlLk5BVFVSRV9JRCk7Ci0KLSAgICAgICAgamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ldyBJQ2xhc3NwYXRoRW50cnlbMF0sIG51bGwpOwotCi0gICAgICAgIGNyZWF0ZVNvdXJjZUZvbGRlcigpOwotICAgICAgICBhZGRUb0NsYXNzcGF0aChqYXZhUHJvamVjdCwgZ2V0SlJFQ29udGFpbmVyRW50cnkoKSk7Ci0gICAgICAgIGNyZWF0ZU91dHB1dEZvbGRlcigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRBdXRvQnVpbGRpbmcoYm9vbGVhbiBhdXRvQnVpbGQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSVdvcmtzcGFjZURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGRlc2NyaXB0aW9uLnNldEF1dG9CdWlsZGluZyhhdXRvQnVpbGQpOwotICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBlbmFibGVBbm5vdGF0aW9uUHJvY2Vzc2luZyhib29sZWFuIGVuYWJsZSkgewotICAgICAgICBBcHRDb25maWcuc2V0RW5hYmxlZChqYXZhUHJvamVjdCwgZW5hYmxlKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBJQ2xhc3NwYXRoRW50cnkgZ2V0SlJFQ29udGFpbmVyRW50cnkoKSB7Ci0gICAgICAgIElWTUluc3RhbGwgZGVmYXVsdFZNSW5zdGFsbCA9IEphdmFSdW50aW1lLmdldERlZmF1bHRWTUluc3RhbGwoKTsKLSAgICAgICAgaWYgKGRlZmF1bHRWTUluc3RhbGwgIT0gbnVsbCAmJiBpc0phdmE2T3JHcmVhdGVySlJFKGRlZmF1bHRWTUluc3RhbGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gSmF2YVJ1bnRpbWUuZ2V0RGVmYXVsdEpSRUNvbnRhaW5lckVudHJ5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIElWTUluc3RhbGxUeXBlW10gaW5zdGFsbFR5cGVzID0gSmF2YVJ1bnRpbWUuZ2V0Vk1JbnN0YWxsVHlwZXMoKTsKLSAgICAgICAgZm9yIChJVk1JbnN0YWxsVHlwZSBpbnN0YWxsVHlwZSA6IGluc3RhbGxUeXBlcykgewotICAgICAgICAgICAgSVZNSW5zdGFsbFtdIHZtSW5zdGFsbHMgPSBpbnN0YWxsVHlwZS5nZXRWTUluc3RhbGxzKCk7Ci0gICAgICAgICAgICBmb3IgKElWTUluc3RhbGwgdm1JbnN0YWxsIDogdm1JbnN0YWxscykgewotICAgICAgICAgICAgICAgIGlmIChpc0phdmE2T3JHcmVhdGVySlJFKHZtSW5zdGFsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEphdmFDb3JlLm5ld0NvbnRhaW5lckVudHJ5KEphdmFSdW50aW1lLm5ld0pSRUNvbnRhaW5lclBhdGgoaW5zdGFsbFR5cGUuZ2V0SWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bUluc3RhbGwuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gSmF2YVJ1bnRpbWUuZ2V0RGVmYXVsdEpSRUNvbnRhaW5lckVudHJ5KCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc0phdmE2T3JHcmVhdGVySlJFKElWTUluc3RhbGwgdm1JbnN0YWxsKSB7Ci0gICAgICAgIGlmICh2bUluc3RhbGwgaW5zdGFuY2VvZiBJVk1JbnN0YWxsMikgewotICAgICAgICAgICAgSVZNSW5zdGFsbDIgdm1JbnN0YWxsMiA9IChJVk1JbnN0YWxsMikgdm1JbnN0YWxsOwotICAgICAgICAgICAgaWYgKHZtSW5zdGFsbDIuZ2V0SmF2YVZlcnNpb24oKS5jb21wYXJlVG8oSmF2YUNvcmUuVkVSU0lPTl8xXzYpID4gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVDb21waWxhdGlvblVuaXQoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGNvbnRlbnRzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldFBhY2thZ2VGcmFnbWVudChwYWNrYWdlTmFtZSkuY3JlYXRlQ29tcGlsYXRpb25Vbml0KG5hbWUsIGNvbnRlbnRzLCBmYWxzZSwgbW9uaXRvcik7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgSVBhY2thZ2VGcmFnbWVudCBnZXRQYWNrYWdlRnJhZ21lbnQoU3RyaW5nIHBhY2thZ2VOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKS5jcmVhdGVQYWNrYWdlRnJhZ21lbnQocGFja2FnZU5hbWUsIHRydWUsIG1vbml0b3IpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIElQYWNrYWdlRnJhZ21lbnRSb290IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKSB7Ci0gICAgICAgIHJldHVybiBnZXRKYXZhUHJvamVjdCgpLmdldFBhY2thZ2VGcmFnbWVudFJvb3QoZ2V0UHJvamVjdCgpLmdldEZvbGRlcigic3JjIikpOyAgICAgCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVTb3VyY2VGb2xkZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElGb2xkZXIgc3JjRGlyID0gZ2V0UHJvamVjdCgpLmdldEZvbGRlcigic3JjIik7Ci0gICAgICAgIG1rZGlycyhzcmNEaXIpOyAgICAKLSAgICAgICAgYWRkVG9DbGFzc3BhdGgoamF2YVByb2plY3QsIEphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KHNyY0Rpci5nZXRGdWxsUGF0aCgpKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZU91dHB1dEZvbGRlcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSUZvbGRlciBvdXRwdXREaXIgPSBnZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJiaW4iKTsKLSAgICAgICAgbWtkaXJzKG91dHB1dERpcik7Ci0gICAgICAgIGdldEphdmFQcm9qZWN0KCkuc2V0T3V0cHV0TG9jYXRpb24ob3V0cHV0RGlyLmdldEZ1bGxQYXRoKCksIG1vbml0b3IpOwotICAgIH0KLQotICAgIHB1YmxpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0gICAgICAgIHJldHVybiBqYXZhUHJvamVjdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkVG9DbGFzc3BhdGgoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBJQ2xhc3NwYXRoRW50cnkgY2xhc3NwYXRoRW50cnkpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElDbGFzc3BhdGhFbnRyeVtdIGN1cnJlbnRDbGFzc3BhdGhFbnRyaWVzID0gamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0gICAgICAgICAgICBJQ2xhc3NwYXRoRW50cnlbXSBuZXdDbGFzc3BhdGhFbnRyaWVzID0gbmV3IElDbGFzc3BhdGhFbnRyeVtjdXJyZW50Q2xhc3NwYXRoRW50cmllcy5sZW5ndGggKyAxXTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY3VycmVudENsYXNzcGF0aEVudHJpZXMsIDAsIG5ld0NsYXNzcGF0aEVudHJpZXMsIDAsIAotICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3NwYXRoRW50cmllcy5sZW5ndGgpOwotICAgICAgICAgICAgbmV3Q2xhc3NwYXRoRW50cmllc1tjdXJyZW50Q2xhc3NwYXRoRW50cmllcy5sZW5ndGhdID0gY2xhc3NwYXRoRW50cnk7Ci0gICAgICAgICAgICBqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3Q2xhc3NwYXRoRW50cmllcywgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIGptZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL1Rlc3RQcm9qZWN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvVGVzdFByb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNkZWFlOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvVGVzdFByb2plY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0UHJvamVjdCB7Ci0gICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQotICAgIHByaXZhdGUgSVByb2plY3QgdGVzdFByb2plY3Q7Ci0gICAgCi0gICAgcHVibGljIFRlc3RQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICAgICAgdGVzdFByb2plY3QgPSB3b3Jrc3BhY2VSb290LmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICB0ZXN0UHJvamVjdC5jcmVhdGUobW9uaXRvcik7Ci0gICAgICAgIHRlc3RQcm9qZWN0Lm9wZW4obW9uaXRvcik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotICAgICAgICByZXR1cm4gdGVzdFByb2plY3Q7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZFByb2plY3ROYXR1cmUoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIG5hdHVyZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSVByb2plY3REZXNjcmlwdGlvbiBwcm9qZWN0RGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBwcmV2aW91c05hdHVyZXMgPSBwcm9qZWN0RGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBuZXdOYXR1cmVzID0gbmV3IFN0cmluZ1twcmV2aW91c05hdHVyZXMubGVuZ3RoICsgMV07Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHByZXZpb3VzTmF0dXJlcywgMCwgbmV3TmF0dXJlcywgMCwgcHJldmlvdXNOYXR1cmVzLmxlbmd0aCk7Ci0gICAgICAgICAgICBuZXdOYXR1cmVzW3ByZXZpb3VzTmF0dXJlcy5sZW5ndGhdID0gbmF0dXJlOwotICAgICAgICAgICAgcHJvamVjdERlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhuZXdOYXR1cmVzKTsKLSAgICAgICAgICAgIHByb2plY3Quc2V0RGVzY3JpcHRpb24ocHJvamVjdERlc2NyaXB0aW9uLCBudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgY2UucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgbWtkaXJzKGZpbmFsIElGb2xkZXIgZm9sZGVyKSB7Ci0gICAgCXRyeSB7Ci0JICAgICAgICBpZiAoIWZvbGRlci5leGlzdHMoKSAmJiBmb2xkZXIuZ2V0UGFyZW50KCkuaXNBY2Nlc3NpYmxlKCkpIHsKLQkgICAgICAgICAgICBmb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG51bGwpOwotCSAgICAgICAgfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQljZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9VcGRhdGVNZW1iZXJWYWx1ZVBhaXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvVXBkYXRlTWVtYmVyVmFsdWVQYWlyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWRhZjFhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9VcGRhdGVNZW1iZXJWYWx1ZVBhaXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzOwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VSZWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUxvY2FsVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TdHJpbmdMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBVcGRhdGVNZW1iZXJWYWx1ZVBhaXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTtcbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7XG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07XG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVJlZjtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJAV2ViU2VydmljZShuYW1lPVwiQ2FsY3VsYXRvclwiKVxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgQ2FsY3VsYXRvciB7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXHRAV2ViU2VydmljZVJlZihtYXBwZWROYW1lPVwibXlGaWVsZFwiKVxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcdHB1YmxpYyBTdHJpbmcgbXlGaWVsZDtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcdEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZT1cImFkZFwiKVxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcdHB1YmxpYyBpbnQgYWRkKEBXZWJQYXJhbShwYXJ0TmFtZT1cImlcIikgaW50IGksIGludCBrKSB7Iik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcblx0XHRyZXR1cm4gaSArIGs7XG5cdH1cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJDYWxjdWxhdG9yLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUiOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNZW1iZXJWYWx1ZVBhaXIoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvL0BXZWJTZXJ2aWNlCi0gICAgICAgICAgICBJVHlwZSB0eXBlID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChzb3VyY2UsICJXZWJTZXJ2aWNlIikpOwotICAgICAgICAgICAgQW5ub3RhdGlvbiB3ZWJTZXJ2aWNlID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24odHlwZSwgV2ViU2VydmljZS5jbGFzcyk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHdlYlNlcnZpY2UpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh3ZWJTZXJ2aWNlIGluc3RhbmNlb2YgTm9ybWFsQW5ub3RhdGlvbik7Ci0KLSAgICAgICAgICAgIE5vcm1hbEFubm90YXRpb24gd2ViU2VydmljZUFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgd2ViU2VydmljZTsKLSAgICAgICAgICAgIGFzc2VydFRydWUod2ViU2VydmljZUFubm90YXRpb24udmFsdWVzKCkuc2l6ZSgpID09IDEpOwotCi0gICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25VdGlscy5nZXRNZW1iZXJWYWx1ZVBhaXIod2ViU2VydmljZUFubm90YXRpb24sICJuYW1lIik7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG5hbWVWYWx1ZVBhaXIpOwotICAgICAgICAgICAgU3RyaW5nTGl0ZXJhbCBuYW1lVmFsdWUgPSAgKFN0cmluZ0xpdGVyYWwpIG5hbWVWYWx1ZVBhaXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobmFtZVZhbHVlLmdldExpdGVyYWxWYWx1ZSgpLmVxdWFscygiQ2FsY3VsYXRvciIpKTsKLQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLnVwZGF0ZU1lbWJlclZhbHVlUGFpcihuYW1lVmFsdWVQYWlyLCBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTGl0ZXJhbChhc3QsICJTY2llbnRpZmljQ2FsY3VsYXRvciIpKTsKLSAgICAgICAgICAgIHdlYlNlcnZpY2VBbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHR5cGUsIFdlYlNlcnZpY2UuY2xhc3MpOwotICAgICAgICAgICAgbmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25VdGlscy5nZXRNZW1iZXJWYWx1ZVBhaXIod2ViU2VydmljZUFubm90YXRpb24sICJuYW1lIik7Ci0gICAgICAgICAgICBuYW1lVmFsdWUgPSAgKFN0cmluZ0xpdGVyYWwpIG5hbWVWYWx1ZVBhaXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobmFtZVZhbHVlLmdldExpdGVyYWxWYWx1ZSgpLmVxdWFscygiU2NpZW50aWZpY0NhbGN1bGF0b3IiKSk7Ci0KLSAgICAgICAgICAgIC8vQFdlYlNlcnZpY2VSZWYKLSAgICAgICAgICAgIElGaWVsZCBmaWVsZCA9IHR5cGUuZ2V0RmllbGQoIm15RmllbGQiKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQoZmllbGQsICJXZWJTZXJ2aWNlUmVmIikpOwotICAgICAgICAgICAgQW5ub3RhdGlvbiB3ZWJTZXJ2aWNlUmVmID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oZmllbGQsIFdlYlNlcnZpY2VSZWYuY2xhc3MpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh3ZWJTZXJ2aWNlUmVmKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUod2ViU2VydmljZVJlZiBpbnN0YW5jZW9mIE5vcm1hbEFubm90YXRpb24pOwotCi0gICAgICAgICAgICBOb3JtYWxBbm5vdGF0aW9uIHdlYlNlcnZpY2VSZWZBbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIHdlYlNlcnZpY2VSZWY7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHdlYlNlcnZpY2VSZWZBbm5vdGF0aW9uLnZhbHVlcygpLnNpemUoKSA9PSAxKTsKLQotICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG1hcHBlZE5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0TWVtYmVyVmFsdWVQYWlyKHdlYlNlcnZpY2VSZWZBbm5vdGF0aW9uLCAibWFwcGVkTmFtZSIpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtYXBwZWROYW1lVmFsdWVQYWlyKTsKLSAgICAgICAgICAgIFN0cmluZ0xpdGVyYWwgbWFwcGVkTmFtZVZhbHVlID0gIChTdHJpbmdMaXRlcmFsKSBtYXBwZWROYW1lVmFsdWVQYWlyLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1hcHBlZE5hbWVWYWx1ZS5nZXRMaXRlcmFsVmFsdWUoKS5lcXVhbHMoIm15RmllbGQiKSk7Ci0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy51cGRhdGVNZW1iZXJWYWx1ZVBhaXIobWFwcGVkTmFtZVZhbHVlUGFpciwgQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ0xpdGVyYWwoYXN0LCAiYW5vdGhlckZpZWxkIikpOwotICAgICAgICAgICAgd2ViU2VydmljZVJlZkFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oZmllbGQsIFdlYlNlcnZpY2VSZWYuY2xhc3MpOwotICAgICAgICAgICAgbWFwcGVkTmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25VdGlscy5nZXRNZW1iZXJWYWx1ZVBhaXIod2ViU2VydmljZVJlZkFubm90YXRpb24sICJtYXBwZWROYW1lIik7Ci0gICAgICAgICAgICBtYXBwZWROYW1lVmFsdWUgPSAgKFN0cmluZ0xpdGVyYWwpIG1hcHBlZE5hbWVWYWx1ZVBhaXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobWFwcGVkTmFtZVZhbHVlLmdldExpdGVyYWxWYWx1ZSgpLmVxdWFscygiYW5vdGhlckZpZWxkIikpOwotCi0gICAgICAgICAgICAvL0BXZWJNZXRob2QKLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gdHlwZS5nZXRNZXRob2QoImFkZCIsIG5ldyBTdHJpbmdbXSB7ICJJIiwgIkkiIH0pOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsICJXZWJNZXRob2QiKSk7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uIHdlYk1ldGhvZCA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKG1ldGhvZCwgV2ViTWV0aG9kLmNsYXNzKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwod2ViTWV0aG9kKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUod2ViTWV0aG9kIGluc3RhbmNlb2YgTm9ybWFsQW5ub3RhdGlvbik7Ci0KLSAgICAgICAgICAgIE5vcm1hbEFubm90YXRpb24gd2ViTWV0aG9kQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSB3ZWJNZXRob2Q7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHdlYk1ldGhvZEFubm90YXRpb24udmFsdWVzKCkuc2l6ZSgpID09IDEpOwotCi0gICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgb3BlcmF0aW9uTmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25VdGlscy5nZXRNZW1iZXJWYWx1ZVBhaXIod2ViTWV0aG9kQW5ub3RhdGlvbiwgIm9wZXJhdGlvbk5hbWUiKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwob3BlcmF0aW9uTmFtZVZhbHVlUGFpcik7Ci0gICAgICAgICAgICBTdHJpbmdMaXRlcmFsIG9wZXJhdGlvbk5hbWVWYWx1ZSA9ICAoU3RyaW5nTGl0ZXJhbCkgb3BlcmF0aW9uTmFtZVZhbHVlUGFpci5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShvcGVyYXRpb25OYW1lVmFsdWUuZ2V0TGl0ZXJhbFZhbHVlKCkuZXF1YWxzKCJhZGQiKSk7Ci0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy51cGRhdGVNZW1iZXJWYWx1ZVBhaXIob3BlcmF0aW9uTmFtZVZhbHVlUGFpciwgQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ0xpdGVyYWwoYXN0LCAibXVsdGlwbHkiKSk7Ci0gICAgICAgICAgICB3ZWJNZXRob2RBbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKG1ldGhvZCwgV2ViTWV0aG9kLmNsYXNzKTsKLSAgICAgICAgICAgIG9wZXJhdGlvbk5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0TWVtYmVyVmFsdWVQYWlyKHdlYk1ldGhvZEFubm90YXRpb24sICJvcGVyYXRpb25OYW1lIik7Ci0gICAgICAgICAgICBvcGVyYXRpb25OYW1lVmFsdWUgPSAgKFN0cmluZ0xpdGVyYWwpIG9wZXJhdGlvbk5hbWVWYWx1ZVBhaXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUob3BlcmF0aW9uTmFtZVZhbHVlLmdldExpdGVyYWxWYWx1ZSgpLmVxdWFscygibXVsdGlwbHkiKSk7Ci0KLSAgICAgICAgICAgIC8vQFdlYlBhcmFtCi0gICAgICAgICAgICBJTG9jYWxWYXJpYWJsZSBsb2NhbFZhcmlhYmxlID0gQW5ub3RhdGlvblV0aWxzLmdldExvY2FsVmFyaWFibGUobWV0aG9kLCAiaSIpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChsb2NhbFZhcmlhYmxlLCAiV2ViUGFyYW0iKSk7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uIHdlYlBhcmFtID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obG9jYWxWYXJpYWJsZSwgV2ViUGFyYW0uY2xhc3MpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh3ZWJQYXJhbSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHdlYlBhcmFtIGluc3RhbmNlb2YgTm9ybWFsQW5ub3RhdGlvbik7Ci0KLSAgICAgICAgICAgIE5vcm1hbEFubm90YXRpb24gd2ViUGFyYW1Bbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIHdlYlBhcmFtOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh3ZWJQYXJhbUFubm90YXRpb24udmFsdWVzKCkuc2l6ZSgpID09IDEpOwotCi0gICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgcGFydE5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0TWVtYmVyVmFsdWVQYWlyKHdlYlBhcmFtQW5ub3RhdGlvbiwgInBhcnROYW1lIik7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHBhcnROYW1lVmFsdWVQYWlyKTsKLSAgICAgICAgICAgIFN0cmluZ0xpdGVyYWwgcGFydE5hbWVWYWx1ZSA9ICAoU3RyaW5nTGl0ZXJhbCkgcGFydE5hbWVWYWx1ZVBhaXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUocGFydE5hbWVWYWx1ZS5nZXRMaXRlcmFsVmFsdWUoKS5lcXVhbHMoImkiKSk7Ci0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy51cGRhdGVNZW1iZXJWYWx1ZVBhaXIocGFydE5hbWVWYWx1ZVBhaXIsIEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdMaXRlcmFsKGFzdCwgImlpaSIpKTsKLSAgICAgICAgICAgIHdlYlBhcmFtQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihsb2NhbFZhcmlhYmxlLCBXZWJQYXJhbS5jbGFzcyk7Ci0gICAgICAgICAgICBwYXJ0TmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25VdGlscy5nZXRNZW1iZXJWYWx1ZVBhaXIod2ViUGFyYW1Bbm5vdGF0aW9uLCAicGFydE5hbWUiKTsKLSAgICAgICAgICAgIHBhcnROYW1lVmFsdWUgPSAgKFN0cmluZ0xpdGVyYWwpIHBhcnROYW1lVmFsdWVQYWlyLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHBhcnROYW1lVmFsdWUuZ2V0TGl0ZXJhbFZhbHVlKCkuZXF1YWxzKCJpaWkiKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL1VwZGF0ZVNpbmdsZU1lbWJlckFubm90YXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvVXBkYXRlU2luZ2xlTWVtYmVyQW5ub3RhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlkYTE0Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvVXBkYXRlU2luZ2xlTWVtYmVyQW5ub3RhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0czsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nVHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TdHJpbmdMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBVcGRhdGVTaW5nbGVNZW1iZXJBbm5vdGF0aW9uVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdUeXBlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIkBCaW5kaW5nVHlwZShcImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC9odHRwXCIpXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBDYWxjdWxhdG9yIHtcblxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIkNhbGN1bGF0b3IuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNpbmdsZU1lbWJlckFubm90YXRpb24oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJVHlwZSB0eXBlID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChzb3VyY2UsICJCaW5kaW5nVHlwZSIpKTsKLSAgICAgICAgICAgIEFubm90YXRpb24gYmluZGluZ1R5cGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbih0eXBlLCBCaW5kaW5nVHlwZS5jbGFzcyk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGJpbmRpbmdUeXBlKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYmluZGluZ1R5cGUgaW5zdGFuY2VvZiBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKTsKLQotICAgICAgICAgICAgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBiaW5kaW5nVHlwZUFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgYmluZGluZ1R5cGU7Ci0gICAgICAgICAgICBTdHJpbmdMaXRlcmFsIGJpbmRpbmdUeXBlVmFsdWUgPSAoU3RyaW5nTGl0ZXJhbCkgYmluZGluZ1R5cGVBbm5vdGF0aW9uLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGJpbmRpbmdUeXBlVmFsdWUuZ2V0TGl0ZXJhbFZhbHVlKCkuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvaHR0cCIpKTsKLQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLnVwZGF0ZVNpbmdsZU1lbWJlckFubm90YXRpb24oYmluZGluZ1R5cGVBbm5vdGF0aW9uLCBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTGl0ZXJhbChhc3QsICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAvYmluZGluZ3MvSFRUUC8iKSk7Ci0gICAgICAgICAgICBiaW5kaW5nVHlwZUFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24odHlwZSwgQmluZGluZ1R5cGUuY2xhc3MpOwotICAgICAgICAgICAgYmluZGluZ1R5cGVWYWx1ZSA9IChTdHJpbmdMaXRlcmFsKSBiaW5kaW5nVHlwZUFubm90YXRpb24uZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYmluZGluZ1R5cGVWYWx1ZS5nZXRMaXRlcmFsVmFsdWUoKS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC9iaW5kaW5ncy9IVFRQLyIpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJkMWE0MzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzUzNjc1Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZTA0ODRlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jTW9uIEp1bCAyMCAxNToyNTozMSBFRVNUIDIwMDkNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZWQ2MjI3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyDQotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wDQotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMA0KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMNCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4NCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyDQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41DQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwNCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24sDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscywNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscywNCi0gb3JnLmptb2NrLA0KLSBvcmcuZWNsaXBzZS5qZHQuY29yZSwNCi0gb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLA0KLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLA0KLSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLA0KLSBvcmcuZWNsaXBzZS51aS5pZGUsDQotIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLA0KLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LA0KLSBvcmcuZWNsaXBzZS5qZHQudWksDQotIG9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZQ0KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLmRvbSwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy5uYXZpZ2F0b3IsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMubmF2aWdhdG9yLmFjdGlvbnMNCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYjdhY2UuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkF1Z3VzdCAyMCwgMjAwOTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2M4OGVmZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcw0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMjQ0MzBiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotQnVuZGxlLU5hbWUuMD1KQVgtV1MgRE9NIEludGVncmF0aW9uIFRlc3RzDQotQnVuZGxlLVZlbmRvci4wPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtDQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi90ZXN0cy9kb20vQWxsVGVzdHNTdWl0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi90ZXN0cy9kb20vQWxsVGVzdHNTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ODc1MDJmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vdGVzdHMvZG9tL0FsbFRlc3RzU3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy5kb207DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLm5hdmlnYXRvci5ET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlclRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMubmF2aWdhdG9yLkRPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlclRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMubmF2aWdhdG9yLkRPTVByb3BlcnR5Vmlld0FkYXB0ZXJGYWN0b3J5VGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy5uYXZpZ2F0b3IuV2ViU2VydmljZURlY29yYXRvclRlc3Q7DQotDQotcHVibGljIGNsYXNzIEFsbFRlc3RzU3VpdGUNCi17DQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotCXsNCi0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsNCi0NCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlclRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKERPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlclRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKERPTVByb3BlcnR5Vmlld0FkYXB0ZXJGYWN0b3J5VGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoV2ViU2VydmljZURlY29yYXRvclRlc3QuY2xhc3MpOw0KLQkJDQotCQlyZXR1cm4gc3VpdGU7DQotCX0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi90ZXN0cy9uYXZpZ2F0b3IvRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL3Rlc3RzL25hdmlnYXRvci9ET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDRmYzExZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL3Rlc3RzL25hdmlnYXRvci9ET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5ET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5JTG9hZGluZ1dzUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5JTG9hZGluZ1dzUHJvamVjdC5JTG9hZGluZ0NhbmNlbGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLklMb2FkaW5nV3NQcm9qZWN0LklMb2FkaW5nRHVtbXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuSVNFSUNoaWxkTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5JV2ViU2VydmljZUNoaWxkTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET007Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdzRE9NUnVudGltZUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLkRvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5UZXN0UHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuVGVzdFByb2plY3RzVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSAKLXsKLQlwcml2YXRlIFRlc3RQcm9qZWN0IHRlc3RQcmoxOyAKLQkKLQlwcml2YXRlIElQYWNrYWdlRnJhZ21lbnQgbW9kZWxTeW5jMTsKLQkKLQlwcml2YXRlIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3Q7Ci0JCi0JcHJvdGVjdGVkIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgdGFyZ2V0UmVzb3VyY2U7Ci0JcHJvdGVjdGVkIERPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGFkYXB0ZXJGYWN0b3J5OwotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJSVByb2plY3QgZWpiUHJvamVjdCA9IFRlc3RQcm9qZWN0c1V0aWxzLmNyZWF0ZUVqYjNQcm9qZWN0KCJET01DbnRQcm92VGVzdFByb2plY3QxIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJdGVzdFByajEgPSBuZXcgVGVzdFByb2plY3QoZWpiUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQltb2RlbFN5bmMxID0gdGVzdFByajEuY3JlYXRlUGFja2FnZSgib3JnLmVjbGlwc2UudGVzdC5tb2RlbHN5bmMxIik7Ci0JCXRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jMSwgIlNlaTEuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaTFOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpMXtcbiIgKwotCQkJCSJAamF2YXguandzLldlYk1ldGhvZChuYW1lPVwicGFyZW50TWV0aG9kXCIpIHB1YmxpYyB2b2lkIHZvaWRNZXRob2RXaXRoTm9BcmdzSW5QYXJlbnQoKTtcbiIgKwotCQkJCSJ9Iik7Ci0JCXRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jMSwgIlNlaTIuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaTJOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpMiBleHRlbmRzIFNlaTEge1xuIiArCi0JCQkJIkBqYXZheC5qd3MuV2ViTWV0aG9kKG5hbWU9XCJ2b2lkTWV0aG9kV2l0aEFyZ3NcIikgcHVibGljIHZvaWQgdm9pZE1ldGhvZFdpdGhBcmdzKEBqYXZheC5qd3MuV2ViUGFyYW0obmFtZT1cInBhcmFtMVwiKSBqYXZhLnV0aWwuTGlzdDxTdHJpbmc+IHBhcmFtMSk7XG4iICsKLQkJCQkifSIpOwotCQl0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYzEsICJXUzEuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2Uoc2VydmljZU5hbWU9XCJXUzFOYW1lXCIsIGVuZHBvaW50SW50ZXJmYWNlPVwib3JnLmVjbGlwc2UudGVzdC5tb2RlbHN5bmMxLlNlaTJcIikgcHVibGljIGNsYXNzIFdTMSB7fSIpOwotCQl0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYzEsICJXUzIuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2Uoc2VydmljZU5hbWU9XCJXUzJOYW1lXCIpIHB1YmxpYyBjbGFzcyBXUzIge30iKTsKLQkJCi0JCXRhcmdldFJlc291cmNlID0gbmV3IEpheFdzV29ya3NwYWNlUmVzb3VyY2UoSmF2YUNvcmUuY3JlYXRlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpKTsKLQkJdGFyZ2V0UmVzb3VyY2UubG9hZChudWxsKTsKLQkJCi0JCXRoaXMud3NQcm9qZWN0ID0gRG9tVXRpbC5JTlNUQU5DRS5maW5kUHJvamVjdEJ5TmFtZSh0YXJnZXRSZXNvdXJjZS5nZXRET00oKSwgdGVzdFByajEuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy53c1Byb2plY3QpOwotCQkKLQkJYWRhcHRlckZhY3RvcnkgPSBuZXcgRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoKSAKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSVdlYlNlcnZpY2VQcm9qZWN0IGdldFdzUHJvamVjdChmaW5hbCBJRE9NIGRvbSwgZmluYWwgSVByb2plY3QgcHJvamVjdCkgewotCQkJCXJldHVybiB3c1Byb2plY3Q7Ci0JCQl9Ci0JCX07Ci0JCQotCQl0YXJnZXRSZXNvdXJjZS5zdGFydFN5bmNocm9uaXppbmcoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJdGFyZ2V0UmVzb3VyY2Uuc3RvcFN5bmNocm9uaXppbmcoKTsKLQkJdGVzdFByajEuZGlzcG9zZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoKSAKLQl7Ci0JCWFzc2VydE5vdE51bGwoYWRhcHRlckZhY3RvcnkuZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCWFzc2VydFRydWUoYWRhcHRlckZhY3RvcnkuZ2V0QWRhcHRlckZhY3RvcnkoKSBpbnN0YW5jZW9mIERvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIAotCXsKLQkJYWRhcHRlckZhY3RvcnkgPSBuZXcgRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIobmV3IERvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChhZGFwdGVyRmFjdG9yeS5nZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyRmFjdG9yeS5nZXRBZGFwdGVyRmFjdG9yeSgpIGluc3RhbmNlb2YgRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDaGlsZHJlbkxpc3RzT2JqZWN0KCkgCi0JewotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmoxLmdldFByb2plY3QoKSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGNoaWxkcmVuKTsKLQkJYXNzZXJ0RXF1YWxzKGNoaWxkcmVuLmxlbmd0aCwgMSk7Ci0JCWFzc2VydFRydWUoY2hpbGRyZW5bMF0gaW5zdGFuY2VvZiBJV2ViU2VydmljZVByb2plY3QpOwotCQkKLQkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGNoaWxkcmVuKTsKLQkJYXNzZXJ0RXF1YWxzKGNoaWxkcmVuLmxlbmd0aCwgMik7Ci0JCWFzc2VydFRydWUoY2hpbGRyZW5bMF0gaW5zdGFuY2VvZiBJU0VJQ2hpbGRMaXN0KTsKLQkJYXNzZXJ0VHJ1ZShjaGlsZHJlblsxXSBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlQ2hpbGRMaXN0KTsKLQkJCi0JCU9iamVjdFtdIHNFSXMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHNFSXMpOwotCQlhc3NlcnRFcXVhbHMoMywgc0VJcy5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKHNFSXNbMF0gaW5zdGFuY2VvZiBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKTsKLQkJYXNzZXJ0VHJ1ZShzRUlzWzFdIGluc3RhbmNlb2YgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSk7Ci0JCWFzc2VydFRydWUoc0VJc1syXSBpbnN0YW5jZW9mIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpOwotCQkKLQkJT2JqZWN0W10gd1NzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMV0pOwotCQkKLQkJYXNzZXJ0Tm90TnVsbCh3U3MpOwotCQlhc3NlcnRFcXVhbHMod1NzLmxlbmd0aCwgMik7Ci0JCWFzc2VydFRydWUod1NzWzBdIGluc3RhbmNlb2YgSVdlYlNlcnZpY2UpOwotCQlhc3NlcnRUcnVlKHdTc1sxXSBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEhhc0NoaWxkcmVuT2JqZWN0KCkgCi0JewotCQkvLyBJV2ViU2VydmljZVByb2plY3QKLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqMS5nZXRQcm9qZWN0KCkpOwotCQkKLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyRmFjdG9yeS5oYXNDaGlsZHJlbihjaGlsZHJlblswXSkpOwotCQkKLQkJLy8gSVNFSUNoaWxkTGlzdCAmIElXZWJTZXJ2aWNlQ2hpbGRMaXN0Ci0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOwotCQkKLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyRmFjdG9yeS5oYXNDaGlsZHJlbihjaGlsZHJlblswXSkpOwotCQlhc3NlcnRUcnVlKGFkYXB0ZXJGYWN0b3J5Lmhhc0NoaWxkcmVuKGNoaWxkcmVuWzFdKSk7Ci0JCQotCQkvLyBudWxsIHBhcmFtZXRlcgotCQlhc3NlcnRGYWxzZShhZGFwdGVyRmFjdG9yeS5oYXNDaGlsZHJlbihudWxsKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDaGlsZHJlbklXZWJTZXJ2aWNlKCkKLQl7Ci0JCUlXZWJTZXJ2aWNlIHdzID0gZmluZFdzKCJvcmcuZWNsaXBzZS50ZXN0Lm1vZGVsc3luYzEuV1MxIik7Ci0JCWFzc2VydE5vdE51bGwod3MpOwotCQlhc3NlcnRUcnVlKGFkYXB0ZXJGYWN0b3J5Lmhhc0NoaWxkcmVuKHdzKSk7Ci0JCWFzc2VydEVxdWFscygxLCBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih3cykubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih3cylbMF0gaW5zdGFuY2VvZiBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKTsKLQkJCi0JCS8vIGNoZWNrIGlmIGFkYXB0ZWQgb25seSBvbmNlCi0JCURPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIG90aGVyRmFjdG9yeSA9IG5ldyBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigpOwotCQlvdGhlckZhY3RvcnkuZ2V0Q2hpbGRyZW4od3MpOwotCQlhc3NlcnRFcXVhbHMoMiwgd3MuZUFkYXB0ZXJzKCkuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENoaWxkcmVuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpCi0JewotCQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IGZpbmRTZWkoIm9yZy5lY2xpcHNlLnRlc3QubW9kZWxzeW5jMS5TZWkyIik7Ci0JCWFzc2VydE5vdE51bGwoc2VpKTsKLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyRmFjdG9yeS5oYXNDaGlsZHJlbihzZWkpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHNlaSkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihzZWkpWzBdIGluc3RhbmNlb2YgSVdlYk1ldGhvZCk7Ci0JCURPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIG90aGVyRmFjdG9yeSA9IG5ldyBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigpOwotCQlvdGhlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oc2VpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHNlaS5lQWRhcHRlcnMoKS5zaXplKCkpOwotCQkKLQkJSVdlYlNlcnZpY2Ugd3MgPSBmaW5kV3MoIm9yZy5lY2xpcHNlLnRlc3QubW9kZWxzeW5jMS5XUzIiKTsKLQkJYXNzZXJ0Tm90TnVsbCh3cyk7Ci0JCWFzc2VydEZhbHNlKGFkYXB0ZXJGYWN0b3J5Lmhhc0NoaWxkcmVuKHdzLmdldFNlcnZpY2VFbmRwb2ludCgpKSk7Ci0JCWFzc2VydEVxdWFscygwLCBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih3cy5nZXRTZXJ2aWNlRW5kcG9pbnQoKSkubGVuZ3RoKTsKLQkJLy8gY2hlY2sgaWYgYWRhcHRlZCBvbmx5IG9uY2UKLQkJb3RoZXJGYWN0b3J5LmdldENoaWxkcmVuKHdzLmdldFNlcnZpY2VFbmRwb2ludCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHdzLmdldFNlcnZpY2VFbmRwb2ludCgpLmVBZGFwdGVycygpLnNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDaGlsZHJlbldlYk1ldGhvZCgpCi0JewotCQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IGZpbmRTZWkoIm9yZy5lY2xpcHNlLnRlc3QubW9kZWxzeW5jMS5TZWkyIik7Ci0JCWFzc2VydE5vdE51bGwoc2VpKTsKLQkJCi0JCUlXZWJNZXRob2QgbWV0aG9kID0gZmluZE1ldGhvZChzZWksICJ2b2lkTWV0aG9kV2l0aEFyZ3MiKTsKLQkJYXNzZXJ0Tm90TnVsbChtZXRob2QpOwkKLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyRmFjdG9yeS5oYXNDaGlsZHJlbihtZXRob2QpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKG1ldGhvZCkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihtZXRob2QpWzBdIGluc3RhbmNlb2YgSVdlYlBhcmFtKTsKLQkJCi0JCSBtZXRob2QgPSBmaW5kTWV0aG9kKHNlaSwgInZvaWRNZXRob2RXaXRoTm9BcmdzSW5QYXJlbnQiKTsKLQkJYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCQlhc3NlcnRGYWxzZShhZGFwdGVyRmFjdG9yeS5oYXNDaGlsZHJlbihtZXRob2QpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKG1ldGhvZCkubGVuZ3RoKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2hpbGRyZW5XZWJQYXJhbSgpCi0JewotCQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IGZpbmRTZWkoIm9yZy5lY2xpcHNlLnRlc3QubW9kZWxzeW5jMS5TZWkyIik7Ci0JCWFzc2VydE5vdE51bGwoc2VpKTsKLQkJCi0JCUlXZWJNZXRob2QgbWV0aG9kID0gZmluZE1ldGhvZChzZWksICJ2b2lkTWV0aG9kV2l0aEFyZ3MiKTsKLQkJYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCQlhc3NlcnRGYWxzZShhZGFwdGVyRmFjdG9yeS5oYXNDaGlsZHJlbihtZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4obWV0aG9kLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkpLmxlbmd0aCk7Ci0JfQotCQotCQotCXByaXZhdGUgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBmaW5kU2VpKGZpbmFsIFN0cmluZyBpbXBsTmFtZSkKLQl7Ci0JCWZvcihJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA6IHdzUHJvamVjdC5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkpIAotCQl7Ci0JCQlpZihzZWkuZ2V0SW1wbGVtZW50YXRpb24oKS5lcXVhbHMoaW1wbE5hbWUpKSB7Ci0JCQkJcmV0dXJuIHNlaTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQkKLQkKLQlwcml2YXRlIElXZWJTZXJ2aWNlIGZpbmRXcyhmaW5hbCBTdHJpbmcgaW1wbE5hbWUpCi0JewotCQlmb3IoSVdlYlNlcnZpY2Ugd3MgOiB3c1Byb2plY3QuZ2V0V2ViU2VydmljZXMoKSkgCi0JCXsKLQkJCWlmKHdzLmdldEltcGxlbWVudGF0aW9uKCkuZXF1YWxzKGltcGxOYW1lKSkgewotCQkJCXJldHVybiB3czsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQkKLQkKLQlwcml2YXRlIElXZWJNZXRob2QgZmluZE1ldGhvZChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSwgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUpIAotCXsKLQkJZm9yKElXZWJNZXRob2QgbWV0aG9kIDogc2VpLmdldFdlYk1ldGhvZHMoKSkgCi0JCXsKLQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKG1ldGhvZE5hbWUpKSB7Ci0JCQkJcmV0dXJuIG1ldGhvZDsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotLy8JcHVibGljIHZvaWQgdGVzdE5vdGlmeUNoYW5nZWQoKQotLy8JewotLy8JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajEuZ2V0UHJvamVjdCgpKTsKLS8vCQkKLS8vCQl0cnkKLS8vCQl7Ci0vLwkJCXRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jMSwgIlNlaTMuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaTNOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpMyB7fSIpOwotLy8JCQl0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYzEsICJXUzMuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2Uoc2VydmljZU5hbWU9XCJXUzNOYW1lXCIsIGVuZHBvaW50SW50ZXJmYWNlPVwib3JnLmVjbGlwc2UudGVzdC5tb2RlbHN5bmMxLlNlaTNcIikgcHVibGljIGNsYXNzIFdTMyB7fSIpOwotLy8JCX0KLS8vCQljYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZSkKLS8vCQl7Ci0vLwkJCWZhaWwoZS50b1N0cmluZygpKTsKLS8vCQl9Ci0vLwkJCi0vLwkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7Ci0vLwkJCi0vLwkJT2JqZWN0W10gc0VJcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsKLS8vCQkKLS8vCQlhc3NlcnRFcXVhbHMoc0VJcy5sZW5ndGgsIDMpOwotLy8JCQotLy8JCU9iamVjdFtdIHdTcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzFdKTsKLS8vCQkKLS8vCQlhc3NlcnRFcXVhbHMod1NzLmxlbmd0aCwgMyk7Ci0vLwl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFdTUHJvamVjdCgpCi0JewotCQlhZGFwdGVyRmFjdG9yeSA9IG5ldyBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigpOwotCQkKLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqMS5nZXRQcm9qZWN0KCkpOwotCQlhc3NlcnROb3ROdWxsKGNoaWxkcmVuKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFdzUHJvamVjdERvbU5vdExvYWRlZCgpCi0JewotCQlhZGFwdGVyRmFjdG9yeSA9IG5ldyBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIElXZWJTZXJ2aWNlUHJvamVjdCBnZXRXc1Byb2plY3QoZmluYWwgSURPTSBkb20sIGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqMS5nZXRQcm9qZWN0KCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2hpbGRyZW4ubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShjaGlsZHJlblswXSBpbnN0YW5jZW9mIElMb2FkaW5nV3NQcm9qZWN0KTsKLQkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7Ci0JCWFzc2VydEVxdWFscygxLCBjaGlsZHJlbi5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKGNoaWxkcmVuWzBdIGluc3RhbmNlb2YgSUxvYWRpbmdEdW1teSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRXc1Byb2plY3RDaGlsZHNEb21Mb2FkTm90Q2FuY2VsZWQoKQotCXsKLQkJSUxvYWRpbmdXc1Byb2plY3QgbG9hZGluZ1Byb2plY3QgPSBuZXcgSUxvYWRpbmdXc1Byb2plY3QoKSB7Ci0JCQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsgcmV0dXJuIG51bGw7IH0KLQkJCXB1YmxpYyBib29sZWFuIGlzTG9hZENhbmNlbGVkKCkge3JldHVybiBmYWxzZTt9Ci0JCX07Ci0JCQkKLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihsb2FkaW5nUHJvamVjdCk7Ci0JCWFzc2VydEVxdWFscygxLCBjaGlsZHJlbi5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKGNoaWxkcmVuWzBdIGluc3RhbmNlb2YgSUxvYWRpbmdEdW1teSk7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFdzUHJvamVjdENoaWxkc0RvbUxvYWRDYW5jZWxlZCgpCi0JewotCQlJTG9hZGluZ1dzUHJvamVjdCBsb2FkaW5nUHJvamVjdCA9IG5ldyBJTG9hZGluZ1dzUHJvamVjdCgpIHsKLQkJCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgeyByZXR1cm4gbnVsbDsgfQotCQkJcHVibGljIGJvb2xlYW4gaXNMb2FkQ2FuY2VsZWQoKSB7cmV0dXJuIHRydWU7fQotCQl9OwotCQkJCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4obG9hZGluZ1Byb2plY3QpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2hpbGRyZW4ubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShjaGlsZHJlblswXSBpbnN0YW5jZW9mIElMb2FkaW5nQ2FuY2VsZWQpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTdXBwb3J0aW5nUnVudGltZSgpCi0JewotCQlET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlck15IHByb3ZpZGVyID0gbmV3IERPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyTXkoKTsKLQkJSVdzRE9NUnVudGltZUV4dGVuc2lvbiBydW50aW1lID0gcHJvdmlkZXIuZ2V0U3VwcG9ydGluZ1J1bnRpbWUodGVzdFByajEuZ2V0UHJvamVjdCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChydW50aW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGNsYXNzIERPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyTXkgZXh0ZW5kcyBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcgotCXsKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBJV3NET01SdW50aW1lRXh0ZW5zaW9uIGdldFN1cHBvcnRpbmdSdW50aW1lKGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJCXJldHVybiBzdXBlci5nZXRTdXBwb3J0aW5nUnVudGltZShwcm9qZWN0KTsKLQkJfQotCX07Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL3Rlc3RzL25hdmlnYXRvci9ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL3Rlc3RzL25hdmlnYXRvci9ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNkNDFjMjMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi90ZXN0cy9uYXZpZ2F0b3IvRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLm5hdmlnYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLkRPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLkRPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET007Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LlRlc3RQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5UZXN0UHJvamVjdHNVdGlsczsKLQotcHVibGljIGNsYXNzIERPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSAKLXsKLQlwcml2YXRlIFRlc3RQcm9qZWN0IHRlc3RQcmoxOyAKLQkKLQlwcm90ZWN0ZWQgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSB0YXJnZXRSZXNvdXJjZTsKLQlwcm90ZWN0ZWQgRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgYWRhcHRlckZhY3Rvcnk7Ci0JcHJvdGVjdGVkIERPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOwotCQotCXByaXZhdGUgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdDsKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gCi0JewotCQlJUHJvamVjdCBlamJQcm9qZWN0ID0gVGVzdFByb2plY3RzVXRpbHMuY3JlYXRlRWpiM1Byb2plY3QoIkRPTUxibFByb3ZUZXN0UHJvamVjdDEiICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQl0ZXN0UHJqMSA9IG5ldyBUZXN0UHJvamVjdChlamJQcm9qZWN0LmdldFByb2plY3QoKSk7Ci0JCWZpbmFsIElQYWNrYWdlRnJhZ21lbnQgbW9kZWxTeW5jMSA9IHRlc3RQcmoxLmNyZWF0ZVBhY2thZ2UoIm9yZy5lY2xpcHNlLnRlc3QubW9kZWxzeW5jMSIpOwotCQl0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYzEsICJTZWkxLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWkxTmFtZVwiKSBwdWJsaWMgaW50ZXJmYWNlIFNlaTF7XG4iICsKLQkJCQkiQGphdmF4Lmp3cy5XZWJNZXRob2QobmFtZT1cInBhcmVudE1ldGhvZFwiKSBwdWJsaWMgdm9pZCB2b2lkTWV0aG9kV2l0aE5vQXJnc0luUGFyZW50KCk7XG4iICsKLQkJCQkifSIpOwotCQl0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYzEsICJTZWkyLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWkyTmFtZVwiKSBwdWJsaWMgaW50ZXJmYWNlIFNlaTIgZXh0ZW5kcyBTZWkxIHtcbiIgKwotCQkJCSJAamF2YXguandzLldlYk1ldGhvZChuYW1lPVwid2ViTWV0aG9kXCIpIHB1YmxpYyB2b2lkIHZvaWRNZXRob2RXaXRoTm9BcmdzTm90SW5QYXJlbnQoKTtcbiIgKwotCQkJCSJ9Iik7Ci0JCXRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jMSwgIldTMS5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShzZXJ2aWNlTmFtZT1cIldTMU5hbWVcIiwgZW5kcG9pbnRJbnRlcmZhY2U9XCJvcmcuZWNsaXBzZS50ZXN0Lm1vZGVsc3luYzEuU2VpMlwiKSBwdWJsaWMgY2xhc3MgV1MxIHt9Iik7Ci0JCXRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jMSwgIldTMi5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShzZXJ2aWNlTmFtZT1cIldTMk5hbWVcIiwgZW5kcG9pbnRJbnRlcmZhY2U9XCJvcmcuZWNsaXBzZS50ZXN0Lm1vZGVsc3luYzEuU2VpMlwiKSBwdWJsaWMgY2xhc3MgV1MyIHt9Iik7Ci0JCQotCQl0YXJnZXRSZXNvdXJjZSA9IG5ldyBKYXhXc1dvcmtzcGFjZVJlc291cmNlKEphdmFDb3JlLmNyZWF0ZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKSk7Ci0JCXRhcmdldFJlc291cmNlLmxvYWQobnVsbCk7Ci0JCXRoaXMud3NQcm9qZWN0ID0gRG9tVXRpbC5JTlNUQU5DRS5maW5kUHJvamVjdEJ5TmFtZSh0YXJnZXRSZXNvdXJjZS5nZXRET00oKSwgdGVzdFByajEuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy53c1Byb2plY3QpOwotCQkKLQkJCi0JCWxhYmVsUHJvdmlkZXIgPSBuZXcgRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKCk7Ci0JCWFkYXB0ZXJGYWN0b3J5ID0gbmV3IERPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKCkgCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIElXZWJTZXJ2aWNlUHJvamVjdCBnZXRXc1Byb2plY3QoZmluYWwgSURPTSBkb20sIGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJCQlyZXR1cm4gd3NQcm9qZWN0OwotCQkJfQkJCQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRJbWFnZU9iamVjdCgpIAotCXsKLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqMS5nZXRQcm9qZWN0KCkpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChsYWJlbFByb3ZpZGVyLmdldEltYWdlKGNoaWxkcmVuWzBdKSk7Ci0KLQkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UoY2hpbGRyZW5bMF0pKTsKLQkJYXNzZXJ0Tm90TnVsbChsYWJlbFByb3ZpZGVyLmdldEltYWdlKGNoaWxkcmVuWzFdKSk7Ci0JCQotCQlPYmplY3RbXSBzRUlzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChsYWJlbFByb3ZpZGVyLmdldEltYWdlKHNFSXNbMF0pKTsKLQkJCi0JCWFzc2VydE5vdFNhbWUobGFiZWxQcm92aWRlci5nZXRJbWFnZShudWxsKSwgbGFiZWxQcm92aWRlci5nZXRJbWFnZShzRUlzWzBdKSk7Ci0JCWFzc2VydE5vdFNhbWUobGFiZWxQcm92aWRlci5nZXRJbWFnZSh0ZXN0UHJqMSksIGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2Uoc0VJc1swXSkpOwotCQkKLQkJT2JqZWN0W10gd1NzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMV0pOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChsYWJlbFByb3ZpZGVyLmdldEltYWdlKHdTc1swXSkpOwotCQkKLQkJYXNzZXJ0Tm90U2FtZShsYWJlbFByb3ZpZGVyLmdldEltYWdlKG51bGwpLCBsYWJlbFByb3ZpZGVyLmdldEltYWdlKHdTc1swXSkpOwotCQlhc3NlcnROb3RTYW1lKGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UodGVzdFByajEpLCBsYWJlbFByb3ZpZGVyLmdldEltYWdlKHdTc1swXSkpOwotCQkKLQkJT2JqZWN0W10gd2ViTWV0aG9kcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHNFSXNbMF0pOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChsYWJlbFByb3ZpZGVyLmdldEltYWdlKHdlYk1ldGhvZHNbMF0pKTsKLQkJCi0JCWFzc2VydE5vdFNhbWUobGFiZWxQcm92aWRlci5nZXRJbWFnZShudWxsKSwgbGFiZWxQcm92aWRlci5nZXRJbWFnZSh3ZWJNZXRob2RzWzBdKSk7Ci0JCWFzc2VydE5vdFNhbWUobGFiZWxQcm92aWRlci5nZXRJbWFnZSh0ZXN0UHJqMSksIGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2Uod2ViTWV0aG9kc1swXSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUZXh0T2JqZWN0KCkgCi0JewotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmoxLmdldFByb2plY3QoKSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChjaGlsZHJlblswXSkpOwotCi0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChsYWJlbFByb3ZpZGVyLmdldFRleHQoY2hpbGRyZW5bMF0pKTsKLQkJYXNzZXJ0Tm90TnVsbChsYWJlbFByb3ZpZGVyLmdldFRleHQoY2hpbGRyZW5bMV0pKTsKLQkJCi0JCU9iamVjdFtdIHNFSXMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChzRUlzWzBdKSk7Ci0JCQotCQlhc3NlcnROb3RTYW1lKGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChudWxsKSwgbGFiZWxQcm92aWRlci5nZXRUZXh0KHNFSXNbMF0pKTsKLQkJYXNzZXJ0Tm90U2FtZShsYWJlbFByb3ZpZGVyLmdldFRleHQodGVzdFByajEpLCBsYWJlbFByb3ZpZGVyLmdldFRleHQoc0VJc1swXSkpOwotCQkKLQkJT2JqZWN0W10gd1NzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMV0pOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChsYWJlbFByb3ZpZGVyLmdldFRleHQod1NzWzBdKSk7Ci0JCQotCQlhc3NlcnROb3RTYW1lKGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChudWxsKSwgbGFiZWxQcm92aWRlci5nZXRUZXh0KHdTc1swXSkpOwotCQlhc3NlcnROb3RTYW1lKGxhYmVsUHJvdmlkZXIuZ2V0VGV4dCh0ZXN0UHJqMSksIGxhYmVsUHJvdmlkZXIuZ2V0VGV4dCh3U3NbMF0pKTsKLQkJCi0JCU9iamVjdFtdIHdlYk1ldGhvZHMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihzRUlzWzBdKTsKLQkJCi0JCWFzc2VydE5vdE51bGwobGFiZWxQcm92aWRlci5nZXRUZXh0KHdlYk1ldGhvZHNbMF0pKTsKLQkJCi0JCWFzc2VydE5vdFNhbWUobGFiZWxQcm92aWRlci5nZXRUZXh0KG51bGwpLCBsYWJlbFByb3ZpZGVyLmdldFRleHQod2ViTWV0aG9kc1swXSkpOwotCQlhc3NlcnROb3RTYW1lKGxhYmVsUHJvdmlkZXIuZ2V0VGV4dCh0ZXN0UHJqMSksIGxhYmVsUHJvdmlkZXIuZ2V0VGV4dCh3ZWJNZXRob2RzWzBdKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZXNjcmlwdGlvbigpCi0JewotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmoxLmdldFByb2plY3QoKSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGxhYmVsUHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24oY2hpbGRyZW5bMF0pKTsKLQotCQljaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsKLQkJCi0JCWFzc2VydE5vdE51bGwobGFiZWxQcm92aWRlci5nZXREZXNjcmlwdGlvbihjaGlsZHJlblswXSkpOwotCQlhc3NlcnROb3ROdWxsKGxhYmVsUHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24oY2hpbGRyZW5bMV0pKTsKLQkJCi0JCU9iamVjdFtdIHNFSXMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGxhYmVsUHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24oc0VJc1swXSkpOwotCQkKLQkJYXNzZXJ0Tm90U2FtZShsYWJlbFByb3ZpZGVyLmdldERlc2NyaXB0aW9uKG51bGwpLCBsYWJlbFByb3ZpZGVyLmdldERlc2NyaXB0aW9uKHNFSXNbMF0pKTsKLQkJYXNzZXJ0Tm90U2FtZShsYWJlbFByb3ZpZGVyLmdldERlc2NyaXB0aW9uKHRlc3RQcmoxKSwgbGFiZWxQcm92aWRlci5nZXREZXNjcmlwdGlvbihzRUlzWzBdKSk7Ci0JCQotCQlPYmplY3RbXSB3U3MgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblsxXSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGxhYmVsUHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24od1NzWzBdKSk7Ci0JCQotCQlhc3NlcnROb3RTYW1lKGxhYmVsUHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24obnVsbCksIGxhYmVsUHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24od1NzWzBdKSk7Ci0JCWFzc2VydE5vdFNhbWUobGFiZWxQcm92aWRlci5nZXREZXNjcmlwdGlvbih0ZXN0UHJqMSksIGxhYmVsUHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24od1NzWzBdKSk7Ci0JCQotCQlPYmplY3RbXSB3ZWJNZXRob2RzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oc0VJc1swXSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGxhYmVsUHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24od2ViTWV0aG9kc1swXSkpOwotCQkKLQkJYXNzZXJ0Tm90U2FtZShsYWJlbFByb3ZpZGVyLmdldERlc2NyaXB0aW9uKG51bGwpLCBsYWJlbFByb3ZpZGVyLmdldERlc2NyaXB0aW9uKHdlYk1ldGhvZHNbMF0pKTsKLQkJYXNzZXJ0Tm90U2FtZShsYWJlbFByb3ZpZGVyLmdldERlc2NyaXB0aW9uKHRlc3RQcmoxKSwgbGFiZWxQcm92aWRlci5nZXREZXNjcmlwdGlvbih3ZWJNZXRob2RzWzBdKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi90ZXN0cy9uYXZpZ2F0b3IvRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL3Rlc3RzL25hdmlnYXRvci9ET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTdmOTExNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL3Rlc3RzL25hdmlnYXRvci9ET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy5uYXZpZ2F0b3I7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLkRPTVByb3BlcnR5Vmlld0FkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyOw0KLQ0KLXB1YmxpYyBjbGFzcyBET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSANCi17DQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBZGFwdGVyKCkgDQotCXsNCi0JCURPTVByb3BlcnR5Vmlld0FkYXB0ZXJGYWN0b3J5IHByb3BlcnR5QWRhcHRlckZhY3RvcnkgPSBuZXcgRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnkoKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChwcm9wZXJ0eUFkYXB0ZXJGYWN0b3J5LmdldEFkYXB0ZXIocHJvcGVydHlBZGFwdGVyRmFjdG9yeSwgSVByb3BlcnR5U291cmNlUHJvdmlkZXIuY2xhc3MpKTsNCi0JCWFzc2VydE51bGwocHJvcGVydHlBZGFwdGVyRmFjdG9yeS5nZXRBZGFwdGVyKHByb3BlcnR5QWRhcHRlckZhY3RvcnksIElXZWJTZXJ2aWNlLmNsYXNzKSk7DQotCQlhc3NlcnRUcnVlKHByb3BlcnR5QWRhcHRlckZhY3RvcnkuZ2V0QWRhcHRlcihwcm9wZXJ0eUFkYXB0ZXJGYWN0b3J5LCBJUHJvcGVydHlTb3VyY2VQcm92aWRlci5jbGFzcykgaW5zdGFuY2VvZiBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcik7DQotCQlhc3NlcnRUcnVlKHByb3BlcnR5QWRhcHRlckZhY3RvcnkuZ2V0QWRhcHRlcihwcm9wZXJ0eUFkYXB0ZXJGYWN0b3J5LCBET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeS5jbGFzcykgaW5zdGFuY2VvZiBET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEdldEFkYXB0ZXJMaXN0KCkgDQotCXsNCi0JCURPTVByb3BlcnR5Vmlld0FkYXB0ZXJGYWN0b3J5IHByb3BlcnR5QWRhcHRlckZhY3RvcnkgPSBuZXcgRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnkoKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChwcm9wZXJ0eUFkYXB0ZXJGYWN0b3J5LmdldEFkYXB0ZXJMaXN0KCkpOw0KLQkJYXNzZXJ0RXF1YWxzKHByb3BlcnR5QWRhcHRlckZhY3RvcnkuZ2V0QWRhcHRlckxpc3QoKS5sZW5ndGgsIDEpOw0KLQkJYXNzZXJ0RXF1YWxzKHByb3BlcnR5QWRhcHRlckZhY3RvcnkuZ2V0QWRhcHRlckxpc3QoKVswXSwgRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIuY2xhc3MpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QWRhcHRlclVzZXNTYW1lRmFjdG9yeSgpDQotCXsNCi0JCURPTVByb3BlcnR5Vmlld0FkYXB0ZXJGYWN0b3J5IHByb3BlcnR5QWRhcHRlckZhY3RvcnkgPSBuZXcgRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnkoKTsNCi0JCU9iamVjdCBhZGFwdGVyMSA9IHByb3BlcnR5QWRhcHRlckZhY3RvcnkuZ2V0QWRhcHRlcihwcm9wZXJ0eUFkYXB0ZXJGYWN0b3J5LCBJUHJvcGVydHlTb3VyY2VQcm92aWRlci5jbGFzcyk7DQotCQlhc3NlcnROb3ROdWxsKGFkYXB0ZXIxKTsNCi0JCU9iamVjdCBhZGFwdGVyMiA9IHByb3BlcnR5QWRhcHRlckZhY3RvcnkuZ2V0QWRhcHRlcihwcm9wZXJ0eUFkYXB0ZXJGYWN0b3J5LCBJUHJvcGVydHlTb3VyY2VQcm92aWRlci5jbGFzcyk7DQotCQlhc3NlcnRUcnVlKGFkYXB0ZXIxPT1hZGFwdGVyMik7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi90ZXN0cy9uYXZpZ2F0b3IvV2ViU2VydmljZURlY29yYXRvclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vdGVzdHMvbmF2aWdhdG9yL1dlYlNlcnZpY2VEZWNvcmF0b3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE1MzcxYmUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi90ZXN0cy9uYXZpZ2F0b3IvV2ViU2VydmljZURlY29yYXRvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZS5pbnRlcm5hbC5BcHRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLklTRUlDaGlsZExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuSVdlYlNlcnZpY2VDaGlsZExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuV2ViU2VydmljZVByb2JsZW1zRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5Eb21VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuSVdhaXRDb25kaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5hc3NlcnRpb25zLkFzc2VydGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5hc3NlcnRpb25zLkNvbmRpdGlvbkNoZWNrRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2tPYmplY3RUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuVGVzdFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LlRlc3RQcm9qZWN0c1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbldyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uSW5zcGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7Ci0KLS8qKgotICogVGVzdHMgZm9yIHtAbGluayBXZWJTZXJ2aWNlRGVjb3JhdG9yfSBjbGFzcwotICogCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292Ci0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZURlY29yYXRvclRlc3QgZXh0ZW5kcyBNb2NrT2JqZWN0VGVzdENhc2UKLXsKLSAgICBwcml2YXRlIE15V2ViU2VydmljZVByb2JsZW1zRGVjb3JhdG9yIGRlY29yYXRvcjsKLSAgICBwcml2YXRlIFRlc3RQcm9qZWN0IHRlc3RQcm9qZWN0OwotCi0gICAgcHJpdmF0ZSBJV2ViU2VydmljZSB3czsKLSAgICBwcml2YXRlIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpOwotICAgIHByaXZhdGUgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdDsKLSAgICBwcml2YXRlIElXZWJNZXRob2Qgd2ViTWV0aG9kOwotICAgIHByaXZhdGUgSVdlYlBhcmFtIHdlYlBhcmFtOwotICAgIHByaXZhdGUgTW9jazxJV2ViU2VydmljZUNoaWxkTGlzdD4gd3NDaGlsZExpc3Q7Ci0gICAgcHJpdmF0ZSBNb2NrPElTRUlDaGlsZExpc3Q+IHNlaUNoaWxkTGlzdDsKLSAgICBwcml2YXRlIElQYWNrYWdlRnJhZ21lbnQgdGVzdFBhY2thZ2U7Ci0KLSAgICBwcml2YXRlIElUeXBlIHNlaVR5cGU7Ci0gICAgcHJpdmF0ZSBJVHlwZSB3c0ltcGxUeXBlOwotCi0gICAgcHJpdmF0ZSBKYXhXc1dvcmtzcGFjZVJlc291cmNlIGpheHdzUmVzb3VyY2U7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9fRVJST1IgPSAwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFSV9DT05URU5UID0gIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiezB9XCIpXG4iICsgInB1YmxpYyBpbnRlcmZhY2UgSVNlaSAneydcbiIgKyAiQGphdmF4Lmp3cy5XZWJNZXRob2Qob3BlcmF0aW9uTmFtZT1cInsxfVwiKVxuIgotICAgICsgInB1YmxpYyB2b2lkIHRlc3RNZXRob2QoQGphdmF4Lmp3cy5XZWJQYXJhbShuYW1lPVwiezJ9XCIpIFN0cmluZyBzKTt9IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QTF9DT05URU5UID0gIkBqYXZheC5qd3MuV2ViU2VydmljZShzZXJ2aWNlTmFtZT1cInswfVwiLCBlbmRwb2ludEludGVyZmFjZT1cInRlc3QuSVNlaVwiKVxuIiArICJwdWJsaWMgY2xhc3MgRW5kcG9pbnRDbGFzcyAneydcbiIKLSAgICArICJwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kKFN0cmluZyBzKSd7J319IjsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGRlY29yYXRvciA9IG5ldyBNeVdlYlNlcnZpY2VQcm9ibGVtc0RlY29yYXRvcigpOwotICAgICAgICB0ZXN0UHJvamVjdCA9IG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAodGVzdFByb2plY3QgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGVzdFByb2plY3QuZGlzcG9zZSgpOwotICAgICAgICAgICAgamF4d3NSZXNvdXJjZS5zdG9wU3luY2hyb25pemluZygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbXB1dGVBZG9ybm1lbnRGb3JPYmplY3QoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGFkb3JubWVudCIsIE5PX0VSUk9SLCBkZWNvcmF0b3IuY29tcHV0ZUFkb3JubWVudEZsYWdzKG5ldyBPYmplY3QoKSkpOwotICAgIH0KLSAgICAvLyBGSVhNRSAzMDcxMjQKLSAgICAvLyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcHV0ZUFkb3JubWVudE5vVmFsaWRhdGlvbkVycm9ycygpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICAvLyAgICB7Ci0gICAgLy8gICAgICAgIGNyZWF0ZVdzQ29udGVudCgiTXlQb3J0IiwgIm15TWV0aG9kIiwgIm15UGFyYW0iLCAiTXlTZXJ2aWNlIik7Ci0gICAgLy8gICAgICAgIGluaXRXc0RvbU9iamVjdHMoKTsKLSAgICAvLyAgICAgICAgY2hlY2tOb0Vycm9yc0Fkb3JubWVudCgpOwotICAgIC8vICAgIH0KLQotICAgIC8vIEZJWE1FIEJ1ZyAzMDUwNzcKLSAgICAvLwlwdWJsaWMgdm9pZCB0ZXN0Q29tcHV0ZUFkb3JubWVudEZvclNlaUVycm9yKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgIC8vCXsKLSAgICAvLwkJY3JlYXRlV3NDb250ZW50KCIiLCAibXlNZXRob2QiLCAibXlQYXJhbSIsICJNeVNlcnZpY2UiKTsKLSAgICAvLwkJd2FpdEZvckFwdE1hcmtlcnNBcHBlYXIoKTsKLSAgICAvLwkJaW5pdFdzRG9tT2JqZWN0cygpOwotICAgIC8vCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgYWRvcm5tZW50IiwgSmF2YUVsZW1lbnRJbWFnZURlc2NyaXB0b3IuRVJST1IsIGRlY29yYXRvci5jb21wdXRlQWRvcm5tZW50RmxhZ3Mod3NDaGlsZExpc3QucHJveHkoKSkpOwotICAgIC8vCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgYWRvcm5tZW50IiwgSmF2YUVsZW1lbnRJbWFnZURlc2NyaXB0b3IuRVJST1IsIGRlY29yYXRvci5jb21wdXRlQWRvcm5tZW50RmxhZ3Moc2VpQ2hpbGRMaXN0LnByb3h5KCkpKTsKLSAgICAvLwkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGFkb3JubWVudCIsIEphdmFFbGVtZW50SW1hZ2VEZXNjcmlwdG9yLkVSUk9SLCBkZWNvcmF0b3IuY29tcHV0ZUFkb3JubWVudEZsYWdzKHdzKSk7Ci0gICAgLy8JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBhZG9ybm1lbnQiLCBKYXZhRWxlbWVudEltYWdlRGVzY3JpcHRvci5FUlJPUiwgZGVjb3JhdG9yLmNvbXB1dGVBZG9ybm1lbnRGbGFncyhzZWkpKTsKLSAgICAvLwkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGFkb3JubWVudCIsIE5PX0VSUk9SLCBkZWNvcmF0b3IuY29tcHV0ZUFkb3JubWVudEZsYWdzKHdlYk1ldGhvZCkpOwotICAgIC8vCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgYWRvcm5tZW50IiwgTk9fRVJST1IsIGRlY29yYXRvci5jb21wdXRlQWRvcm5tZW50RmxhZ3Mod2ViUGFyYW0pKTsKLSAgICAvLwotICAgIC8vCQlmaXhBcHRFcnJvcnMoKTsKLSAgICAvLwkJY2hlY2tOb0Vycm9yc0Fkb3JubWVudCgpOwotICAgIC8vCX0KLQotICAgIC8vIEZJWE1FIEJ1ZyAzMDUwNzcKLSAgICAvLwlwdWJsaWMgdm9pZCB0ZXN0Q29tcHV0ZUFkb3JubWVudEZvcldlYk1ldGhvZEVycm9yKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgIC8vCXsKLSAgICAvLwkJY3JlYXRlV3NDb250ZW50KCJNeVBvcnQiLCAiIiwgIm15UGFyYW0iLCAiTXlTZXJ2aWNlIik7Ci0gICAgLy8JCXdhaXRGb3JBcHRNYXJrZXJzQXBwZWFyKCk7Ci0gICAgLy8JCWluaXRXc0RvbU9iamVjdHMoKTsKLSAgICAvLwkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGFkb3JubWVudCIsIEphdmFFbGVtZW50SW1hZ2VEZXNjcmlwdG9yLkVSUk9SLCBkZWNvcmF0b3IuY29tcHV0ZUFkb3JubWVudEZsYWdzKHdzQ2hpbGRMaXN0LnByb3h5KCkpKTsKLSAgICAvLwkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGFkb3JubWVudCIsIEphdmFFbGVtZW50SW1hZ2VEZXNjcmlwdG9yLkVSUk9SLCBkZWNvcmF0b3IuY29tcHV0ZUFkb3JubWVudEZsYWdzKHNlaUNoaWxkTGlzdC5wcm94eSgpKSk7Ci0gICAgLy8JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBhZG9ybm1lbnQiLCBKYXZhRWxlbWVudEltYWdlRGVzY3JpcHRvci5FUlJPUiwgZGVjb3JhdG9yLmNvbXB1dGVBZG9ybm1lbnRGbGFncyh3cykpOwotICAgIC8vCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgYWRvcm5tZW50IiwgSmF2YUVsZW1lbnRJbWFnZURlc2NyaXB0b3IuRVJST1IsIGRlY29yYXRvci5jb21wdXRlQWRvcm5tZW50RmxhZ3Moc2VpKSk7Ci0gICAgLy8JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBhZG9ybm1lbnQiLCBKYXZhRWxlbWVudEltYWdlRGVzY3JpcHRvci5FUlJPUiwgZGVjb3JhdG9yLmNvbXB1dGVBZG9ybm1lbnRGbGFncyh3ZWJNZXRob2QpKTsKLSAgICAvLwkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGFkb3JubWVudCIsIE5PX0VSUk9SLCBkZWNvcmF0b3IuY29tcHV0ZUFkb3JubWVudEZsYWdzKHdlYlBhcmFtKSk7Ci0gICAgLy8KLSAgICAvLwkJZml4QXB0RXJyb3JzKCk7Ci0gICAgLy8JCWNoZWNrTm9FcnJvcnNBZG9ybm1lbnQoKTsKLSAgICAvLwl9Ci0KLSAgICAvL0ZJWE1FICBCdWcgMzA1MDc3Ci0gICAgLy8JcHVibGljIHZvaWQgdGVzdENvbXB1dGVBZG9ybm1lbnRGb3JXZWJQYXJhbUVycm9yKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgIC8vCXsKLSAgICAvLwkJY3JlYXRlV3NDb250ZW50KCJNeVBvcnQiLCAiTXlNZXRob2QiLCAiIiwgIk15U2VydmljZSIpOwotICAgIC8vCQl3YWl0Rm9yQXB0TWFya2Vyc0FwcGVhcigpOwotICAgIC8vCQlpbml0V3NEb21PYmplY3RzKCk7Ci0gICAgLy8JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBhZG9ybm1lbnQiLCBKYXZhRWxlbWVudEltYWdlRGVzY3JpcHRvci5FUlJPUiwgZGVjb3JhdG9yLmNvbXB1dGVBZG9ybm1lbnRGbGFncyh3c0NoaWxkTGlzdC5wcm94eSgpKSk7Ci0gICAgLy8JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBhZG9ybm1lbnQiLCBKYXZhRWxlbWVudEltYWdlRGVzY3JpcHRvci5FUlJPUiwgZGVjb3JhdG9yLmNvbXB1dGVBZG9ybm1lbnRGbGFncyhzZWlDaGlsZExpc3QucHJveHkoKSkpOwotICAgIC8vCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgYWRvcm5tZW50IiwgSmF2YUVsZW1lbnRJbWFnZURlc2NyaXB0b3IuRVJST1IsIGRlY29yYXRvci5jb21wdXRlQWRvcm5tZW50RmxhZ3Mod3MpKTsKLSAgICAvLwkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGFkb3JubWVudCIsIEphdmFFbGVtZW50SW1hZ2VEZXNjcmlwdG9yLkVSUk9SLCBkZWNvcmF0b3IuY29tcHV0ZUFkb3JubWVudEZsYWdzKHNlaSkpOwotICAgIC8vCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgYWRvcm5tZW50IiwgSmF2YUVsZW1lbnRJbWFnZURlc2NyaXB0b3IuRVJST1IsIGRlY29yYXRvci5jb21wdXRlQWRvcm5tZW50RmxhZ3Mod2ViTWV0aG9kKSk7Ci0gICAgLy8JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBhZG9ybm1lbnQiLCBKYXZhRWxlbWVudEltYWdlRGVzY3JpcHRvci5FUlJPUiwgZGVjb3JhdG9yLmNvbXB1dGVBZG9ybm1lbnRGbGFncyh3ZWJQYXJhbSkpOwotICAgIC8vCi0gICAgLy8JCWZpeEFwdEVycm9ycygpOwotICAgIC8vCQljaGVja05vRXJyb3JzQWRvcm5tZW50KCk7Ci0gICAgLy8JfQotCi0gICAgLy8gRklYTUUgQnVnIDMwNTA3NwotICAgIC8vCXB1YmxpYyB2b2lkIHRlc3RDb21wdXRlQWRvcm5tZW50Rm9yV3NJbXBsRXJyb3IoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgLy8JewotICAgIC8vCQljcmVhdGVXc0NvbnRlbnQoIk15UG9ydCIsICJNeU1ldGhvZCIsICJteVBhcmFtIiwgIiIpOwotICAgIC8vCQl3YWl0Rm9yQXB0TWFya2Vyc0FwcGVhcigpOwotICAgIC8vCQlpbml0V3NEb21PYmplY3RzKCk7Ci0gICAgLy8JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBhZG9ybm1lbnQiLCBKYXZhRWxlbWVudEltYWdlRGVzY3JpcHRvci5FUlJPUiwgZGVjb3JhdG9yLmNvbXB1dGVBZG9ybm1lbnRGbGFncyh3c0NoaWxkTGlzdC5wcm94eSgpKSk7Ci0gICAgLy8JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBhZG9ybm1lbnQiLCBOT19FUlJPUiwgZGVjb3JhdG9yLmNvbXB1dGVBZG9ybm1lbnRGbGFncyhzZWlDaGlsZExpc3QucHJveHkoKSkpOwotICAgIC8vCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgYWRvcm5tZW50IiwgSmF2YUVsZW1lbnRJbWFnZURlc2NyaXB0b3IuRVJST1IsIGRlY29yYXRvci5jb21wdXRlQWRvcm5tZW50RmxhZ3Mod3MpKTsKLSAgICAvLwkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGFkb3JubWVudCIsIE5PX0VSUk9SLCBkZWNvcmF0b3IuY29tcHV0ZUFkb3JubWVudEZsYWdzKHNlaSkpOwotICAgIC8vCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgYWRvcm5tZW50IiwgTk9fRVJST1IsIGRlY29yYXRvci5jb21wdXRlQWRvcm5tZW50RmxhZ3Mod2ViTWV0aG9kKSk7Ci0gICAgLy8JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBhZG9ybm1lbnQiLCBOT19FUlJPUiwgZGVjb3JhdG9yLmNvbXB1dGVBZG9ybm1lbnRGbGFncyh3ZWJQYXJhbSkpOwotICAgIC8vCi0gICAgLy8JCWZpeEFwdEVycm9ycygpOwotICAgIC8vCQljaGVja05vRXJyb3JzQWRvcm5tZW50KCk7Ci0gICAgLy8JfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVdzQ29udGVudChmaW5hbCBTdHJpbmcgc2VpTmFtZSwgZmluYWwgU3RyaW5nIHdlYk1ldGhvZE5hbWUsIGZpbmFsIFN0cmluZyBwYXJhbU5hbWUsIGZpbmFsIFN0cmluZyBzZXJ2aWNlTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgSVByb2plY3Qgd2ViUCA9IFRlc3RQcm9qZWN0c1V0aWxzLmNyZWF0ZVdlYjI1UHJvamVjdCgiV2ViVGVzdGVyIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLSAgICAgICAgdGVzdFByb2plY3QgPSBuZXcgVGVzdFByb2plY3Qod2ViUCk7Ci0gICAgICAgIHRlc3RQcm9qZWN0LnNldEFwdFByb2Nlc3NpbmdFbmFibGVkKHRydWUsIGZhbHNlKTsKLQotICAgICAgICBqYXh3c1Jlc291cmNlID0gbmV3IEpheFdzV29ya3NwYWNlUmVzb3VyY2UoSmF2YUNvcmUuY3JlYXRlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpKTsKLSAgICAgICAgamF4d3NSZXNvdXJjZS5sb2FkKG51bGwpOwotICAgICAgICBqYXh3c1Jlc291cmNlLnN0YXJ0U3luY2hyb25pemluZygpOwotCi0gICAgICAgIHRlc3RQYWNrYWdlID0gdGVzdFByb2plY3QuY3JlYXRlUGFja2FnZSgidGVzdCIpOwotICAgICAgICBzZWlUeXBlID0gdGVzdFByb2plY3QuY3JlYXRlVHlwZSh0ZXN0UGFja2FnZSwgIklTZWkuamF2YSIsIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFNFSV9DT05URU5ULCBzZWlOYW1lLCB3ZWJNZXRob2ROYW1lLCBwYXJhbU5hbWUpKTsKLSAgICAgICAgd3NJbXBsVHlwZSA9IHRlc3RQcm9qZWN0LmNyZWF0ZVR5cGUodGVzdFBhY2thZ2UsICJFbmRwb2ludENsYXNzLmphdmEiLCBNZXNzYWdlRm9ybWF0LmZvcm1hdChJTVBMX0NPTlRFTlQsIHNlcnZpY2VOYW1lKSk7Ci0gICAgICAgIHRlc3RQcm9qZWN0LmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQ0xFQU5fQlVJTEQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0V3NEb21PYmplY3RzKCkgdGhyb3dzIFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0aGlzLndzUHJvamVjdCA9IERvbVV0aWwuSU5TVEFOQ0UuZmluZFByb2plY3RCeU5hbWUoamF4d3NSZXNvdXJjZS5nZXRET00oKSwgdGVzdFByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodGhpcy53c1Byb2plY3QpOwotCi0gICAgICAgIHdzID0gd3NQcm9qZWN0LmdldFdlYlNlcnZpY2VzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgIHNlaSA9IHdzUHJvamVjdC5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgIHdlYk1ldGhvZCA9IHNlaS5nZXRXZWJNZXRob2RzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgIHdlYlBhcmFtID0gd2ViTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotICAgICAgICB3c0NoaWxkTGlzdCA9IG1vY2soSVdlYlNlcnZpY2VDaGlsZExpc3QuY2xhc3MpOwotICAgICAgICB3c0NoaWxkTGlzdC5zdHVicygpLm1ldGhvZCgiZ2V0V1NDaGlsZExpc3QiKS53aWxsKHJldHVyblZhbHVlKGVsaXN0KHdzKSkpOwotICAgICAgICBzZWlDaGlsZExpc3QgPSBtb2NrKElTRUlDaGlsZExpc3QuY2xhc3MpOwotICAgICAgICBzZWlDaGlsZExpc3Quc3R1YnMoKS5tZXRob2QoImdldFNFSUNoaWxkTGlzdCIpLndpbGwocmV0dXJuVmFsdWUoZWxpc3Qoc2VpKSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB3YWl0Rm9yQXB0TWFya2Vyc0FwcGVhcigpCi0gICAgewotICAgICAgICBBc3NlcnRpb25zLndhaXRBc3NlcnQobmV3IElXYWl0Q29uZGl0aW9uKCkKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gY2hlY2tDb25kaXRpb24oKSB0aHJvd3MgQ29uZGl0aW9uQ2hlY2tFeGNlcHRpb24KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmaW5kQXB0TWFya2VycygpLnNpemUoKSA+IDA7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmRpdGlvbkNoZWNrRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSwgIkFQVCBtYXJrZXJzIGRpZCBub3QgYXBwZWFyIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDb2xsZWN0aW9uPElNYXJrZXI+IGZpbmRBcHRNYXJrZXJzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIENvbGxlY3Rpb248SU1hcmtlcj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxJTWFya2VyPigpOwotICAgICAgICBmb3IoZmluYWwgSU1hcmtlciBtIDogdGVzdFByb2plY3QuZ2V0UHJvamVjdCgpLmZpbmRNYXJrZXJzKEFwdFBsdWdpbi5BUFRfQ09NUElMQVRJT05fUFJPQkxFTV9NQVJLRVIsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQuYWRkKG0pOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yKGZpbmFsIElNYXJrZXIgbSA6IHRlc3RQcm9qZWN0LmdldFByb2plY3QoKS5maW5kTWFya2VycyhBcHRQbHVnaW4uQVBUX05PTlJFQ09OQ0lMRV9DT01QSUxBVElPTl9QUk9CTEVNX01BUktFUiwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdC5hZGQobSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB3YWl0Rm9yTm9BcHRNYXJrZXJzKCkKLSAgICB7Ci0gICAgICAgIEFzc2VydGlvbnMud2FpdEFzc2VydChuZXcgSVdhaXRDb25kaXRpb24oKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBjaGVja0NvbmRpdGlvbigpIHRocm93cyBDb25kaXRpb25DaGVja0V4Y2VwdGlvbgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRlc3RQcm9qZWN0LmdldFByb2plY3QoKS5maW5kTWFya2VycyhBcHRQbHVnaW4uQVBUX05PTlJFQ09OQ0lMRV9DT01QSUxBVElPTl9QUk9CTEVNX01BUktFUiwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSkubGVuZ3RoID09IDA7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmRpdGlvbkNoZWNrRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSwgIkFQVCBtYXJrZXJzIGRpZCBub3QgZGlzYXBwZWFyIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBFTGlzdDxFT2JqZWN0PiBlbGlzdChmaW5hbCBFT2JqZWN0Li4uIGVsZW1lbnRzKQotICAgIHsKLSAgICAgICAgZmluYWwgRUxpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IEJhc2ljRUxpc3Q8RU9iamVjdD4oKTsKLSAgICAgICAgZm9yIChFT2JqZWN0IGVPYmogOiBlbGVtZW50cykKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0LmFkZChlT2JqKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZpeEFwdEVycm9ycygpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBBbm5vdGF0aW9uV3JpdGVyIGFubldyaXRlciA9IEFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKTsKLQotICAgICAgICBmaW5hbCBJQW5ub3RhdGlvbkluc3BlY3RvciBzZWlJbnNwZWN0b3IgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKHNlaVR5cGUpOwotICAgICAgICBmaW5hbCBJQW5ub3RhdGlvbjxJVHlwZT4gc2VpV3NBbm5vdGF0aW9uID0gc2VpSW5zcGVjdG9yLmluc3BlY3RUeXBlKCJqYXZheC5qd3MuV2ViU2VydmljZSIpOwotICAgICAgICBzZWlXc0Fubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuY2xlYXIoKTsKLSAgICAgICAgYW5uV3JpdGVyLnVwZGF0ZShzZWlXc0Fubm90YXRpb24pOwotCi0gICAgICAgIGZpbmFsIElNZXRob2Qgc2VpTWV0aG9kID0gc2VpVHlwZS5nZXRNZXRob2RzKClbMF07Ci0gICAgICAgIGZpbmFsIElBbm5vdGF0aW9uPElNZXRob2Q+IHNlaVdlYk1ldGhvZEFubm90YXRpb24gPSBzZWlJbnNwZWN0b3IuaW5zcGVjdE1ldGhvZChzZWlNZXRob2QsICJqYXZheC5qd3MuV2ViTWV0aG9kIik7Ci0gICAgICAgIGFubldyaXRlci5yZW1vdmUoc2VpV2ViTWV0aG9kQW5ub3RhdGlvbik7Ci0KLSAgICAgICAgZmluYWwgSVR5cGVQYXJhbWV0ZXIgc2VpTWV0aG9kUGFyYW0gPSBzZWlNZXRob2QuZ2V0VHlwZVBhcmFtZXRlcihzZWlNZXRob2QuZ2V0UGFyYW1ldGVyTmFtZXMoKVswXSk7Ci0gICAgICAgIGZpbmFsIElBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPiBzZWlXZWJQYXJhbUFubm90YXRpb24gPSBzZWlJbnNwZWN0b3IuaW5zcGVjdFBhcmFtKHNlaU1ldGhvZFBhcmFtLCAiamF2YXguandzLldlYlBhcmFtIik7Ci0gICAgICAgIGFubldyaXRlci5yZW1vdmUoc2VpV2ViUGFyYW1Bbm5vdGF0aW9uKTsKLQotICAgICAgICBmaW5hbCBJQW5ub3RhdGlvbkluc3BlY3RvciB3c0ltcGxJbnNwZWN0b3IgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKHdzSW1wbFR5cGUpOwotICAgICAgICBmaW5hbCBJQW5ub3RhdGlvbjxJVHlwZT4gd3NJbXBsV3NBbm5vdGF0aW9uID0gd3NJbXBsSW5zcGVjdG9yLmluc3BlY3RUeXBlKCJqYXZheC5qd3MuV2ViU2VydmljZSIpOwotICAgICAgICBmaW5hbCBTZXQ8SVBhcmFtVmFsdWVQYWlyPiBuZXdBbm5WYWx1ZXMgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7Ci0gICAgICAgIGZvciAoSVBhcmFtVmFsdWVQYWlyIHBhaXIgOiB3c0ltcGxXc0Fubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwYWlyLmdldFBhcmFtKCkuZXF1YWxzKCJzZXJ2aWNlTmFtZSIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5ld0FublZhbHVlcy5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgic2VydmljZU5hbWUiLCBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgiTXlTZXJ2aWNlTmFtZSIpKSk7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuZXdBbm5WYWx1ZXMuYWRkKHBhaXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHdzSW1wbFdzQW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5jbGVhcigpOwotICAgICAgICB3c0ltcGxXc0Fubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuYWRkQWxsKG5ld0FublZhbHVlcyk7Ci0gICAgICAgIGFubldyaXRlci51cGRhdGUod3NJbXBsV3NBbm5vdGF0aW9uKTsKLSAgICAgICAgd2FpdEZvck5vQXB0TWFya2VycygpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja05vRXJyb3JzQWRvcm5tZW50KCkKLSAgICB7Ci0gICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBhZG9ybm1lbnQiLCBOT19FUlJPUiwgZGVjb3JhdG9yLmNvbXB1dGVBZG9ybm1lbnRGbGFncyh3c0NoaWxkTGlzdC5wcm94eSgpKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBhZG9ybm1lbnQiLCBOT19FUlJPUiwgZGVjb3JhdG9yLmNvbXB1dGVBZG9ybm1lbnRGbGFncyhzZWlDaGlsZExpc3QucHJveHkoKSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgYWRvcm5tZW50IiwgTk9fRVJST1IsIGRlY29yYXRvci5jb21wdXRlQWRvcm5tZW50RmxhZ3Mod3MpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGFkb3JubWVudCIsIE5PX0VSUk9SLCBkZWNvcmF0b3IuY29tcHV0ZUFkb3JubWVudEZsYWdzKHNlaSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgYWRvcm5tZW50IiwgTk9fRVJST1IsIGRlY29yYXRvci5jb21wdXRlQWRvcm5tZW50RmxhZ3Mod2ViTWV0aG9kKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBhZG9ybm1lbnQiLCBOT19FUlJPUiwgZGVjb3JhdG9yLmNvbXB1dGVBZG9ybm1lbnRGbGFncyh3ZWJQYXJhbSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgTXlXZWJTZXJ2aWNlUHJvYmxlbXNEZWNvcmF0b3IgZXh0ZW5kcyBXZWJTZXJ2aWNlUHJvYmxlbXNEZWNvcmF0b3IKLSAgICB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGNvbXB1dGVBZG9ybm1lbnRGbGFncyhPYmplY3Qgb2JqKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIuY29tcHV0ZUFkb3JubWVudEZsYWdzKG9iaik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL3Rlc3RzL25hdmlnYXRvci9hY3Rpb25zL1dTQWN0aW9uQWJzdHJhY3RUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL3Rlc3RzL25hdmlnYXRvci9hY3Rpb25zL1dTQWN0aW9uQWJzdHJhY3RUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU5ODQ1YzguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi90ZXN0cy9uYXZpZ2F0b3IvYWN0aW9ucy9XU0FjdGlvbkFic3RyYWN0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy5uYXZpZ2F0b3IuYWN0aW9uczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVQYXRoOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVTZWxlY3Rpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLklTRUlDaGlsZExpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLklXZWJTZXJ2aWNlQ2hpbGRMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5hY3Rpb25zLldTQWN0aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2tPYmplY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LlRlc3RQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuVGVzdFByb2plY3RzVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubmF2aWdhdG9yLk5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZXh0ZW5zaW9ucy5Db21tb25BY3Rpb25FeHRlbnNpb25TaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vblZpZXdlclNpdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5OYXZpZ2F0b3JDb250ZW50U2VydmljZUZhY3Rvcnk7DQotDQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikNCi1wdWJsaWMgY2xhc3MgV1NBY3Rpb25BYnN0cmFjdFRlc3QgZXh0ZW5kcyBNb2NrT2JqZWN0VGVzdENhc2UgDQotew0KLQlwcm90ZWN0ZWQgc3RhdGljIFRlc3RQcm9qZWN0IHRlc3RQcmoxOyANCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXN0UHJvamVjdCB0ZXN0UHJqMjsgDQotCXByb3RlY3RlZCBzdGF0aWMgVGVzdFByb2plY3QgdGVzdFByajM7DQotCXByb3RlY3RlZCBzdGF0aWMgVGVzdFByb2plY3QgdGVzdFByajQ7DQotCQ0KLQlwcml2YXRlIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QxOw0KLQlwcml2YXRlIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QyOw0KLQlwcml2YXRlIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QzOw0KLQlwcml2YXRlIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3Q0Ow0KLQkNCi0JcHJvdGVjdGVkIElQYWNrYWdlRnJhZ21lbnQgbW9kZWxTeW5jMTsNCi0JcHJvdGVjdGVkIElQYWNrYWdlRnJhZ21lbnQgbW9kZWxTeW5jMjsNCi0JcHJvdGVjdGVkIElQYWNrYWdlRnJhZ21lbnQgbW9kZWxTeW5jMzsNCi0JcHJvdGVjdGVkIElQYWNrYWdlRnJhZ21lbnQgbW9kZWxTeW5jNDsNCi0JDQotCXByb3RlY3RlZCBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHRhcmdldFJlc291cmNlOw0KLQlwcm90ZWN0ZWQgRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgYWRhcHRlckZhY3Rvcnk7DQotCQ0KLQlwcm90ZWN0ZWQgV1NBY3Rpb25Qcm92aWRlciB3c0FjdGlvblByb3YgPSBudWxsOw0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlpZih0ZXN0UHJqMT09bnVsbCkNCi0JCXsNCi0JCQlJUHJvamVjdCBlamJQcm9qZWN0ID0gVGVzdFByb2plY3RzVXRpbHMuY3JlYXRlRWpiM1Byb2plY3QoIkRPTVdTQWN0aW9uVGVzdFByb2plY3QxIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsNCi0JCQl0ZXN0UHJqMSA9IG5ldyBUZXN0UHJvamVjdChlamJQcm9qZWN0LmdldFByb2plY3QoKSk7DQotCQkJdGVzdFByajEuY3JlYXRlU291cmNlRm9sZGVyKCJzcmMiKTsNCi0JCQltb2RlbFN5bmMxID0gdGVzdFByajEuY3JlYXRlUGFja2FnZSgib3JnLmVjbGlwc2UudGVzdC5tb2RlbHN5bmMxIik7DQotCQkJdGVzdFByajEuY3JlYXRlVHlwZShtb2RlbFN5bmMxLCAiU2VpMS5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiU2VpMU5hbWVcIikgcHVibGljIGludGVyZmFjZSBTZWkxe1xuIiArDQotCQkJCQkiQGphdmF4Lmp3cy5XZWJNZXRob2Qob3BlcmF0aW9uTmFtZT1cInBhcmVudE1ldGhvZFwiKSBwdWJsaWMgdm9pZCB2b2lkTWV0aG9kV2l0aE5vQXJnc0luUGFyZW50KCk7XG4iICsNCi0JCQkJCSJ9Iik7DQotCQkJdGVzdFByajEuY3JlYXRlVHlwZShtb2RlbFN5bmMxLCAiU2VpMi5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiU2VpMk5hbWVcIikgcHVibGljIGludGVyZmFjZSBTZWkyIGV4dGVuZHMgU2VpMSB7XG4iICsNCi0JCQkJCSJAamF2YXguandzLldlYk1ldGhvZChvcGVyYXRpb25OYW1lPVwid2ViTWV0aG9kXCIpIHB1YmxpYyB2b2lkIHZvaWRNZXRob2RXaXRoTm9BcmdzTm90SW5QYXJlbnQoKTtcbiIgKw0KLQkJCQkJIn0iKTsNCi0JCQl0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYzEsICJXUzEuamF2YSIsICJAamF2YXguZWpiLlN0YXRlbGVzc1xuIiArICJAamF2YXguandzLldlYlNlcnZpY2Uoc2VydmljZU5hbWU9XCJXUzFOYW1lXCIsIGVuZHBvaW50SW50ZXJmYWNlPVwib3JnLmVjbGlwc2UudGVzdC5tb2RlbHN5bmMxLlNlaTJcIikgcHVibGljIGNsYXNzIFdTMSB7fSIpOw0KLQkJCQ0KLQkJfQ0KLQkJDQotCQlpZih0ZXN0UHJqMj09bnVsbCkNCi0JCXsNCi0JCQlJUHJvamVjdCB3ZWJQcm9qZWN0ID0gVGVzdFByb2plY3RzVXRpbHMuY3JlYXRlV2ViMjVQcm9qZWN0KCJET01XU0FjdGlvblRlc3RQcm9qZWN0MiIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7DQotCQkJdGVzdFByajIgPSBuZXcgVGVzdFByb2plY3Qod2ViUHJvamVjdC5nZXRQcm9qZWN0KCkpOw0KLQkJCXRlc3RQcmoyLmNyZWF0ZVNvdXJjZUZvbGRlcigic3JjIik7DQotCQkJbW9kZWxTeW5jMiA9IHRlc3RQcmoyLmNyZWF0ZVBhY2thZ2UoIm9yZy5lY2xpcHNlLnRlc3QubW9kZWxzeW5jMiIpOw0KLQkJCXRlc3RQcmoyLmNyZWF0ZVR5cGUobW9kZWxTeW5jMiwgIlNlaTEuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaTFOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpMXtcbiIgKw0KLQkJCQkJIkBqYXZheC5qd3MuV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWU9XCJwYXJlbnRNZXRob2RcIikgcHVibGljIHZvaWQgdm9pZE1ldGhvZFdpdGhOb0FyZ3NJblBhcmVudCgpO1xuIiArDQotCQkJCQkifSIpOw0KLQkJCXRlc3RQcmoyLmNyZWF0ZVR5cGUobW9kZWxTeW5jMiwgIlNlaTIuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaTJOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpMiBleHRlbmRzIFNlaTEge1xuIiArDQotCQkJCQkiQGphdmF4Lmp3cy5XZWJNZXRob2Qob3BlcmF0aW9uTmFtZT1cIndlYk1ldGhvZFwiKSBwdWJsaWMgdm9pZCB2b2lkTWV0aG9kV2l0aE5vQXJnc05vdEluUGFyZW50KCk7XG4iICsNCi0JCQkJCSJ9Iik7DQotCQkJdGVzdFByajIuY3JlYXRlVHlwZShtb2RlbFN5bmMyLCAiV1MxLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPVwiV1MxTmFtZVwiLCBlbmRwb2ludEludGVyZmFjZT1cIm9yZy5lY2xpcHNlLnRlc3QubW9kZWxzeW5jMS5TZWkyXCIpIHB1YmxpYyBjbGFzcyBXUzEge30iKTsNCi0JCX0NCi0JCQ0KLQkJaWYodGVzdFByajM9PW51bGwpDQotCQl7DQotCQkJSVByb2plY3QgZWpiUHJvamVjdCA9IFRlc3RQcm9qZWN0c1V0aWxzLmNyZWF0ZUVqYjNQcm9qZWN0KCJET01XU0FjdGlvblRlc3RQcm9qZWN0MyIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7DQotCQkJdGVzdFByajMgPSBuZXcgVGVzdFByb2plY3QoZWpiUHJvamVjdC5nZXRQcm9qZWN0KCkpOw0KLQkJCXRlc3RQcmozLmNyZWF0ZVNvdXJjZUZvbGRlcigic3JjIik7DQotCQkJbW9kZWxTeW5jMyA9IHRlc3RQcmozLmNyZWF0ZVBhY2thZ2UoIm9yZy5lY2xpcHNlLnRlc3QubW9kZWxzeW5jMyIpOw0KLQkJCXRlc3RQcmozLmNyZWF0ZVR5cGUobW9kZWxTeW5jMywNCi0JCQkJCSJXUzEuamF2YSIsDQotCQkJCQkiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJJbXBsaWNpdFNlaTFOYW1lXCIpIHB1YmxpYyBjbGFzcyBXUzEge1xuIg0KLQkJCQkJKyAiQGphdmF4Lmp3cy5XZWJNZXRob2Qob3BlcmF0aW9uTmFtZT1cInN1cGVyUGFyZW50TWV0aG9kXCIpIHB1YmxpYyB2b2lkIHN1cGVyUGFyZW50TWV0aG9kKCkge31cbiINCi0JCQkJCSsgIn0iKTsNCi0JCQkNCi0JCQl0ZXN0UHJqMy5jcmVhdGVUeXBlKG1vZGVsU3luYzMsDQotCQkJCQkiV1MyLmphdmEiLA0KLQkJCQkJIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiSW1wbGljaXRTZWkyTmFtZVwiKSBwdWJsaWMgY2xhc3MgV1MyIGV4dGVuZHMgV1MxIHtcbiINCi0JCQkJCSsgIkBqYXZheC5qd3MuV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWU9XCJwYXJlbnRNZXRob2RcIikgcHVibGljIHZvaWQgcGFyZW50TWV0aG9kKCkge31cbiINCi0JCQkJCSsgIn0iKTsNCi0JCQkNCi0JCQl0ZXN0UHJqMy5jcmVhdGVUeXBlKG1vZGVsU3luYzMsDQotCQkJCQkiV1MzLmphdmEiLA0KLQkJCQkJIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiSW1wbGljaXRTZWkzTmFtZVwiKSBwdWJsaWMgY2xhc3MgV1MzIGV4dGVuZHMgV1MyIHtcbiINCi0JCQkJCSsgIkBqYXZheC5qd3MuV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWU9XCJ3ZWJNZXRob2RcIikgcHVibGljIHZvaWQgd2ViTWV0aG9kKGludCBwYXJhbSkge31cbiINCi0JCQkJCSsgIn0iKTsNCi0JCX0NCi0NCi0JCWlmKHRlc3RQcmo0PT1udWxsKQ0KLQkJew0KLQkJCUlQcm9qZWN0IHdlYlByb2plY3QgPSBUZXN0UHJvamVjdHNVdGlscy5jcmVhdGVXZWIyNVByb2plY3QoIkRPTVdTQWN0aW9uVGVzdFByb2plY3Q0IiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsNCi0JCQl0ZXN0UHJqNCA9IG5ldyBUZXN0UHJvamVjdCh3ZWJQcm9qZWN0LmdldFByb2plY3QoKSk7DQotCQkJdGVzdFByajQuY3JlYXRlU291cmNlRm9sZGVyKCJzcmMiKTsNCi0JCQltb2RlbFN5bmM0ID0gdGVzdFByajQuY3JlYXRlUGFja2FnZSgib3JnLmVjbGlwc2UudGVzdC5tb2RlbHN5bmM0Iik7DQotCQkJdGVzdFByajQuY3JlYXRlVHlwZShtb2RlbFN5bmM0LA0KLQkJCQkJIldTMS5qYXZhIiwNCi0JCQkJCSJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIkltcGxpY2l0U2VpMU5hbWVcIikgcHVibGljIGNsYXNzIFdTMSB7XG4iDQotCQkJCQkrICJAamF2YXguandzLldlYk1ldGhvZChvcGVyYXRpb25OYW1lPVwic3VwZXJQYXJlbnRNZXRob2RcIikgcHVibGljIHZvaWQgc3VwZXJQYXJlbnRNZXRob2QoKSB7fVxuIg0KLQkJCQkJKyAifSIpOw0KLQkJCQ0KLQkJCXRlc3RQcmo0LmNyZWF0ZVR5cGUobW9kZWxTeW5jNCwNCi0JCQkJCSJXUzIuamF2YSIsDQotCQkJCQkiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJJbXBsaWNpdFNlaTJOYW1lXCIpIHB1YmxpYyBjbGFzcyBXUzIgZXh0ZW5kcyBXUzEge1xuIg0KLQkJCQkJKyAiQGphdmF4Lmp3cy5XZWJNZXRob2Qob3BlcmF0aW9uTmFtZT1cInBhcmVudE1ldGhvZFwiKSBwdWJsaWMgdm9pZCBwYXJlbnRNZXRob2QoKSB7fVxuIg0KLQkJCQkJKyAifSIpOw0KLQkJCQ0KLQkJCXRlc3RQcmo0LmNyZWF0ZVR5cGUobW9kZWxTeW5jNCwNCi0JCQkJCSJXUzMuamF2YSIsDQotCQkJCQkiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJJbXBsaWNpdFNlaTNOYW1lXCIpIHB1YmxpYyBjbGFzcyBXUzMgZXh0ZW5kcyBXUzIge1xuIg0KLQkJCQkJKyAiQGphdmF4Lmp3cy5XZWJNZXRob2Qob3BlcmF0aW9uTmFtZT1cIndlYk1ldGhvZFwiKSBwdWJsaWMgdm9pZCB3ZWJNZXRob2QoKSB7fVxuIg0KLQkJCQkJKyAifSIpOw0KLQkJfQ0KLQ0KLQkJdGFyZ2V0UmVzb3VyY2UgPSBuZXcgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZShKYXZhQ29yZS5jcmVhdGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSkpOw0KLQkJdGFyZ2V0UmVzb3VyY2UubG9hZChudWxsKTsNCi0JCQ0KLQkJSXRlcmF0b3I8SVdlYlNlcnZpY2VQcm9qZWN0PiB3c1Byb2plY3RzID0gdGFyZ2V0UmVzb3VyY2UuZ2V0RE9NKCkuZ2V0V2ViU2VydmljZVByb2plY3RzKCkuaXRlcmF0b3IoKTsNCi0JCQ0KLQkJd2hpbGUod3NQcm9qZWN0cy5oYXNOZXh0KCkpDQotCQl7DQotCQkJSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdCA9IHdzUHJvamVjdHMubmV4dCgpOw0KLQkJCQ0KLQkJCWlmKHdzUHJvamVjdC5nZXROYW1lKCkuZXF1YWxzKHRlc3RQcmoxLmdldFByb2plY3QoKS5nZXROYW1lKCkpKQ0KLQkJCXsNCi0JCQkJdGhpcy53c1Byb2plY3QxID0gd3NQcm9qZWN0Ow0KLQkJCX0NCi0JCQllbHNlIGlmKHdzUHJvamVjdC5nZXROYW1lKCkuZXF1YWxzKHRlc3RQcmoyLmdldFByb2plY3QoKS5nZXROYW1lKCkpKQ0KLQkJCXsNCi0JCQkJdGhpcy53c1Byb2plY3QyID0gd3NQcm9qZWN0Ow0KLQkJCX0NCi0JCQllbHNlIGlmKHdzUHJvamVjdC5nZXROYW1lKCkuZXF1YWxzKHRlc3RQcmozLmdldFByb2plY3QoKS5nZXROYW1lKCkpKQ0KLQkJCXsNCi0JCQkJdGhpcy53c1Byb2plY3QzID0gd3NQcm9qZWN0Ow0KLQkJCX0NCi0JCQllbHNlIGlmKHdzUHJvamVjdC5nZXROYW1lKCkuZXF1YWxzKHRlc3RQcmo0LmdldFByb2plY3QoKS5nZXROYW1lKCkpKQ0KLQkJCXsNCi0JCQkJdGhpcy53c1Byb2plY3Q0ID0gd3NQcm9qZWN0Ow0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLndzUHJvamVjdDEpOw0KLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLndzUHJvamVjdDIpOw0KLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLndzUHJvamVjdDMpOw0KLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLndzUHJvamVjdDQpOw0KLQkJDQotCQlhZGFwdGVyRmFjdG9yeSA9IG5ldyBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigpIA0KLQkJew0KLQkJCUBPdmVycmlkZQ0KLQkJCXByb3RlY3RlZCBJV2ViU2VydmljZVByb2plY3QgZ2V0V3NQcm9qZWN0KGZpbmFsIElET00gZG9tLCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0KSB7DQotCQkJCWlmKHByb2plY3QuZ2V0TmFtZSgpLmVxdWFscyh3c1Byb2plY3QxLmdldE5hbWUoKSkpDQotCQkJCXsNCi0JCQkJCXJldHVybiB3c1Byb2plY3QxOw0KLQkJCQl9DQotCQkJCWVsc2UgaWYocHJvamVjdC5nZXROYW1lKCkuZXF1YWxzKHdzUHJvamVjdDIuZ2V0TmFtZSgpKSkNCi0JCQkJew0KLQkJCQkJcmV0dXJuIHdzUHJvamVjdDI7DQotCQkJCX0NCi0JCQkJZWxzZSBpZihwcm9qZWN0LmdldE5hbWUoKS5lcXVhbHMod3NQcm9qZWN0My5nZXROYW1lKCkpKQ0KLQkJCQl7DQotCQkJCQlyZXR1cm4gd3NQcm9qZWN0MzsNCi0JCQkJfQ0KLQkJCQllbHNlIGlmKHByb2plY3QuZ2V0TmFtZSgpLmVxdWFscyh3c1Byb2plY3Q0LmdldE5hbWUoKSkpDQotCQkJCXsNCi0JCQkJCXJldHVybiB3c1Byb2plY3Q0Ow0KLQkJCQl9DQotCQkJCXRocm93IG5ldyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3IoInByb2plY3QgIiArIHByb2plY3QgKyAibm90IGZvdW5kIGluIERPTSIpOw0KLQkJCX0JCQkNCi0JCX07DQotDQotCX0NCi0JDQotCXByb3RlY3RlZCBJV2ViU2VydmljZSBnZXRXU0Zyb21FamJQcm9qZWN0KCkNCi0Jew0KLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqMS5nZXRQcm9qZWN0KCkpOw0KLQkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7DQotDQotCQlmb3IoaW50IGlpPTA7IGlpPGNoaWxkcmVuLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZihjaGlsZHJlbltpaV0gaW5zdGFuY2VvZiBJV2ViU2VydmljZUNoaWxkTGlzdCkNCi0JCQl7DQotCQkJCU9iamVjdFtdIHdTcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuW2lpXSk7DQotCQkJCQ0KLQkJCQlyZXR1cm4gKElXZWJTZXJ2aWNlKXdTc1swXTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVdlYlNlcnZpY2UgZ2V0V1NGcm9tV2ViUHJvamVjdCgpDQotCXsNCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajIuZ2V0UHJvamVjdCgpKTsNCi0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOw0KLQ0KLQkJZm9yKGludCBpaT0wOyBpaTxjaGlsZHJlbi5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoY2hpbGRyZW5baWldIGluc3RhbmNlb2YgSVdlYlNlcnZpY2VDaGlsZExpc3QpDQotCQkJew0KLQkJCQlPYmplY3RbXSB3U3MgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlbltpaV0pOw0KLQkJCQkNCi0JCQkJcmV0dXJuIChJV2ViU2VydmljZSl3U3NbMF07DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgZ2V0U0VJRXhwRnJvbUVqYlByb2plY3QoKQ0KLQl7DQotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmoxLmdldFByb2plY3QoKSk7DQotCQljaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsNCi0NCi0JCWZvcihpbnQgaWk9MDsgaWk8Y2hpbGRyZW4ubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKGNoaWxkcmVuW2lpXSBpbnN0YW5jZW9mIElTRUlDaGlsZExpc3QpDQotCQkJew0KLQkJCQlPYmplY3RbXSBzRUlzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5baWldKTsNCi0JCQkJDQotCQkJCXJldHVybiAoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSlzRUlzWzBdOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIGdldFNFSUZyb21UZXN0UHJqMShTdHJpbmcgc2VpTmFtZSkNCi0Jew0KLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqMS5nZXRQcm9qZWN0KCkpOw0KLQkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7DQotDQotCQlmb3IoaW50IGlpPTA7IGlpPGNoaWxkcmVuLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZihjaGlsZHJlbltpaV0gaW5zdGFuY2VvZiBJU0VJQ2hpbGRMaXN0KQ0KLQkJCXsNCi0JCQkJT2JqZWN0W10gc0VJcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuW2lpXSk7DQotCQkJCQ0KLQkJCQlmb3IoaW50IGpqPTA7IGpqPHNFSXMubGVuZ3RoOyBqaisrKQ0KLQkJCQl7DQotCQkJCQlpZigoKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Upc0VJc1tqal0pLmdldE5hbWUoKS5lcXVhbHMoc2VpTmFtZSkpDQotCQkJCQl7DQotCQkJCQkJcmV0dXJuIChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKXNFSXNbampdOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElXZWJTZXJ2aWNlIGdldFdTRnJvbVRlc3RQcmooVGVzdFByb2plY3QgdGVzdFByaiwgU3RyaW5nIHdzTmFtZSkNCi0Jew0KLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqLmdldFByb2plY3QoKSk7DQotCQljaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsNCi0NCi0JCWZvcihpbnQgaWk9MDsgaWk8Y2hpbGRyZW4ubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKGNoaWxkcmVuW2lpXSBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlQ2hpbGRMaXN0KQ0KLQkJCXsNCi0JCQkJT2JqZWN0W10gd1NzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5baWldKTsNCi0JCQkJDQotCQkJCWZvcihpbnQgamo9MDsgamo8d1NzLmxlbmd0aDsgamorKykNCi0JCQkJew0KLQkJCQkJaWYoKChJV2ViU2VydmljZSl3U3NbampdKS5nZXRJbXBsZW1lbnRhdGlvbigpLmVxdWFscyh3c05hbWUpKQ0KLQkJCQkJew0KLQkJCQkJCXJldHVybiAoSVdlYlNlcnZpY2Upd1NzW2pqXTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotLy8JcHJvdGVjdGVkIElXZWJTZXJ2aWNlIGdldFdTRnJvbVRlc3RQcmoxKFN0cmluZyB3c05hbWUpDQotLy8Jew0KLS8vCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmoxLmdldFByb2plY3QoKSk7DQotLy8JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOw0KLS8vDQotLy8JCWZvcihpbnQgaWk9MDsgaWk8Y2hpbGRyZW4ubGVuZ3RoOyBpaSsrKQ0KLS8vCQl7DQotLy8JCQlpZihjaGlsZHJlbltpaV0gaW5zdGFuY2VvZiBJV2ViU2VydmljZUNoaWxkTGlzdCkNCi0vLwkJCXsNCi0vLwkJCQlPYmplY3RbXSB3U3MgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlbltpaV0pOw0KLS8vCQkJCQ0KLS8vCQkJCWZvcihpbnQgamo9MDsgamo8d1NzLmxlbmd0aDsgamorKykNCi0vLwkJCQl7DQotLy8JCQkJCWlmKCgoSVdlYlNlcnZpY2Upd1NzW2pqXSkuZ2V0TmFtZSgpLmVxdWFscyh3c05hbWUpKQ0KLS8vCQkJCQl7DQotLy8JCQkJCQlyZXR1cm4gKElXZWJTZXJ2aWNlKXdTc1tqal07DQotLy8JCQkJCX0NCi0vLwkJCQl9DQotLy8JCQl9DQotLy8JCX0NCi0vLwkJDQotLy8JCXJldHVybiBudWxsOw0KLS8vCX0NCi0JDQotCXByb3RlY3RlZCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIGdldFNFSUZyb21UZXN0UHJqMyhTdHJpbmcgc2VpTmFtZSkNCi0Jew0KLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqMy5nZXRQcm9qZWN0KCkpOw0KLQkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7DQotDQotCQlmb3IoaW50IGlpPTA7IGlpPGNoaWxkcmVuLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZihjaGlsZHJlbltpaV0gaW5zdGFuY2VvZiBJV2ViU2VydmljZUNoaWxkTGlzdCkNCi0JCQl7DQotCQkJCU9iamVjdFtdIHdTcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuW2lpXSk7DQotCQkJCQ0KLQkJCQlmb3IoaW50IGpqPTA7IGpqPHdTcy5sZW5ndGg7IGpqKyspDQotCQkJCXsNCi0JCQkJCWlmKCgoSVdlYlNlcnZpY2Upd1NzW2pqXSkuZ2V0U2VydmljZUVuZHBvaW50KCkuZ2V0TmFtZSgpLmVxdWFscyhzZWlOYW1lKSkNCi0JCQkJCXsNCi0JCQkJCQlyZXR1cm4gKChJV2ViU2VydmljZSl3U3NbampdKS5nZXRTZXJ2aWNlRW5kcG9pbnQoKTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIGdldFNFSUV4cEZyb21XZWJQcm9qZWN0KCkNCi0Jew0KLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqMi5nZXRQcm9qZWN0KCkpOw0KLQkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7DQotDQotCQlmb3IoaW50IGlpPTA7IGlpPGNoaWxkcmVuLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZihjaGlsZHJlbltpaV0gaW5zdGFuY2VvZiBJU0VJQ2hpbGRMaXN0KQ0KLQkJCXsNCi0JCQkJT2JqZWN0W10gc0VJcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuW2lpXSk7DQotCQkJCQ0KLQkJCQlyZXR1cm4gKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Upc0VJc1swXTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBnZXRTRUlJbXBGcm9tRWpiUHJvamVjdCgpDQotCXsNCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajMuZ2V0UHJvamVjdCgpKTsNCi0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOw0KLQ0KLQkJZm9yKGludCBpaT0wOyBpaTxjaGlsZHJlbi5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoY2hpbGRyZW5baWldIGluc3RhbmNlb2YgSVdlYlNlcnZpY2VDaGlsZExpc3QpDQotCQkJew0KLQkJCQlPYmplY3RbXSB3U3MgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlbltpaV0pOw0KLQkJCQkNCi0JCQkJcmV0dXJuICgoSVdlYlNlcnZpY2Upd1NzWzBdKS5nZXRTZXJ2aWNlRW5kcG9pbnQoKTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBnZXRTRUlJbXBGcm9tV2ViUHJvamVjdCgpDQotCXsNCi0JCQ0KLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqNC5nZXRQcm9qZWN0KCkpOw0KLQkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7DQotDQotCQlmb3IoaW50IGlpPTA7IGlpPGNoaWxkcmVuLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZihjaGlsZHJlbltpaV0gaW5zdGFuY2VvZiBJV2ViU2VydmljZUNoaWxkTGlzdCkNCi0JCQl7DQotCQkJCU9iamVjdFtdIHdTcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuW2lpXSk7DQotCQkJCQ0KLQkJCQlyZXR1cm4gKChJV2ViU2VydmljZSl3U3NbMF0pLmdldFNlcnZpY2VFbmRwb2ludCgpOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJV2ViTWV0aG9kIGdldFdTTWV0aG9kSW5oZXJpdGVkRnJvbUVqYlByb2plY3QoKQ0KLQl7DQotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmozLmdldFByb2plY3QoKSk7DQotCQljaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsNCi0JCU9iamVjdFtdIHdTcyA9IG51bGw7DQotCQlPYmplY3RbXSB3ZWJNZXRob2RzID0gbnVsbDsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTxjaGlsZHJlbi5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoY2hpbGRyZW5baWldIGluc3RhbmNlb2YgSVdlYlNlcnZpY2VDaGlsZExpc3QpDQotCQkJew0KLQkJCQl3U3MgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlbltpaV0pOw0KLQkJCQkNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHdTcyk7DQotCQkNCi0JCWZvcihpbnQgaWk9MDsgaWk8d1NzLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZigoKElXZWJTZXJ2aWNlKXdTc1tpaV0pLmdldEltcGxlbWVudGF0aW9uKCkuZXF1YWxzKCJvcmcuZWNsaXBzZS50ZXN0Lm1vZGVsc3luYzMuV1MzIikpDQotCQkJew0KLQkJCQl3ZWJNZXRob2RzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oKChJV2ViU2VydmljZSl3U3NbaWldKS5nZXRTZXJ2aWNlRW5kcG9pbnQoKSk7DQotCQkJCQ0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWFzc2VydE5vdE51bGwod2ViTWV0aG9kcyk7DQotCQkNCi0JCWZvcihpbnQgaWk9MDsgaWk8d2ViTWV0aG9kcy5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoKChJV2ViTWV0aG9kKXdlYk1ldGhvZHNbaWldKS5nZXROYW1lKCkuZXF1YWxzKCJzdXBlclBhcmVudE1ldGhvZCIpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIChJV2ViTWV0aG9kKXdlYk1ldGhvZHNbaWldOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJV2ViTWV0aG9kIGdldFdTTWV0aG9kSW5oZXJpdGVkRnJvbVdlYlByb2plY3QoKQ0KLQl7DQotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmo0LmdldFByb2plY3QoKSk7DQotCQljaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsNCi0NCi0JCU9iamVjdFtdIHdTcyA9IG51bGw7DQotCQlPYmplY3RbXSB3ZWJNZXRob2RzID0gbnVsbDsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTxjaGlsZHJlbi5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoY2hpbGRyZW5baWldIGluc3RhbmNlb2YgSVdlYlNlcnZpY2VDaGlsZExpc3QpDQotCQkJew0KLQkJCQl3U3MgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlbltpaV0pOw0KLQkJCQkNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHdTcyk7DQotCQkNCi0JCWZvcihpbnQgaWk9MDsgaWk8d1NzLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZigoKElXZWJTZXJ2aWNlKXdTc1tpaV0pLmdldEltcGxlbWVudGF0aW9uKCkuZXF1YWxzKCJvcmcuZWNsaXBzZS50ZXN0Lm1vZGVsc3luYzQuV1MzIikpDQotCQkJew0KLQkJCQl3ZWJNZXRob2RzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oKChJV2ViU2VydmljZSl3U3NbaWldKS5nZXRTZXJ2aWNlRW5kcG9pbnQoKSk7DQotCQkJCQ0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWFzc2VydE5vdE51bGwod2ViTWV0aG9kcyk7DQotCQkNCi0JCWZvcihpbnQgaWk9MDsgaWk8d2ViTWV0aG9kcy5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoKChJV2ViTWV0aG9kKXdlYk1ldGhvZHNbaWldKS5nZXROYW1lKCkuZXF1YWxzKCJzdXBlclBhcmVudE1ldGhvZCIpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIChJV2ViTWV0aG9kKXdlYk1ldGhvZHNbaWldOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJV2ViTWV0aG9kIGdldFdTTWV0aG9kTm90SW5oZXJpdGVkRnJvbUVqYlByb2plY3QoKQ0KLQl7DQotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmozLmdldFByb2plY3QoKSk7DQotCQljaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsNCi0NCi0JCU9iamVjdFtdIHdTcyA9IG51bGw7DQotCQlPYmplY3RbXSB3ZWJNZXRob2RzID0gbnVsbDsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTxjaGlsZHJlbi5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoY2hpbGRyZW5baWldIGluc3RhbmNlb2YgSVdlYlNlcnZpY2VDaGlsZExpc3QpDQotCQkJew0KLQkJCQl3U3MgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlbltpaV0pOw0KLQkJCQkNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHdTcyk7DQotCQkNCi0JCWZvcihpbnQgaWk9MDsgaWk8d1NzLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZigoKElXZWJTZXJ2aWNlKXdTc1tpaV0pLmdldEltcGxlbWVudGF0aW9uKCkuZXF1YWxzKCJvcmcuZWNsaXBzZS50ZXN0Lm1vZGVsc3luYzMuV1MzIikpDQotCQkJew0KLQkJCQl3ZWJNZXRob2RzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oKChJV2ViU2VydmljZSl3U3NbaWldKS5nZXRTZXJ2aWNlRW5kcG9pbnQoKSk7DQotCQkJCQ0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWFzc2VydE5vdE51bGwod2ViTWV0aG9kcyk7DQotCQkNCi0JCWZvcihpbnQgaWk9MDsgaWk8d2ViTWV0aG9kcy5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoKChJV2ViTWV0aG9kKXdlYk1ldGhvZHNbaWldKS5nZXROYW1lKCkuZXF1YWxzKCJ3ZWJNZXRob2QiKSkNCi0JCQl7DQotCQkJCXJldHVybiAoSVdlYk1ldGhvZCl3ZWJNZXRob2RzW2lpXTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVdlYk1ldGhvZCBnZXRXU01ldGhvZE5vdEluaGVyaXRlZEZyb21XZWJQcm9qZWN0KCkNCi0Jew0KLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqNC5nZXRQcm9qZWN0KCkpOw0KLQkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7DQotDQotCQlPYmplY3RbXSB3U3MgPSBudWxsOw0KLQkJT2JqZWN0W10gd2ViTWV0aG9kcyA9IG51bGw7DQotCQkNCi0JCWZvcihpbnQgaWk9MDsgaWk8Y2hpbGRyZW4ubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKGNoaWxkcmVuW2lpXSBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlQ2hpbGRMaXN0KQ0KLQkJCXsNCi0JCQkJd1NzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5baWldKTsNCi0JCQkJDQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbCh3U3MpOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPHdTcy5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoKChJV2ViU2VydmljZSl3U3NbaWldKS5nZXRJbXBsZW1lbnRhdGlvbigpLmVxdWFscygib3JnLmVjbGlwc2UudGVzdC5tb2RlbHN5bmM0LldTMyIpKQ0KLQkJCXsNCi0JCQkJd2ViTWV0aG9kcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKCgoSVdlYlNlcnZpY2Upd1NzW2lpXSkuZ2V0U2VydmljZUVuZHBvaW50KCkpOw0KLQkJCQkNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHdlYk1ldGhvZHMpOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPHdlYk1ldGhvZHMubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKCgoSVdlYk1ldGhvZCl3ZWJNZXRob2RzW2lpXSkuZ2V0TmFtZSgpLmVxdWFscygid2ViTWV0aG9kIikpDQotCQkJew0KLQkJCQlyZXR1cm4gKElXZWJNZXRob2Qpd2ViTWV0aG9kc1tpaV07DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElXZWJNZXRob2QgZ2V0U0VJTWV0aG9kSW5oZXJpdGVkRnJvbUVqYlByb2plY3QoKQ0KLQl7DQotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmoxLmdldFByb2plY3QoKSk7DQotCQljaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsNCi0NCi0JCU9iamVjdFtdIHNFSXMgPSBudWxsOw0KLQkJT2JqZWN0W10gd2ViTWV0aG9kcyA9IG51bGw7DQotCQkNCi0JCWZvcihpbnQgaWk9MDsgaWk8Y2hpbGRyZW4ubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKGNoaWxkcmVuW2lpXSBpbnN0YW5jZW9mIElTRUlDaGlsZExpc3QpDQotCQkJew0KLQkJCQlzRUlzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5baWldKTsNCi0JCQkJDQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChzRUlzKTsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTxzRUlzLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZigoKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Upc0VJc1tpaV0pLmdldE5hbWUoKS5lcXVhbHMoIlNlaTJOYW1lIikpDQotCQkJew0KLQkJCQl3ZWJNZXRob2RzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKXNFSXNbaWldKSk7DQotCQkJCQ0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWFzc2VydE5vdE51bGwod2ViTWV0aG9kcyk7DQotCQkNCi0JCWZvcihpbnQgaWk9MDsgaWk8d2ViTWV0aG9kcy5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoKChJV2ViTWV0aG9kKXdlYk1ldGhvZHNbaWldKS5nZXROYW1lKCkuZXF1YWxzKCJwYXJlbnRNZXRob2QiKSkNCi0JCQl7DQotCQkJCXJldHVybiAoSVdlYk1ldGhvZCl3ZWJNZXRob2RzW2lpXTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVdlYk1ldGhvZCBnZXRTRUlNZXRob2RJbmhlcml0ZWRGcm9tV2ViUHJvamVjdCgpDQotCXsNCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajIuZ2V0UHJvamVjdCgpKTsNCi0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOw0KLQ0KLQkJT2JqZWN0W10gc0VJcyA9IG51bGw7DQotCQlPYmplY3RbXSB3ZWJNZXRob2RzID0gbnVsbDsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTxjaGlsZHJlbi5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoY2hpbGRyZW5baWldIGluc3RhbmNlb2YgSVNFSUNoaWxkTGlzdCkNCi0JCQl7DQotCQkJCXNFSXMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlbltpaV0pOw0KLQkJCQkNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHNFSXMpOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPHNFSXMubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKCgoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSlzRUlzW2lpXSkuZ2V0TmFtZSgpLmVxdWFscygiU2VpMk5hbWUiKSkNCi0JCQl7DQotCQkJCXdlYk1ldGhvZHMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbigoKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Upc0VJc1tpaV0pKTsNCi0JCQkJDQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbCh3ZWJNZXRob2RzKTsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTx3ZWJNZXRob2RzLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZigoKElXZWJNZXRob2Qpd2ViTWV0aG9kc1tpaV0pLmdldE5hbWUoKS5lcXVhbHMoInBhcmVudE1ldGhvZCIpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIChJV2ViTWV0aG9kKXdlYk1ldGhvZHNbaWldOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJV2ViTWV0aG9kIGdldFNFSU1ldGhvZE5vdEluaGVyaXRlZEZyb21FamJQcm9qZWN0KCkNCi0Jew0KLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqMS5nZXRQcm9qZWN0KCkpOw0KLQkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7DQotDQotCQlPYmplY3RbXSBzRUlzID0gbnVsbDsNCi0JCU9iamVjdFtdIHdlYk1ldGhvZHMgPSBudWxsOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPGNoaWxkcmVuLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZihjaGlsZHJlbltpaV0gaW5zdGFuY2VvZiBJU0VJQ2hpbGRMaXN0KQ0KLQkJCXsNCi0JCQkJc0VJcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuW2lpXSk7DQotCQkJCQ0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWFzc2VydE5vdE51bGwoc0VJcyk7DQotCQkNCi0JCWZvcihpbnQgaWk9MDsgaWk8c0VJcy5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKXNFSXNbaWldKS5nZXROYW1lKCkuZXF1YWxzKCJTZWkyTmFtZSIpKQ0KLQkJCXsNCi0JCQkJd2ViTWV0aG9kcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKCgoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSlzRUlzW2lpXSkpOw0KLQkJCQkNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHdlYk1ldGhvZHMpOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPHdlYk1ldGhvZHMubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKCgoSVdlYk1ldGhvZCl3ZWJNZXRob2RzW2lpXSkuZ2V0TmFtZSgpLmVxdWFscygid2ViTWV0aG9kIikpDQotCQkJew0KLQkJCQlyZXR1cm4gKElXZWJNZXRob2Qpd2ViTWV0aG9kc1tpaV07DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElXZWJNZXRob2QgZ2V0U0VJTWV0aG9kTm90SW5oZXJpdGVkRnJvbVdlYlByb2plY3QoKQ0KLQl7DQotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmoyLmdldFByb2plY3QoKSk7DQotCQljaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsNCi0NCi0JCU9iamVjdFtdIHNFSXMgPSBudWxsOw0KLQkJT2JqZWN0W10gd2ViTWV0aG9kcyA9IG51bGw7DQotCQkNCi0JCWZvcihpbnQgaWk9MDsgaWk8Y2hpbGRyZW4ubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKGNoaWxkcmVuW2lpXSBpbnN0YW5jZW9mIElTRUlDaGlsZExpc3QpDQotCQkJew0KLQkJCQlzRUlzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5baWldKTsNCi0JCQkJDQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChzRUlzKTsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTxzRUlzLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZigoKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Upc0VJc1tpaV0pLmdldE5hbWUoKS5lcXVhbHMoIlNlaTJOYW1lIikpDQotCQkJew0KLQkJCQl3ZWJNZXRob2RzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKXNFSXNbaWldKSk7DQotCQkJCQ0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWFzc2VydE5vdE51bGwod2ViTWV0aG9kcyk7DQotCQkNCi0JCWZvcihpbnQgaWk9MDsgaWk8d2ViTWV0aG9kcy5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoKChJV2ViTWV0aG9kKXdlYk1ldGhvZHNbaWldKS5nZXROYW1lKCkuZXF1YWxzKCJ3ZWJNZXRob2QiKSkNCi0JCQl7DQotCQkJCXJldHVybiAoSVdlYk1ldGhvZCl3ZWJNZXRob2RzW2lpXTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0V3NBY3Rpb25Qcm92aWRlcldpdGhUcmVlU2VsZWN0aW9uKE9iamVjdFtdIHNlbGVjdGlvbikNCi0Jew0KLQkJd3NBY3Rpb25Qcm92ID0gbmV3IFdTQWN0aW9uUHJvdmlkZXIoKTsNCi0JCQ0KLQkJTW9jazxUcmVlVmlld2VyPiB0cmVlVmlld2VyID0gbW9jayhUcmVlVmlld2VyLmNsYXNzKTsNCi0JCUNvbW1vbkFjdGlvbkV4dGVuc2lvblNpdGUgY0FFeHRTaXRlID0gY3JlYXRlQ29tbW9uQWN0aW9uRXh0ZW5zaW9uU2l0ZU1vY2sodHJlZVZpZXdlci5wcm94eSgpKTsNCi0NCi0JCXdzQWN0aW9uUHJvdi5pbml0KGNBRXh0U2l0ZSk7DQotCQkNCi0JCVRyZWVQYXRoIHBhdGggPSBuZXcgVHJlZVBhdGgoc2VsZWN0aW9uKTsNCi0JCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gbmV3IFRyZWVTZWxlY3Rpb24ocGF0aCk7DQotCQlBY3Rpb25Db250ZXh0IGFjdENudCA9IG5ldyBBY3Rpb25Db250ZXh0KHNlbCk7DQotCQkNCi0JCXdzQWN0aW9uUHJvdi5zZXRDb250ZXh0KGFjdENudCk7DQotCX0NCi0JDQotCXByb3RlY3RlZCB2b2lkIGluaXRXc0FjdGlvblByb3ZpZGVyV2l0aFN0cnVjdHVyZWRTZWxlY3Rpb24oT2JqZWN0W10gc2VsZWN0aW9uKQ0KLQl7DQotCQl3c0FjdGlvblByb3YgPSBuZXcgV1NBY3Rpb25Qcm92aWRlcigpOw0KLQ0KLQkJTW9jazxUcmVlVmlld2VyPiB0cmVlVmlld2VyID0gbW9jayhUcmVlVmlld2VyLmNsYXNzKTsNCi0JCUNvbW1vbkFjdGlvbkV4dGVuc2lvblNpdGUgY0FFeHRTaXRlID0gY3JlYXRlQ29tbW9uQWN0aW9uRXh0ZW5zaW9uU2l0ZU1vY2sodHJlZVZpZXdlci5wcm94eSgpKTsNCi0NCi0JCXdzQWN0aW9uUHJvdi5pbml0KGNBRXh0U2l0ZSk7DQotCQkNCi0JCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0aW9uKTsNCi0JCUFjdGlvbkNvbnRleHQgYWN0Q250ID0gbmV3IEFjdGlvbkNvbnRleHQoc2VsKTsNCi0JCQ0KLQkJd3NBY3Rpb25Qcm92LnNldENvbnRleHQoYWN0Q250KTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElXZWJTZXJ2aWNlUHJvamVjdCBnZXRXc1Byb2plY3QoSVByb2plY3QgcHJvamVjdCkNCi0Jew0KLQkJSXRlcmF0b3I8SVdlYlNlcnZpY2VQcm9qZWN0PiB3c1Byb2plY3RzID0gdGFyZ2V0UmVzb3VyY2UuZ2V0RE9NKCkuZ2V0V2ViU2VydmljZVByb2plY3RzKCkuaXRlcmF0b3IoKTsNCi0JCQ0KLQkJd2hpbGUod3NQcm9qZWN0cy5oYXNOZXh0KCkpDQotCQl7DQotCQkJSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdCA9IHdzUHJvamVjdHMubmV4dCgpOw0KLQkJCQ0KLQkJCWlmKHdzUHJvamVjdC5nZXROYW1lKCkuZXF1YWxzKHByb2plY3QuZ2V0TmFtZSgpKSkNCi0JCQl7DQotCQkJCXJldHVybiB3c1Byb2plY3Q7DQotCQkJfQ0KLQkJfQ0KLQkJdGhyb3cgbmV3IGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcigicHJvamVjdCAiICsgcHJvamVjdCArICJub3QgZm91bmQgaW4gRE9NIik7DQotCX0NCi0JDQotCXByb3RlY3RlZCBDb21tb25BY3Rpb25FeHRlbnNpb25TaXRlIGNyZWF0ZUNvbW1vbkFjdGlvbkV4dGVuc2lvblNpdGVNb2NrKGZpbmFsIFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyKQ0KLQl7DQotCQlmaW5hbCBOYXZpZ2F0b3JDb250ZW50U2VydmljZSBjb250ZW50U2VydmljZSA9IChOYXZpZ2F0b3JDb250ZW50U2VydmljZSlOYXZpZ2F0b3JDb250ZW50U2VydmljZUZhY3RvcnkuSU5TVEFOQ0UuY3JlYXRlQ29udGVudFNlcnZpY2UoIm15dmlld2VyIik7DQotCQkNCi0JCS8vRWNsaXBzZSAzLjUgY29uc3RydWN0b3IgcmVxdWlyZWQgZm9yIFdUUCBidWlsZA0KLQkJcmV0dXJuIG5ldyBDb21tb25BY3Rpb25FeHRlbnNpb25TaXRlKCJteWV4dGVuc2lvbmlkIiwgIm15cGx1Z2luaWQiLCAoSUNvbW1vblZpZXdlclNpdGUpbW9jayhJQ29tbW9uVmlld2VyU2l0ZS5jbGFzcykucHJveHkoKSwgY29udGVudFNlcnZpY2UsIHZpZXdlcik7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJQ29udHJpYnV0aW9uSXRlbSBjcmVhdGVDb250cmlidXRpb25JdGVtTW9jayhmaW5hbCBTdHJpbmcgaXRlbUlkKQ0KLQl7DQotCQlNb2NrPElDb250cmlidXRpb25JdGVtPiBjbnRyYkl0ZW0gPSBtb2NrKElDb250cmlidXRpb25JdGVtLmNsYXNzKTsNCi0JCWNudHJiSXRlbS5zdHVicygpLm1ldGhvZCgiZ2V0SWQiKS53aWxsKHJldHVyblZhbHVlKGl0ZW1JZCkpOw0KLQkJY250cmJJdGVtLnN0dWJzKCkubWV0aG9kKCJzZXRQYXJlbnQiKS53aWxsKHJldHVyblZhbHVlKG51bGwpKTsNCi0JCWNudHJiSXRlbS5zdHVicygpLm1ldGhvZCgiaXNEeW5hbWljIikud2lsbChyZXR1cm5WYWx1ZShmYWxzZSkpOw0KLQkJcmV0dXJuIGNudHJiSXRlbS5wcm94eSgpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsTWVudVdpdGhDb250cmlidXRpb25JdGVtcyhmaW5hbCBNZW51TWFuYWdlciBtZW51LCBmaW5hbCBTdHJpbmcuLi4gaXRlbUlkcykNCi0Jew0KLQkJZm9yKFN0cmluZyBpZCA6IGl0ZW1JZHMpDQotCQl7DQotCQkJSUNvbnRyaWJ1dGlvbkl0ZW0gY250cmJJdGVtID0gY3JlYXRlQ29udHJpYnV0aW9uSXRlbU1vY2soaWQpOw0KLQkJCW1lbnUuYWRkKGNudHJiSXRlbSk7DQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZDFhNDMwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUzNDdkMWUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWUwNDg0ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI01vbiBKdWwgMjAgMTU6MjU6MzEgRUVTVCAyMDA5DQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUNCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDNjYmM1Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wDQotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMg0KLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMA0KLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjANCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzDQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luDQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcg0KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQ0KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWksDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMsDQotIG9yZy5qbW9jaywNCi0gb3JnLmp1bml0DQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMuaW50ZXJuYWwNCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzL2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYjdhY2UuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkF1Z3VzdCAyMCwgMjAwOTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2M4OGVmZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcw0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNWVhYjJmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotQnVuZGxlLU5hbWUuMD1KQVgtV1MgRE9NIFVJIFRlc3RzDQotQnVuZGxlLVZlbmRvci4wPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtDQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS90ZXN0cy9BbGxUZXN0c1N1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL3Rlc3RzL0FsbFRlc3RzU3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTJiNGQ4Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL3Rlc3RzL0FsbFRlc3RzU3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0czsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMuaW50ZXJuYWwuQWxsRG9tSXRlbVByb3ZpZGVyVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy5pbnRlcm5hbC5ET01JdGVtUHJvcGVydHlQcm92aWRlclRlc3Q7DQotDQotcHVibGljIGNsYXNzIEFsbFRlc3RzU3VpdGUNCi17DQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotCXsNCi0JCWZpbmFsIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsNCi0NCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBbGxEb21JdGVtUHJvdmlkZXJUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShET01JdGVtUHJvcGVydHlQcm92aWRlclRlc3QuY2xhc3MpOw0KLQkJDQotCQlyZXR1cm4gc3VpdGU7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS90ZXN0cy9pbnRlcm5hbC9BbGxEb21JdGVtUHJvdmlkZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL3Rlc3RzL2ludGVybmFsL0FsbERvbUl0ZW1Qcm92aWRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTYzOGNlYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL3Rlc3RzL2ludGVybmFsL0FsbERvbUl0ZW1Qcm92aWRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMuaW50ZXJuYWw7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuUHJvcGVydHlWYWx1ZVdyYXBwZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5JUHJvcGVydHlTdGF0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5XZWJQYXJhbUtpbmQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudEl0ZW1Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSXRlbVByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLklXZWJNZXRob2RJdGVtUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuSVdlYlBhcmFtSXRlbVByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLklXZWJTZXJ2aWNlSXRlbVByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLklXZWJTZXJ2aWNlUHJvamVjdEl0ZW1Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrT2JqZWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5qbW9jay5Nb2NrOw0KLQ0KLXB1YmxpYyBjbGFzcyBBbGxEb21JdGVtUHJvdmlkZXJUZXN0IGV4dGVuZHMgTW9ja09iamVjdFRlc3RDYXNlIA0KLXsNCi0JcHJpdmF0ZSBEb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBpdGVtUHJvdmlkZXI7IA0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIHNldFVwKCkNCi0Jew0KLQkJaXRlbVByb3ZpZGVyID0gbmV3IERvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpDQotCXsNCi0JCWl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RET01JdGVtUHJvdmlkZXIoKQ0KLQl7DQotCQlhc3NlcnROb3ROdWxsKGl0ZW1Qcm92aWRlci5nZXRSb290QWRhcHRlckZhY3RvcnkoKSk7DQotCQlpdGVtUHJvdmlkZXIuc2V0UGFyZW50QWRhcHRlckZhY3RvcnkobnVsbCk7DQotCQlhc3NlcnROb3ROdWxsKGl0ZW1Qcm92aWRlci5nZXRSb290QWRhcHRlckZhY3RvcnkoKSk7DQotCQlpdGVtUHJvdmlkZXIucmVtb3ZlTGlzdGVuZXIobnVsbCk7DQotCQlhc3NlcnROb3ROdWxsKGl0ZW1Qcm92aWRlci5nZXRSb290QWRhcHRlckZhY3RvcnkoKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RJSmF2YVdlYlNlcnZpY2VFbGVtZW50SXRlbVByb3ZpZGVyKCkNCi0Jew0KLQkJSUphdmFXZWJTZXJ2aWNlRWxlbWVudEl0ZW1Qcm92aWRlciBqYXZhSXRlbVByb3ZpZGVyID0gKElKYXZhV2ViU2VydmljZUVsZW1lbnRJdGVtUHJvdmlkZXIpIGl0ZW1Qcm92aWRlci5jcmVhdGVJSmF2YVdlYlNlcnZpY2VFbGVtZW50QWRhcHRlcigpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKGphdmFJdGVtUHJvdmlkZXIpOw0KLQkJDQotCQlMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBwcm9wRGVzY3MgPSBqYXZhSXRlbVByb3ZpZGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMobnVsbCk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwocHJvcERlc2NzKTsNCi0JCWFzc2VydFRydWUocHJvcERlc2NzLnNpemUoKSA+IDApOw0KLQkJDQotCQlNb2NrIGphdmFXU0VsZW0gPSBtb2NrKElKYXZhV2ViU2VydmljZUVsZW1lbnQuY2xhc3MpOw0KLQkJamF2YVdTRWxlbS5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJnZXROYW1lIikud2lsbChyZXR1cm5WYWx1ZSgiVGVzdE5hbWUiKSk7DQotCQlhc3NlcnROb3ROdWxsKGphdmFJdGVtUHJvdmlkZXIuZ2V0SW1hZ2UobmV3IE9iamVjdCgpKSk7DQotCQlhc3NlcnROb3ROdWxsKGphdmFJdGVtUHJvdmlkZXIuZ2V0VGV4dChqYXZhV1NFbGVtLnByb3h5KCkpKTsNCi0JCWFzc2VydE51bGwoamF2YUl0ZW1Qcm92aWRlci5nZXROYW1lQ2F0ZWdvcnkoKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RJU2VydmljZUVuZHBvaW50SXRlbVByb3ZpZGVyKCkNCi0Jew0KLQkJSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUl0ZW1Qcm92aWRlciBzZWlJdGVtUHJvdmlkZXIgPSAoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUl0ZW1Qcm92aWRlcikgaXRlbVByb3ZpZGVyLmNyZWF0ZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VBZGFwdGVyKCk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwoc2VpSXRlbVByb3ZpZGVyKTsNCi0JCQ0KLQkJTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gcHJvcERlc2NzID0gc2VpSXRlbVByb3ZpZGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMobnVsbCk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwocHJvcERlc2NzKTsNCi0JCWFzc2VydFRydWUocHJvcERlc2NzLnNpemUoKSA+IDApOw0KLQkJDQotCQlNb2NrIHNFSUVsZW0gPSBtb2NrKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuY2xhc3MpOw0KLQkJc0VJRWxlbS5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJnZXROYW1lIikud2lsbChyZXR1cm5WYWx1ZSgiVGVzdE5hbWUiKSk7DQotCQlhc3NlcnROb3ROdWxsKHNlaUl0ZW1Qcm92aWRlci5nZXRJbWFnZShuZXcgT2JqZWN0KCkpKTsNCi0JCWFzc2VydE5vdE51bGwoc2VpSXRlbVByb3ZpZGVyLmdldFRleHQoc0VJRWxlbS5wcm94eSgpKSk7DQotCQlhc3NlcnROb3ROdWxsKHNlaUl0ZW1Qcm92aWRlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG51bGwpKTsNCi0JCWFzc2VydE5vdE51bGwoc2VpSXRlbVByb3ZpZGVyLmdldE5hbWVDYXRlZ29yeSgpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdElXZWJNZXRob2RJdGVtUHJvdmlkZXIoKQ0KLQl7DQotCQlJV2ViTWV0aG9kSXRlbVByb3ZpZGVyIG1ldGhvZEl0ZW1Qcm92aWRlciA9IChJV2ViTWV0aG9kSXRlbVByb3ZpZGVyKSBpdGVtUHJvdmlkZXIuY3JlYXRlSVdlYk1ldGhvZEFkYXB0ZXIoKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChtZXRob2RJdGVtUHJvdmlkZXIpOw0KLQkJDQotCQlMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBwcm9wRGVzY3MgPSBtZXRob2RJdGVtUHJvdmlkZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhudWxsKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChwcm9wRGVzY3MpOw0KLQkJYXNzZXJ0VHJ1ZShwcm9wRGVzY3Muc2l6ZSgpID4gMCk7DQotCQkNCi0JCU1vY2sgd01FbGVtID0gbW9jayhJV2ViTWV0aG9kLmNsYXNzKTsNCi0JCXdNRWxlbS5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJnZXROYW1lIikud2lsbChyZXR1cm5WYWx1ZSgiVGVzdE5hbWUiKSk7DQotCQlhc3NlcnROb3ROdWxsKG1ldGhvZEl0ZW1Qcm92aWRlci5nZXRJbWFnZShuZXcgT2JqZWN0KCkpKTsNCi0JCWFzc2VydE5vdE51bGwobWV0aG9kSXRlbVByb3ZpZGVyLmdldFRleHQod01FbGVtLnByb3h5KCkpKTsNCi0JCWFzc2VydE5vdE51bGwobWV0aG9kSXRlbVByb3ZpZGVyLmdldENoaWxkcmVuRmVhdHVyZXMobnVsbCkpOw0KLQkJYXNzZXJ0Tm90TnVsbChtZXRob2RJdGVtUHJvdmlkZXIuZ2V0TmFtZUNhdGVnb3J5KCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SVdlYlNlcnZpY2VJdGVtUHJvdmlkZXIoKQ0KLQl7DQotCQlJV2ViU2VydmljZUl0ZW1Qcm92aWRlciB3c0l0ZW1Qcm92aWRlciA9IChJV2ViU2VydmljZUl0ZW1Qcm92aWRlcikgaXRlbVByb3ZpZGVyLmNyZWF0ZUlXZWJTZXJ2aWNlQWRhcHRlcigpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHdzSXRlbVByb3ZpZGVyKTsNCi0JCQ0KLQkJTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gcHJvcERlc2NzID0gd3NJdGVtUHJvdmlkZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhudWxsKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChwcm9wRGVzY3MpOw0KLQkJYXNzZXJ0VHJ1ZShwcm9wRGVzY3Muc2l6ZSgpID4gMCk7DQotCQkNCi0JCU1vY2sgd3NFbGVtID0gbW9jayhJV2ViU2VydmljZS5jbGFzcyk7DQotCQl3c0VsZW0uZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiZ2V0TmFtZSIpLndpbGwocmV0dXJuVmFsdWUoIlRlc3ROYW1lIikpOw0KLQkJYXNzZXJ0Tm90TnVsbCh3c0l0ZW1Qcm92aWRlci5nZXRJbWFnZShuZXcgT2JqZWN0KCkpKTsNCi0JCWFzc2VydE5vdE51bGwod3NJdGVtUHJvdmlkZXIuZ2V0VGV4dCh3c0VsZW0ucHJveHkoKSkpOw0KLQkJYXNzZXJ0Tm90TnVsbCh3c0l0ZW1Qcm92aWRlci5nZXROYW1lQ2F0ZWdvcnkoKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RJV2ViU2VydmljZVByb2plY3RJdGVtUHJvdmlkZXIoKQ0KLQl7DQotCQlJV2ViU2VydmljZVByb2plY3RJdGVtUHJvdmlkZXIgd3NQcm9qSXRlbVByb3ZpZGVyID0gKElXZWJTZXJ2aWNlUHJvamVjdEl0ZW1Qcm92aWRlcikgaXRlbVByb3ZpZGVyLmNyZWF0ZUlXZWJTZXJ2aWNlUHJvamVjdEFkYXB0ZXIoKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbCh3c1Byb2pJdGVtUHJvdmlkZXIpOw0KLQkJDQotCQlMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBwcm9wRGVzY3MgPSB3c1Byb2pJdGVtUHJvdmlkZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhudWxsKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChwcm9wRGVzY3MpOw0KLQkJYXNzZXJ0VHJ1ZShwcm9wRGVzY3Muc2l6ZSgpID4gMCk7DQotCQkNCi0JCU1vY2sgd3NQcm9qRWxlbSA9IG1vY2soSVdlYlNlcnZpY2VQcm9qZWN0LmNsYXNzKTsNCi0JCXdzUHJvakVsZW0uZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiZ2V0TmFtZSIpLndpbGwocmV0dXJuVmFsdWUoIlRlc3ROYW1lIikpOw0KLQkJYXNzZXJ0Tm90TnVsbCh3c1Byb2pJdGVtUHJvdmlkZXIuZ2V0SW1hZ2UobmV3IE9iamVjdCgpKSk7DQotCQlhc3NlcnROb3ROdWxsKHdzUHJvakl0ZW1Qcm92aWRlci5nZXRUZXh0KHdzUHJvakVsZW0ucHJveHkoKSkpOw0KLQkJYXNzZXJ0Tm90TnVsbCh3c1Byb2pJdGVtUHJvdmlkZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhudWxsKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RJV2ViTWV0aG9kSXRlbVByb3ZpZGVyR2V0SW1wbGVtZW50YXRpb24oKQ0KLQl7DQotCQlJV2ViTWV0aG9kSXRlbVByb3ZpZGVyIG1ldGhvZEl0ZW1Qcm92aWRlciA9IChJV2ViTWV0aG9kSXRlbVByb3ZpZGVyKSBpdGVtUHJvdmlkZXIuY3JlYXRlSVdlYk1ldGhvZEFkYXB0ZXIoKTsNCi0JCWFzc2VydE5vdE51bGwobWV0aG9kSXRlbVByb3ZpZGVyKTsNCi0JCQ0KLQkJTW9jayB3ZWJQYXJhbTEgPSBtb2NrKElXZWJQYXJhbS5jbGFzcyk7DQotCQl3ZWJQYXJhbTEuZXhwZWN0cyhhdExlYXN0T25jZSgpKS5tZXRob2QoImdldE5hbWUiKS53aWxsKHJldHVyblZhbHVlKCJQYXJhbTEiKSk7DQotCQl3ZWJQYXJhbTEuZXhwZWN0cyhhdExlYXN0T25jZSgpKS5tZXRob2QoImdldFR5cGVOYW1lIikud2lsbChyZXR1cm5WYWx1ZSgiYm9vbGVhbiIpKTsNCi0JCU1vY2sgd2ViUGFyYW0yID0gbW9jayhJV2ViUGFyYW0uY2xhc3MpOw0KLQkJd2ViUGFyYW0yLmV4cGVjdHMoYXRMZWFzdE9uY2UoKSkubWV0aG9kKCJnZXROYW1lIikud2lsbChyZXR1cm5WYWx1ZSgicmV0dXJuIikpOw0KLQkJd2ViUGFyYW0yLmV4cGVjdHMoYXRMZWFzdE9uY2UoKSkubWV0aG9kKCJnZXRUeXBlTmFtZSIpLndpbGwocmV0dXJuVmFsdWUoImphdmEubGFuZy5TdHJpbmciKSk7DQotCQlvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q8SVdlYlBhcmFtPiB3ZWJQYXJhbXMgPSBuZXcgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q8SVdlYlBhcmFtPigpOw0KLQkJd2ViUGFyYW1zLmFkZCgoSVdlYlBhcmFtKXdlYlBhcmFtMS5wcm94eSgpKTsNCi0JCXdlYlBhcmFtcy5hZGQoKElXZWJQYXJhbSl3ZWJQYXJhbTIucHJveHkoKSk7DQotCQlNb2NrIHdlYk1ldGhvZCA9IG1vY2soSVdlYk1ldGhvZC5jbGFzcyk7DQotCQl3ZWJNZXRob2QuZXhwZWN0cyhhdExlYXN0T25jZSgpKS5tZXRob2QoImdldFBhcmFtZXRlcnMiKS53aWxsKHJldHVyblZhbHVlKHdlYlBhcmFtcykpOw0KLQkJd2ViTWV0aG9kLmV4cGVjdHMoYXRMZWFzdE9uY2UoKSkubWV0aG9kKCJnZXRJbXBsZW1lbnRhdGlvbiIpLndpbGwocmV0dXJuVmFsdWUoInRlc3RNZXRob2QoQilRU3RyaW5nIikpOw0KLQkJDQotCQlCYXNpY0VMaXN0PFN0YXRlQWRhcHRlcj4gYWRhcHRlcnMgPSBuZXcgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q8U3RhdGVBZGFwdGVyPigpOw0KLQkJTW9jayBhZGFwdGVyID0gbW9jayhTdGF0ZUFkYXB0ZXIuY2xhc3MpOw0KLQkJYWRhcHRlci5zdHVicygpLm1ldGhvZCgiaXNBZGFwdGVyRm9yVHlwZSIpLndpbGwocmV0dXJuVmFsdWUodHJ1ZSkpOw0KLQkJYWRhcHRlci5zdHVicygpLm1ldGhvZCgiaXNDaGFuZ2VhYmxlIikud2lsbChyZXR1cm5WYWx1ZShmYWxzZSkpOw0KLQkJYWRhcHRlcnMuYWRkKChTdGF0ZUFkYXB0ZXIpYWRhcHRlci5wcm94eSgpKTsNCi0JCQ0KLQkJd2ViTWV0aG9kLmV4cGVjdHMoYXRMZWFzdE9uY2UoKSkubWV0aG9kKCJlQWRhcHRlcnMiKS53aWxsKHJldHVyblZhbHVlKGFkYXB0ZXJzKSk7DQotCQkoKElXZWJNZXRob2Qpd2ViTWV0aG9kLnByb3h5KCkpLmVBZGFwdGVycygpOw0KLQkJbWV0aG9kSXRlbVByb3ZpZGVyLnNldFRhcmdldCgoTm90aWZpZXIpd2ViTWV0aG9kLnByb3h5KCkpOw0KLQkJTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gcHJvcERlc2NzID0gbWV0aG9kSXRlbVByb3ZpZGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMod2ViTWV0aG9kLnByb3h5KCkpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHByb3BEZXNjcyk7DQotCQlhc3NlcnRUcnVlKHByb3BEZXNjcy5zaXplKCkgPiAwKTsNCi0JCQ0KLQkJZm9yKElJdGVtUHJvcGVydHlEZXNjcmlwdG9yIHByb3BEZXNjIDogcHJvcERlc2NzKQ0KLQkJew0KLQkJCWlmKHByb3BEZXNjLmdldEZlYXR1cmUobnVsbCkuZXF1YWxzKERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT04pKQ0KLQkJCXsNCi0JCQkJYXNzZXJ0RXF1YWxzKCgoUHJvcGVydHlWYWx1ZVdyYXBwZXIpcHJvcERlc2MuZ2V0UHJvcGVydHlWYWx1ZSh3ZWJNZXRob2QucHJveHkoKSkpLmdldFRleHQobnVsbCksICJTdHJpbmcgdGVzdE1ldGhvZChib29sZWFuKSIpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdElXZWJQYXJhbUl0ZW1Qcm92aWRlcigpDQotCXsNCi0JCUlXZWJQYXJhbUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSVdlYlBhcmFtSXRlbVByb3ZpZGVyKSBuZXcgRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKS5jcmVhdGVJV2ViUGFyYW1BZGFwdGVyKCk7DQotCQlNb2NrIHBhcmFtTW9jayA9IG1vY2soSVdlYlBhcmFtLmNsYXNzKTsJCQ0KLQkJYXNzZXJ0Tm90TnVsbChpdGVtUHJvdmlkZXIuZ2V0SW1hZ2UobmV3IE9iamVjdCgpKSk7DQotDQotCQlwYXJhbU1vY2suc3R1YnMoKS5tZXRob2QoImdldE5hbWUiKS53aWxsKHJldHVyblZhbHVlKCJteVBhcmFtIikpOw0KLQkJcGFyYW1Nb2NrLnN0dWJzKCkubWV0aG9kKCJnZXRUeXBlTmFtZSIpLndpbGwocmV0dXJuVmFsdWUoImphdmEudXRpbC5MaXN0IikpOw0KLQkJcGFyYW1Nb2NrLnN0dWJzKCkubWV0aG9kKCJnZXRJbXBsZW1lbnRhdGlvbiIpLndpbGwocmV0dXJuVmFsdWUoInRlc3QiKSk7DQotCQlwYXJhbU1vY2suc3R1YnMoKS5tZXRob2QoImVDb250YWluZXIiKS53aWxsKHJldHVyblZhbHVlKG51bGwpKTsNCi0JCXBhcmFtTW9jay5zdHVicygpLm1ldGhvZCgiZVJlc291cmNlIikud2lsbChyZXR1cm5WYWx1ZShudWxsKSk7DQotCQkNCi0JCWFzc2VydEVxdWFscygibXlQYXJhbSIsIGl0ZW1Qcm92aWRlci5nZXRUZXh0KHBhcmFtTW9jay5wcm94eSgpKSk7DQotCQlhc3NlcnROb3ROdWxsKGl0ZW1Qcm92aWRlci5nZXRJbWFnZShwYXJhbU1vY2sucHJveHkoKSkpOw0KLQkJYXNzZXJ0Tm90TnVsbChpdGVtUHJvdmlkZXIuZ2V0TmFtZUNhdGVnb3J5KCkpOw0KLQkJcGFyYW1Nb2NrLnN0dWJzKCkubWV0aG9kKCJnZXRJbXBsZW1lbnRhdGlvbiIpLndpbGwocmV0dXJuVmFsdWUoInJldHVybiIpKTsNCi0JCWFzc2VydE5vdE51bGwoaXRlbVByb3ZpZGVyLmdldEltYWdlKHBhcmFtTW9jay5wcm94eSgpKSk7CQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SVdlYlBhcmFtSXRlbVByb3ZpZGVyRm9yVHlwZU5hbWUoKQ0KLQl7DQotCQkvLyBJV2ViUGFyYW1JdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElXZWJQYXJhbUl0ZW1Qcm92aWRlcikgbmV3IERvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkuY3JlYXRlSVdlYlBhcmFtQWRhcHRlcigpOw0KLQkJZmluYWwgSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgdHlwZU5hbWVQcm9wZXJ0eURlc2NyaXB0b3IgPSBmaW5kV2ViUGFyYW1JdGVtUHJvcGVydHlEZXNjcmlwdG9yKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fVFlQRV9OQU1FKTsNCi0JCQ0KLQkJZmluYWwgSVdlYlBhcmFtIHdlYlBhcmFtID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYlBhcmFtKCk7DQotCQl3ZWJQYXJhbS5zZXRIZWFkZXIodHJ1ZSk7DQotCQl3ZWJQYXJhbS5zZXRLaW5kKFdlYlBhcmFtS2luZC5JTk9VVCk7DQotCQl3ZWJQYXJhbS5zZXROYW1lKCJhbnlOYW1lIik7IC8vJE5PTi1OTFMtMSQNCi0JCXdlYlBhcmFtLnNldFBhcnROYW1lKCJhbnlQYXJ0TmFtZSIpOyAvLyROT04tTkxTLTEkDQotCQl3ZWJQYXJhbS5zZXRUYXJnZXROYW1lc3BhY2UoImFueVRhcmdldE5hbWVzcGFjZSIpOyAvLyROT04tTkxTLTEkDQotCQkoKEVPYmplY3QpIHdlYlBhcmFtKS5lU2V0KERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fVFlQRV9OQU1FLCBudWxsKTsNCi0JCQkJDQotCQlhc3NlcnROdWxsKCJVbmV4cGVjdGVkIHZhbHVlLiIsIHR5cGVOYW1lUHJvcGVydHlEZXNjcmlwdG9yLmdldFByb3BlcnR5VmFsdWUod2ViUGFyYW0pKTsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJT2JqZWN0IHByb3BlcnR5VmFsdWVXcmFwcGVyID0gbnVsbDsNCi0JCQ0KLQkJKChFT2JqZWN0KSB3ZWJQYXJhbSkuZVNldChEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfUEFSQU1fX1RZUEVfTkFNRSwgIkkiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcHJvcGVydHlWYWx1ZVdyYXBwZXIgPSB0eXBlTmFtZVByb3BlcnR5RGVzY3JpcHRvci5nZXRQcm9wZXJ0eVZhbHVlKHdlYlBhcmFtKTsJCQ0KLQkJYXNzZXJ0RXF1YWxzKCJVbnJlc29sdmVkIHZhbHVlLiIsICJpbnQiLCAoKElJdGVtUHJvcGVydHlTb3VyY2UpIHByb3BlcnR5VmFsdWVXcmFwcGVyKS5nZXRFZGl0YWJsZVZhbHVlKG51bGwpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQkNCi0JCSgoRU9iamVjdCkgd2ViUGFyYW0pLmVTZXQoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNX19UWVBFX05BTUUsICJbUVN0cmluZzsiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcHJvcGVydHlWYWx1ZVdyYXBwZXIgPSB0eXBlTmFtZVByb3BlcnR5RGVzY3JpcHRvci5nZXRQcm9wZXJ0eVZhbHVlKHdlYlBhcmFtKTsJCQ0KLQkJYXNzZXJ0RXF1YWxzKCJVbnJlc29sdmVkIHZhbHVlLiIsICJTdHJpbmdbXSIsICgoSUl0ZW1Qcm9wZXJ0eVNvdXJjZSkgcHJvcGVydHlWYWx1ZVdyYXBwZXIpLmdldEVkaXRhYmxlVmFsdWUobnVsbCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBJSXRlbVByb3BlcnR5RGVzY3JpcHRvciBmaW5kV2ViUGFyYW1JdGVtUHJvcGVydHlEZXNjcmlwdG9yKGZpbmFsIEVBdHRyaWJ1dGUgYXR0cmlidXRlKQ0KLQl7DQotCQlmaW5hbCBJV2ViUGFyYW1JdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElXZWJQYXJhbUl0ZW1Qcm92aWRlcikgbmV3IERvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkuY3JlYXRlSVdlYlBhcmFtQWRhcHRlcigpOw0KLQkJTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZGVzY3JpcHRvcnMgPSBpdGVtUHJvdmlkZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhudWxsKTsNCi0JCQkJCQ0KLQkJZm9yIChJSXRlbVByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yIDogZGVzY3JpcHRvcnMpCQkJDQotCQl7DQotCQkJaWYgKGRlc2NyaXB0b3IuZ2V0RmVhdHVyZShudWxsKS5lcXVhbHMoYXR0cmlidXRlKSkNCi0JCQl7DQotCQkJCXJldHVybiBkZXNjcmlwdG9yOwkJCQkNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwdWJsaWMgaW50ZXJmYWNlIFN0YXRlQWRhcHRlciBleHRlbmRzIElQcm9wZXJ0eVN0YXRlLCBBZGFwdGVyDQotCXsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL3Rlc3RzL2ludGVybmFsL0RPTUl0ZW1Qcm9wZXJ0eVByb3ZpZGVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS90ZXN0cy9pbnRlcm5hbC9ET01JdGVtUHJvcGVydHlQcm92aWRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGZiZmNkZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL3Rlc3RzL2ludGVybmFsL0RPTUl0ZW1Qcm9wZXJ0eVByb3ZpZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzLmludGVybmFsOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLmludGVybmFsLmltcGwuRE9NSXRlbVByb3BlcnR5UHJvdmlkZXI7DQotDQotLyoqDQotICogVGVzdHMgZm9yIHtAbGluayBET01JdGVtUHJvcGVydHlQcm92aWRlcn0gY2xhc3MNCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIERPTUl0ZW1Qcm9wZXJ0eVByb3ZpZGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIA0KLXsNCi0JcHJpdmF0ZSBET01JdGVtUHJvcGVydHlQcm92aWRlciBwcm92aWRlcjsNCi0JDQotCXB1YmxpYyB2b2lkIHNldFVwKCkNCi0Jew0KLQkJcHJvdmlkZXIgPSBuZXcgRE9NSXRlbVByb3BlcnR5UHJvdmlkZXIoDQotCQkJCW51bGwsDQotCQkJCW51bGwsDQotCQkJCSJkaXNwbGF5IG5hbWUiLA0KLQkJCQkiZGVzY3JpcHRpb24iLA0KLQkJCQlEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUsDQotCQkJCXRydWUsDQotCQkJCWZhbHNlLA0KLQkJCQlmYWxzZSwNCi0JCQkJbnVsbCwgDQotCQkJCSJjYXRlZ29yeSIsDQotCQkJCW5ldyBTdHJpbmdbMF0pOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVzZXRQcm9wZXJ0eVZhbHVlKCkNCi0Jew0KLQkJZmluYWwgSVdlYlNlcnZpY2Ugd3MgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViU2VydmljZSgpOw0KLQkJd3MuZVNldChEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OLCAib3JnLmVjbGlwc2UudGVzdC5TZWkiKTsNCi0JCXdzLnNldE5hbWUoIlRlc3QiKTsNCi0JCXByb3ZpZGVyLnJlc2V0UHJvcGVydHlWYWx1ZSh3cyk7DQotCQlhc3NlcnRFcXVhbHMoIlNlaVNlcnZpY2UiLCB3cy5nZXROYW1lKCkpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmQxYTQzMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvLnByb2plY3QgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmN2EzODAzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFlMDQ4NGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNNb24gSnVsIDIwIDE1OjI1OjMxIEVFU1QgMjAwOQ0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI4NjEwMTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMA0KLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDINCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjANCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wDQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscw0KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbg0KLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXINCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUNCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmptb2NrLA0KLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywNCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLA0KLSBvcmcuZWNsaXBzZS5qZHQuY29yZSwNCi0gb3JnLmVjbGlwc2UudWksDQotIG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcsDQotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMsDQotIG9yZy5qdW5pdCwNCi0gb3JnLmVjbGlwc2UuamR0LmFwdC5jb3JlDQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuYXNzZXJ0aW9ucywNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5maWxlcywNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jaywNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay50ZXN0Y2FzZXMsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam9icywNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnRocmVhZGluZw0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvYWJvdXQuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJiN2FjZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+QXVndXN0IDIwLCAyMDA5PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9idWlsZC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYzg4ZWZkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzDQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9wbHVnaW4ucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg3ZGNiMDkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi1CdW5kbGUtTmFtZS4wPUpBWC1XUyBVdGlsaXRpZXMgZm9yIEpVbml0IHRlc3RzDQotQnVuZGxlLVZlbmRvci4wPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtDQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9JV2FpdENvbmRpdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9JV2FpdENvbmRpdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYTA4ZThmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvSVdhaXRDb25kaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlsczsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5hc3NlcnRpb25zLkNvbmRpdGlvbkNoZWNrRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSB3aGljaCBkZWZpbmVzIGEgY29uZGl0aW9uIHVwb24gd2hpY2ggdGhlIGV4ZWN1dGlvbiBjYW4gY29udGludWUgDQotICogQGF1dGhvciBEYW5haWwgQnJhbmVrb3YNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElXYWl0Q29uZGl0aW9uDQotew0KLQkvKioNCi0JICogTWV0aG9kIHdoaWNoIGNoZWNrcyB3aGV0aGVyIGEgZ2l2ZW4gY29uZGl0aW9uIGlzIG1ldA0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+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+ZXF1YWxzPC9jPiBpcyBwcm9wZXJseSBpbXBsZW1lbnRlZCBmb3IgdXNlIGluIHN1YmNsYXNzZXMuIEl0IHRha2VzIHR3byBlcXVhbCBhbmNlc3RvciBpbnN0YW5jZXMgYW5kIGNvbXBhcmVzIHRoZW0gZm9yIGVxdWFsaXR5Lg0KLQkgKiBTaW5jZSB0aGUgYW5jZXN0b3IgY2xhc3MgZG9lcyBub3Qgb3ZlcnJpZGUgdGhlIGVxdWFscyBtZXRob2QuIFRoZSB0ZXN0cyBhc3NlcnRzIHRoYXQgZXF1YWxzIHNob3VsZCByZXR1cm4gdHJ1ZS4NCi0JICogDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzU3VpdGFibGVGb3JBbmNlc3RvcnMoKQ0KLQl7DQotCQlmaW5hbCBUIGFuY2VzdG9yVDEgPSBuZXdBbmNlc3RvckVxdWFsSW5zdGFuY2VDaGVja0NvcnJlY3QoKTsNCi0JCWZpbmFsIFQgYW5jZXN0b3JUMiA9IG5ld0FuY2VzdG9yRXF1YWxJbnN0YW5jZUNoZWNrQ29ycmVjdCgpOw0KLQkJaWYgKGFuY2VzdG9yVDEgPT0gbnVsbCkNCi0JCXsNCi0JCQlhc3NlcnROdWxsKA0KLQkJCQkJCQkJCQkJIlRoZSBuZXdBbmNlc3Rvckluc3RhbmNlKCkgbWV0aG9kIHJldHVybmVkIG51bGwgb24gdGhlIHNlY29uZCBpbnZvY2F0aW9uLCB3aGlsZSBpdCByZXR1cm4gYSB2YWx1ZSBkaWZmZXJldCB0aGFuIG51bGwgZnJvbSB0aGUgZmlyc3QiLA0KLQkJCQkJCQkJCQkJYW5jZXN0b3JUMik7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQkJYXNzZXJ0VHJ1ZShhbmNlc3RvclQxLmVxdWFscyhhbmNlc3RvclQyKSAmJiBhbmNlc3RvclQyLmVxdWFscyhhbmNlc3RvclQxKSk7DQotDQotCX0NCi0NCi0JcHJpdmF0ZSBUIG5ld0FuY2VzdG9yRXF1YWxJbnN0YW5jZUNoZWNrQ29ycmVjdCgpDQotCXsNCi0JCWZpbmFsIFQgYW5jZXN0b3JUID0gbmV3QW5jZXN0b3JFcXVhbEluc3RhbmNlKCk7DQotCQlpZiAoYW5jZXN0b3JUID09IG51bGwpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZSgibmV3QW5jZXN0b3JFcXVhbEluc3RhbmNlIHJldHVybmVkIG51bGwsIGFsdGhvdWdoIHRoZSB0ZXN0IGNsYXNzICIsIE1vZGlmaWVyLmlzRmluYWwodGVzdENsYXNzLmdldE1vZGlmaWVycygpKSk7DQotCQl9IGVsc2UNCi0JCXsNCi0JCQlhc3NlcnRUcnVlKCJuZXdBbmNlc3RvckVxdWFsSW5zdGFuY2UgcmV0dXJuZWQgb2JqZWN0IG9mIGNsYXNzICIgKyBhbmNlc3RvclQuZ2V0Q2xhc3MoKSArICIsIHdoaWNoIGlzIG5vdCBzdWJ0eXBlIG9mICINCi0JCQkJCQkJCQkJCSsgdGVzdENsYXNzLmdldE5hbWUoKSwgdGVzdENsYXNzLmlzQXNzaWduYWJsZUZyb20oYW5jZXN0b3JULmdldENsYXNzKCkpKTsNCi0JCX0NCi0JCXJldHVybiBhbmNlc3RvclQ7DQotCX0NCi0NCi0JcHJpdmF0ZSBUIG5ld0VxdWFsSW5zdGFuY2VDaGVja0NvcnJlY3QoKQ0KLQl7DQotCQlmaW5hbCBUIG9iamVjdFQgPSBuZXdFcXVhbEluc3RhbmNlKCk7DQotCQlhc3NlcnRUcnVlKCJuZXdFcXVhbEluc3RhbmNlIHJldHVybmVkIG9iamVjdCBvZiBjbGFzcyAiICsgb2JqZWN0VC5nZXRDbGFzcygpLmdldE5hbWUoKSArICJFeHBlY3RlZCB3YXMgY2xhc3MgIiArIHRlc3RDbGFzcy5nZXROYW1lKCksDQotCQkJCQkJCQkJCXRlc3RDbGFzcyA9PSBvYmplY3RULmdldENsYXNzKCkpOw0KLQkJcmV0dXJuIG9iamVjdFQ7DQotCX0NCi0NCi0JcHJpdmF0ZSBUIG5ld05vbkVxdWFsSW5zdGFuY2VDaGVja0NvcnJlY3QoKQ0KLQl7DQotCQlmaW5hbCBUIG9iamVjdFQgPSBuZXdOb25FcXVhbEluc3RhbmNlKCk7DQotCQlhc3NlcnRUcnVlKCJuZXdOb25FcXVhbEluc3RhbmNlIHJldHVybmVkIG9iamVjdCBvZiBjbGFzcyAiICsgb2JqZWN0VC5nZXRDbGFzcygpLmdldE5hbWUoKSArICJFeHBlY3RlZCB3YXMgY2xhc3MgIiArIHRlc3RDbGFzcy5nZXROYW1lKCksDQotCQkJCQkJCQkJCXRlc3RDbGFzcyA9PSBvYmplY3RULmdldENsYXNzKCkpOw0KLQkJcmV0dXJuIG9iamVjdFQ7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qbW9jay90ZXN0Y2FzZXMvSUJlZm9yZUFmdGVyRW5hYmxlZC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qbW9jay90ZXN0Y2FzZXMvSUJlZm9yZUFmdGVyRW5hYmxlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MTE1ZWVkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvam1vY2svdGVzdGNhc2VzL0lCZWZvcmVBZnRlckVuYWJsZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay50ZXN0Y2FzZXM7DQotDQotcHVibGljIGludGVyZmFjZSBJQmVmb3JlQWZ0ZXJFbmFibGVkIHsNCi0NCi0JcHVibGljIHZvaWQgYmVmb3JlVGVzdENhc2UoKSB0aHJvd3MgRXhjZXB0aW9uOw0KLQkNCi0JcHVibGljIHZvaWQgYWZ0ZXJUZXN0Q2FzZSgpIHRocm93cyBFeGNlcHRpb247DQotCQ0KLQlwdWJsaWMgdm9pZCBydW5CYXJlSW50ZXJuYWwoKSB0aHJvd3MgVGhyb3dhYmxlOw0KLQkNCi0JDQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvam9icy9Kb2JVdGlscy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qb2JzL0pvYlV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ1ZTIwOGEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qb2JzL0pvYlV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmpvYnM7DQotDQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hDb25zdGFudHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXR0ZXJuOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guVHlwZU5hbWVSZXF1ZXN0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMudGhyZWFkaW5nLlRlc3RDb250ZXh0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZy5JTG9nZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZy5Mb2dnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7DQotDQotcHVibGljIGNsYXNzIEpvYlV0aWxzDQotew0KLQlAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQ0KLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FpdEZvckpvYnNJbnRlcnJ1cHRhYmxlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uDQotCXsNCi0JCXdoaWxlIChQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkuY3VycmVudEpvYigpICE9IG51bGwpDQotCQl7DQotCQkJZGVsYXkoNSk7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhaXRGb3JKb2JzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQl3YWl0Rm9yRHVtbXlKb2IoSm9iLklOVEVSQUNUSVZFKTsNCi0JCQ0KLQkJd2hpbGUgKHRydWUpDQotCQl7DQotCQkJdHJ5DQotCQkJew0KLQkJCQl3YWl0Rm9ySm9ic0ludGVycnVwdGFibGUoKTsNCi0JCQkJYnJlYWs7DQotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpDQotCQkJew0KLQ0KLQkJCX0NCi0JCX0NCi0NCi0JCS8vIGkwMzY1MDkgYWRkZWQgY291c2Ugd2FpdGluZyBmb3Igam9icyBpcyBub3QgZW5vdWdodA0KLQkJd2FpdEZvckluZGV4ZXIoKTsNCi0JCQ0KLQkJLy8gRm9yY2Ugbm90aWZpY2F0aW9ucw0KLQkJd2FpdEZvck5vdGlmaWNhdGlvbnMoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsYXkoZmluYWwgbG9uZyBtaWxsaXMpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbg0KLQl7DQotCQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsNCi0JCS8vIGlmIHRoaXMgaXMgdGhlIFVJIHRocmVhZCwgdGhlbiBwcm9jZXNzIHRoZSBpbnB1dA0KLQkJaWYgKGRpc3BsYXkgIT0gbnVsbCkNCi0JCXsNCi0JCQlmaW5hbCBsb25nIGVudFRpbWVNaWxsaXMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIG1pbGxpczsNCi0JCQl3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgPCBlbnRUaW1lTWlsbGlzKQ0KLQkJCXsNCi0JCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQ0KLQkJCQl7DQotCQkJCQlkaXNwbGF5LnNsZWVwKCk7DQotCQkJCX0NCi0JCQl9DQotCQkJZGlzcGxheS51cGRhdGUoKTsNCi0JCX0gZWxzZQ0KLQkJew0KLQkJCVRocmVhZC5zbGVlcCgxMDAwKTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhaXRGb3JJbmRleGVyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoQWxsVHlwZU5hbWVzKG51bGwsU2VhcmNoUGF0dGVybi5SX0VYQUNUX01BVENILCBudWxsLCANCi0JCQkJU2VhcmNoUGF0dGVybi5SX0NBU0VfU0VOU0lUSVZFLCBJSmF2YVNlYXJjaENvbnN0YW50cy5DTEFTUywgU2VhcmNoRW5naW5lDQotCQkJCQkJCQkJCQkJCQkJCQkJLmNyZWF0ZUphdmFTZWFyY2hTY29wZShuZXcgSUphdmFFbGVtZW50WzBdKSwgbmV3IFR5cGVOYW1lUmVxdWVzdG9yKCkNCi0JCQkJCQkJCQkJew0KLQkJCQkJCQkJCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpDQotCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBhY2NlcHRDbGFzcyhjaGFyW10gcGFja2FnZU5hbWUsIGNoYXJbXSBzaW1wbGVUeXBlTmFtZSwgY2hhcltdW10gZW5jbG9zaW5nVHlwZU5hbWVzLA0KLQkJCQkJCQkJCQkJCQkJCQkJCQlTdHJpbmcgcGF0aCkNCi0JCQkJCQkJCQkJCXsNCi0JCQkJCQkJCQkJCX0NCi0JCQkJCQkJCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQ0KLQkJCQkJCQkJCQkJcHVibGljIHZvaWQgYWNjZXB0SW50ZXJmYWNlKGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIHNpbXBsZVR5cGVOYW1lLCBjaGFyW11bXSBlbmNsb3NpbmdUeXBlTmFtZXMsDQotCQkJCQkJCQkJCQkJCQkJCQkJCVN0cmluZyBwYXRoKQ0KLQkJCQkJCQkJCQkJew0KLQkJCQkJCQkJCQkJfQ0KLQkJCQkJCQkJCQl9LCBJSmF2YVNlYXJjaENvbnN0YW50cy5XQUlUX1VOVElMX1JFQURZX1RPX1NFQVJDSCwgbnVsbCk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBTY2hlZHVsZSBhIGR1bW15IGpvYiB3aXRoIHRoZSBwcmlvcml0eSBzcGVjaWZpZWQgYW5kIHdhaXQgZm9yIGl0IGlzIGRvbmUNCi0JICovDQotCXByaXZhdGUgc3RhdGljIHZvaWQgd2FpdEZvckR1bW15Sm9iKGZpbmFsIGludCBwcmlvcml0eSkNCi0Jew0KLQkJdHJ5DQotCQl7DQotCQkJd2FpdEZvckR1bW15Sm9iV2l0aFByaW8ocHJpb3JpdHkpOw0KLQkJfQ0KLQkJY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQkNCi0JCX0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3YWl0Rm9yRHVtbXlKb2JXaXRoUHJpbyhmaW5hbCBpbnQgcHJpbykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uDQotCXsNCi0JCUpvYiBteUR1bW15Sm9iID0gbmV3IEpvYigiRFVNTVkiKXsNCi0NCi0JCQlAT3ZlcnJpZGUNCi0JCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7DQotCQkJfX07DQotCQkJDQotCQlteUR1bW15Sm9iLnNldFByaW9yaXR5KHByaW8pOw0KLQkJbXlEdW1teUpvYi5zZXRVc2VyKGZhbHNlKTsNCi0JCW15RHVtbXlKb2Iuc2NoZWR1bGUoKTsNCi0JCQ0KLQkJbXlEdW1teUpvYi5qb2luKCk7DQotCX0NCi0JDQotCQ0KLQkvKioNCi0JICogRm9yY2VzIGRlbGl2ZXJpbmcgb2Ygbm90aWZpY2F0aW9uIGV2ZW50cy4gVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtZXRob2QgaXMgImluc3BpcmVkIiBieSBOb3RpZmljYXRpb25NYW5hZ2VyJ3Mgbm90aWZpY2F0aW9uIGpvYg0KLQkgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIA0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3YWl0Rm9yTm90aWZpY2F0aW9ucygpDQotCXsNCi0JCWZpbmFsIElXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOw0KLQkJZmluYWwgSVdvcmtzcGFjZVJ1bm5hYmxlIGR1bW15UnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCl7DQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0JCQl7DQotCQkJfQ0KLQkJfTsNCi0JCQ0KLQkJZmluYWwgSm9iIG5vdGlmRm9yY2luZ0pvYiA9IG5ldyBKb2IoIkRlbGl2ZXJpbmcgbm90aWZpY2F0aW9ucy4uLiIpew0KLQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpDQotCQkJew0KLQkJCQl0cnkNCi0JCQkJew0KLQkJCQkJd29ya3NwYWNlLnJ1bihkdW1teVJ1bm5hYmxlLCBudWxsLCBJV29ya3NwYWNlLkFWT0lEX1VQREFURSwgbnVsbCk7DQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkNCi0JCQkJew0KLQkJCQkJbG9nZ2VyKCkubG9nRGVidWcoIGUuZ2V0TWVzc2FnZSgpLCBlICk7DQotCQkJCX0NCi0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7DQotCQkJfX07DQotCQkNCi0JCXN5bmNFeGVjSm9iKG5vdGlmRm9yY2luZ0pvYiwgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FpdEZvckpvYnNTbG93KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQl3YWl0Rm9ySm9icygpOw0KLQkJd2FpdEZvckR1bW15Sm9iKEpvYi5ERUNPUkFURSk7DQotCQkNCi0JCXdhaXRGb3JFdmVudExvb3AoKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdhaXRGb3JFdmVudExvb3AoKQ0KLQl7DQotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKTsNCi0JCQ0KLQkJZmluYWwgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKXsNCi0NCi0JCQlwdWJsaWMgdm9pZCBydW4oKQ0KLQkJCXsNCi0JCQkJLy8gTGV0IHRoZSBkaXNwbGF5IHByb2Nlc3MgdGhlIGV2ZW50cyBpbiBpdHMgcXVldWUNCi0JCQkJd2hpbGUoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSl7fTsNCi0JCQl9fTsNCi0JCQ0KLQkJaWYoRGlzcGxheS5nZXRDdXJyZW50KCkgIT0gbnVsbCkNCi0JCXsNCi0JCQlydW5uYWJsZS5ydW4oKTsNCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQlkaXNwbGF5LnN5bmNFeGVjKHJ1bm5hYmxlKTsNCi0JCX0NCi0JCQkNCi0JfQ0KLQ0KLQkvKioNCi0JICogRXhlY3V0ZXMgc3luY2hyb25vdXNseSAoc2NoZWR1bGVzIGFuZCBqb2lucykgdGhlIGpvYiBzcGVjaWZpZWQuPGJyPg0KLQkgKiBJZiB0aGUgbWV0aG9kIGlzIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQsIHRoZSBqb2IgaXMgc2NoZWR1bGVkIGFuZCBqb2luZWQgaW4gYSBtb2RhbCBjb250ZXh0IHRocmVhZCB0aHVzIGxldHRpbmcgdGhlIGV2ZW50IGxvb3AgcHJvY2VzcyBhc3luY2hyb25vdXMgZXZlbnRzPGJyPg0KLQkgKiBJZiB0aGUgbWV0aG9kIGlzIGNhbGxlZCBmcm9tIGEgd29ya2VyIHRocmVhZCwgdGhlIGpvYiBpcyBzY2hlZHVsZWQgYW5kIGpvaW5lZCBpbiB0aGUgY2FsbGVyIHRocmVhZC4NCi0JICogDQotCSAqIEBwYXJhbSBqb2INCi0JICogQHBhcmFtIGRpc3BsYXkNCi0JICovDQotCXByaXZhdGUgc3RhdGljIHZvaWQgc3luY0V4ZWNKb2IoZmluYWwgSm9iIGpvYiwgZmluYWwgRGlzcGxheSBkaXNwbGF5KQ0KLQl7DQotCQlmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkNCi0JCXsNCi0NCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24NCi0JCQl7DQotCQkJCWpvYi5zY2hlZHVsZSgpOw0KLQkJCQl0cnkNCi0JCQkJew0KLQkJCQkJam9iLmpvaW4oKTsNCi0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkNCi0JCQkJew0KLQkJCQkJbG9nZ2VyKCkubG9nRGVidWcoZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJCQl9DQotCQkJfQ0KLQkJfTsNCi0JCXRyeQ0KLQkJew0KLQkJCVRlc3RDb250ZXh0LnJ1bihydW5uYWJsZSwgRGlzcGxheS5nZXRDdXJyZW50KCkgIT0gbnVsbCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgZGlzcGxheSk7DQotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpDQotCQl7DQotCQkJbG9nZ2VyKCkubG9nRGVidWcoZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlsb2dnZXIoKS5sb2dEZWJ1ZyhlLmdldE1lc3NhZ2UoKSwgZSk7DQotCQl9DQotCX0NCi0JDQotCXByaXZhdGUgc3RhdGljIElMb2dnZXIgbG9nZ2VyKCkNCi0Jew0KLQkJcmV0dXJuIG5ldyBMb2dnZXIoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL3Byb2plY3QvQ2xhc3NMb2FkaW5nVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9wcm9qZWN0L0NsYXNzTG9hZGluZ1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWI2NDIwMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL3Byb2plY3QvQ2xhc3NMb2FkaW5nVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3Q7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBFeHRlbmRzIHtAbGluayBQcm9qZWN0QmFzZWRUZXN0fSBieSBhZGRpbmcgZmluY3Rpb25hbGl0aWVzIHRvIGNyZWF0ZSBjbGFzc2VzIGluIHNvbWUgcGFja2FnZSBlaWRlciBieSByZWFkaW5nIGl0IGZyb20gdGV4dCBmaWxlIG9yIHBhc3NlZCBhcwotICogc3RyaW5ncy4KLSAqIAotICogPC9wcmU+Ci0gKiAKLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2xhc3NMb2FkaW5nVGVzdCBleHRlbmRzIFByb2plY3RCYXNlZFRlc3QKLXsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgSkFWQV9FWFQgPSAiLmphdmEiOwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2hhciBTRVBBUkFUT1IgPSAnIyc7Ci0KLQlwcm90ZWN0ZWQgSVBhY2thZ2VGcmFnbWVudCBkZWZhdWx0UGFja2FnZTsKLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUphdmFQcm9qZWN0KFN0cmluZyBzcmNGb2xkZXIsIFN0cmluZyBkZWZhdWx0UGFja2FnZU5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQljcmVhdGVKYXZhUHJvamVjdChzcmNGb2xkZXIpOwotCi0JCWlmIChkZWZhdWx0UGFja2FnZU5hbWUgIT0gbnVsbCkKLQkJewotCQkJZGVmYXVsdFBhY2thZ2UgPSBnZXRTb3VyY2VGb2xkZXIoKS5jcmVhdGVQYWNrYWdlRnJhZ21lbnQoZGVmYXVsdFBhY2thZ2VOYW1lLCB0cnVlLCBudWxsKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGNsYXNzIGluIHRlc3QgcHJvamVjdC4gPGNvZGU+c291cmNlRmlsZVBhdGg8L2NvZGU+IG11c3QgY29udGFpbiB0aGUgY2xhc3Mgc291cmNlIHdpdGhvdXQgcGFja2FnZSBkZWNsYXJhdGlvbi4gVGhlIGNsYXNzIGlzIGNyZWF0ZWQgaW4KLQkgKiBkZWZhdWx0IHBhY2thZ2UuCi0JICogCi0JICogUHJvamVjdCBtdXN0IGJlIGNyZWF0ZWQgYmVmb3JlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlRmlsZVBhdGgKLQkgKiBAcGFyYW0gY2xhc3NOYW1lCi0JICogQHJldHVybiBJVHlwZSBvYmplY3QgZm9yIHRoZSBjcmVhdGVkIGNsYXNzCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIElUeXBlIGNyZWF0ZUNsYXNzKFN0cmluZyBzb3VyY2VGaWxlUGF0aCwgU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uCi0JewotCQlpZiAoc291cmNlRmlsZVBhdGggPT0gbnVsbCkKLQkJewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJzb3VyY2VGaWxlUGF0aCBzaG91bGQgbm90IGJlIG51bGwuIik7Ci0JCX0KLQotCQlTdHJpbmcgc291cmNlID0gVGVzdFByb2plY3RzVXRpbHMucmVhZFNvdXJjZSh0aGlzLmdldENsYXNzKCksIHNvdXJjZUZpbGVQYXRoKTsKLQotCQlyZXR1cm4gY3JlYXRlQ2xhc3MoZGVmYXVsdFBhY2thZ2UsIGNsYXNzTmFtZSwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGNsYXNzIGluIDxjb2RlPnBjazwvY29kZT4gcGFja2FnZSB3aXRoIG5hbWUgYW5kIHNvdXJjZSA8Y29kZT5jbGFzc05hbWUsIHNvdXJjZTwvY29kZT4uIFNvdXJjZSBtdXN0IG5vdCBpbmNsdXNlIHBhY2thZ2UKLQkgKiBkZWNsYXJhdGlvbi4gUHJvamVjdCBtdXN0IGJlIGNyZWF0ZWQgYmVmb3JlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcGNrCi0JICogQHBhcmFtIGNsYXNzTmFtZQotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGluIGNhc2Ugc29tZSBvZiB0aGUgcGFyYW1zIGlzIG51bGwuCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgSVR5cGUgY3JlYXRlQ2xhc3MoSVBhY2thZ2VGcmFnbWVudCBwY2ssIFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlpZiAoY2xhc3NOYW1lID09IG51bGwpCi0JCXsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicGFyYW0gJ2NsYXNzTmFtZScgc2hvdWxkIG5vdCBiZSBudWxsLiIpOwotCQl9Ci0KLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQl7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInBhcmFtICdzb3VyY2UnIHNob3VsZCBub3QgYmUgbnVsbC4iKTsKLQkJfQotCi0JCWlmIChnZXRUZXN0UHJvamVjdCgpID09IG51bGwpCi0JCXsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicHJvamVjdCBtdXN0IGJlIGNyZWF0ZWQgYmVmb3JlIGNsYXNzZXMgY2FuIGJlIGFkZGVkIHRvIGl0Iik7Ci0JCX0KLQotCQlyZXR1cm4gZ2V0VGVzdFByb2plY3QoKS5jcmVhdGVUeXBlKHBjaywgY2xhc3NOYW1lICsgSkFWQV9FWFQsIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogUmVhZHMgdGhlIGNvbnRlbnQgb2YgPGNvZGU+c291cmNlc0ZpbGVQYXRoPC9jb2RlPiBhbmQgY3JlYXRlcyBjbGFzc2VzIGluIHRlc3QgcHJvamVjdC4gVGhlIGNvbnRlbnQgb2YgPGNvZGU+c291cmNlc0ZpbGVQYXRoPC9jb2RlPiBzb3VsZCBiZSAtCi0JICogJyMnIGNoYXIgKHNlcGFyYXRvciBmb3IgY2xhc3NlcykgZm9sbG93ZWQgYnkgQ2xhc3MgbmFtZSwgbmV3IGxpbmUgYW5kIGFmdGVyIHRoYXQgY2xhc3Mgc291cmNlIHdpdGhvdXQgcGFja2FnZSBkZWNsYXJhdGlvbi48YnI+Ci0JICogRXhhbXBsZToKLQkgKiAKLQkgKiA8cHJlPgotCSAqICAjSW1wbGVtZW50c1JlbW90ZQotCSAqICBwdWJsaWMgY2xhc3MgSW1wbGVtZW50c1JlbW90ZSBpbXBsZW1lbnRzIGphdmEucm1pLlJlbW90ZQotCSAqICB7Ci0JICogIH0KLQkgKiAJCi0JICogICNOb0RlZmF1bHRDb25zdHJ1Y3RvcgotCSAqICBwdWJsaWMgY2xhc3MgTm9EZWZhdWx0Q29uc3RydWN0b3IgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCSAqICB7Ci0JICogCXB1YmxpYyBOb0RlZmF1bHRDb25zdHJ1Y3RvcihTdHJpbmcgcGFyYW0pIHsKLQkgKiAgCX0KLQkgKiAgfQotCSAqIDwvcHJlPgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBpZiBsb3RzIG9mIHNtYWxsIGNsYXNzZXMgc2hvdWxkIGJlIGNyZWF0ZWQgZnJvbSBhIHNvdXJjZSBmaWxlLiBQcm9qZWN0IG11c3QgYmUgY3JlYXRlZCBiZWZvcmUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2VzRmlsZVBhdGgKLQkgKiBAcmV0dXJuIG1hcCBvZiBjbGFzc05hbWUtPklUeXBlLiB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgTWFwPFN0cmluZywgSVR5cGU+IGNyZWF0ZUNsYXNzZXMoU3RyaW5nIHNvdXJjZXNGaWxlUGF0aCkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJTWFwPFN0cmluZywgSVR5cGU+IHR5cGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJVHlwZT4oKTsKLQkJU3RyaW5nIHNvdXJjZSA9IFRlc3RQcm9qZWN0c1V0aWxzLnJlYWRTb3VyY2UodGhpcy5nZXRDbGFzcygpLCBzb3VyY2VzRmlsZVBhdGgpOwotCi0JCWludCBzdGFydFBvcyA9IDA7Ci0JCXdoaWxlICgoc3RhcnRQb3MgPSBzb3VyY2UuaW5kZXhPZihTRVBBUkFUT1IpKSA+IC0xKQotCQl7Ci0JCQlpbnQgZW5kUG9zID0gc291cmNlLmluZGV4T2YoU0VQQVJBVE9SLCBzdGFydFBvcyArIDEpOwotCQkJaWYgKGVuZFBvcyA9PSAtMSkKLQkJCQllbmRQb3MgPSBzb3VyY2UubGVuZ3RoKCk7Ci0KLQkJCVN0cmluZyBzcmMgPSBzb3VyY2Uuc3Vic3RyaW5nKHN0YXJ0UG9zICsgMSwgZW5kUG9zKTsKLQkJCXNvdXJjZSA9IHNvdXJjZS5zdWJzdHJpbmcoZW5kUG9zKTsKLQotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IHNyYy5zdWJzdHJpbmcoMCwgc3JjLmluZGV4T2YoJ1xuJykpLnJlcGxhY2VBbGwoIlxyIiwgIiIpOwotCQkJc3JjID0gc3JjLnN1YnN0cmluZyhzcmMuaW5kZXhPZignXG4nKSArIDEpOwotCi0JCQl0eXBlcy5wdXQoY2xhc3NOYW1lLCBjcmVhdGVDbGFzcyhkZWZhdWx0UGFja2FnZSwgY2xhc3NOYW1lLCBzcmMpKTsKLQkJfQotCi0JCXJldHVybiB0eXBlczsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL3Byb2plY3QvUHJvamVjdEJhc2VkVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9wcm9qZWN0L1Byb2plY3RCYXNlZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDRlMDg5OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL3Byb2plY3QvUHJvamVjdEJhc2VkVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3Q7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290Ow0KLQ0KLS8qKg0KLSAqIEdlbmVyYWwgY2xhc3MgZm9yIHRlc3RzIHRoYXQgc2hvdWxkIGJlIHN0YXJ0ZWQgYXMgSlVuaXQgUGx1Z2luIHRlc3RzLiBQcm92aWRlcyBiYXNpYyBmdW5jdGlvbmFsaXRpZXMgZm9yIGZ1bmN0aW9uYWwgdGVzdGluZzogMS4gQ3JlYXRlIEphdmEgcHJvamVjdA0KLSAqIGluIGp1bml0LXJ1bnRpbWUtd29ya2JlbmNoLiAyLiBDcmVhdGUgZGVmYXVsdCBzb3VyY2UgZm9sZGVyLiAzLiBDcmVhdGUgZGVmYXVsdCBwYWNrYWdlLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvamVjdEJhc2VkVGVzdCBleHRlbmRzIFRlc3RDYXNlDQotew0KLQlwcml2YXRlIFRlc3RQcm9qZWN0IHByb2plY3Q7DQotDQotCS8qKg0KLQkgKiA8Y29kZT5zcmNGb2xkZXJOYW1lPC9jb2RlPiB0aGUgc291cmNlIGZvbGRlciB3aGVyZSBjbGFzc2VzIHdpbGwgYmUgY3JlYXRlZCwgPGNvZGU+cGFja2FnZU5hbWU8L2NvZGU+IGlzIHRoZSBwYWNrYWdlIHdoZXJlIGNsYXNzZXMgd2lsbCBiZQ0KLQkgKiBjcmVhdGVkLg0KLQkgKiANCi0JICogQHBhcmFtIHNyY0ZvbGRlck5hbWUNCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gLQ0KLQkgKiAgICAgICAgICAgICBpbiBjYXNlIHNyY0ZvbGRlck5hbWUgaXMgbnVsbA0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlSmF2YVByb2plY3QoU3RyaW5nIHNyY0ZvbGRlck5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCWlmIChzcmNGb2xkZXJOYW1lID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJzcmNGb2xkZXJOYW1lIHNob3VsZCBub3QgYmUgbnVsbC4iKTsNCi0JCX0NCi0NCi0JCXByb2plY3QgPSBuZXcgVGVzdFByb2plY3QoKTsNCi0JCXByb2plY3QuY3JlYXRlU291cmNlRm9sZGVyKHNyY0ZvbGRlck5hbWUpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJaWYgKHByb2plY3QgIT0gbnVsbCkNCi0JCXsNCi0JCQlwcm9qZWN0LmRpc3Bvc2UoKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgZmluYWwgVGVzdFByb2plY3QgZ2V0VGVzdFByb2plY3QoKQ0KLQl7DQotCQlyZXR1cm4gcHJvamVjdDsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgSVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0U291cmNlRm9sZGVyKCkNCi0Jew0KLQkJcmV0dXJuIHByb2plY3QuZ2V0U291cmNlRm9sZGVyKCk7DQotCX0NCi0NCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpDQotCXsNCi0JCXJldHVybiBwcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9wcm9qZWN0L1Rlc3RFamIzUHJvamVjdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9wcm9qZWN0L1Rlc3RFamIzUHJvamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMGE3OWI1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvcHJvamVjdC9UZXN0RWpiM1Byb2plY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdDsNCi0NCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuZXhjZXB0aW9uLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCi0NCi1wdWJsaWMgY2xhc3MgVGVzdEVqYjNQcm9qZWN0DQotew0KLQlwcml2YXRlIElQcm9qZWN0IGVqYlByb2plY3Q7DQotDQotCXB1YmxpYyBUZXN0RWpiM1Byb2plY3QoZmluYWwgU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJZWpiUHJvamVjdCA9IGNyZWF0ZUVqYk1vZHVsZShuYW1lICsgIl8iICsgTG9uZy50b1N0cmluZyhTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgVGVzdEVqYjNQcm9qZWN0KGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBib29sZWFuIGFwcGVuZFVpZCwgZmluYWwgYm9vbGVhbiByZXVzZUV4aXN0aW5nKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIFN0cmluZ0J1aWxkZXIgcHJvamVjdE5hbWUgPSBuZXcgU3RyaW5nQnVpbGRlcihuYW1lKTsNCi0JCWlmIChhcHBlbmRVaWQpDQotCQl7DQotCQkJcHJvamVjdE5hbWUuYXBwZW5kKCJfIik7DQotCQkJcHJvamVjdE5hbWUuYXBwZW5kKExvbmcudG9TdHJpbmcoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpKTsNCi0JCX0NCi0JCUlQcm9qZWN0IGV4aXN0aW5nUHJvamVjdCA9IG51bGw7DQotCQlpZiAocmV1c2VFeGlzdGluZykNCi0JCXsNCi0JCQlleGlzdGluZ1Byb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUudG9TdHJpbmcoKSk7DQotCQl9DQotCQlpZiAoZXhpc3RpbmdQcm9qZWN0ID09IG51bGwpDQotCQl7DQotCQkJdGhpcy5lamJQcm9qZWN0ID0gY3JlYXRlRWpiTW9kdWxlKHByb2plY3ROYW1lLnRvU3RyaW5nKCkpOw0KLQkJfSBlbHNlDQotCQl7DQotCQkJdGhpcy5lamJQcm9qZWN0ID0gZXhpc3RpbmdQcm9qZWN0Ow0KLQkJfQ0KLQl9DQotCQ0KLQlwcml2YXRlIElQcm9qZWN0IGNyZWF0ZUVqYk1vZHVsZShmaW5hbCBTdHJpbmcgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gVGVzdFByb2plY3RzVXRpbHMuY3JlYXRlRWpiM1Byb2plY3QobmFtZSk7DQotCX0NCi0NCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKQ0KLQl7DQotCQlyZXR1cm4gZWpiUHJvamVjdC5nZXRQcm9qZWN0KCk7DQotCX0NCi0NCi0JcHVibGljIElGb2xkZXIgZ2V0TWV0YUluZkZvbGRlcigpIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24NCi0Jew0KLQkJcmV0dXJuIGVqYlByb2plY3QuZ2V0UHJvamVjdCgpLmdldEZvbGRlcigiZWpiTW9kdWxlIikuZ2V0Rm9sZGVyKCJNRVRBLUlORiIpOw0KLQl9DQotDQotCXB1YmxpYyBJUGFja2FnZUZyYWdtZW50IGNyZWF0ZVBhY2thZ2UoU3RyaW5nIHNvdXJjZUZvbGRlciwgU3RyaW5nIHBhY2thZ2VOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShnZXRQcm9qZWN0KCkpOw0KLQkJZmluYWwgSUZvbGRlciBmb2xkZXIgPSBnZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKHNvdXJjZUZvbGRlcik7DQotCQlmaW5hbCBJUGFja2FnZUZyYWdtZW50Um9vdCBzcmNGb2xkZXIgPSBqYXZhUHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KGZvbGRlcik7DQotCQlyZXR1cm4gc3JjRm9sZGVyLmNyZWF0ZVBhY2thZ2VGcmFnbWVudChwYWNrYWdlTmFtZSwgZmFsc2UsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOw0KLQl9DQotDQotCXB1YmxpYyBJRmlsZSBjcmVhdGVGaWxlKGZpbmFsIElGb2xkZXIgZm9sZGVyLCBmaW5hbCBTdHJpbmcgZmlsZU5hbWUsIGZpbmFsIFVSTCBpbnB1dFVybCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShmb2xkZXIsICJmb2xkZXIiKTsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShmaWxlTmFtZSwgImZpbGVOYW1lIik7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0oaW5wdXRVcmwsICJpbnB1dFVybCIpOw0KLQkJDQotCQlmaW5hbCBJRmlsZSBmaWxlID0gZm9sZGVyLmdldEZpbGUoZmlsZU5hbWUpOw0KLQkJZmluYWwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBpbnB1dFVybC5vcGVuU3RyZWFtKCk7DQotCQl0cnkNCi0JCXsNCi0JCQlmaWxlLmNyZWF0ZShpbnB1dFN0cmVhbSwgZmFsc2UsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOw0KLQkJCXJldHVybiBmaWxlOw0KLQkJfQ0KLQkJZmluYWxseQ0KLQkJew0KLQkJCWlucHV0U3RyZWFtLmNsb3NlKCk7DQotCQl9DQotCX0NCi0JDQotCS8qKiBUbyBnZXQgYSBoYW5kbGUgdG8gYSBmaWxlIGxvY2F0ZWQgaW4gdGhpcyBwcm9qZWN0IHNwZWNpZmllZCBieSB0aGUgcmVsYXRpdmUgZmlsZSBwYXRoLg0KLQkgKiBAcGFyYW0gZmlsZVBhdGggZmlsZSBwYXRoIHJlbGF0aXZlIGluc2lkZSBvZiB0aGUgcHJvamVjdCwgaS5lLiB0aGUgcHJvamVjdCBuYW1lIG11c3QgTk9UDQotCSAqICBiZSBwYXJ0IG9mIHRoZSBwYXRoIA0KLQkgKiBAcmV0dXJuIHRoZSBmaWxlIGhhbmRsZSAqLw0KLQlwdWJsaWMgZmluYWwgSUZpbGUgZ2V0RmlsZShmaW5hbCBTdHJpbmcgZmlsZVBhdGgpDQotCXsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShmaWxlUGF0aCwgImZpbGVQYXRoIik7DQotCQlyZXR1cm4gdGhpcy5lamJQcm9qZWN0LmdldFByb2plY3QoKS5nZXRGaWxlKGZpbGVQYXRoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBkZWxldGVGaWxlKGZpbmFsIElGb2xkZXIgZm9sZGVyLCBmaW5hbCBTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbg0KLQl7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0oZm9sZGVyLCAiZm9sZGVyIik7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0oZmlsZU5hbWUsICJmaWxlTmFtZSIpOw0KLQkJDQotCQlmaW5hbCBJRmlsZSBmaWxlID0gZm9sZGVyLmdldEZpbGUoZmlsZU5hbWUpOw0KLQkJaWYgKGZpbGUuZXhpc3RzKCkpDQotCQl7DQotCQkJZmlsZS5kZWxldGUodHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7DQotCQl9DQotCX0NCi0JDQotCS8qKiBUbyBjcmVhdGUgYSBwcm9qZWN0IGZvbGRlciBzcGVjaWZpZWQgYnkgdGhlIHJlbGF0aXZlIGZvbGRlciBwYXRoLiBBbGwgZm9sZGVyIHNlZ21lbnRzDQotCSAqIGhhdmUgYWxyZWFkeSB0byBleGlzdCBhcGFydCBmcm9tIHRoZSBsYXN0IG9uZSwgaS5lLiBwYXJlbnQgZm9sZGVycyBhcmUgbm90IGNyZWF0ZWQgYXV0b21hdGljYWxseS4NCi0JICogQHBhcmFtIGZvbGRlclBhdGggZm9sZGVyIHBhdGggcmVsYXRpdmUgaW5zaWRlIG9mIHRoZSBwcm9qZWN0LCBpLmUuIHRoZSBwcm9qZWN0IG5hbWUgbXVzdCBOT1QNCi0JICogIGJlIHBhcnQgb2YgdGhlIHBhdGggDQotCSAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgZm9sZGVyDQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAqLw0KLQlwdWJsaWMgZmluYWwgSUZvbGRlciBjcmVhdGVGb2xkZXIoZmluYWwgU3RyaW5nIGZvbGRlclBhdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShmb2xkZXJQYXRoLCAiZm9sZGVyUGF0aCIpOw0KLQkJDQotCQlmaW5hbCBJRm9sZGVyIGZvbGRlciA9IHRoaXMuZWpiUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKGZvbGRlclBhdGgpOw0KLQkJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsNCi0JCXJldHVybiBmb2xkZXI7DQotCX0NCi0NCi0JLyoqIFRvIGdldCBhIGhhbmRsZSB0byBhIHByb2plY3QgZm9sZGVyIHNwZWNpZmllZCBieSB0aGUgcmVsYXRpdmUgZm9sZGVyIHBhdGguDQotCSAqIEBwYXJhbSBmb2xkZXJQYXRoIGZvbGRlciBwYXRoIHJlbGF0aXZlIGluc2lkZSBvZiB0aGUgcHJvamVjdCwgaS5lLiB0aGUgcHJvamVjdCBuYW1lIG11c3QgTk9UDQotCSAqICBiZSBwYXJ0IG9mIHRoZSBwYXRoIA0KLQkgKiBAcmV0dXJuIHRoZSBmb2xkZXIgaGFuZGxlICovDQotCXB1YmxpYyBmaW5hbCBJRm9sZGVyIGdldEZvbGRlcihmaW5hbCBTdHJpbmcgZm9sZGVyUGF0aCkNCi0Jew0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKGZvbGRlclBhdGgsICJmb2xkZXJQYXRoIik7DQotCQlyZXR1cm4gdGhpcy5lamJQcm9qZWN0LmdldFByb2plY3QoKS5nZXRGb2xkZXIoZm9sZGVyUGF0aCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9wcm9qZWN0L1Rlc3RQcm9qZWN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL3Byb2plY3QvVGVzdFByb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODMwMGQxNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL3Byb2plY3QvVGVzdFByb2plY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnJlc291cmNlcy5SZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnJlc291cmNlcy5Xb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZS51dGlsLkFwdENvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmpvYnMuSm9iVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy50aHJlYWRpbmcuVGVzdENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFdyYXBwZXIgdXRpbGl0eSBmb3IgbWFpbnRhaW5pbmcgcHJvamVjdHMgd2hpY2ggcGFydGljaXBhdGUgaW4gdGVzdHMgZml4dHVyZS4gUmVzb3VyY2UgbW9kaWZpY2F0aW9uIG9wZXJhdGlvbnMgYXJlIGFsd2F5cyBwZXJmb3JtZWQgb3V0c2lkZSB0aGUgVUkgKG1haW4gdGhyZWFkKS4gSWYgdGhlIGNhbGxlciB0aHJlYWQgaXMgdGhlIFVJIHRocmVhZCwgZm9yayBpbiB7QGxpbmsgVGVzdENvbnRleHR9IGlzIHBlcmZvcm1lZC4KLSAqIFJlc291cmNlIGNoYW5nZSBvcGVyYXRpb25zIGFyZSBwZXJmb3JtZWQgd2l0aGluIGEge0BsaW5rIElXb3Jrc3BhY2VSdW5uYWJsZX0gd2l0aCBhIHNjaGVkdWxpbmcgcnVsZSBvZiB0aGUgd29ya3NwYWNlIHJvb3Q8YnI+Ci0gKiBFeGVjdXRpbmcgcmVzb3VyY2UgY2hhbmdlcyBvdXRzaWRlIHRoZSBVSSB0aHJlYWQgYWxsb3dzIHJlc291cmNlIGNoYW5nZSBldmVudHMgcHJvcGFnYXRpb24gZXZlbnQgd2hlbiB0aGUgSlVuaXQgdGVzdHMgcnVuIGluIHRoZSBVSSB0aHJlYWQuIFRoaXMgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQgZm9yIFdlYiBzZXJ2aWNlIERPTSB0ZXN0cyBhcyB0aGUgbW9kZWwgaXMgdXBkYXRlZCBvbiByZXNvdXJjZSBjaGFuZ2VzICAgCi0gKiAKLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YsIERhbmFpbCBCcmFuZWtvdgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIFRlc3RQcm9qZWN0Ci17Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBjaGFyIENMQVNTX1NFUEFSQVRPUiA9ICcjJzsKLQkKLQlwcml2YXRlIGludCBpZEluTWlsbGlzID0gMDsKLQkKLQlwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0KLQlwcml2YXRlIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdDsKLQotCXByaXZhdGUgSVBhY2thZ2VGcmFnbWVudFJvb3Qgc291cmNlRm9sZGVyOwotCi0JcHVibGljIFRlc3RQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCXRoaXMoIiIpOwotCX0KLQkKLQlwdWJsaWMgVGVzdFByb2plY3QoU3RyaW5nIG5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQkvKgotCQkgKiBDYWxjdWxhdGUgdGhlIG5hbWUgb2YgdGhlIHRlc3QgcHJvamVjdC4gVGhlIGZvcm11bGE6IEphdmFQcm9qXyArIDxjdXJyZW50X3RpbWVfaW5fbWlsbGlzPyArIDxpZEluTWlsbGlzPiBpcyB1c3NlZC4gSW4gdGhpcyBmb3JtdWxhCi0JCSAqIEphdmFQcm9qXyBpcyBhIHN0cmluZyBsaXR0ZXJhbCwgY3VycmVudF90aW1lX2luX21pbGxpcyBpcyBvYnZpb3VzLiBpZEluTWlsbGlzIGlzIGFuIGludGVnZXIgaW5jcmVtZW50ZWQgZWFjaCB0aW1lIGEgcHJvamVjdCBuYW1lIGlzCi0JCSAqIGNhbGN1bGF0ZWQuIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIHN5c3RlbSB0aW1lciBoYXMgcHJlY2lzaW9uIGFib3V0IDEwIG1zLiBUaHVzIGl0J3MgcG9zc2libGUgdGhhdCB0d28gY29uc2VjdXRpdmUgcHJvamVjdCBjcmVhdGlvbnMKLQkJICogZ2l2ZSB0aGUgc2FtZSBwcm9qZWN0IG5hbWUuIEZvciBleGFtcGxlIHRoZSBwcm9qZWN0IGlzIGNyZXRlZCB0aGVuIHRoZSB0ZXN0IGV4ZWN1dGVzIHZlcnkgZmFzdCBhbmQgYSBuZXcgcHJvamVjdCBpcyBjcmVhdGVkIGFnYWluLiBJbiB0aGUKLQkJICogc2FtZSB0aW1lIHNpbXBseSB0aGUgaWQgaXMgbm90IGVub3VnaCBhcyBhIGRpZmZlcmVudCB0ZXN0IHJ1biBtaWdodCBwcm9kdWNlIHRoZSBzYW1lIHByb2plY3QgbmFtZS4gVGh1cyB0aGUgY29tYmluYXRpb24gdGltX21pbGxpcyArCi0JCSAqIGlkSW5NaWxsaXMgZ2l2ZXMgYSB1bmlxdWUgcHJvamVjdCBuYW1lCi0JCSAqLwotCQlmaW5hbCBTdHJpbmcgdGVzdFByb2plY3ROYW1lID0gIkphdmFQcm9qXyIgKyBMb25nLnRvU3RyaW5nKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSArICJfIiArIGlkSW5NaWxsaXMrKyArIG5hbWU7Ci0JCXByb2plY3QgPSB3b3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCh0ZXN0UHJvamVjdE5hbWUpOwotCQkKLQkJZmluYWwgSVdvcmtzcGFjZVJ1bm5hYmxlIGNyZWF0ZVByb2plY3RPcGVyYXRpb24gPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkKLQkJewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQkJCXsKLQkJCQlwcm9qZWN0LmNyZWF0ZShudWxsKTsKLQkJCQlwcm9qZWN0Lm9wZW4obnVsbCk7Ci0KLQkJCQljb25maWd1cmVKYXZhUHJvamVjdCgpOwotCQkJfQotCQl9OwotCQkKLQkJVGVzdFByb2plY3RzVXRpbHMuZXhlY3V0ZVdvcmtzcGFjZVJ1bm5hYmxlKGNyZWF0ZVByb2plY3RPcGVyYXRpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb25maWd1cmVKYXZhUHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQotCQlJRm9sZGVyIGJpbkZvbGRlciA9IGNyZWF0ZUJpbkZvbGRlcigpOwotCi0JCXNldEphdmFOYXR1cmUoKTsKLQkJamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ldyBJQ2xhc3NwYXRoRW50cnlbMF0sIG51bGwpOwotCi0JCWNyZWF0ZU91dHB1dEZvbGRlcihiaW5Gb2xkZXIpOwotCQlhZGRTeXN0ZW1MaWJyYXJpZXMoKTsKLQl9Ci0KLQlwdWJsaWMgVGVzdFByb2plY3QoZmluYWwgSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCXsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicHJvamVjdCBzaG91bGQgbm90IGJlIG51bGwiKTsKLQkJfQotCi0JCXRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0JCXRoaXMuamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCXRoaXMuc291cmNlRm9sZGVyID0gZmluZFNvdXJjZUZvbGRlcigpOwotCX0KLQotCXByaXZhdGUgSVBhY2thZ2VGcmFnbWVudFJvb3QgZmluZFNvdXJjZUZvbGRlcigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQl7Ci0JCWZvciAoSVBhY2thZ2VGcmFnbWVudFJvb3QgcGZyIDogamF2YVByb2plY3QuZ2V0QWxsUGFja2FnZUZyYWdtZW50Um9vdHMoKSkKLQkJewotCQkJaWYgKHBmci5nZXRLaW5kKCkgPT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UpCi0JCQl7Ci0JCQkJcmV0dXJuIHBmcjsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkKLQl7Ci0JCXJldHVybiBwcm9qZWN0OwotCX0KLQotCXB1YmxpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKQotCXsKLQkJcmV0dXJuIGphdmFQcm9qZWN0OwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEphcihTdHJpbmcgcGx1Z2luLCBTdHJpbmcgamFyKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbgotCXsKLQkJUGF0aCByZXN1bHQgPSBmaW5kRmlsZUluUGx1Z2luKHBsdWdpbiwgamFyKTsKLQkJSUNsYXNzcGF0aEVudHJ5W10gb2xkRW50cmllcyA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCQlmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBuZXdFbnRyaWVzID0gbmV3IElDbGFzc3BhdGhFbnRyeVtvbGRFbnRyaWVzLmxlbmd0aCArIDFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KG9sZEVudHJpZXMsIDAsIG5ld0VudHJpZXMsIDAsIG9sZEVudHJpZXMubGVuZ3RoKTsKLQkJbmV3RW50cmllc1tvbGRFbnRyaWVzLmxlbmd0aF0gPSBKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkocmVzdWx0LCBudWxsLCBudWxsKTsKLQkJCi0JCXNldENsYXNzcGF0aChuZXdFbnRyaWVzKTsKLQl9Ci0KLQlwdWJsaWMgSVBhY2thZ2VGcmFnbWVudCBjcmVhdGVQYWNrYWdlKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudFtdIGNyZWF0ZWRQYWNrYWdlID0gbmV3IElQYWNrYWdlRnJhZ21lbnRbMV07Ci0JCQotCQlmaW5hbCBJV29ya3NwYWNlUnVubmFibGUgY3JlYXRlUGFja2FnZVJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpCi0JCXsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JCQl7Ci0JCQkJaWYgKHNvdXJjZUZvbGRlciA9PSBudWxsKQotCQkJCQlzb3VyY2VGb2xkZXIgPSBjcmVhdGVTb3VyY2VGb2xkZXIoInNyYyIpOwotCQkJCWNyZWF0ZWRQYWNrYWdlWzBdID0gc291cmNlRm9sZGVyLmNyZWF0ZVBhY2thZ2VGcmFnbWVudChuYW1lLCBmYWxzZSwgbnVsbCk7Ci0JCQl9Ci0JCX07Ci0JCVRlc3RQcm9qZWN0c1V0aWxzLmV4ZWN1dGVXb3Jrc3BhY2VSdW5uYWJsZShjcmVhdGVQYWNrYWdlUnVubmFibGUpOwotCQkKLQkJcmV0dXJuIGNyZWF0ZWRQYWNrYWdlWzBdOwotCX0KLQotCXB1YmxpYyBJVHlwZSBjcmVhdGVUeXBlKGZpbmFsIElQYWNrYWdlRnJhZ21lbnQgcGFjaywgZmluYWwgU3RyaW5nIGN1TmFtZSwgZmluYWwgU3RyaW5nIHNvdXJjZSkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWZpbmFsIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1Zi5hcHBlbmQoInBhY2thZ2UgIiArIHBhY2suZ2V0RWxlbWVudE5hbWUoKSArICI7XG4iKTsKLQkJYnVmLmFwcGVuZCgiXG4iKTsKLQkJYnVmLmFwcGVuZChzb3VyY2UpOwotCQkKLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdFtdIGNyZWF0ZWRDdSA9IG5ldyBJQ29tcGlsYXRpb25Vbml0WzFdOwotCQlmaW5hbCBJV29ya3NwYWNlUnVubmFibGUgY3JlYXRlQ3VSdW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKQotCQl7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCQkJewotCQkJCWNyZWF0ZWRDdVswXSA9IHBhY2suY3JlYXRlQ29tcGlsYXRpb25Vbml0KGN1TmFtZSwgYnVmLnRvU3RyaW5nKCksIGZhbHNlLCBudWxsKTsKLQkJCX0KLQkJfTsKLQkJVGVzdFByb2plY3RzVXRpbHMuZXhlY3V0ZVdvcmtzcGFjZVJ1bm5hYmxlKGNyZWF0ZUN1UnVubmFibGUpOwotCQkKLQkJcmV0dXJuIGNyZWF0ZWRDdVswXS5nZXRUeXBlcygpWzBdOwotCX0KLQotCQotCS8qKgotCSAqIENyZWF0ZXMgbXVsdGlwbGUgY2xhc3NlcyBpbiBwcm9qZWN0LiBUaGUgY29udGVudCBvZiA8Y29kZT5zb3VyY2U8L2NvZGU+IHNob3VsZCBiZSBpbiBmb3JtIC0KLQkgKiAnIycgY2hhciAoc2VwYXJhdG9yIGZvciBjbGFzc2VzKSBmb2xsb3dlZCBieSBDbGFzcyBuYW1lLCBuZXcgbGluZSBhbmQgYWZ0ZXIgdGhhdCBjbGFzcyBzb3VyY2Ugd2l0aG91dCBwYWNrYWdlIGRlY2xhcmF0aW9uLjxicj4KLQkgKiBFeGFtcGxlOgotCSAqIAotCSAqIDxwcmU+Ci0JICogICNJbXBsZW1lbnRzUmVtb3RlCi0JICogIHB1YmxpYyBjbGFzcyBJbXBsZW1lbnRzUmVtb3RlIGltcGxlbWVudHMgamF2YS5ybWkuUmVtb3RlCi0JICogIHsKLQkgKiAgfQotCSAqIAkKLQkgKiAgI05vRGVmYXVsdENvbnN0cnVjdG9yCi0JICogIHB1YmxpYyBjbGFzcyBOb0RlZmF1bHRDb25zdHJ1Y3RvciBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi0JICogIHsKLQkgKiAJcHVibGljIE5vRGVmYXVsdENvbnN0cnVjdG9yKFN0cmluZyBwYXJhbSkgewotCSAqICAJfQotCSAqICB9Ci0JICogPC9wcmU+Ci0JICogCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZnVsIGlmIGxvdHMgb2Ygc21hbGwgY2xhc3NlcyBzaG91bGQgYmUgY3JlYXRlZCBmcm9tIGEgc291cmNlIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHNvdXJjZXNGaWxlUGF0aAotCSAqIEByZXR1cm4gbWFwIG9mIGNsYXNzTmFtZS0+SVR5cGUuIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBNYXA8U3RyaW5nLCBJVHlwZT4gY3JlYXRlVHlwZXMoSVBhY2thZ2VGcmFnbWVudCBwYWNrLCBTdHJpbmcgc291cmNlKSB0aHJvd3MgRXhjZXB0aW9uCi0JewotCQlNYXA8U3RyaW5nLCBJVHlwZT4gdHlwZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElUeXBlPigpOwotCQlpbnQgc3RhcnRQb3MgPSAwOwotCQl3aGlsZSAoKHN0YXJ0UG9zID0gc291cmNlLmluZGV4T2YoQ0xBU1NfU0VQQVJBVE9SKSkgPiAtMSkKLQkJewotCQkJaW50IGVuZFBvcyA9IHNvdXJjZS5pbmRleE9mKENMQVNTX1NFUEFSQVRPUiwgc3RhcnRQb3MgKyAxKTsKLQkJCWlmIChlbmRQb3MgPT0gLTEpIHsKLQkJCQllbmRQb3MgPSBzb3VyY2UubGVuZ3RoKCk7Ci0JCQl9Ci0KLQkJCVN0cmluZyBzcmMgPSBzb3VyY2Uuc3Vic3RyaW5nKHN0YXJ0UG9zICsgMSwgZW5kUG9zKTsKLQkJCXNvdXJjZSA9IHNvdXJjZS5zdWJzdHJpbmcoZW5kUG9zKTsKLQotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IHNyYy5zdWJzdHJpbmcoMCwgc3JjLmluZGV4T2YoJ1xuJykpLnJlcGxhY2VBbGwoIlxyIiwgIiIpLnRyaW0oKTsKLQkJCXNyYyA9IHNyYy5zdWJzdHJpbmcoc3JjLmluZGV4T2YoJ1xuJykgKyAxKTsKLQotCQkJdHlwZXMucHV0KGNsYXNzTmFtZSwgY3JlYXRlVHlwZShwYWNrLCBjbGFzc05hbWUgKyAiLmphdmEiLCBzcmMpKTsKLQkJfQotCi0JCXJldHVybiB0eXBlczsKLQl9CQkKLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7Ci0JCQotCQlmaW5hbCBJV29ya3NwYWNlUnVubmFibGUgZGlzcG9zZVByb2plY3RSdW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKQotCQl7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCQkJewotCQkJCXRyeSB7Ci0JCQkJCXByb2plY3QucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbnVsbCk7Ci0JCQkJCXByb2plY3QuZGVsZXRlKHRydWUsIHRydWUsIG51bGwpOwotCQkJCX0gY2F0Y2ggKFJlc291cmNlRXhjZXB0aW9uIHJlKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIHNpbGVudGx5IHN3YWxsb3cgdGhlIHJlc291cmNlIGV4Y2VwdGlvbi4gRm9yIHNvbWUgcmVhc29uIHRoaXMgZXhjZXB0aW9uIGdldHMgdGhyb3duCi0JCQkJCSAqIGZyb20gdGltZSB0byB0aW1lIGFuZCByZXBvcnRzIHRoZSB0ZXN0IGZhaWxpbmcuIFRoZSBwcm9qZWN0IGRlbGV0aW9uIGl0c2VsZiBoYXBwZW5zCi0JCQkJCSAqIGFmdGVyIHRoZSB0ZXN0IGhhcyBjb21wbGV0ZWQgYW5kIGEgZmFpbHVyZSB3aWxsIG5vdCByZXBvcnQgYSBwcm9ibGVtIGluIHRoZSB0ZXN0LgotCQkJICAgIAkgKiBPbmx5IFJlc291cmNlRXhjZXB0aW9uIGlzIGNhdWdodCBpbiBvcmRlciBub3QgdG8gaGlkZSB1bmV4cGVjdGVkIGVycm9ycy4JCi0JCQkJCSAqLwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9OwotCQlUZXN0UHJvamVjdHNVdGlscy5leGVjdXRlV29ya3NwYWNlUnVubmFibGUoZGlzcG9zZVByb2plY3RSdW5uYWJsZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7Ci0JCQotCQlmaW5hbCBJV29ya3NwYWNlUnVubmFibGUgY2xvc2VSdW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKQotCQl7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCQkJewotCQkJCXByb2plY3QuY2xvc2UobW9uaXRvcik7CQkKLQkJCX0KLQkJfTsKLQkJVGVzdFByb2plY3RzVXRpbHMuZXhlY3V0ZVdvcmtzcGFjZVJ1bm5hYmxlKGNsb3NlUnVubmFibGUpOwotCX0KLQotCXByaXZhdGUgSUZvbGRlciBjcmVhdGVCaW5Gb2xkZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJSUZvbGRlciBiaW5Gb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcigiYmluIik7Ci0JCWJpbkZvbGRlci5jcmVhdGUoZmFsc2UsIHRydWUsIG51bGwpOwotCQlyZXR1cm4gYmluRm9sZGVyOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRKYXZhTmF0dXJlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhuZXcgU3RyaW5nW10geyBKYXZhQ29yZS5OQVRVUkVfSUQgfSk7Ci0JCXByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG51bGwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVPdXRwdXRGb2xkZXIoSUZvbGRlciBiaW5Gb2xkZXIpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQl7Ci0JCUlQYXRoIG91dHB1dExvY2F0aW9uID0gYmluRm9sZGVyLmdldEZ1bGxQYXRoKCk7Ci0JCWphdmFQcm9qZWN0LnNldE91dHB1dExvY2F0aW9uKG91dHB1dExvY2F0aW9uLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgSVBhY2thZ2VGcmFnbWVudFJvb3QgY3JlYXRlU291cmNlRm9sZGVyKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBjcmVhdGVkUm9vdCA9IG5ldyBJUGFja2FnZUZyYWdtZW50Um9vdFsxXTsKLQkJZmluYWwgSVdvcmtzcGFjZVJ1bm5hYmxlIGNyZWF0ZVJvb3RSdW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKQotCQl7Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JCQl7Ci0JCQkJSUZvbGRlciBmb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcihuYW1lKTsKLQkJCQlmb2xkZXIuY3JlYXRlKGZhbHNlLCB0cnVlLCBudWxsKTsKLQkJCQljcmVhdGVkUm9vdFswXSA9IGphdmFQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QoZm9sZGVyKTsKLQotCQkJCUlDbGFzc3BhdGhFbnRyeVtdIG9sZEVudHJpZXMgPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdFbnRyaWVzID0gbmV3IElDbGFzc3BhdGhFbnRyeVtvbGRFbnRyaWVzLmxlbmd0aCArIDFdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkob2xkRW50cmllcywgMCwgbmV3RW50cmllcywgMCwgb2xkRW50cmllcy5sZW5ndGgpOwotCQkJCW5ld0VudHJpZXNbb2xkRW50cmllcy5sZW5ndGhdID0gSmF2YUNvcmUubmV3U291cmNlRW50cnkoY3JlYXRlZFJvb3RbMF0uZ2V0UGF0aCgpKTsKLQkJCQlzZXRDbGFzc3BhdGgobmV3RW50cmllcyk7Ci0JCQl9Ci0JCX07Ci0JCVRlc3RQcm9qZWN0c1V0aWxzLmV4ZWN1dGVXb3Jrc3BhY2VSdW5uYWJsZShjcmVhdGVSb290UnVubmFibGUpOwotCQl0aGlzLnNvdXJjZUZvbGRlciA9IGNyZWF0ZWRSb290WzBdOwotCQkKLQkJcmV0dXJuIHNvdXJjZUZvbGRlcjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkU3lzdGVtTGlicmFyaWVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIG9sZEVudHJpZXMgPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3RW50cmllcyA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbb2xkRW50cmllcy5sZW5ndGggKyAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShvbGRFbnRyaWVzLCAwLCBuZXdFbnRyaWVzLCAwLCBvbGRFbnRyaWVzLmxlbmd0aCk7Ci0JCW5ld0VudHJpZXNbb2xkRW50cmllcy5sZW5ndGhdID0gSmF2YVJ1bnRpbWUuZ2V0RGVmYXVsdEpSRUNvbnRhaW5lckVudHJ5KCk7Ci0JCXNldENsYXNzcGF0aChuZXdFbnRyaWVzKTsKLQl9Ci0KLQlwcml2YXRlIFBhdGggZmluZEZpbGVJblBsdWdpbihTdHJpbmcgcGx1Z2luLCBTdHJpbmcgZmlsZSkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLQl7Ci0JCUJ1bmRsZSBwbHVnaW5CdW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luKTsKLQkJVVJMIGphclVSTCA9IG5ldyBVUkwocGx1Z2luQnVuZGxlLmdldEVudHJ5KCIvIiksIGZpbGUpOwotCQlVUkwgbG9jYWxKYXJVUkwgPSBGaWxlTG9jYXRvci50b0ZpbGVVUkwoamFyVVJMKTsKLQkJcmV0dXJuIG5ldyBQYXRoKGxvY2FsSmFyVVJMLmdldFBhdGgoKSk7Ci0JfQotCi0JcHVibGljIElQYWNrYWdlRnJhZ21lbnRSb290IGdldFNvdXJjZUZvbGRlcigpCi0JewotCQlyZXR1cm4gc291cmNlRm9sZGVyOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb250YWluZXIgY29ycmVzcG9uZGluZyB0byB0aGUgcGFja2FnZSBmcmFnbWVudCByb290LCBpLmUuIHRoZSBzb3VyY2UgZm9sZGVyLjxicj4KLQkgKiBJZiB0aGlzIHByb2plY3QgaXMgYSBqYXIvemlwIChpZiB0aGlzIGlzIHBvc3NpYmxlIGF0IGFsbCksIHRoZSBtZXRob2Qgd2lsbCByZXR1cm4gbnVsbC4KLQkgKi8KLQlwdWJsaWMgSUNvbnRhaW5lciBnZXRTb3VyY2VGb2xkZXJDb250YWluZXIoKQotCXsKLQkJdHJ5ewotCQkJSVJlc291cmNlIHJlcyA9IGdldFNvdXJjZUZvbGRlcigpLmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpOwotCQkJaWYocmVzPT1udWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9ZWxzZSB7Ci0JCQkJSUNvbnRhaW5lciByZXRWYWwgPSAoSUNvbnRhaW5lcikgcmVzOwotCQkJCXJldHVybiByZXRWYWw7Ci0JCQl9Ci0JCX1jYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Y2F0Y2goQ2xhc3NDYXN0RXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBJRm9sZGVyIGNyZWF0ZUZvbGRlcihmaW5hbCBTdHJpbmcgZm9sZGVyTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShmb2xkZXJOYW1lLCAiZm9sZGVyTmFtZSIpOwotCQlmaW5hbCBJRm9sZGVyIGZvbGRlciA9IHRoaXMucHJvamVjdC5nZXRGb2xkZXIoZm9sZGVyTmFtZSk7Ci0JCWZpbmFsIElXb3Jrc3BhY2VSdW5uYWJsZSBjcmVhdGVGb2xkZXJSdW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKQotCQl7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCQkJewotCQkJCWZvbGRlci5jcmVhdGUoZmFsc2UsIHRydWUsIG1vbml0b3IpOwotCQkJfQotCQl9OwotCQlUZXN0UHJvamVjdHNVdGlscy5leGVjdXRlV29ya3NwYWNlUnVubmFibGUoY3JlYXRlRm9sZGVyUnVubmFibGUpOwotCQkKLQkJcmV0dXJuIGZvbGRlcjsJCQotCX0KLQkKLQkvKioKLQkgKiBTZXQgdGhlIHByb2plY3Qgcm9vdCBhcyBzb3VyY2UgZm9sZGVyCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gCi0JICovCi0JcHVibGljIHZvaWQgYXNzaWduUHJvamVjdFJvb3RBc1NvdXJjZUZvbGRlcigpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlJQ2xhc3NwYXRoRW50cnkgZGVmYXVsdFNyY0ZvbGRlckVudHJ5ID0gSmF2YUNvcmUubmV3U291cmNlRW50cnkocHJvamVjdC5nZXRGdWxsUGF0aCgpKTsKLQkJSUNsYXNzcGF0aEVudHJ5W10gb2xkQ3AgPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3Q3AgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W29sZENwLmxlbmd0aCArIDFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KG9sZENwLCAwLCBuZXdDcCwgMCwgb2xkQ3AubGVuZ3RoKTsKLQkJbmV3Q3BbbmV3Q3AubGVuZ3RoIC0gMV0gPSBkZWZhdWx0U3JjRm9sZGVyRW50cnk7Ci0JCQotCQlzZXRDbGFzc3BhdGgobmV3Q3ApOwotCQl0aGlzLnNvdXJjZUZvbGRlciA9ICBUZXN0UHJvamVjdHNVdGlscy5nZXRTb3VyY2VGb2xkZXIocHJvamVjdCwgIiIpOwotCX0KLQkKLQlwcml2YXRlIElXb3Jrc3BhY2Ugd29ya3NwYWNlKCkKLQl7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBuZXdDbGFzc3BhdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlmaW5hbCBJV29ya3NwYWNlUnVubmFibGUgc2V0Q2xhc3NwYXRoUnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkKLQkJewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQkJCXsKLQkJCQlqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3Q2xhc3NwYXRoLCBtb25pdG9yKTsKLQkJCX0KLQkJfTsKLQkJVGVzdFByb2plY3RzVXRpbHMuZXhlY3V0ZVdvcmtzcGFjZVJ1bm5hYmxlKHNldENsYXNzcGF0aFJ1bm5hYmxlKTsKLQkJCi0JCVN0cmluZyBsb2cgPSAiXG4iK2phdmFQcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCkrIlxuIitTdHJpbmcudmFsdWVPZihqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKS5sZW5ndGgpKyJcbiI7IAotCi0JCWZvcihpbnQgaWk9MDsgaWkgPCBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKS5sZW5ndGg7IGlpKyspCi0JCXsKLQkJCWxvZyA9IGxvZyArICBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKVtpaV0uZ2V0UGF0aCgpLnRvU3RyaW5nKCkrIlxuIjsKLQkJfQotCQkKLQkJaWYoamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCkubGVuZ3RoPT0wKQotCQl7Ci0JCQlsb2cgPSBsb2cgKyAiQ2xhc3NwYXRoIG5vdCBpbml0aWFsaXplZCAhXG4iOwotCQl9Ci0JCQotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nKCkubG9nKG5ldyBTdGF0dXMoMCwidGVzdE91dHB1dCIsbG9nKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEFwdFByb2Nlc3NpbmdFbmFibGVkKGZpbmFsIGJvb2xlYW4gZW5hYmxlZCwgZmluYWwgYm9vbGVhbiBlbmFibGVSZWNvbmNpbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlmaW5hbCBJV29ya3NwYWNlUnVubmFibGUgc2V0UHJvY2Vzc2luZ1J1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpCi0JCXsKLQkJCQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQkJCXsKLQkJCQlBcHRDb25maWcuc2V0RW5hYmxlZChUZXN0UHJvamVjdC50aGlzLmphdmFQcm9qZWN0LCBlbmFibGVkKTsKLQkJCQlBcHRDb25maWcuc2V0UHJvY2Vzc0R1cmluZ1JlY29uY2lsZShUZXN0UHJvamVjdC50aGlzLmphdmFQcm9qZWN0LCBlbmFibGVSZWNvbmNpbGUpOwotCQkJCVRlc3RQcm9qZWN0LnRoaXMuamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQ0xFQU5fQlVJTEQsIG1vbml0b3IpOwotCQkJfQotCQl9OwotCQkKLQkJVGVzdFByb2plY3RzVXRpbHMuZXhlY3V0ZVdvcmtzcGFjZVJ1bm5hYmxlKHNldFByb2Nlc3NpbmdSdW5uYWJsZSk7Ci0JfQotCQotCS8qKgotCSAqIEJ1aWxkcyBhIHByb2plY3QKLQkgKiBAcGFyYW0ga2luZCBidWlsZCBraW5kLiBTZWUge0BsaW5rIElQcm9qZWN0I2J1aWxkKGludCwgSVByb2dyZXNzTW9uaXRvcil9IGZvciBkZXRhaWxzCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgYnVpbGQoZmluYWwgaW50IGtpbmQpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlmaW5hbCBJV29ya3NwYWNlUnVubmFibGUgYnVpbGRSdW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKQotCQl7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCQkJewotCQkJCVRlc3RQcm9qZWN0LnRoaXMucHJvamVjdC5idWlsZChraW5kLCBtb25pdG9yKTsKLQkJCX0KLQkJfTsKLQkJCi0JCVRlc3RQcm9qZWN0c1V0aWxzLmV4ZWN1dGVXb3Jrc3BhY2VSdW5uYWJsZShidWlsZFJ1bm5hYmxlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlmaW5hbCBJV29ya3NwYWNlUnVubmFibGUgcmVmcmVzaFJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpCi0JCXsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JCQl7Ci0JCQkJVGVzdFByb2plY3QudGhpcy5nZXRQcm9qZWN0KCkucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbW9uaXRvcik7Ci0JCQl9Ci0JCX07Ci0JCQotCQlUZXN0UHJvamVjdHNVdGlscy5leGVjdXRlV29ya3NwYWNlUnVubmFibGUocmVmcmVzaFJ1bm5hYmxlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9wcm9qZWN0L1Rlc3RQcm9qZWN0c1V0aWxzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL3Byb2plY3QvVGVzdFByb2plY3RzVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2YyNDQ3OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL3Byb2plY3QvVGVzdFByb2plY3RzVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0OwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5UeXBlTmFtZVJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qb2JzLkpvYlV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMudGhyZWFkaW5nLlRlc3RDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0UHJvamVjdHNVdGlscwotewotCS8qKgotCSAqIFJlYWRzIGNvbnRlbnQgb2YgdGV4dCBmaWxlIGFuZCByZXR1cm5zIGl0IGFzIFN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gY2xhc3MgY29udGV4dAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkU291cmNlKENsYXNzPD8+IGNsYXNzQ29udGV4dCwgU3RyaW5nIGZpbGVQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24KLQl7Ci0JCUlucHV0U3RyZWFtUmVhZGVyIGlzciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihjbGFzc0NvbnRleHQuZ2V0UmVzb3VyY2VBc1N0cmVhbShmaWxlUGF0aCkpOwotCQl0cnkKLQkJewotCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJY2hhcltdIGJ1ZmYgPSBuZXcgY2hhcls1MTJdOwotCi0JCQlpbnQgbGVuID0gMDsKLQkJCXdoaWxlICgobGVuID0gaXNyLnJlYWQoYnVmZikpID4gMCkKLQkJCXsKLQkJCQlzYi5hcHBlbmQoU3RyaW5nLnZhbHVlT2YoYnVmZiwgMCwgbGVuKSk7Ci0JCQl9Ci0KLQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCi0JCX0gZmluYWxseQotCQl7Ci0JCQlpc3IuY2xvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN0YXJ0cyBhbiBpbmRleGVyIGpvYi4gVGhpcyBtZXRob2QgaXMgdXNlZnVsIHRvIG1ha2Ugc3VyZSB0aGF0IGFsbCB3b3JrYmVuY2ggcmVmcmVzaC9idWlsZCBwcm9jZXNzZXMgYXJlIG92ZXIgCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FpdEZvckluZGV4ZXIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JewotCQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoQWxsVHlwZU5hbWVzKG51bGwsIFNlYXJjaFBhdHRlcm4uUl9FWEFDVF9NQVRDSCwgCi0JCQkJCQkJCQkJCSAgbnVsbCwgU2VhcmNoUGF0dGVybi5SX0NBU0VfU0VOU0lUSVZFLCAKLQkJCQkJCQkJCQkJICBJSmF2YVNlYXJjaENvbnN0YW50cy5DTEFTUywgCi0JCQkJCQkJCQkJCSAgU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZShuZXcgSUphdmFFbGVtZW50WzBdKSwgbmV3IFR5cGVOYW1lUmVxdWVzdG9yKCkKLQkJCQkJCQkJCQkJICB7Ci0JCQkJCQkJCQkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLQkJCQkJCQkJCQkJCXB1YmxpYyB2b2lkIGFjY2VwdENsYXNzKGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIHNpbXBsZVR5cGVOYW1lLCBjaGFyW11bXSBlbmNsb3NpbmdUeXBlTmFtZXMsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCVN0cmluZyBwYXRoKQotCQkJCQkJCQkJCQkJCXsKLQkJCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLQkJCQkJCQkJCQkJCXB1YmxpYyB2b2lkIGFjY2VwdEludGVyZmFjZShjaGFyW10gcGFja2FnZU5hbWUsIGNoYXJbXSBzaW1wbGVUeXBlTmFtZSwgY2hhcltdW10gZW5jbG9zaW5nVHlwZU5hbWVzLAotCQkJCQkJCQkJCQkJCQkJCQkJCQlTdHJpbmcgcGF0aCkKLQkJCQkJCQkJCQkJCQl7Ci0JCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQkgIH0sCi0JCQkJCQkJCQkJCSAgSUphdmFTZWFyY2hDb25zdGFudHMuV0FJVF9VTlRJTF9SRUFEWV9UT19TRUFSQ0gsIG51bGwpOwotCX0KLQotCQotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgY3JlYXRlSmF2YVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCXByb2plY3QuY3JlYXRlKG51bGwpOwotCQlwcm9qZWN0Lm9wZW4obnVsbCk7Ci0JCUpvYlV0aWxzLndhaXRGb3JJbmRleGVyKCk7Ci0JCQotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQlkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMobmV3IFN0cmluZ1tdIHsgSmF2YUNvcmUuTkFUVVJFX0lEIH0pOwotCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKLQkJSUphdmFQcm9qZWN0IGphdmFQID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQlhZGRUb0NsYXNzcGF0aChqYXZhUCwgSmF2YVJ1bnRpbWUuZ2V0RGVmYXVsdEpSRUNvbnRhaW5lckVudHJ5KCkpOwotCi0JCXJldHVybiBwcm9qZWN0OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFRvQ2xhc3NwYXRoKGZpbmFsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgZmluYWwgSUNsYXNzcGF0aEVudHJ5IGNwRW50cnkpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQl7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIG9sZEVudHJpZXMgPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3RW50cmllcyA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbb2xkRW50cmllcy5sZW5ndGggKyAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShvbGRFbnRyaWVzLCAwLCBuZXdFbnRyaWVzLCAwLCBvbGRFbnRyaWVzLmxlbmd0aCk7Ci0JCW5ld0VudHJpZXNbb2xkRW50cmllcy5sZW5ndGhdID0gY3BFbnRyeTsKLQkJamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld0VudHJpZXMsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0U291cmNlRm9sZGVyKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBmb2xkZXJOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCWZvcihJUGFja2FnZUZyYWdtZW50Um9vdCByb290IDogamF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKSkKLQkJewotCQkJaWYocm9vdC5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhmb2xkZXJOYW1lKSkKLQkJCXsKLQkJCQlyZXR1cm4gcm9vdDsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSVBhY2thZ2VGcmFnbWVudFJvb3QgY3JlYXRlU291cmNlRm9sZGVyKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBmb2xkZXJOYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJaWYoZ2V0U291cmNlRm9sZGVyKHByb2plY3QsIGZvbGRlck5hbWUpICE9IG51bGwpCi0JCXsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlNvdXJjZSBmb2xkZXIgYWxyZWFkeSBleGlzdHM6ICIgKyBmb2xkZXJOYW1lKTsKLQkJfQotCi0JCUlGb2xkZXIgc3JjRm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIoZm9sZGVyTmFtZSk7Ci0JCXNyY0ZvbGRlci5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCQotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCUlDbGFzc3BhdGhFbnRyeSBzcmNDcEVudHJ5ID0gSmF2YUNvcmUubmV3U291cmNlRW50cnkoc3JjRm9sZGVyLmdldEZ1bGxQYXRoKCkubWFrZUFic29sdXRlKCkpOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBvbGRFbnRyaWVzID0gamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIG5ld0VudHJpZXMgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W29sZEVudHJpZXMubGVuZ3RoICsgMV07IAotCQlTeXN0ZW0uYXJyYXljb3B5KG9sZEVudHJpZXMsIDAsIG5ld0VudHJpZXMsIDAsIG9sZEVudHJpZXMubGVuZ3RoKTsKLQkJbmV3RW50cmllc1tuZXdFbnRyaWVzLmxlbmd0aCAtIDFdID0gc3JjQ3BFbnRyeTsKLQkJamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld0VudHJpZXMsIG51bGwpOwotCi0JCXJldHVybiBnZXRTb3VyY2VGb2xkZXIocHJvamVjdCwgZm9sZGVyTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogSW1wb3J0cyBhIGZpbGUgaW50byBhIHByb2plY3QKLQkgKiBAcGFyYW0gY2xhc3NDb250ZXh0IHRoZSBjbGFzcyB3aGljaCBjbGFzc2xvYWRlciBpcyB1c2VkIHRvIGdldCB0aGUgc291cmNlIHJlc291cmNlIAotCSAqIEBwYXJhbSByZWxhdGl2ZVNyY0ZpbGVMb2NhdGlvbiBzb3VyY2UgZmlsZSBsb2NhdGlvbiByZWxhdGl2ZSB0byB0aGUgPGNvZGU+Y2xhc3NDb250ZXh0PC9jb2RlPiBwYXJhbWV0ZXIKLQkgKiBAcGFyYW0gdGFyZ2V0UmVzb3VyY2UgdGhlIHRhcmdldCByZXNvdXJjZTsgCi0JICogQHBhcmFtIHRhcmdldEZpbGVOYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGJlIGNyZWF0ZWQKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogQHJldHVybnMgdGhlIGZpbGUgaW1wb3J0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgaW1wb3J0RmlsZUludG9Qcm9qZWN0KENsYXNzPD8+IGNsYXNzQ29udGV4dCwgU3RyaW5nIHJlbGF0aXZlU3JjRmlsZUxvY2F0aW9uLCBJQ29udGFpbmVyIHRhcmdldFJlc291cmNlLCBTdHJpbmcgdGFyZ2V0RmlsZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbgotCXsKLQkJU3RyaW5nIHNyYyA9IFRlc3RQcm9qZWN0c1V0aWxzLnJlYWRTb3VyY2UoY2xhc3NDb250ZXh0LCByZWxhdGl2ZVNyY0ZpbGVMb2NhdGlvbik7Ci0JCUZpbGUgZiA9IG5ldyBGaWxlKHRhcmdldFJlc291cmNlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpICsgIlxcIiArIHRhcmdldEZpbGVOYW1lKTsKLQkJCi0JCWlmKGYuZXhpc3RzKCkpCi0JCXsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZpbGUgYWxyZWFkeSBleGlzdHM6ICIgKyBmLmdldEFic29sdXRlUGF0aCgpKTsKLQkJfQotCQkKLQkJaWYoZi5pc0RpcmVjdG9yeSgpKQotCQl7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGYuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiIGlzIGEgZGlyZWN0b3J5Iik7Ci0JCX0KLQkJaWYoIGYuY3JlYXRlTmV3RmlsZSgpICkKLQkJewotCQkJQnVmZmVyZWRXcml0ZXIgb3V0ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oZikpKTsKLQkJCW91dC53cml0ZShzcmMpOwotCQkJb3V0LmZsdXNoKCk7Ci0JCQlvdXQuY2xvc2UoKTsKLQkJfQotCQkKLQkJcmV0dXJuIGY7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVXb3Jrc3BhY2VQcm9qZWN0cygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQl7Ci0JCWZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7Ci0JCWZvcihJUHJvamVjdCBwcm9qZWN0IDogUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpKQotCQl7Ci0JCQl0cnkKLQkJCXsKLQkJCQlwcm9qZWN0LmRlbGV0ZShmYWxzZSwgbW9uaXRvcik7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQkJKG5ldyBMb2dnZXIoKSkubG9nRXJyb3IoZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgY3JlYXRlRWpiM1Byb2plY3QoZmluYWwgU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJZmluYWwgSVByb2plY3QgZWpiUHJvamVjdCA9IGNyZWF0ZVByb2plY3RXaXRoRmFjZXQocHJvamVjdE5hbWUsIG5ldyBTdHJpbmdbXXsianN0LmphdmEiLCAianN0LmVqYiJ9LCBuZXcgU3RyaW5nW117IjUuMCIsICIzLjAifSk7Ci0JCWZpbmFsIElKYXZhUHJvamVjdCBqYXZhUCA9IEphdmFDb3JlLmNyZWF0ZShlamJQcm9qZWN0KTsKLQkJCi0JCXJlbW92ZUFsbFNvdXJjZUZvbGRlcnMoamF2YVApOwotCi0JCS8vIFNldCBlamJNb2R1bGUgZm9sZGVyIChjcmVhdGVkIGR1cmluZyBqc3QuZWpiIGZhY2V0IGluc3RhbGxhdGlvbikgYXMgc291cmNlIGZvbGRlcgotCQlmaW5hbCBJRm9sZGVyIHNyY0ZvbGRlciA9IGVqYlByb2plY3QuZ2V0Rm9sZGVyKCJlamJNb2R1bGUiKTsKLQkJZmluYWwgSUNsYXNzcGF0aEVudHJ5IGVqYk1vZHVsZUNwRW50cnkgPSBKYXZhQ29yZS5uZXdTb3VyY2VFbnRyeShzcmNGb2xkZXIuZ2V0RnVsbFBhdGgoKS5tYWtlQWJzb2x1dGUoKSk7Ci0JCWFkZFRvQ2xhc3NwYXRoKEphdmFDb3JlLmNyZWF0ZShlamJQcm9qZWN0KSwgZWpiTW9kdWxlQ3BFbnRyeSk7Ci0JCQotCQlyZXR1cm4gZWpiUHJvamVjdDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVBbGxTb3VyY2VGb2xkZXJzKGZpbmFsIElKYXZhUHJvamVjdCBqYXZhUCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCXsKLQkJZmluYWwgTGlzdDxJQ2xhc3NwYXRoRW50cnk+IG5ld0NsYXNzcGF0aCA9IG5ldyBBcnJheUxpc3Q8SUNsYXNzcGF0aEVudHJ5PigpOwotCQlmb3IoSUNsYXNzcGF0aEVudHJ5IGNwRW50cnkgOiBqYXZhUC5nZXRSYXdDbGFzc3BhdGgoKSkKLQkJewotCQkJaWYoY3BFbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkKLQkJCXsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCW5ld0NsYXNzcGF0aC5hZGQoY3BFbnRyeSk7Ci0JCX0KLQkJamF2YVAuc2V0UmF3Q2xhc3NwYXRoKG5ld0NsYXNzcGF0aC50b0FycmF5KG5ldyBJQ2xhc3NwYXRoRW50cnlbbmV3Q2xhc3NwYXRoLnNpemUoKV0pLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSVByb2plY3QgY3JlYXRlUHJvamVjdFdpdGhGYWNldChmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWUsIGZpbmFsIFN0cmluZ1tdIGZhY2V0SWQsIGZpbmFsIFN0cmluZ1tdIGZhY2V0VmVyc2lvbikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWFzc2VydCBmYWNldElkLmxlbmd0aCA9PSBmYWNldFZlcnNpb24ubGVuZ3RoOwotCQlmaW5hbCBJUHJvamVjdFtdIHJlc3VsdCA9IG5ldyBJUHJvamVjdFsxXTsKLQkJdHJ5Ci0JCXsKLQkJCVRlc3RDb250ZXh0LnJ1bihuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCl7Ci0JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCi0JCQkJewotCQkJCQl0cnkKLQkJCQkJewotCQkJCQkJcmVzdWx0WzBdID0gY3JlYXRlSmF2YVByb2plY3QocHJvamVjdE5hbWUpOwotCQkJCQkJZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHJlc3VsdFswXSwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCi0JCQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgZmFjZXRJZC5sZW5ndGg7IGkrKykKLQkJCQkJCXsKLQkJCQkJCQlmaW5hbCBJUHJvamVjdEZhY2V0IGZhY2V0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KGZhY2V0SWRbaV0pOwotCQkJCQkJCWZhY2V0ZWRQcm9qZWN0Lmluc3RhbGxQcm9qZWN0RmFjZXQoZmFjZXQuZ2V0VmVyc2lvbihmYWNldFZlcnNpb25baV0pLCBudWxsLCBtb25pdG9yKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCQkJCXsKLQkJCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQkJCQl9Ci0JCQkJfX0sIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlpZihlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKQotCQkJewotCQkJCXRocm93IChDb3JlRXhjZXB0aW9uKWUuZ2V0Q2F1c2UoKTsKLQkJCX0KLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJfQotCQkKLQkJcmV0dXJuIHJlc3VsdFswXTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgZHluYW1pYyB3ZWIgbW9kdWxlIHByb2plY3Qgd2l0aCAianN0LndlYiIgZmFjZXQgdmVyLiAyLjUgaW5zdGFsbGVkCi0JICogQHBhcmFtIHByb2plY3ROYW1lCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgY3JlYXRlV2ViMjVQcm9qZWN0KGZpbmFsIFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWZpbmFsIElQcm9qZWN0IHdlYlByb2plY3QgPSBjcmVhdGVQcm9qZWN0V2l0aEZhY2V0KHByb2plY3ROYW1lLCBuZXcgU3RyaW5nW117ImpzdC5qYXZhIiwgImpzdC53ZWIifSwgbmV3IFN0cmluZ1tdeyI1LjAiLCAiMi41In0pOwotCQlmaW5hbCBJSmF2YVByb2plY3QgamF2YVAgPSBKYXZhQ29yZS5jcmVhdGUod2ViUHJvamVjdCk7Ci0KLQkJcmVtb3ZlQWxsU291cmNlRm9sZGVycyhqYXZhUCk7Ci0KLQkJcmV0dXJuIHdlYlByb2plY3Q7Ci0JfQotCQotCS8qKgotCSAqIEV4ZWN1dGVzIGEgd29ya3NwYWNlIHJ1bm5hYmxlIG91dHNpZGUgdGhlIG1haW4gdGhyZWFkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGV4ZWN1dGVXb3Jrc3BhY2VSdW5uYWJsZShmaW5hbCBJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlleGVjdXRlV29ya3NwYWNlUnVubmFibGUocnVubmFibGUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGV4ZWN1dGVXb3Jrc3BhY2VSdW5uYWJsZShmaW5hbCBJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUsIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWlmKERpc3BsYXkuZ2V0Q3VycmVudCgpID09IG51bGwpCi0JCXsKLQkJCS8vIEV4ZWN1dGUgdGhlIHJ1bm5hYmxlIGluIHRoZSBjdXJyZW50IChub24tVUkpIHRocmVhZAotCQkJd29ya3NwYWNlKCkucnVuKHJ1bm5hYmxlLCBtb25pdG9yKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXJ1bkluVGVzdENvbnRleHQocnVubmFibGUsIG1vbml0b3IpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgcnVuSW5UZXN0Q29udGV4dChmaW5hbCBJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUsIGZpbmFsIElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgdGV4dEN0eFJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpCi0JCXsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotCQkJewotCQkJCXRyeQotCQkJCXsKLQkJCQkJZXhlY3V0ZVdvcmtzcGFjZVJ1bm5hYmxlKHJ1bm5hYmxlLCBtb25pdG9yKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCQkJewotCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXRyeQotCQl7Ci0JCQlUZXN0Q29udGV4dC5ydW4odGV4dEN0eFJ1bm5hYmxlLCB0cnVlLCBwbSwgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpCi0JCXsKLQkJCWlmKGUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pCi0JCQl7Ci0JCQkJdGhyb3cgKENvcmVFeGNlcHRpb24pZS5nZXRDYXVzZSgpOwotCQkJfQotCQkJCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbmV4ZWN0ZWQgZXhjZXB0aW9uIHRocm93biBieSBydW5uYWJsZSIsIGUuZ2V0Q2F1c2UoKSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCi0JCXsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkludGVycnVwdGlvbiBpcyBub3Qgc3VwcG9ydGVkIik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJV29ya3NwYWNlIHdvcmtzcGFjZSgpCi0JewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvdGhyZWFkaW5nL1Rlc3RDb250ZXh0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL3RocmVhZGluZy9UZXN0Q29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3Zjc2ODg2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvdGhyZWFkaW5nL1Rlc3RDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnRocmVhZGluZzsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5Nb2RhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5Db250cmFjdENoZWNrZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7DQotDQotLyoqDQotICogVXRpbGl0eSB0byBleGVjdXRlIHJ1bm5hYmxlIGluc3RhbmNlcyBpbiBhIHNlcGFyYXRlIHRocmVhZC4gSW1wbGVtZW50YXRpb24gaXMgcHJldHR5IHNpbWlsYXIgdG8ge0BsaW5rIE1vZGFsQ29udGV4dH0gYnV0IGl0IHVzZXMge0BsaW5rIFRlc3RDb250ZXh0VGhyZWFkfSB0byBwZXJmb3JtIGZvcmtpbmcNCi0gKiANCi0gKiBAYXV0aG9yIERhbmFpbCBCcmFuZWtvdg0KLSAqIA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBUZXN0Q29udGV4dA0KLXsNCi0JLyoqDQotCSAqIEV4ZWN1dGVzIHRoZSBvcGVyYXRpb24gc3BlY2lmaWVkIGluIHRoZSBjYWxsZXIgb3IgaW4gYSB7QGxpbmsgVGVzdENvbnRleHRUaHJlYWR9IHRocmVhZCBkZXBlbmRpbmcgb24gdGhlIDxjb2RlPmZvcms8L2NvZGU+IHZhbHVlLiBJbiBjYXNlIHRoZSBjYWxsZXIgb2YgdGhpcyBtZXRob2QgaXMgYSB7QGxpbmsgVGVzdENvbnRleHRUaHJlYWR9IGluc3RhbmNlLCB0aGUgZXhlY3V0aW9uIG9mIHRoZSA8Y29kZT5vcGVyYXRpb248L2NvZGU+IGlzIHBlcmZvcm1lZCBpbiB0aGUgY3VycmVudCB0aHJlYWQgbm8gbWF0dGVyDQotCSAqIG9mIHRoZSA8Y29kZT5mb3JrPC9jb2RlPiB2YWx1ZQ0KLQkgKiANCi0JICogQHBhcmFtIG9wZXJhdGlvbg0KLQkgKiAgICAgICAgICAgIHRoZSBvcGVyYXRpb247IG11c3Qgbm90IGJlIG51bGwNCi0JICogQHBhcmFtIGZvcmsNCi0JICogICAgICAgICAgICB0cnVlIHRvIHBlcmZvcm0gdGhlIDxjb2RlPm9wZXJhdGlvbjwvY29kZT4gaW4gYSB7QGxpbmsgVGVzdENvbnRleHRUaHJlYWR9OyBmYWxzZSB0byBwZXJmb3JtIHRoZSA8Y29kZT5vcGVyYXRpb248L2NvZGU+IGluIHRoZSBjdXJyZW50IHRocmVhZA0KLQkgKiBAcGFyYW0gbW9uaXRvcg0KLQkgKiAgICAgICAgICAgIHByb2dyZXNzIG1vbml0b3INCi0JICogQHBhcmFtIGRpc3BsYXkgVE9ETw0KLQkgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24NCi0JICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIHJ1bihmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3BlcmF0aW9uLCBmaW5hbCBib29sZWFuIGZvcmssIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgZmluYWwgRGlzcGxheSBkaXNwbGF5KSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24NCi0Jew0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKG9wZXJhdGlvbiwgIm9wZXJhdGlvbiIpOw0KLQ0KLQkJZmluYWwgYm9vbGVhbiB3aWxsRm9yayA9ICFpc0luVGVzdENvbnRleHRUaHJlYWQoKSAmJiBmb3JrOw0KLQkJaWYgKHdpbGxGb3JrKQ0KLQkJew0KLQkJCXJ1bkluVGVzdENvbnRleHRUaHJlYWQob3BlcmF0aW9uLCBtb25pdG9yLCBkaXNwbGF5KTsNCi0JCX0gZWxzZQ0KLQkJew0KLQkJCXJ1bkluQ3VycmVudFRocmVhZChvcGVyYXRpb24sIG1vbml0b3IpOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBSdW5zIHRoZSBvcGVyYXRpb24gaW4gdGhlIGN1cnJlbnQgdGhyZWFkDQotCSAqIA0KLQkgKiBAcGFyYW0gb3BlcmF0aW9uDQotCSAqICAgICAgICAgICAgdGhlIG9wZXJhdGlvbg0KLQkgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgaWYgYSB7QGxpbmsgVGhyb3dhYmxlfSBoYXMgYmVlbiB0aHJvd24gZHVyaW5nIG9wZXJhdGlvbiBleGVjdXRpb24uIFRoZSBleGNlcHRpb24gd3JhcHMgdGhhdCB7QGxpbmsgVGhyb3dhYmxlfQ0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBydW5JbkN1cnJlbnRUaHJlYWQoZmluYWwgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wZXJhdGlvbiwgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24NCi0Jew0KLQkJb3BlcmF0aW9uLnJ1bihtb25pdG9yKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUnVucyB0aGUgb3BlcmF0aW9uIGluIGEge0BsaW5rIFRlc3RDb250ZXh0VGhyZWFkfS4NCi0JICogDQotCSAqIEBwYXJhbSBydW5uYWJsZQ0KLQkgKiAgICAgICAgICAgIG9wZXJhdGlvbg0KLQkgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgaWYgdGhlIHtAbGluayBUZXN0Q29udGV4dFRocmVhZH0gZmluaXNoZWQgd2l0aCBlcnJvcg0KLQkgKiBAc2VlIFRlc3RDb250ZXh0VGhyZWFkI2dldEVycm9yKCkNCi0JICovDQotCXByaXZhdGUgc3RhdGljIHZvaWQgcnVuSW5UZXN0Q29udGV4dFRocmVhZChmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUsIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgZmluYWwgRGlzcGxheSBkaXNwbGF5KSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBUZXN0Q29udGV4dFRocmVhZCBjb250ZXh0VGhyZWFkID0gbmV3IFRlc3RDb250ZXh0VGhyZWFkKHJ1bm5hYmxlLCBtb25pdG9yLCBkaXNwbGF5KTsNCi0JCWNvbnRleHRUaHJlYWQuc3RhcnQoKTsNCi0JCWNvbnRleHRUaHJlYWQuYmxvY2soKTsNCi0NCi0JCWlmIChjb250ZXh0VGhyZWFkLmdldEVycm9yKCkgIT0gbnVsbCkNCi0JCXsNCi0JCQlpZihjb250ZXh0VGhyZWFkLmdldEVycm9yKCkgaW5zdGFuY2VvZiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB7DQotCQkJCXRocm93IChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKWNvbnRleHRUaHJlYWQuZ2V0RXJyb3IoKTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGNvbnRleHRUaHJlYWQuZ2V0RXJyb3IoKSk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgY3VycmVudCB0aHJlYWQgaXMgaW5zdGFuY2Ugb2Yge0BsaW5rIFRlc3RDb250ZXh0VGhyZWFkfQ0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luVGVzdENvbnRleHRUaHJlYWQoKQ0KLQl7DQotCQlmaW5hbCBUaHJlYWQgdCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7DQotCQlyZXR1cm4gdCBpbnN0YW5jZW9mIFRlc3RDb250ZXh0VGhyZWFkOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvdGhyZWFkaW5nL1Rlc3RDb250ZXh0VGhyZWFkLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL3RocmVhZGluZy9UZXN0Q29udGV4dFRocmVhZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZDFiYjkxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvdGhyZWFkaW5nL1Rlc3RDb250ZXh0VGhyZWFkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnRocmVhZGluZzsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5Db250cmFjdENoZWNrZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLkxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsNCi0NCi0vKioNCi0gKiB7QGxpbmsgVGhyZWFkfSBleHRlbmRlciB3aGljaCBpcyBjYXBhYmxlIG9mIHByb3ZpZGluZyBldmVudCBsb29wIHByb2Nlc3Npbmcgd2hpbGUgdGhlIHJ1bm5hYmxlIGlzIGV4ZWN1dGVkPGJyPg0KLSAqIEEgdHlwaWNhbCB1c2FnZSBvZiB0aGlzIGNsYXNzIHNob3VsZCBiZToNCi0gKiANCi0gKiA8cHJlPg0KLSAqIFRlc3RDb250ZXh0VGhyZWFkIHQgPSBuZXcgVGVzdENvbnRleHRUaHJlYWQoc29tZVJ1bm5hYmxlKCkpOw0KLSAqIHQuc3RhcnQoKTsNCi0gKiB0LmJsb2NrKCk7DQotICogPC9wcmU+DQotICogDQotICogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgdGhyZWFkIHJlc2VtYmxlcyB0byB0aGUgTW9kYWxDb250ZXh0VGhyZWFkIHdpdGggdGhlIGRpZmZlcmVuY2UgdGhhdCBpdCBkb2VzIG5vdCBjYWxsIHtAbGluayBEaXNwbGF5I3NsZWVwKCl9IGFuZCBpcyBzaW1wbGlmaWVkIGluIG9yZGVyIHRvIG1lZXQgdGVzdCByZXF1aXJlbWVudHMuIFRoZSByZWFzb24gbm90IHRvIGNhbGwge0BsaW5rIERpc3BsYXkjc2xlZXAoKX0gaXMgdGhhdCB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnMgcHV0dGluZyB0aGUgZGlzcGxheSB0bw0KLSAqIHNsZWVwIGNhdXNlcyBqdW5pdCB0ZXN0cyB0byB3YWl0IGZvcmV2ZXINCi0gKiANCi0gKiBAYXV0aG9yIERhbmFpbCBCcmFuZWtvdg0KLSAqLw0KLWNsYXNzIFRlc3RDb250ZXh0VGhyZWFkIGV4dGVuZHMgVGhyZWFkDQotew0KLQlwcml2YXRlIGJvb2xlYW4gaXNSdW5uaW5nOw0KLQlwcml2YXRlIFRocm93YWJsZSBlcnJvclRocm93YWJsZTsNCi0JcHJpdmF0ZSBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I7DQotCXByaXZhdGUgZmluYWwgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlOw0KLQlwcml2YXRlIGZpbmFsIERpc3BsYXkgZGlzcGxheTsNCi0NCi0JVGVzdENvbnRleHRUaHJlYWQoZmluYWwgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlLCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGZpbmFsIERpc3BsYXkgZGlzcGxheSkNCi0Jew0KLQkJc3VwZXIoKTsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShydW5uYWJsZSwgInJ1bm5hYmxlIik7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0obW9uaXRvciwgIm1vbml0b3IiKTsNCi0JCQ0KLQkJaXNSdW5uaW5nID0gdHJ1ZTsNCi0JCXRoaXMubW9uaXRvciA9IG1vbml0b3I7DQotCQl0aGlzLnJ1bm5hYmxlID0gcnVubmFibGU7DQotCQl0aGlzLnNldE5hbWUoIlRlc3RDb250ZXh0Iik7DQotCQl0aGlzLnNldERhZW1vbih0cnVlKTsNCi0JCXRoaXMuZGlzcGxheSA9IGRpc3BsYXk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHJpZXZlcyB0aGUgZXJyb3IgdGhyb3dhYmxlIHdoaWNoIGhhcHBlbmVkIGR1cmluZyBleGVjdXRpb24NCi0JICogDQotCSAqIEByZXR1cm4gdGhlIGVycm9yIHRocm93YWJsZSBvciBudWxsIGlmIG5vbmUNCi0JICovDQotCXB1YmxpYyBUaHJvd2FibGUgZ2V0RXJyb3IoKQ0KLQl7DQotCQlyZXR1cm4gZXJyb3JUaHJvd2FibGU7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIHJ1bigpDQotCXsNCi0JCWlzUnVubmluZyA9IHRydWU7DQotCQl0cnkNCi0JCXsNCi0JCQlydW5uYWJsZS5ydW4obW9uaXRvcik7DQotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkNCi0JCXsNCi0JCQllcnJvclRocm93YWJsZSA9IHQ7DQotCQl9IGZpbmFsbHkNCi0JCXsNCi0JCQkvLyBNYWtlIHN1cmUgdGhhdCBhc3luY2hyb25vdXMgZXZlbnRzIGFyZSBwcm9jZXNzZWQgYnkgdGhlIGV2ZW50IGxvb3AgdmlhIHN5bmMgZXhlY3V0aW9uIG9mIGFuICJlbXB0eSIgcnVubmFibGUNCi0JCQlkaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkNCi0JCQl7DQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpDQotCQkJCXsNCi0JCQkJfQ0KLQkJCX0pOw0KLQkJCWlzUnVubmluZyA9IGZhbHNlOw0KLQ0KLQkJCS8vIEZvcmNlIHRoZSBkaXNwbGF5IHRvIHdha2UgdXANCi0JCQlkaXNwbGF5KCkuYXN5bmNFeGVjKG51bGwpOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBCbG9ja3MgdGhlIGNhbGxlciB3aGlsZSB0aGUge0BsaW5rIFJ1bm5hYmxlfSBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yIGlzIGJlaW5nIGV4ZWN1dGVkLjxicj4NCi0JICogSWYgdGhlIGNhbGxlciBpcyB0aGUgVUkgdGhyZWFkLCB7QGxpbmsgRGlzcGxheSNyZWFkQW5kRGlzcGF0Y2goKX0gaXMgaW52b2tlZCBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCB0aGUgZXZlbnQgbG9vcCBpcyBwcm9jZXNzZWQ8YnI+DQotCSAqIElmIHRoZSBjYWxsZXIgaXMgbm90IGEgVUkgdGhyZWFkLCB0aGlzIG1ldGhvZCBzaW1wbHkgam9pbnMuIDxicj4NCi0JICogDQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIGluIGNhc2UgdGhlIG1ldGhvZCBpcyBpbnZva2VkIHdpdGhpbiBpdHMgb3duIHRocmVhZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgYmxvY2soKQ0KLQl7DQotCQlpZiAoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSA9PSB0aGlzKQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZnJvbSBpbnNpZGUgdGhlIHNhbWUgdGhyZWFkIik7DQotCQl9DQotDQotCQlpZiAoRGlzcGxheS5nZXRDdXJyZW50KCkgPT0gbnVsbCkNCi0JCXsNCi0JCQl0cnkNCi0JCQl7DQotCQkJCWpvaW4oKTsNCi0JCQl9IGNhdGNoIChUaHJvd2FibGUgZSkNCi0JCQl7DQotCQkJCWVycm9yVGhyb3dhYmxlID0gZTsNCi0JCQl9DQotCQl9IGVsc2UNCi0JCXsNCi0JCQl3aGlsZSAoaXNSdW5uaW5nKQ0KLQkJCXsNCi0JCQkJaWYoIWRpc3BsYXkoKS5yZWFkQW5kRGlzcGF0Y2goKSkNCi0JCQkJew0KLQkJCQkJdHJ5DQotCQkJCQl7DQotCQkJCQkJVGhyZWFkLnNsZWVwKDUwKTsNCi0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpDQotCQkJCQl7DQotCQkJCQkJLy8gaWdub3JlDQotCQkJCQkJKG5ldyBMb2dnZXIoKSkubG9nRGVidWcoZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQl9DQotCQ0KLQlwcml2YXRlIERpc3BsYXkgZGlzcGxheSgpDQotCXsNCi0JCXJldHVybiBkaXNwbGF5Ow0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJkMWE0MzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGZiMDMwOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFlMDQ4NGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI01vbiBKdWwgMjAgMTU6MjU6MzEgRUVTVCAyMDA5DQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUNCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJmMjAxOTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cwotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMsCi0gb3JnLmptb2NrLAotIG9yZy5qdW5pdCwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cywKLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwsCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5jbGF6egpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJiN2FjZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5BdWd1c3QgMjAsIDIwMDk8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYzg4ZWZkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcDQotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMNCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc0ZDE1OTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLUJ1bmRsZS1OYW1lLjA9SkFYLVdTIFV0aWxzIFRlc3RzDQotQnVuZGxlLVZlbmRvci4wPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtDQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvcmVzb3VyY2VzL1N0cmluZ0lucHV0U3RyZWFtQWRhcHRlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Jlc291cmNlcy9TdHJpbmdJbnB1dFN0cmVhbUFkYXB0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYyYmZkOWMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvcmVzb3VyY2VzL1N0cmluZ0lucHV0U3RyZWFtQWRhcHRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnJlc291cmNlczsNCi0NCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnJlc291cmNlcy5TdHJpbmdJbnB1dFN0cmVhbUFkYXB0ZXI7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi0vKioNCi0gKiBUZXN0IGNhc2UgZm9yIFN0cmluZ0lucHV0U3RyZWFtQWRhcHRlciBjbGFzcw0KLSAqIA0KLSAqIEBhdXRob3IgRGFuYWlsIEJyYW5la292DQotICogDQotICovDQotcHVibGljIGNsYXNzIFN0cmluZ0lucHV0U3RyZWFtQWRhcHRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQ0KLXsNCi0JcHVibGljIHZvaWQgdGVzdENyZWF0aW9uKCkNCi0Jew0KLQkJdHJ5DQotCQl7DQotCQkJbmV3IFN0cmluZ0lucHV0U3RyZWFtQWRhcHRlcihudWxsKTsNCi0JCQlmYWlsKCJOUEUgZXhwZWN0ZWQiKTsNCi0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJLy8gZXhwZWN0ZWQNCi0JCQlhc3NlcnRUcnVlKHRydWUpOw0KLQkJfQ0KLQ0KLQkJU3RyaW5nSW5wdXRTdHJlYW1BZGFwdGVyIGFkYXB0ZXIgPSBuZXcgU3RyaW5nSW5wdXRTdHJlYW1BZGFwdGVyKCJBQkMiKTsNCi0JCWFzc2VydE5vdE51bGwoYWRhcHRlcik7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFJlYWQoKQ0KLQl7DQotCQl0cnkNCi0JCXsNCi0JCQlTdHJpbmdJbnB1dFN0cmVhbUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBTdHJpbmdJbnB1dFN0cmVhbUFkYXB0ZXIoIkFCQyIpOw0KLQkJCWFzc2VydFRydWUoYWRhcHRlci5yZWFkKCkgPiAwKTsNCi0NCi0JCQlhZGFwdGVyID0gbmV3IFN0cmluZ0lucHV0U3RyZWFtQWRhcHRlcigiIik7DQotCQkJYXNzZXJ0VHJ1ZShhZGFwdGVyLnJlYWQoKSA9PSAtMSk7DQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCWZhaWwoZS5nZXRNZXNzYWdlKCkpOw0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL0FsbFRlc3RzU3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL0FsbFRlc3RzU3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjhjMWJmZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9BbGxUZXN0c1N1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0czsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5yZXNvdXJjZXMuU3RyaW5nSW5wdXRTdHJlYW1BZGFwdGVyVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLkZpbGVVdGlsc1VuaXRUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuSmF4V3NVdGlsc1Rlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeVRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uSW5zcGVjdG9ySW1wbFRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXJUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuQW5ub3RhdGlvblV0aWxzVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zLkFubm90YXRpb25zQmFzZUltcGxUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuQXJyYXlWYWx1ZUltcGxUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuQm9vbGVhblZhbHVlSW1wbFRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5DbGFzc1ZhbHVlSW1wbFRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5JbnRlZ2VyVmFsdWVJbXBsVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zLlBhcmFtVmFsdWVQYWlySW1wbFRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5RdWFsaWZpZWROYW1lVmFsdWVJbXBsVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zLlN0cmluZ1ZhbHVlSW1wbFRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5jbGF6ei5BU1RVdGlsc1Rlc3Q7DQotDQotDQotcHVibGljIGNsYXNzIEFsbFRlc3RzU3VpdGUNCi17DQotCS8qKg0KLQkgKiBSZXR1cm5zIGEgdGVzdCBzdWl0ZSBjb250YWluaW5nIHRoZSB0ZXN0cyB0byBiZSBydW4gYnkgSmF2YSBEZXZlbG9wZXIgVGVzdCBEaXNwYXRjaGVyDQotCSAqIA0KLQkgKiBAcmV0dXJuIC0gYSBzdWl0ZSBvZiBqdW5pdCBwZGUgdGVzdA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0Jew0KLQkJZmluYWwgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOw0KLQ0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFubm90YXRpb25GYWN0b3J5VGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQXJyYXlWYWx1ZUltcGxUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBbm5vdGF0aW9uc0Jhc2VJbXBsVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQW5ub3RhdGlvbkluc3BlY3RvckltcGxUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBbm5vdGF0aW9uVXRpbHNUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShCb29sZWFuVmFsdWVJbXBsVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSW50ZWdlclZhbHVlSW1wbFRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFBhcmFtVmFsdWVQYWlySW1wbFRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFF1YWxpZmllZE5hbWVWYWx1ZUltcGxUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTdHJpbmdWYWx1ZUltcGxUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDbGFzc1ZhbHVlSW1wbFRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lclRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFTVFV0aWxzVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRmlsZVV0aWxzVW5pdFRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEpheFdzVXRpbHNUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTdHJpbmdJbnB1dFN0cmVhbUFkYXB0ZXJUZXN0LmNsYXNzKTsNCi0JCQ0KLQkJcmV0dXJuIHN1aXRlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL0ZpbGVVdGlsc1VuaXRUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9GaWxlVXRpbHNVbml0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZDRhOTE0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL0ZpbGVVdGlsc1VuaXRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklCdWZmZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2tPYmplY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLlN0YXR1c1V0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMucmVzb3VyY2VzLkZpbGVVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnJlc291cmNlcy5JRmlsZVV0aWxzOw0KLWltcG9ydCBvcmcuam1vY2suY29yZS5jb25zdHJhaW50LklzRXF1YWw7DQotaW1wb3J0IG9yZy5qbW9jay5jb3JlLmNvbnN0cmFpbnQuSXNTYW1lOw0KLQ0KLXB1YmxpYyBjbGFzcyBGaWxlVXRpbHNVbml0VGVzdCBleHRlbmRzIE1vY2tPYmplY3RUZXN0Q2FzZQ0KLXsNCi0JcHJpdmF0ZSBmaW5hbCBJRmlsZVV0aWxzIGZpbGVVdGlscyA9IEZpbGVVdGlscy5nZXRJbnN0YW5jZSgpOw0KLQlwcml2YXRlIE1vY2s8SUNvbXBpbGF0aW9uVW5pdD4gY3VNb2NrOw0KLQlwcml2YXRlIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCWN1TW9jayA9IG1vY2soSUNvbXBpbGF0aW9uVW5pdC5jbGFzcyk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDb21waWxhdGlvblVuaXRDb250ZW50RGVhbHNDb3JyZWN0bHlXaXRoV29ya2luZ0NvcHkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIFN0cmluZyB0ZXN0Q29udGVudCA9ICJNeVRlc3RDb250ZW50IjsNCi0JCWZpbmFsIE1vY2s8SUJ1ZmZlcj4gYnVmZmVyTW9jayA9IG1vY2soSUJ1ZmZlci5jbGFzcyk7DQotCQlidWZmZXJNb2NrLmV4cGVjdHMob25jZSgpKS5tZXRob2QoInNldENvbnRlbnRzIikud2l0aChuZXcgSXNTYW1lKHRlc3RDb250ZW50KSk7DQotCQkNCi0JCWN1TW9jay5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJiZWNvbWVXb3JraW5nQ29weSIpOw0KLQkJY3VNb2NrLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImdldEJ1ZmZlciIpLndpbGwocmV0dXJuVmFsdWUoYnVmZmVyTW9jay5wcm94eSgpKSk7DQotCQljdU1vY2suZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiY29tbWl0V29ya2luZ0NvcHkiKS53aXRoKG5ldyBJc0VxdWFsKHRydWUpLCBuZXcgSXNTYW1lKG1vbml0b3IpKTsNCi0JCWN1TW9jay5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJkaXNjYXJkV29ya2luZ0NvcHkiKTsNCi0NCi0JCWZpbGVVdGlscy5zZXRDb21waWxhdGlvblVuaXRDb250ZW50KGN1TW9jay5wcm94eSgpLCB0ZXN0Q29udGVudCwgdHJ1ZSwgbW9uaXRvcik7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDb21waWxhdGlvblVuaXRDb250ZW50RG9lc05vdERpc2NhcmRXb3JraW5nQ29weU9uSk1FKCkNCi0Jew0KLQkJZmluYWwgSmF2YU1vZGVsRXhjZXB0aW9uIHRlc3RFeGNlcHRpb24gPSBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBDb3JlRXhjZXB0aW9uKFN0YXR1c1V0aWxzLnN0YXR1c0Vycm9yKCJURVNUIikpKTsNCi0JCWN1TW9jay5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJiZWNvbWVXb3JraW5nQ29weSIpLndpbGwodGhyb3dFeGNlcHRpb24odGVzdEV4Y2VwdGlvbikpOw0KLQkJY3VNb2NrLmV4cGVjdHMobmV2ZXIoKSkubWV0aG9kKCJkaXNjYXJkV29ya2luZ0NvcHkiKTsNCi0JCWN1TW9jay5leHBlY3RzKG5ldmVyKCkpLm1ldGhvZCgiY29tbWl0V29ya2luZ0NvcHkiKTsNCi0JCQ0KLQkJdHJ5DQotCQl7DQotCQkJZmlsZVV0aWxzLnNldENvbXBpbGF0aW9uVW5pdENvbnRlbnQoY3VNb2NrLnByb3h5KCksICIxMjMiLCB0cnVlLCBtb25pdG9yKTsNCi0JCX0NCi0JCWNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCWFzc2VydFRydWUoIlRlc3QgZXhjZXB0aW9uIHdhcyBub3QgY2F1Z2h0IiwgZSA9PSB0ZXN0RXhjZXB0aW9uKTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFNldEN1Q29udGVudFNhdmVzRGlydHlFZGl0b3JzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBib29sZWFuW10gc2F2ZUVkaXRvckludm9rZWQgPSBuZXcgYm9vbGVhbltde2ZhbHNlfTsNCi0JCWZpbmFsIGJvb2xlYW5bXSBzZXRDb250ZW50c0ludm9rZWQgPSBuZXcgYm9vbGVhbltde2ZhbHNlfTsNCi0JCQ0KLQkJZmluYWwgSUZpbGVVdGlscyBteUZpbGVVdGlscyA9IG5ldyBGaWxlVXRpbHMoKXsNCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0NvbXBpbGF0aW9uVW5pdERpc3BsYXllZEluRGlydHlFZGl0b3IoZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBjdSkNCi0JCQl7DQotCQkJCWFzc2VydFRydWUoIlVuZXhwZWN0ZWQgY29tcGlsYXRpb24gdW5pdCIsIGN1ID09IGN1TW9jay5wcm94eSgpKTsNCi0JCQkJcmV0dXJuIHRydWU7DQotCQkJfQ0KLQkJCQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyB2b2lkIHNhdmVFZGl0b3IoZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBjdSkNCi0JCQl7DQotCQkJCWFzc2VydFRydWUoIlNhdmUgZWRpdG9ycyBpbnZva2VkIGJlZm9yZSBzZXQgQ1UgY29udGVudCIsIHNldENvbnRlbnRzSW52b2tlZFswXSk7DQotCQkJCWFzc2VydFRydWUoIlVuZXhwZWN0ZWQgY29tcGlsYXRpb24gdW5pdCIsIGN1ID09IGN1TW9jay5wcm94eSgpKTsNCi0JCQkJc2F2ZUVkaXRvckludm9rZWRbMF0gPSB0cnVlOw0KLQkJCX0NCi0JCQkNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgdm9pZCBzZXRDb21waWxhdGlvblVuaXRDb250ZW50KElDb21waWxhdGlvblVuaXQgdW5pdCwgU3RyaW5nIGNvbnRlbnQsIGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikNCi0JCQkJCQkJCQkJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JCQl7DQotCQkJCWFzc2VydEZhbHNlKCJTZXQgQ1UgY29udGVudCBpbnZva2VkIGFmdGVyIGVkaXRvciBzYXZlZCIsIHNhdmVFZGl0b3JJbnZva2VkWzBdKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIENVIGNvbnRlbnQiLCAiTXlDb250ZW50IiwgY29udGVudCk7DQotCQkJCXNldENvbnRlbnRzSW52b2tlZFswXSA9IHRydWU7DQotCQkJfQ0KLQkJfTsNCi0JCQ0KLQkJbXlGaWxlVXRpbHMuc2V0Q29tcGlsYXRpb25Vbml0Q29udGVudEFuZFNhdmVEaXJ0eUVkaXRvcnMoY3VNb2NrLnByb3h5KCksICJNeUNvbnRlbnQiLCB0cnVlLCBudWxsKTsNCi0JCWFzc2VydFRydWUoIlNldCBjb250ZW50cyBub3QgaW52b2tlZCIsIHNldENvbnRlbnRzSW52b2tlZFswXSk7DQotCQlhc3NlcnRUcnVlKCJTYXZlIGVkaXRvcnMgbm90IGludm9rZWQiLCBzYXZlRWRpdG9ySW52b2tlZFswXSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDdUNvbnRlbnREb2VzTm90U2F2ZXNDbGVhbkVkaXRvcnMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIGJvb2xlYW5bXSBpc0Rpc3BsYXllZEludm9rZWQgPSBuZXcgYm9vbGVhbltde2ZhbHNlfTsNCi0JCWZpbmFsIGJvb2xlYW5bXSBzZXRDb250ZW50c0ludm9rZWQgPSBuZXcgYm9vbGVhbltde2ZhbHNlfTsNCi0JCQ0KLQkJZmluYWwgSUZpbGVVdGlscyBteUZpbGVVdGlscyA9IG5ldyBGaWxlVXRpbHMoKXsNCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0NvbXBpbGF0aW9uVW5pdERpc3BsYXllZEluRGlydHlFZGl0b3IoZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBjdSkNCi0JCQl7DQotCQkJCWFzc2VydFRydWUoIlVuZXhwZWN0ZWQgY29tcGlsYXRpb24gdW5pdCIsIGN1ID09IGN1TW9jay5wcm94eSgpKTsNCi0JCQkJaXNEaXNwbGF5ZWRJbnZva2VkWzBdID0gdHJ1ZTsNCi0JCQkJcmV0dXJuIGZhbHNlOw0KLQkJCX0NCi0JCQkNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgdm9pZCBzYXZlRWRpdG9yKGZpbmFsIElDb21waWxhdGlvblVuaXQgY3UpDQotCQkJew0KLQkJCQlmYWlsKCJVbmV4cGVjdGVkIGludm9jYXRpb24iKTsNCi0JCQl9DQotCQkJDQotCQkJQE92ZXJyaWRlDQotCQkJcHVibGljIHZvaWQgc2V0Q29tcGlsYXRpb25Vbml0Q29udGVudChJQ29tcGlsYXRpb25Vbml0IHVuaXQsIFN0cmluZyBjb250ZW50LCBib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpDQotCQkJCQkJCQkJCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCQkJew0KLQkJCQlhc3NlcnRGYWxzZSgiU2V0IENVIGNvbnRlbnQgaW52b2tlZCBhZnRlciBlZGl0b3Igc2F2ZWQiLCBpc0Rpc3BsYXllZEludm9rZWRbMF0pOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgQ1UgY29udGVudCIsICJNeUNvbnRlbnQiLCBjb250ZW50KTsNCi0JCQkJc2V0Q29udGVudHNJbnZva2VkWzBdID0gdHJ1ZTsNCi0JCQl9DQotCQl9Ow0KLQkJDQotCQlteUZpbGVVdGlscy5zZXRDb21waWxhdGlvblVuaXRDb250ZW50QW5kU2F2ZURpcnR5RWRpdG9ycyhjdU1vY2sucHJveHkoKSwgIk15Q29udGVudCIsIHRydWUsIG51bGwpOw0KLQkJYXNzZXJ0VHJ1ZSgiU2V0IGNvbnRlbnRzIG5vdCBpbnZva2VkIiwgc2V0Q29udGVudHNJbnZva2VkWzBdKTsNCi0JCWFzc2VydFRydWUoIklzIGRpc3BsYXllZCBpbiBkaXJ0eSBlZGl0b3Igbm90IGludm9rZWQiLCBpc0Rpc3BsYXllZEludm9rZWRbMF0pOw0KLQl9DQotCQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9KYXhXc1V0aWxzVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvSmF4V3NVdGlsc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDEwZjRiNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9KYXhXc1V0aWxzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9ja09iamVjdFRlc3RDYXNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuSmF4V3NVdGlsczsNCi0NCi1wdWJsaWMgY2xhc3MgSmF4V3NVdGlsc1Rlc3QgZXh0ZW5kcyBNb2NrT2JqZWN0VGVzdENhc2UNCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19OQU1FID0gIlRlc3RCZWFuIjsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX0ZRX05BTUUgPSAib3JnLmVjbGlwc2UudGVzdC4iICsgQ0xBU1NfTkFNRTsNCi0JDQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcG9zZUpheFdzVGFyZ2V0TmFtZXNwYWNlQnlQYWNrYWdlX1dpdGhOdWxsKCkNCi0Jew0KLQkJdHJ5DQotCQl7DQotCQkJSmF4V3NVdGlscy5jb21wb3NlSmF4V3NUYXJnZXROYW1lc3BhY2VCeVBhY2thZ2UobnVsbCk7DQotCQkJZmFpbCgiTlBFIGV4cGVjdGVkIik7DQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQkvLyBleHBlY3RlZA0KLQkJCWFzc2VydFRydWUodHJ1ZSk7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdENvbXBvc2VKYXhXc1RhcmdldE5hbWVzcGFjZUJ5UGFja2FnZSgpDQotCXsNCi0JCVN0cmluZyBucyA9IEpheFdzVXRpbHMuY29tcG9zZUpheFdzVGFyZ2V0TmFtZXNwYWNlQnlQYWNrYWdlKCIiKTsNCi0JCWFzc2VydFRydWUobnMuZXF1YWxzKCJodHRwOi8vLyIpKTsNCi0JCW5zID0gSmF4V3NVdGlscy5jb21wb3NlSmF4V3NUYXJnZXROYW1lc3BhY2VCeVBhY2thZ2UoImEiKTsNCi0JCWFzc2VydFRydWUobnMuZXF1YWxzKCJodHRwOi8vYS8iKSk7DQotCQlucyA9IEpheFdzVXRpbHMuY29tcG9zZUpheFdzVGFyZ2V0TmFtZXNwYWNlQnlQYWNrYWdlKCJhLmIuYyIpOw0KLQkJYXNzZXJ0VHJ1ZShucy5lcXVhbHMoImh0dHA6Ly9iLmEvYy8iKSk7DQotCQlucyA9IEpheFdzVXRpbHMuY29tcG9zZUpheFdzVGFyZ2V0TmFtZXNwYWNlQnlQYWNrYWdlKCJhLmIuYy5kIik7DQotCQlhc3NlcnRUcnVlKG5zLmVxdWFscygiaHR0cDovL2IuYS9jL2QvIikpOw0KLQkJbnMgPSBKYXhXc1V0aWxzLmNvbXBvc2VKYXhXc1RhcmdldE5hbWVzcGFjZUJ5UGFja2FnZSgiYS5iLmMuZC5lIik7DQotCQlhc3NlcnRUcnVlKG5zLmVxdWFscygiaHR0cDovL2IuYS9jL2QvZS8iKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0U2VydmljZU5hbWUoKQ0KLQl7DQotCQl0cnkgew0KLQkJCUpheFdzVXRpbHMuZ2V0RGVmYXVsdFNlcnZpY2VOYW1lKG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIF8pe30NCi0JCQ0KLQkJYXNzZXJ0RXF1YWxzKENMQVNTX05BTUUgKyAiU2VydmljZSIsICBKYXhXc1V0aWxzLmdldERlZmF1bHRTZXJ2aWNlTmFtZShDTEFTU19GUV9OQU1FKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0UG9ydHR5cGVOYW1lKCkNCi0Jew0KLQkJdHJ5IHsNCi0JCQlKYXhXc1V0aWxzLmdldERlZmF1bHRQb3J0dHlwZU5hbWUobnVsbCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gXyl7fQ0KLQkJDQotCQlhc3NlcnRFcXVhbHMoQ0xBU1NfTkFNRSwgIEpheFdzVXRpbHMuZ2V0RGVmYXVsdFBvcnR0eXBlTmFtZShDTEFTU19GUV9OQU1FKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0UG9ydE5hbWUoKQ0KLQl7DQotCQl0cnkgew0KLQkJCUpheFdzVXRpbHMuZ2V0RGVmYXVsdFBvcnROYW1lKG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIF8pe30NCi0JCQ0KLQkJYXNzZXJ0RXF1YWxzKENMQVNTX05BTUUgKyAiUG9ydCIsICBKYXhXc1V0aWxzLmdldERlZmF1bHRQb3J0TmFtZShDTEFTU19GUV9OQU1FKSk7DQotCX0NCi0JDQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0Fubm90YXRpb25GYWN0b3J5VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQW5ub3RhdGlvbkZhY3RvcnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRkMGNiOTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQW5ub3RhdGlvbkZhY3RvcnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnM7DQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LkNsYXNzTG9hZGluZ1Rlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVZhbHVlOw0KLQ0KLS8qKg0KLSAqIEFubm90YXRpb25GYWN0b3J5IGNsYXNzIHRlc3QgY2FzZXMuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQ0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uRmFjdG9yeVRlc3QgZXh0ZW5kcyBDbGFzc0xvYWRpbmdUZXN0DQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1JDID0gInNyYyI7DQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQ0sgPSAib3JnLmVjbGlwc2UuZGVtbyI7DQotDQotCXByaXZhdGUgSVR5cGUgZW5kcG9pbnQ7DQotDQotDQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVTdHJpbmdWYWx1ZSgpDQotCXsNCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQl9DQotDQotCQlJVmFsdWUgc3RyVmFsdWUgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgidmFsdWUiKTsNCi0JCWFzc2VydE5vdE51bGwoc3RyVmFsdWUpOw0KLQkJYXNzZXJ0VHJ1ZShzdHJWYWx1ZS50b1N0cmluZygpLmVxdWFscygidmFsdWUiKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZVBhcmFtVmFsdWVQYWlyKCkNCi0Jew0KLQkJSVZhbHVlIHN0clZhbHVlID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoInZhbHVlIik7DQotDQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKG51bGwsIHN0clZhbHVlKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgiIiwgbnVsbCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJCWZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9DQotCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgDQotCQl7DQotCQl9DQotDQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJwYXJhbSIsIG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0NCi0JCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQkJDQotCQlJUGFyYW1WYWx1ZVBhaXIgdmFsdWVQYWlyID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgicGFyYW0iLCBzdHJWYWx1ZSk7DQotCQlhc3NlcnROb3ROdWxsKHZhbHVlUGFpcik7DQotCQlhc3NlcnRUcnVlKHZhbHVlUGFpci5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgSVZhbHVlKTsNCi0JCWFzc2VydFRydWUodmFsdWVQYWlyLmdldFBhcmFtKCkuZXF1YWxzKCJwYXJhbSIpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQ29tcGxleEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIA0KLQl7DQotCQlJVmFsdWUgc3RyVmFsdWUxID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoInZhbHVlIik7DQotCQlJUGFyYW1WYWx1ZVBhaXIgdmFsdWVQYWlyMSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInBhcmFtIiwgc3RyVmFsdWUxKTsNCi0NCi0JCUlWYWx1ZSBzdHJWYWx1ZTIgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgidmFsdWUxIik7DQotCQlJUGFyYW1WYWx1ZVBhaXIgdmFsdWVQYWlyMiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInBhcmFtMSIsIHN0clZhbHVlMik7DQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlcyA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCXBhcmFtVmFsdWVzLmFkZCh2YWx1ZVBhaXIxKTsNCi0JCXBhcmFtVmFsdWVzLmFkZCh2YWx1ZVBhaXIyKTsNCi0NCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24obnVsbCwgcGFyYW1WYWx1ZXMsIGVuZHBvaW50KTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigiIiwgbnVsbCwgZW5kcG9pbnQpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCQlmYWlsKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfQ0KLQkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQl9DQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpDQotCQl7DQotCQl9DQotCQkNCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIk15TmFtZSIsIG51bGwsIGVuZHBvaW50KTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9DQotCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0NCi0vLwkJdHJ5DQotLy8JCXsNCi0vLwkJCUFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIk15TmFtZSIsIG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKSk7DQotLy8JCQlmYWlsKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gbm90IHRocm93biIpOw0KLS8vCQl9DQotLy8JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkNCi0vLwkJew0KLS8vCQl9DQotDQotCQkNCi0JCXByZXBhcmVQcm9qZWN0KCk7DQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gY2EgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJuYW1lIiwgcGFyYW1WYWx1ZXMsIGVuZHBvaW50KTsNCi0JCWFzc2VydE5vdE51bGwoY2EpOw0KLQkJYXNzZXJ0RXF1YWxzKGNhLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSwgMik7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZVZhbHVlUGFpcigpDQotCXsNCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoIiIsIG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCQlmYWlsKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfQ0KLQkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQl9DQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpDQotCQl7DQotCQl9DQotDQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKG51bGwsIG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUFycmF5VmFsdWUoKQ0KLQl7DQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBcnJheVZhbHVlKG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQl9DQotDQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBcnJheVZhbHVlKG5ldyBIYXNoU2V0PElWYWx1ZT4oKSk7DQotCQkJZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQ0KLQkJSVZhbHVlIHN0clZhbHVlMSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKCJ2YWx1ZTEiKTsNCi0JCUlWYWx1ZSBzdHJWYWx1ZTIgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgidmFsdWUyIik7DQotCQlTZXQ8SVZhbHVlPiB2YWx1ZXMgPSBuZXcgSGFzaFNldDxJVmFsdWU+KCk7DQotCQl2YWx1ZXMuYWRkKHN0clZhbHVlMSk7DQotCQl2YWx1ZXMuYWRkKHN0clZhbHVlMik7DQotCQkNCi0JCQ0KLQkJSVZhbHVlIGFyclZhbHVlID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQXJyYXlWYWx1ZSh2YWx1ZXMpOw0KLQkJYXNzZXJ0Tm90TnVsbChhcnJWYWx1ZSk7DQotCQlhc3NlcnRUcnVlKGFyclZhbHVlLnRvU3RyaW5nKCkuZXF1YWxzKCJbdmFsdWUxLCB2YWx1ZTJdIikpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoKQ0KLQl7DQotDQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoIlFOYW1lIik7DQotCQkJZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0NCi0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0JCQ0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUXVhbGlmaWVkTmFtZVZhbHVlKG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQl9DQotDQotCQlJVmFsdWUgcU5hbWUgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoIm9yZy5lY2xpcHNlLmRlbW8uVGVzdCIpOw0KLQkJYXNzZXJ0Tm90TnVsbChxTmFtZSk7DQotCQlhc3NlcnRUcnVlKHFOYW1lLnRvU3RyaW5nKCkuZXF1YWxzKCJvcmcuZWNsaXBzZS5kZW1vLlRlc3QiKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUJvb2xlYW5WYWx1ZSgpDQotCXsNCi0JCUlWYWx1ZSBib29sVmFsdWUgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVCb29sZWFuVmFsdWUodHJ1ZSk7DQotCQlhc3NlcnROb3ROdWxsKGJvb2xWYWx1ZSk7DQotCQlhc3NlcnRFcXVhbHMoYm9vbFZhbHVlLnRvU3RyaW5nKCksICJ0cnVlIik7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEdldEFubm90YXRpb25zRnJvbUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiAvLyAkSkwtRVhDJA0KLQl7DQotCQlwcmVwYXJlUHJvamVjdCgpOw0KLQ0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZT4+IGFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5zaXplKCkgPT0gMik7DQotCX0NCi0NCi0vLwlwdWJsaWMgdm9pZCB0ZXN0R2V0QW5ub3RhdGlvbnNGcm9tRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIC8vICRKTC1FWEMkDQotLy8Jew0KLS8vCQlwcmVwYXJlUHJvamVjdCgpOw0KLS8vDQotLy8JCUlGaWVsZCBmaWVsZCA9IGVuZHBvaW50LmdldEZpZWxkKCJmaWVsZDEiKTsNCi0vLwkJYXNzZXJ0Tm90TnVsbChmaWVsZCk7DQotLy8NCi0vLwkJSUFubm90YXRpb25bXSBhbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXR0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKG1ldGhvZCkgZ2V0QW5ub3RhdGlvbnNGcm9tRmllbGQoZmllbGQpOw0KLS8vCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb25zKTsNCi0vLwkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5sZW5ndGggPT0gMSk7DQotLy8JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QW5ub3RhdGlvbnNGcm9tTWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiAvLyAkSkwtRVhDJA0KLQl7DQotCQlwcmVwYXJlUHJvamVjdCgpOw0KLQ0KLQkJSU1ldGhvZCBtZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2QoImFubm90YXRlZE1ldGhvZCIsIG5ldyBTdHJpbmdbXSB7ICJRU3RyaW5nOyIgfSk7DQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElNZXRob2Q+PiBhbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RNZXRob2QobWV0aG9kKTs7DQotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb25zKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuc2l6ZSgpID09IDEpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uc0lUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiAvLyAkSkwtRVhDJA0KLQl7DQotCQlwcmVwYXJlUHJvamVjdCgpOw0KLQkJDQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5yZW1vdmVBbm5vdGF0aW9uc0Zyb21KYXZhRWxlbWVudChudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9DQotCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0NCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LnJlbW92ZUFubm90YXRpb25zRnJvbUphdmFFbGVtZW50KGVuZHBvaW50LmdldFBhY2thZ2VGcmFnbWVudCgpKTsNCi0JCQlmYWlsKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfQ0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQkJDQotCQlBbm5vdGF0aW9uRmFjdG9yeS5yZW1vdmVBbm5vdGF0aW9uc0Zyb21KYXZhRWxlbWVudChlbmRwb2ludCk7DQotDQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElUeXBlPj4gYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS4gaW5zcGVjdFR5cGUoKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuc2l6ZSgpID09IDApOw0KLQ0KLQkJSU1ldGhvZCBtZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2QoImFubm90YXRlZE1ldGhvZCIsIG5ldyBTdHJpbmdbXSB7ICJRU3RyaW5nOyIgfSk7DQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikNCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SU1ldGhvZD4+IGFubm90YXRpb25zTWV0aG9kID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdE1ldGhvZChtZXRob2QpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5zaXplKCkgPT0gMCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb25zSVR5cGVTZXRPZlN0cmluZygpIHRocm93cyBFeGNlcHRpb24gLy8gJEpMLUVYQyQNCi0Jew0KLQkJcHJlcGFyZVByb2plY3QoKTsNCi0NCi0JCVNldDxTdHJpbmc+IHRvUmVtb3ZlID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOw0KLQkJdG9SZW1vdmUuYWRkKCJXZWJTZXJ2aWNlIik7DQotCQl0b1JlbW92ZS5hZGQoIldlYk1ldGhvZCIpOw0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkucmVtb3ZlQW5ub3RhdGlvbnMobnVsbCwgdG9SZW1vdmUpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0NCi0JCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkucmVtb3ZlQW5ub3RhdGlvbnMoZW5kcG9pbnQuZ2V0UGFja2FnZUZyYWdtZW50KCksIHRvUmVtb3ZlKTsNCi0JCQlmYWlsKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfQ0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQ0KLQkJDQotCQlBbm5vdGF0aW9uRmFjdG9yeS5yZW1vdmVBbm5vdGF0aW9ucyhlbmRwb2ludCwgdG9SZW1vdmUpOw0KLQ0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZT4+IGFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuc2l6ZSgpID09IDEpOw0KLQ0KLQkJSU1ldGhvZCBtZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2QoImFubm90YXRlZE1ldGhvZCIsIG5ldyBTdHJpbmdbXSB7ICJRU3RyaW5nOyIgfSk7DQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElNZXRob2Q+PiBhbm5vdGF0aW9uc01ldGhvZCA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RNZXRob2QobWV0aG9kKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnNNZXRob2Quc2l6ZSgpID09IDApOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uc0lGaWVsZCgpIHRocm93cyBFeGNlcHRpb24gLy8gJEpMLUVYQyQNCi0Jew0KLQkJcHJlcGFyZVByb2plY3QoKTsNCi0NCi0JCUlGaWVsZCBmaWVsZCA9IGVuZHBvaW50LmdldEZpZWxkKCJmaWVsZDEiKTsNCi0JCWFzc2VydE5vdE51bGwoZmllbGQpOw0KLQ0KLQkJQW5ub3RhdGlvbkZhY3RvcnkucmVtb3ZlQW5ub3RhdGlvbnNGcm9tSmF2YUVsZW1lbnQoZmllbGQpOw0KLQ0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZT4+IGFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuc2l6ZSgpID09IDIpOw0KLQ0KLQkJSU1ldGhvZCBtZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2QoImFubm90YXRlZE1ldGhvZCIsIG5ldyBTdHJpbmdbXSB7ICJRU3RyaW5nOyIgfSk7DQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElNZXRob2Q+PiBhbm5vdGF0aW9uc01ldGhvZCA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RNZXRob2QobWV0aG9kKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnNNZXRob2Quc2l6ZSgpID09IDEpOw0KLQ0KLS8vCQlhbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmdldEFubm90YXRpb25zRnJvbUZpZWxkKGZpZWxkKTsNCi0vLwkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9ucyk7DQotLy8JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMubGVuZ3RoID09IDApOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uc0lNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIC8vICRKTC1FWEMkDQotCXsNCi0JCXByZXBhcmVQcm9qZWN0KCk7DQotDQotCQlJTWV0aG9kIG1ldGhvZCA9IGVuZHBvaW50LmdldE1ldGhvZCgiYW5ub3RhdGVkTWV0aG9kIiwgbmV3IFN0cmluZ1tdIHsgIlFTdHJpbmc7IiB9KTsNCi0JCWVuZHBvaW50LmdldEZpZWxkKCJmaWVsZDEiKTsNCi0NCi0JCUFubm90YXRpb25GYWN0b3J5LnJlbW92ZUFubm90YXRpb25zRnJvbUphdmFFbGVtZW50KG1ldGhvZCk7DQotDQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElUeXBlPj4gYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5zaXplKCkgPT0gMik7DQotDQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElNZXRob2Q+PiBhbm5vdGF0aW9uc01ldGhvZCA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RNZXRob2QobWV0aG9kKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnNNZXRob2Quc2l6ZSgpPT0gMCk7DQotDQotLy8JCWFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuZ2V0QW5ub3RhdGlvbnNGcm9tRmllbGQoZmllbGQpOw0KLS8vCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb25zKTsNCi0vLwkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5sZW5ndGggPT0gMCk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHByZXBhcmVQcm9qZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiAvLyAkSkwtRVhDJA0KLQl7DQotCQljcmVhdGVKYXZhUHJvamVjdChTUkMsIFBDSyk7DQotCQllbmRwb2ludCA9IGNyZWF0ZUNsYXNzKCJFbmRwb2ludC5zcmMiLCAiRW5kcG9pbnQiKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uSW5zcGVjdG9ySW1wbFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0Fubm90YXRpb25JbnNwZWN0b3JJbXBsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMDg0NWI4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0Fubm90YXRpb25JbnNwZWN0b3JJbXBsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuQ2xhc3NMb2FkaW5nVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25Xcml0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklQYXJhbVZhbHVlUGFpcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklWYWx1ZTsNCi0NCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkluc3BlY3RvckltcGxUZXN0IGV4dGVuZHMgQ2xhc3NMb2FkaW5nVGVzdA0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNSQyA9ICJzcmMiOw0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUENLID0gIm9yZy5lY2xpcHNlLmRlbW8iOw0KLQ0KLQlwcml2YXRlIElUeXBlIGVuZHBvaW50Ow0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQljcmVhdGVKYXZhUHJvamVjdChTUkMsIFBDSyk7DQotCQllbmRwb2ludCA9IGNyZWF0ZUNsYXNzKCJFbmRwb2ludC5zcmMiLCAiRW5kcG9pbnQiKTsNCi0JCUFubm90YXRpb25GYWN0b3J5LnJlbW92ZUFubm90YXRpb25zRnJvbUphdmFFbGVtZW50KGVuZHBvaW50KTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRVcFNwZWNpZmljKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCWNyZWF0ZUphdmFQcm9qZWN0KFNSQywgUENLKTsNCi0JCWVuZHBvaW50ID0gY3JlYXRlQ2xhc3MoIkVuZHBvaW50QW5uSW5zcGVjdG9yLnNyYyIsICJFbmRwb2ludEFubkluc3BlY3RvciIpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RJbnNwZWN0b3IoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXNldFVwKCk7DQotCQkNCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IobnVsbCkuaW5zcGVjdFR5cGUoKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duISIpOw0KLQkJfQ0KLQkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIA0KLQkJew0KLQkJCWFzc2VydFRydWUodHJ1ZSk7DQotCQl9DQotDQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24hIik7DQotCQl9DQotCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsNCi0JCX0NCi0NCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RGaWVsZChudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duISIpOw0KLQkJfQ0KLQkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIA0KLQkJew0KLQkJCWFzc2VydFRydWUodHJ1ZSk7DQotCQl9DQotDQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0UGFyYW0obnVsbCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gc2hvdWxkIGJlIHRocm93biEiKTsNCi0JCX0NCi0JCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSANCi0JCXsNCi0JCQlhc3NlcnRUcnVlKHRydWUpOw0KLQkJfQ0KLQkJDQotCQlJVmFsdWUgc3YgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgiTXkgVmFsdWUiKTsNCi0NCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHB2ID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJcHYuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInBhcmFtIiwgc3YpKTsNCi0JCQ0KLQkJSUFubm90YXRpb248SUZpZWxkPiBhbm4gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJvcmcuZWNsaXBzZS50ZXN0Lk15QW5ub3RhdGlvbiIsIHB2LCBlbmRwb2ludC5nZXRGaWVsZCgiZmllbGQxIikpOw0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KGFubiwgZW5kcG9pbnQuZ2V0RmllbGQoImZpZWxkMSIpKTsNCi0NCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SUZpZWxkPj4gYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0RmllbGQoZW5kcG9pbnQuZ2V0RmllbGQoImZpZWxkMSIpKTsNCi0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5zaXplKCkgPT0gMSk7DQotCQlJQW5ub3RhdGlvbjxJRmllbGQ+IGFublAgPSBhbm5vdGF0aW9ucy5pdGVyYXRvcigpLm5leHQoKTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmUoYW5uUCk7DQotCQkNCi0JCWFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdEZpZWxkKGVuZHBvaW50LmdldEZpZWxkKCJmaWVsZDEiKSk7DQotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb25zKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuc2l6ZSgpID09IDApOw0KLQkJDQotDQotCQlJTWV0aG9kW10gbWV0aG9kcyA9IGVuZHBvaW50LmdldE1ldGhvZHMoKTsNCi0JCWZvciAoSU1ldGhvZCBtZXRob2QgOiBtZXRob2RzKQ0KLQkJew0KLQkJCWlmKG1ldGhvZC5nZXRSYXdQYXJhbWV0ZXJOYW1lcygpICE9IG51bGwgJiYgbWV0aG9kLmdldFJhd1BhcmFtZXRlck5hbWVzKCkubGVuZ3RoID4gMCkNCi0JCQl7DQotCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBtZXRob2QuZ2V0UmF3UGFyYW1ldGVyTmFtZXMoKS5sZW5ndGg7IGkrKykNCi0JCQkJew0KLQkJCQkJSVR5cGVQYXJhbWV0ZXIgcGFyYW0gPSBtZXRob2QuZ2V0VHlwZVBhcmFtZXRlcihtZXRob2QuZ2V0UmF3UGFyYW1ldGVyTmFtZXMoKVtpXSk7DQotDQotCQkJCQlJVmFsdWUgc3ZQYXJhbSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKCJTdHJpbmcgVmFsdSBQYXJhbSIpOw0KLQkJCQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcHZQYXJhbSA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCQkJCXB2UGFyYW0uYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoIlBhcmFtQXRyaWJ1dGUiLCBzdlBhcmFtKSk7DQotCQkJCQlJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4gYW5uUGFtID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigiUGFyYW1Bbm5vdGF0aW9uIiwgcHZQYXJhbSwgcGFyYW0pOw0KLQkJCQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KGFublBhbSwgcGFyYW0pOw0KLQkJCQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4+IHBhcmFtQW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0UGFyYW0ocGFyYW0pOw0KLQkJCQkJYXNzZXJ0Tm90TnVsbChwYXJhbUFubm90YXRpb25zKTsNCi0JCQkJCWFzc2VydFRydWUocGFyYW1Bbm5vdGF0aW9ucy5zaXplKCkgPT0gMSk7DQotCQkJCQlJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4gdG1wQW5uID0gcGFyYW1Bbm5vdGF0aW9ucy5pdGVyYXRvcigpLm5leHQoKTsNCi0JCQkJCQ0KLQkJCQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnJlbW92ZSh0bXBBbm4pOw0KLQkJCQkJcGFyYW1Bbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RQYXJhbShwYXJhbSk7DQotCQkJCQlhc3NlcnROb3ROdWxsKHBhcmFtQW5ub3RhdGlvbnMpOw0KLQkJCQkJYXNzZXJ0VHJ1ZShwYXJhbUFubm90YXRpb25zLnNpemUoKSA9PSAwKTsNCi0JCQkJCQ0KLQkJCQkJYW5uUGFtID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigiUGFyYW1Bbm5vdGF0aW9uMiIsIHB2UGFyYW0sIHBhcmFtKTsNCi0JCQkJCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChhbm5QYW0sIHBhcmFtKTsNCi0JCQkJCXBhcmFtQW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0UGFyYW0ocGFyYW0pOw0KLQkJCQkJYXNzZXJ0Tm90TnVsbChwYXJhbUFubm90YXRpb25zKTsNCi0JCQkJCWFzc2VydFRydWUocGFyYW1Bbm5vdGF0aW9ucy5zaXplKCkgPT0gMSk7DQotCQkJCQlBbm5vdGF0aW9uRmFjdG9yeS5yZW1vdmVBbm5vdGF0aW9uc0Zyb21KYXZhRWxlbWVudChwYXJhbSk7DQotCQkJCQlwYXJhbUFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFBhcmFtKHBhcmFtKTsNCi0JCQkJCWFzc2VydE5vdE51bGwocGFyYW1Bbm5vdGF0aW9ucyk7DQotCQkJCQlhc3NlcnRUcnVlKHBhcmFtQW5ub3RhdGlvbnMuc2l6ZSgpID09IDApOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zcGVjdG9yU3BlY2lmaWNBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlzZXRVcFNwZWNpZmljKCk7DQotCQkNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBpbnNwZWN0ZWRUeXBlQW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCJvcmcuZWNsaXBzZS5kZW1vLk15QW5ub3RhdGlvbiIpOw0KLQkJYXNzZXJ0Tm90TnVsbChpbnNwZWN0ZWRUeXBlQW5ub3RhdGlvbik7DQotCQlhc3NlcnRFcXVhbHMoaW5zcGVjdGVkVHlwZUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgibXlWYWx1ZSIpLCAiTXlTdHJpbmciKTsgDQotCQkNCi0JCWluc3BlY3RlZFR5cGVBbm5vdGF0aW9uID0gbnVsbDsNCi0JCQkJDQotCQlpbnNwZWN0ZWRUeXBlQW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCJqYXZheC5qd3MuV2ViU2VydmljZSIpOw0KLQkJYXNzZXJ0Tm90TnVsbChpbnNwZWN0ZWRUeXBlQW5ub3RhdGlvbik7DQotCQlhc3NlcnRUcnVlKCJqYXZheC5qd3MuV2ViU2VydmljZSIuZW5kc1dpdGgoaW5zcGVjdGVkVHlwZUFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSkpOw0KLQkJYXNzZXJ0RXF1YWxzKGluc3BlY3RlZFR5cGVBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoInNlcnZpY2VOYW1lIiksICJXU0ltcGxCZWFuU2VydmljZSIpOyANCi0JCWFzc2VydEVxdWFscyhpbnNwZWN0ZWRUeXBlQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJuYW1lIiksICJXU0ltcGxCZWFuIik7IA0KLQkJYXNzZXJ0RXF1YWxzKGluc3BlY3RlZFR5cGVBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoInRhcmdldE5hbWVzcGFjZSIpLCAiaHR0cDovL2RlbW8vZWNsaXBzZS9vcmcvIik7IA0KLQkJYXNzZXJ0RXF1YWxzKGluc3BlY3RlZFR5cGVBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoInBvcnROYW1lIiksICJXU0ltcGxCZWFuUG9ydCIpOyANCi0NCi0JCUlGaWVsZCBmaWVsZCA9IGVuZHBvaW50LmdldEZpZWxkKCJmaWVsZDEiKTsNCi0JCUlBbm5vdGF0aW9uPElGaWVsZD4gaW5zcGVjdGVkRmllbGRBbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdEZpZWxkKGZpZWxkLCAib3JnLmVjbGlwc2UuZGVtby5NeUZpZWxkQW5ub3RhdGlvbiIpOw0KLQkJYXNzZXJ0Tm90TnVsbChpbnNwZWN0ZWRGaWVsZEFubm90YXRpb24pOw0KLQkJYXNzZXJ0VHJ1ZSgib3JnLmVjbGlwc2UuZGVtby5NeUZpZWxkQW5ub3RhdGlvbiIuZW5kc1dpdGgoaW5zcGVjdGVkRmllbGRBbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpKTsNCi0JCWFzc2VydEVxdWFscyhpbnNwZWN0ZWRGaWVsZEFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgibmFtZSIpLCAiZmllbGQxIik7DQotCQkNCi0JCWluc3BlY3RlZEZpZWxkQW5ub3RhdGlvbiA9IG51bGw7DQotCQkNCi0JCWluc3BlY3RlZEZpZWxkQW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RGaWVsZChmaWVsZCwgImphdmF4Lmp3cy5XZWJGaWVsZCIpOw0KLQkJYXNzZXJ0Tm90TnVsbChpbnNwZWN0ZWRGaWVsZEFubm90YXRpb24pOw0KLQkJYXNzZXJ0VHJ1ZSgiamF2YXguandzLldlYkZpZWxkIi5lbmRzV2l0aChpbnNwZWN0ZWRGaWVsZEFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSkpOw0KLQkJYXNzZXJ0RXF1YWxzKGluc3BlY3RlZEZpZWxkQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJuYW1lIiksICJNeUZpZWxkIik7DQotDQotCQlJTWV0aG9kIG1ldGhvZCA9IGVuZHBvaW50LmdldE1ldGhvZHMoKVswXTsNCi0JCUlBbm5vdGF0aW9uPElNZXRob2Q+IGluc3BlY3RlZE1ldGhvZEFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKG1ldGhvZCwgIm9yZy5lY2xpcHNlLmRlbW8uTXlNZXRob2RBbm5vdGF0aW9uIik7DQotCQlhc3NlcnROb3ROdWxsKGluc3BlY3RlZE1ldGhvZEFubm90YXRpb24pOw0KLQkJYXNzZXJ0VHJ1ZSgib3JnLmVjbGlwc2UuZGVtby5NeU1ldGhvZEFubm90YXRpb24iLmVuZHNXaXRoKGluc3BlY3RlZE1ldGhvZEFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSkpOw0KLQkJYXNzZXJ0RXF1YWxzKGluc3BlY3RlZE1ldGhvZEFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgibmFtZSIpLCAiYW5ub3RhdGVkTWV0aG9kIik7DQotCQkNCi0JCWluc3BlY3RlZE1ldGhvZEFubm90YXRpb24gPSBudWxsOw0KLQkJDQotCQlpbnNwZWN0ZWRNZXRob2RBbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdE1ldGhvZChtZXRob2QsICJqYXZheC5qd3MuV2ViTWV0aG9kIik7DQotCQlhc3NlcnROb3ROdWxsKGluc3BlY3RlZE1ldGhvZEFubm90YXRpb24pOw0KLQkJYXNzZXJ0VHJ1ZSgiamF2YXguandzLldlYk1ldGhvZCIuZW5kc1dpdGgoaW5zcGVjdGVkTWV0aG9kQW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKSk7DQotCQlhc3NlcnRFcXVhbHMoaW5zcGVjdGVkTWV0aG9kQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJleGNsdWRlIiksICJmYWxzZSIpOw0KLQkJYXNzZXJ0RXF1YWxzKGluc3BlY3RlZE1ldGhvZEFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgib3BlcmF0aW9uTmFtZSIpLCAidGVzdCIpOw0KLQ0KLQkJSVR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IG1ldGhvZC5nZXRUeXBlUGFyYW1ldGVyKCJhbm5vdGF0ZWRQYXJhbSIpOw0KLQkJSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IGluc3BlY3RlZFBhcmFtQW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RQYXJhbSh0eXBlUGFyYW1ldGVyLCAib3JnLmVjbGlwc2UuZGVtby5NeVBhcmFtQW5ub3RhdGlvbiIpOw0KLQkJYXNzZXJ0Tm90TnVsbChpbnNwZWN0ZWRQYXJhbUFubm90YXRpb24pOw0KLQkJYXNzZXJ0VHJ1ZSgib3JnLmVjbGlwc2UuZGVtby5NeVBhcmFtQW5ub3RhdGlvbiIuZW5kc1dpdGgoaW5zcGVjdGVkUGFyYW1Bbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpKTsNCi0JCWFzc2VydEVxdWFscyhpbnNwZWN0ZWRQYXJhbUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgibmFtZSIpLCAiYW5ub3RhdGVkTXlQYXJhbSIpOw0KLQkJDQotCQlpbnNwZWN0ZWRQYXJhbUFubm90YXRpb24gPSBudWxsOw0KLQkJDQotCQlpbnNwZWN0ZWRQYXJhbUFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0UGFyYW0odHlwZVBhcmFtZXRlciwgImphdmF4Lmp3cy5XZWJQYXJhbSIpOw0KLQkJYXNzZXJ0Tm90TnVsbChpbnNwZWN0ZWRQYXJhbUFubm90YXRpb24pOw0KLQkJYXNzZXJ0VHJ1ZSgiamF2YXguandzLldlYlBhcmFtIi5lbmRzV2l0aChpbnNwZWN0ZWRQYXJhbUFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSkpOw0KLQkJYXNzZXJ0RXF1YWxzKGluc3BlY3RlZFBhcmFtQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJuYW1lIiksICJhbm5vdGF0ZWRQYXJhbSIpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zcGVjdG9yTG9jYXRvclJldHJpZXZlZCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJc2V0VXBTcGVjaWZpYygpOwkJDQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gYW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCJqYXZheC5qd3MuV2ViU2VydmljZSIpOw0KLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsNCi0NCi0JCWFzc2VydEVxdWFscygxMSwgYW5ub3RhdGlvbi5nZXRMb2NhdG9yKCkuZ2V0TGluZU51bWJlcigpKTsNCi0JCWFzc2VydEVxdWFscygyMjYsIGFubm90YXRpb24uZ2V0TG9jYXRvcigpLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQlhc3NlcnRFcXVhbHMoMTM0LCBhbm5vdGF0aW9uLmdldExvY2F0b3IoKS5nZXRMZW5ndGgoKSk7DQotCQkNCi0JCWFzc2VydEVxdWFscygxMSwgZ2V0UGFyYW0oInBvcnROYW1lIiwgYW5ub3RhdGlvbikuZ2V0TG9jYXRvcigpLmdldExpbmVOdW1iZXIoKSk7DQotCQlhc3NlcnRFcXVhbHMoMzM0LCBnZXRQYXJhbSgicG9ydE5hbWUiLCBhbm5vdGF0aW9uKS5nZXRMb2NhdG9yKCkuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCWFzc2VydEVxdWFscygyNSwgZ2V0UGFyYW0oInBvcnROYW1lIiwgYW5ub3RhdGlvbikuZ2V0TG9jYXRvcigpLmdldExlbmd0aCgpKTsJCQ0KLQl9DQotCQ0KLQlwcml2YXRlIElQYXJhbVZhbHVlUGFpciBnZXRQYXJhbShmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gYW5ub3RhdGlvbikgDQotCXsNCi0JCWZvciAoSVBhcmFtVmFsdWVQYWlyIHBhcmFtIDogYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKSkgew0KLQkJCWlmKHBhcmFtLmdldFBhcmFtKCkuZXF1YWxzKG5hbWUpKSB7DQotCQkJCXJldHVybiBwYXJhbTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYwZGJlN2YuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZVBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2tPYmplY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5Bbm5vdGF0aW9uUHJvcGVydHk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLkFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuQXR0cmlidXRlVHlwZUVudW07DQotDQotcHVibGljIGNsYXNzIEFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lclRlc3QgZXh0ZW5kcyBNb2NrT2JqZWN0VGVzdENhc2UNCi17DQotCXByaXZhdGUgTW9jazxJVHlwZT4gdHlwZSA9IG1vY2soSVR5cGUuY2xhc3MpOw0KLQlwcml2YXRlIE1vY2s8SU1ldGhvZD4gbWV0aG9kID0gbW9jayhJTWV0aG9kLmNsYXNzKTsNCi0JcHJpdmF0ZSBNb2NrPElUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVyID0gbW9jayhJVHlwZVBhcmFtZXRlci5jbGFzcyk7DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFzZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXIoKTsNCi0JCXRyeSANCi0JCXsNCi0JCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KG51bGwsIG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duISIpOw0KLQkJfQ0KLQkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsNCi0JCX0NCi0NCi0JCXRyeSANCi0JCXsNCi0JCQlBbm5vdGF0aW9uUHJvcGVydHkgYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWUiLCAiYXR0cmlidXRlTmFtZSIsICJ2YWx1ZSIsIEF0dHJpYnV0ZVR5cGVFbnVtLlNUUklORyk7DQotCQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duISIpOw0KLQkJfQ0KLQkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsNCi0JCX0NCi0NCi0JCXRyeSANCi0JCXsNCi0JCQlBbm5vdGF0aW9uUHJvcGVydHkgYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWUiLCAiYXR0cmlidXRlTmFtZSIsICJ2YWx1ZSIsIEF0dHJpYnV0ZVR5cGVFbnVtLlNUUklORyk7DQotCQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlBBQ0tBR0UpOw0KLQkJCWZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3YXMgbm90IHRocm93biEiKTsNCi0JCX0NCi0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlhc3NlcnRUcnVlKHRydWUpOw0KLQkJfQ0KLQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RUeXBlTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCUFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lciBjb250YWluZXIgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyKCk7DQotCQlBbm5vdGF0aW9uUHJvcGVydHkgYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWUiLCAiYXR0cmlidXRlTmFtZUJvb2xlYW4iLCAidHJ1ZSIsIEF0dHJpYnV0ZVR5cGVFbnVtLkJPT0xFQU4pOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlRZUEUpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWUiLCAiYXR0cmlidXRlTmFtZUludGVnZXIiLCAiMTAwIiwgQXR0cmlidXRlVHlwZUVudW0uSU5URUdFUik7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuVFlQRSk7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZSIsICJhdHRyaWJ1dGVOYW1lUXVhbGlmaWVkIiwgIm9yZy5lY2xpcHNlLnRlc3RFbnVtZXJhdGlvbi5WQUxVRSIsIEF0dHJpYnV0ZVR5cGVFbnVtLlFVQUxJRklFRF9OQU1FKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5UWVBFKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lIiwgImF0dHJpYnV0ZU5hbWVTdHJpbmciLCAidmFsdWVTdHJpbmciLCBBdHRyaWJ1dGVUeXBlRW51bS5TVFJJTkcpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlRZUEUpOw0KLQkJDQotCQlhc3NlcnRUcnVlKGNvbnRhaW5lci5nZXRUeXBlQW5ub3RhdGlvbnModHlwZS5wcm94eSgpKS5zaXplKCkgPT0gMSk7DQotCQlhc3NlcnRUcnVlKGNvbnRhaW5lci5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucyh0eXBlUGFyYW1ldGVyLnByb3h5KCkpLnNpemUoKSA9PSAwKTsNCi0JCWFzc2VydFRydWUoY29udGFpbmVyLmdldE1ldGhvZEFubm90YXRpb25zKG1ldGhvZC5wcm94eSgpKS5zaXplKCkgPT0gMCk7DQotCQlTZXQ8SUFubm90YXRpb248SVR5cGU+PiB0eXBlQW5ub3RhdGlvbnMgPSBjb250YWluZXIuZ2V0VHlwZUFubm90YXRpb25zKHR5cGUucHJveHkoKSk7DQotCQkNCi0JCWZvciAoSUFubm90YXRpb248SVR5cGU+IGFubm90YXRpb24gOiB0eXBlQW5ub3RhdGlvbnMpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJhbm5vdGF0aW9uTmFtZSIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpID09IDQpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lQm9vbGVhbiIpLmVxdWFscygidHJ1ZSIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZUludGVnZXIiKS5lcXVhbHMoIjEwMCIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZVF1YWxpZmllZCIpLmVxdWFscygib3JnLmVjbGlwc2UudGVzdEVudW1lcmF0aW9uLlZBTFVFIikpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lU3RyaW5nIikuZXF1YWxzKCJ2YWx1ZVN0cmluZyIpKTsNCi0JCX0NCi0NCi0JCWNvbnRhaW5lciA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXIoKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lMSIsICJhdHRyaWJ1dGVOYW1lQm9vbGVhbiIsICJ0cnVlIiwgQXR0cmlidXRlVHlwZUVudW0uQk9PTEVBTik7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuVFlQRSk7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZTIiLCAiYXR0cmlidXRlTmFtZUludGVnZXIiLCAiMTAwIiwgQXR0cmlidXRlVHlwZUVudW0uSU5URUdFUik7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuVFlQRSk7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZTMiLCAiYXR0cmlidXRlTmFtZVF1YWxpZmllZCIsICJvcmcuZWNsaXBzZS50ZXN0RW51bWVyYXRpb24uVkFMVUUiLCBBdHRyaWJ1dGVUeXBlRW51bS5RVUFMSUZJRURfTkFNRSk7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuVFlQRSk7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZTQiLCAiYXR0cmlidXRlTmFtZVN0cmluZyIsICJ2YWx1ZVN0cmluZyIsIEF0dHJpYnV0ZVR5cGVFbnVtLlNUUklORyk7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuVFlQRSk7DQotCQkNCi0JCWFzc2VydFRydWUoY29udGFpbmVyLmdldFR5cGVBbm5vdGF0aW9ucyh0eXBlLnByb3h5KCkpLnNpemUoKSA9PSA0KTsNCi0JCWFzc2VydFRydWUoY29udGFpbmVyLmdldFBhcmFtZXRlckFubm90YXRpb25zKHR5cGVQYXJhbWV0ZXIucHJveHkoKSkuc2l6ZSgpID09IDApOw0KLQkJYXNzZXJ0VHJ1ZShjb250YWluZXIuZ2V0TWV0aG9kQW5ub3RhdGlvbnMobWV0aG9kLnByb3h5KCkpLnNpemUoKSA9PSAwKTsNCi0JCXR5cGVBbm5vdGF0aW9ucyA9IGNvbnRhaW5lci5nZXRUeXBlQW5ub3RhdGlvbnModHlwZS5wcm94eSgpKTsNCi0NCi0JCVNldDxTdHJpbmc+IG5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOw0KLQkJbmFtZXMuY2xlYXIoKTsNCi0JCW5hbWVzLmFkZCgiYW5ub3RhdGlvbk5hbWUxIik7DQotCQluYW1lcy5hZGQoImFubm90YXRpb25OYW1lMiIpOw0KLQkJbmFtZXMuYWRkKCJhbm5vdGF0aW9uTmFtZTMiKTsNCi0JCW5hbWVzLmFkZCgiYW5ub3RhdGlvbk5hbWU0Iik7DQotCQkNCi0JCWZvciAoSUFubm90YXRpb248SVR5cGU+IGFubm90YXRpb24gOiB0eXBlQW5ub3RhdGlvbnMpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZShuYW1lcy5jb250YWlucyhhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpKTsNCi0JCQluYW1lcy5yZW1vdmUoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKTsNCi0JCQlpZihhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJhbm5vdGF0aW9uTmFtZTEiKSkNCi0JCQl7DQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkgPT0gMSk7CQ0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZUJvb2xlYW4iKS5lcXVhbHMoInRydWUiKSk7DQotCQkJfQ0KLQkJCWlmKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoImFubm90YXRpb25OYW1lMiIpKQ0KLQkJCXsNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSA9PSAxKTsJDQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lSW50ZWdlciIpLmVxdWFscygiMTAwIikpOw0KLQkJCX0NCi0JCQlpZihhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJhbm5vdGF0aW9uTmFtZTMiKSkNCi0JCQl7DQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkgPT0gMSk7CQ0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZVF1YWxpZmllZCIpLmVxdWFscygib3JnLmVjbGlwc2UudGVzdEVudW1lcmF0aW9uLlZBTFVFIikpOw0KLQkJCX0NCi0JCQlpZihhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJhbm5vdGF0aW9uTmFtZTQiKSkNCi0JCQl7DQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkgPT0gMSk7DQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lU3RyaW5nIikuZXF1YWxzKCJ2YWx1ZVN0cmluZyIpKTsJCQkJDQotCQkJfQ0KLQkJfQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCUFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lciBjb250YWluZXIgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyKCk7DQotCQlBbm5vdGF0aW9uUHJvcGVydHkgYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWUiLCAiYXR0cmlidXRlTmFtZUJvb2xlYW4iLCAidHJ1ZSIsIEF0dHJpYnV0ZVR5cGVFbnVtLkJPT0xFQU4pOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLk1FVEhPRCk7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZSIsICJhdHRyaWJ1dGVOYW1lSW50ZWdlciIsICIxMDAiLCBBdHRyaWJ1dGVUeXBlRW51bS5JTlRFR0VSKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5NRVRIT0QpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWUiLCAiYXR0cmlidXRlTmFtZVF1YWxpZmllZCIsICJvcmcuZWNsaXBzZS50ZXN0RW51bWVyYXRpb24uVkFMVUUiLCBBdHRyaWJ1dGVUeXBlRW51bS5RVUFMSUZJRURfTkFNRSk7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuTUVUSE9EKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lIiwgImF0dHJpYnV0ZU5hbWVTdHJpbmciLCAidmFsdWVTdHJpbmciLCBBdHRyaWJ1dGVUeXBlRW51bS5TVFJJTkcpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLk1FVEhPRCk7DQotCQkNCi0JCWFzc2VydFRydWUoY29udGFpbmVyLmdldFR5cGVBbm5vdGF0aW9ucyh0eXBlLnByb3h5KCkpLnNpemUoKSA9PSAwKTsNCi0JCWFzc2VydFRydWUoY29udGFpbmVyLmdldFBhcmFtZXRlckFubm90YXRpb25zKHR5cGVQYXJhbWV0ZXIucHJveHkoKSkuc2l6ZSgpID09IDApOw0KLQkJYXNzZXJ0VHJ1ZShjb250YWluZXIuZ2V0TWV0aG9kQW5ub3RhdGlvbnMobWV0aG9kLnByb3h5KCkpLnNpemUoKSA9PSAxKTsNCi0JCVNldDxJQW5ub3RhdGlvbjxJTWV0aG9kPj4gbWV0aG9kQW5ub3RhdGlvbnMgPSBjb250YWluZXIuZ2V0TWV0aG9kQW5ub3RhdGlvbnMobWV0aG9kLnByb3h5KCkpOw0KLQkJDQotCQlmb3IgKElBbm5vdGF0aW9uPElNZXRob2Q+IGFubm90YXRpb24gOiBtZXRob2RBbm5vdGF0aW9ucykNCi0JCXsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoImFubm90YXRpb25OYW1lIikpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkgPT0gNCk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImF0dHJpYnV0ZU5hbWVCb29sZWFuIikuZXF1YWxzKCJ0cnVlIikpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lSW50ZWdlciIpLmVxdWFscygiMTAwIikpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lUXVhbGlmaWVkIikuZXF1YWxzKCJvcmcuZWNsaXBzZS50ZXN0RW51bWVyYXRpb24uVkFMVUUiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImF0dHJpYnV0ZU5hbWVTdHJpbmciKS5lcXVhbHMoInZhbHVlU3RyaW5nIikpOw0KLQkJfQ0KLQ0KLQkJY29udGFpbmVyID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lcigpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWUxIiwgImF0dHJpYnV0ZU5hbWVCb29sZWFuIiwgInRydWUiLCBBdHRyaWJ1dGVUeXBlRW51bS5CT09MRUFOKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5NRVRIT0QpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWUyIiwgImF0dHJpYnV0ZU5hbWVJbnRlZ2VyIiwgIjEwMCIsIEF0dHJpYnV0ZVR5cGVFbnVtLklOVEVHRVIpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLk1FVEhPRCk7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZTMiLCAiYXR0cmlidXRlTmFtZVF1YWxpZmllZCIsICJvcmcuZWNsaXBzZS50ZXN0RW51bWVyYXRpb24uVkFMVUUiLCBBdHRyaWJ1dGVUeXBlRW51bS5RVUFMSUZJRURfTkFNRSk7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuTUVUSE9EKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lNCIsICJhdHRyaWJ1dGVOYW1lU3RyaW5nIiwgInZhbHVlU3RyaW5nIiwgQXR0cmlidXRlVHlwZUVudW0uU1RSSU5HKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5NRVRIT0QpOw0KLQkJDQotCQlhc3NlcnRUcnVlKGNvbnRhaW5lci5nZXRUeXBlQW5ub3RhdGlvbnModHlwZS5wcm94eSgpKS5zaXplKCkgPT0gMCk7DQotCQlhc3NlcnRUcnVlKGNvbnRhaW5lci5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucyh0eXBlUGFyYW1ldGVyLnByb3h5KCkpLnNpemUoKSA9PSAwKTsNCi0JCWFzc2VydFRydWUoY29udGFpbmVyLmdldE1ldGhvZEFubm90YXRpb25zKG1ldGhvZC5wcm94eSgpKS5zaXplKCkgPT0gNCk7DQotCQltZXRob2RBbm5vdGF0aW9ucyA9IGNvbnRhaW5lci5nZXRNZXRob2RBbm5vdGF0aW9ucyhtZXRob2QucHJveHkoKSk7DQotDQotCQlTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsNCi0JCW5hbWVzLmNsZWFyKCk7DQotCQluYW1lcy5hZGQoImFubm90YXRpb25OYW1lMSIpOw0KLQkJbmFtZXMuYWRkKCJhbm5vdGF0aW9uTmFtZTIiKTsNCi0JCW5hbWVzLmFkZCgiYW5ub3RhdGlvbk5hbWUzIik7DQotCQluYW1lcy5hZGQoImFubm90YXRpb25OYW1lNCIpOw0KLQkJDQotCQlmb3IgKElBbm5vdGF0aW9uPElNZXRob2Q+IGFubm90YXRpb24gOiBtZXRob2RBbm5vdGF0aW9ucykNCi0JCXsNCi0JCQlhc3NlcnRUcnVlKG5hbWVzLmNvbnRhaW5zKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSkpOw0KLQkJCW5hbWVzLnJlbW92ZShhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpOw0KLQkJCWlmKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoImFubm90YXRpb25OYW1lMSIpKQ0KLQkJCXsNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSA9PSAxKTsJDQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lQm9vbGVhbiIpLmVxdWFscygidHJ1ZSIpKTsNCi0JCQl9DQotCQkJaWYoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscygiYW5ub3RhdGlvbk5hbWUyIikpDQotCQkJew0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpID09IDEpOwkNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImF0dHJpYnV0ZU5hbWVJbnRlZ2VyIikuZXF1YWxzKCIxMDAiKSk7DQotCQkJfQ0KLQkJCWlmKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoImFubm90YXRpb25OYW1lMyIpKQ0KLQkJCXsNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSA9PSAxKTsJDQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lUXVhbGlmaWVkIikuZXF1YWxzKCJvcmcuZWNsaXBzZS50ZXN0RW51bWVyYXRpb24uVkFMVUUiKSk7DQotCQkJfQ0KLQkJCWlmKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoImFubm90YXRpb25OYW1lNCIpKQ0KLQkJCXsNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSA9PSAxKTsNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImF0dHJpYnV0ZU5hbWVTdHJpbmciKS5lcXVhbHMoInZhbHVlU3RyaW5nIikpOwkJCQkNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFBhcmFtZXRlckxldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXIgY29udGFpbmVyID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lcigpOw0KLQkJQW5ub3RhdGlvblByb3BlcnR5IGFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lIiwgImF0dHJpYnV0ZU5hbWVCb29sZWFuIiwgInRydWUiLCBBdHRyaWJ1dGVUeXBlRW51bS5CT09MRUFOKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5QQVJBTUVURVIpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWUiLCAiYXR0cmlidXRlTmFtZUludGVnZXIiLCAiMTAwIiwgQXR0cmlidXRlVHlwZUVudW0uSU5URUdFUik7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuUEFSQU1FVEVSKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lIiwgImF0dHJpYnV0ZU5hbWVRdWFsaWZpZWQiLCAib3JnLmVjbGlwc2UudGVzdEVudW1lcmF0aW9uLlZBTFVFIiwgQXR0cmlidXRlVHlwZUVudW0uUVVBTElGSUVEX05BTUUpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlBBUkFNRVRFUik7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZSIsICJhdHRyaWJ1dGVOYW1lU3RyaW5nIiwgInZhbHVlU3RyaW5nIiwgQXR0cmlidXRlVHlwZUVudW0uU1RSSU5HKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5QQVJBTUVURVIpOw0KLQkJDQotCQlhc3NlcnRUcnVlKGNvbnRhaW5lci5nZXRUeXBlQW5ub3RhdGlvbnModHlwZS5wcm94eSgpKS5zaXplKCkgPT0gMCk7DQotCQlhc3NlcnRUcnVlKGNvbnRhaW5lci5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucyh0eXBlUGFyYW1ldGVyLnByb3h5KCkpLnNpemUoKSA9PSAxKTsNCi0JCWFzc2VydFRydWUoY29udGFpbmVyLmdldE1ldGhvZEFubm90YXRpb25zKG1ldGhvZC5wcm94eSgpKS5zaXplKCkgPT0gMCk7DQotCQlTZXQ8SUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+PiBwYXJhbWV0ZXJBbm5vdGF0aW9ucyA9IGNvbnRhaW5lci5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucyh0eXBlUGFyYW1ldGVyLnByb3h5KCkpOw0KLQkJDQotCQlmb3IgKElBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPiBhbm5vdGF0aW9uIDogcGFyYW1ldGVyQW5ub3RhdGlvbnMpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJhbm5vdGF0aW9uTmFtZSIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpID09IDQpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lQm9vbGVhbiIpLmVxdWFscygidHJ1ZSIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZUludGVnZXIiKS5lcXVhbHMoIjEwMCIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZVF1YWxpZmllZCIpLmVxdWFscygib3JnLmVjbGlwc2UudGVzdEVudW1lcmF0aW9uLlZBTFVFIikpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lU3RyaW5nIikuZXF1YWxzKCJ2YWx1ZVN0cmluZyIpKTsNCi0JCX0NCi0NCi0JCWNvbnRhaW5lciA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXIoKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lMSIsICJhdHRyaWJ1dGVOYW1lQm9vbGVhbiIsICJ0cnVlIiwgQXR0cmlidXRlVHlwZUVudW0uQk9PTEVBTik7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuUEFSQU1FVEVSKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lMiIsICJhdHRyaWJ1dGVOYW1lSW50ZWdlciIsICIxMDAiLCBBdHRyaWJ1dGVUeXBlRW51bS5JTlRFR0VSKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5QQVJBTUVURVIpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWUzIiwgImF0dHJpYnV0ZU5hbWVRdWFsaWZpZWQiLCAib3JnLmVjbGlwc2UudGVzdEVudW1lcmF0aW9uLlZBTFVFIiwgQXR0cmlidXRlVHlwZUVudW0uUVVBTElGSUVEX05BTUUpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlBBUkFNRVRFUik7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZTQiLCAiYXR0cmlidXRlTmFtZVN0cmluZyIsICJ2YWx1ZVN0cmluZyIsIEF0dHJpYnV0ZVR5cGVFbnVtLlNUUklORyk7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuUEFSQU1FVEVSKTsNCi0JCQ0KLQkJYXNzZXJ0VHJ1ZShjb250YWluZXIuZ2V0VHlwZUFubm90YXRpb25zKHR5cGUucHJveHkoKSkuc2l6ZSgpID09IDApOw0KLQkJYXNzZXJ0VHJ1ZShjb250YWluZXIuZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnModHlwZVBhcmFtZXRlci5wcm94eSgpKS5zaXplKCkgPT0gNCk7DQotCQlhc3NlcnRUcnVlKGNvbnRhaW5lci5nZXRNZXRob2RBbm5vdGF0aW9ucyhtZXRob2QucHJveHkoKSkuc2l6ZSgpID09IDApOw0KLQkJcGFyYW1ldGVyQW5ub3RhdGlvbnMgPSBjb250YWluZXIuZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnModHlwZVBhcmFtZXRlci5wcm94eSgpKTsNCi0NCi0JCVNldDxTdHJpbmc+IG5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOw0KLQkJbmFtZXMuY2xlYXIoKTsNCi0JCW5hbWVzLmFkZCgiYW5ub3RhdGlvbk5hbWUxIik7DQotCQluYW1lcy5hZGQoImFubm90YXRpb25OYW1lMiIpOw0KLQkJbmFtZXMuYWRkKCJhbm5vdGF0aW9uTmFtZTMiKTsNCi0JCW5hbWVzLmFkZCgiYW5ub3RhdGlvbk5hbWU0Iik7DQotCQkNCi0JCWZvciAoSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IGFubm90YXRpb24gOiBwYXJhbWV0ZXJBbm5vdGF0aW9ucykNCi0JCXsNCi0JCQlhc3NlcnRUcnVlKG5hbWVzLmNvbnRhaW5zKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSkpOw0KLQkJCW5hbWVzLnJlbW92ZShhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpOw0KLQkJCWlmKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoImFubm90YXRpb25OYW1lMSIpKQ0KLQkJCXsNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSA9PSAxKTsJDQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lQm9vbGVhbiIpLmVxdWFscygidHJ1ZSIpKTsNCi0JCQl9DQotCQkJaWYoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscygiYW5ub3RhdGlvbk5hbWUyIikpDQotCQkJew0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpID09IDEpOwkNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImF0dHJpYnV0ZU5hbWVJbnRlZ2VyIikuZXF1YWxzKCIxMDAiKSk7DQotCQkJfQ0KLQkJCWlmKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoImFubm90YXRpb25OYW1lMyIpKQ0KLQkJCXsNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSA9PSAxKTsJDQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lUXVhbGlmaWVkIikuZXF1YWxzKCJvcmcuZWNsaXBzZS50ZXN0RW51bWVyYXRpb24uVkFMVUUiKSk7DQotCQkJfQ0KLQkJCWlmKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoImFubm90YXRpb25OYW1lNCIpKQ0KLQkJCXsNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSA9PSAxKTsNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImF0dHJpYnV0ZU5hbWVTdHJpbmciKS5lcXVhbHMoInZhbHVlU3RyaW5nIikpOwkJCQkNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdENvbWJpbmVkKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXIgY29udGFpbmVyID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lcigpOw0KLQkJQW5ub3RhdGlvblByb3BlcnR5IGFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoInBhcmFtQW5ub3RhdGlvbk5hbWUiLCAicGFyYW1BdHRyaWJ1dGVOYW1lQm9vbGVhbiIsICJ0cnVlIiwgQXR0cmlidXRlVHlwZUVudW0uQk9PTEVBTik7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuUEFSQU1FVEVSKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoInBhcmFtQW5ub3RhdGlvbk5hbWUiLCAicGFyYW1BdHRyaWJ1dGVOYW1lSW50ZWdlciIsICIxMDAiLCBBdHRyaWJ1dGVUeXBlRW51bS5JTlRFR0VSKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5QQVJBTUVURVIpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgicGFyYW1Bbm5vdGF0aW9uTmFtZSIsICJwYXJhbUF0dHJpYnV0ZU5hbWVRdWFsaWZpZWQiLCAib3JnLmVjbGlwc2UudGVzdEVudW1lcmF0aW9uLlBBUkFNX1ZBTFVFIiwgQXR0cmlidXRlVHlwZUVudW0uUVVBTElGSUVEX05BTUUpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlBBUkFNRVRFUik7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJwYXJhbUFubm90YXRpb25OYW1lIiwgInBhcmFtQXR0cmlidXRlTmFtZVN0cmluZyIsICJwYXJhbVZhbHVlU3RyaW5nIiwgQXR0cmlidXRlVHlwZUVudW0uU1RSSU5HKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5QQVJBTUVURVIpOw0KLQ0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgibWV0aG9kQW5ub3RhdGlvbk5hbWUiLCAibWV0aG9kQXR0cmlidXRlTmFtZUJvb2xlYW4iLCAiZmFsc2UiLCBBdHRyaWJ1dGVUeXBlRW51bS5CT09MRUFOKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5NRVRIT0QpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgibWV0aG9kQW5ub3RhdGlvbk5hbWUiLCAibWV0aG9kQXR0cmlidXRlTmFtZUludGVnZXIiLCAiMTAxIiwgQXR0cmlidXRlVHlwZUVudW0uSU5URUdFUik7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuTUVUSE9EKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoIm1ldGhvZEFubm90YXRpb25OYW1lIiwgIm1ldGhvZEF0dHJpYnV0ZU5hbWVRdWFsaWZpZWQiLCAib3JnLmVjbGlwc2UudGVzdEVudW1lcmF0aW9uLk1FVEhPRF9WQUxVRSIsIEF0dHJpYnV0ZVR5cGVFbnVtLlFVQUxJRklFRF9OQU1FKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5NRVRIT0QpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgibWV0aG9kQW5ub3RhdGlvbk5hbWUiLCAibWV0aG9kQXR0cmlidXRlTmFtZVN0cmluZyIsICJtZXRob2RWYWx1ZVN0cmluZyIsIEF0dHJpYnV0ZVR5cGVFbnVtLlNUUklORyk7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuTUVUSE9EKTsNCi0NCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoInR5cGVBbm5vdGF0aW9uTmFtZSIsICJ0eXBlQXR0cmlidXRlTmFtZUJvb2xlYW4iLCAiZmFsc2UiLCBBdHRyaWJ1dGVUeXBlRW51bS5CT09MRUFOKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5UWVBFKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoInR5cGVBbm5vdGF0aW9uTmFtZSIsICJ0eXBlQXR0cmlidXRlTmFtZUludGVnZXIiLCAiMSIsIEF0dHJpYnV0ZVR5cGVFbnVtLklOVEVHRVIpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlRZUEUpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgidHlwZUFubm90YXRpb25OYW1lIiwgInR5cGVBdHRyaWJ1dGVOYW1lUXVhbGlmaWVkIiwgIm9yZy5lY2xpcHNlLnRlc3RFbnVtZXJhdGlvbi5UWVBFX1ZBTFVFIiwgQXR0cmlidXRlVHlwZUVudW0uUVVBTElGSUVEX05BTUUpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlRZUEUpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgidHlwZUFubm90YXRpb25OYW1lIiwgInR5cGVBdHRyaWJ1dGVOYW1lU3RyaW5nIiwgInR5cGVWYWx1ZVN0cmluZyIsIEF0dHJpYnV0ZVR5cGVFbnVtLlNUUklORyk7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuVFlQRSk7DQotDQotCQlhc3NlcnRUcnVlKGNvbnRhaW5lci5nZXRUeXBlQW5ub3RhdGlvbnModHlwZS5wcm94eSgpKS5zaXplKCkgPT0gMSk7DQotCQlhc3NlcnRUcnVlKGNvbnRhaW5lci5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucyh0eXBlUGFyYW1ldGVyLnByb3h5KCkpLnNpemUoKSA9PSAxKTsNCi0JCWFzc2VydFRydWUoY29udGFpbmVyLmdldE1ldGhvZEFubm90YXRpb25zKG1ldGhvZC5wcm94eSgpKS5zaXplKCkgPT0gMSk7DQotCQkNCi0JCVNldDxJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4+IHBhcmFtZXRlckFubm90YXRpb25zID0gY29udGFpbmVyLmdldFBhcmFtZXRlckFubm90YXRpb25zKHR5cGVQYXJhbWV0ZXIucHJveHkoKSk7DQotCQlmb3IgKElBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPiBhbm5vdGF0aW9uIDogcGFyYW1ldGVyQW5ub3RhdGlvbnMpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJwYXJhbUFubm90YXRpb25OYW1lIikpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkgPT0gNCk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoInBhcmFtQXR0cmlidXRlTmFtZUJvb2xlYW4iKS5lcXVhbHMoInRydWUiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoInBhcmFtQXR0cmlidXRlTmFtZUludGVnZXIiKS5lcXVhbHMoIjEwMCIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgicGFyYW1BdHRyaWJ1dGVOYW1lUXVhbGlmaWVkIikuZXF1YWxzKCJvcmcuZWNsaXBzZS50ZXN0RW51bWVyYXRpb24uUEFSQU1fVkFMVUUiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoInBhcmFtQXR0cmlidXRlTmFtZVN0cmluZyIpLmVxdWFscygicGFyYW1WYWx1ZVN0cmluZyIpKTsNCi0JCX0NCi0NCi0JCVNldDxJQW5ub3RhdGlvbjxJTWV0aG9kPj4gbWV0aG9kQW5ub3RhdGlvbnMgPSBjb250YWluZXIuZ2V0TWV0aG9kQW5ub3RhdGlvbnMobWV0aG9kLnByb3h5KCkpOw0KLQkJZm9yIChJQW5ub3RhdGlvbjxJTWV0aG9kPiBhbm5vdGF0aW9uIDogbWV0aG9kQW5ub3RhdGlvbnMpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJtZXRob2RBbm5vdGF0aW9uTmFtZSIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpID09IDQpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJtZXRob2RBdHRyaWJ1dGVOYW1lQm9vbGVhbiIpLmVxdWFscygiZmFsc2UiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoIm1ldGhvZEF0dHJpYnV0ZU5hbWVJbnRlZ2VyIikuZXF1YWxzKCIxMDEiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoIm1ldGhvZEF0dHJpYnV0ZU5hbWVRdWFsaWZpZWQiKS5lcXVhbHMoIm9yZy5lY2xpcHNlLnRlc3RFbnVtZXJhdGlvbi5NRVRIT0RfVkFMVUUiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoIm1ldGhvZEF0dHJpYnV0ZU5hbWVTdHJpbmciKS5lcXVhbHMoIm1ldGhvZFZhbHVlU3RyaW5nIikpOw0KLQkJfQ0KLQ0KLQkJU2V0PElBbm5vdGF0aW9uPElUeXBlPj4gdHlwZUFubm90YXRpb25zID0gY29udGFpbmVyLmdldFR5cGVBbm5vdGF0aW9ucyh0eXBlLnByb3h5KCkpOw0KLQkJZm9yIChJQW5ub3RhdGlvbjxJVHlwZT4gYW5ub3RhdGlvbiA6IHR5cGVBbm5vdGF0aW9ucykNCi0JCXsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoInR5cGVBbm5vdGF0aW9uTmFtZSIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpID09IDQpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJ0eXBlQXR0cmlidXRlTmFtZUJvb2xlYW4iKS5lcXVhbHMoImZhbHNlIikpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJ0eXBlQXR0cmlidXRlTmFtZUludGVnZXIiKS5lcXVhbHMoIjEiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoInR5cGVBdHRyaWJ1dGVOYW1lUXVhbGlmaWVkIikuZXF1YWxzKCJvcmcuZWNsaXBzZS50ZXN0RW51bWVyYXRpb24uVFlQRV9WQUxVRSIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgidHlwZUF0dHJpYnV0ZU5hbWVTdHJpbmciKS5lcXVhbHMoInR5cGVWYWx1ZVN0cmluZyIpKTsNCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uVXRpbHNUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uVXRpbHNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVkMjQ1MmYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQW5ub3RhdGlvblV0aWxzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnM7DQotDQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LkNsYXNzTG9hZGluZ1Rlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uV3JpdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JVmFsdWU7DQotDQotcHVibGljIGNsYXNzIEFubm90YXRpb25VdGlsc1Rlc3QgZXh0ZW5kcyBDbGFzc0xvYWRpbmdUZXN0DQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1JDID0gInNyYyI7DQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQ0sgPSAib3JnLmVjbGlwc2UuZGVtbyI7DQotDQotCXByaXZhdGUgSVR5cGUgZW5kcG9pbnQ7DQotDQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCWNyZWF0ZUphdmFQcm9qZWN0KFNSQywgUENLKTsNCi0JCWVuZHBvaW50ID0gY3JlYXRlQ2xhc3MoIkVuZHBvaW50LnNyYyIsICJFbmRwb2ludCIpOw0KLQkJQW5ub3RhdGlvbkZhY3RvcnkucmVtb3ZlQW5ub3RhdGlvbnNGcm9tSmF2YUVsZW1lbnQoZW5kcG9pbnQpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXNldFVwKCk7DQotCQkNCi0JCUlWYWx1ZSBzdiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKCJNeSBTdHJpbmcgVmFsdWUiKTsNCi0NCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHB2ID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJcHYuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoIlBhcmFtIiwgc3YpKTsNCi0JCQ0KLQkJSUFubm90YXRpb248SUZpZWxkPiBhbm4gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJvcmcuZWNsaXBzZS50ZXN0Lk15QW5ub3RhdGlvbiIsIHB2LCBlbmRwb2ludC5nZXRGaWVsZCgiZmllbGQxIikpOw0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KGFubiwgZW5kcG9pbnQuZ2V0RmllbGQoImZpZWxkMSIpKTsNCi0JCWFzc2VydEVxdWFscyhhbm4uZ2V0QXBwbGllZEVsZW1lbnQoKSwgZW5kcG9pbnQuZ2V0RmllbGQoImZpZWxkMSIpKTsNCi0JCQ0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnJlbW92ZShhbm4pOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0Fubm90YXRpb25zQmFzZUltcGxUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uc0Jhc2VJbXBsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MTVkMTQ2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0Fubm90YXRpb25zQmFzZUltcGxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnM7DQotDQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuQ2xhc3NMb2FkaW5nVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25Xcml0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklMb2NhdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVZhbHVlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5Bbm5vdGF0aW9uSW1wbDsNCi0NCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbnNCYXNlSW1wbFRlc3QgZXh0ZW5kcyBDbGFzc0xvYWRpbmdUZXN0DQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1JDID0gInNyYyI7DQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQ0sgPSAib3JnLmVjbGlwc2UuZGVtbyI7DQotDQotCXByaXZhdGUgSVR5cGUgZW5kcG9pbnQ7DQotDQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCXNldFVwV2l0b3V0UmVtb3ZlKCk7DQotCQlBbm5vdGF0aW9uRmFjdG9yeS5yZW1vdmVBbm5vdGF0aW9uc0Zyb21KYXZhRWxlbWVudChlbmRwb2ludCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc2V0VXBXaXRvdXRSZW1vdmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJY3JlYXRlSmF2YVByb2plY3QoU1JDLCBQQ0spOw0KLQkJZW5kcG9pbnQgPSBjcmVhdGVDbGFzcygiRW5kcG9pbnQuc3JjIiwgIkVuZHBvaW50Iik7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHNldFVwV2l0b3V0UmVtb3ZlMigpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQljcmVhdGVKYXZhUHJvamVjdChTUkMsIFBDSyk7DQotCQllbmRwb2ludCA9IGNyZWF0ZUNsYXNzKCJFbmRwb2ludEFubkluc3BlY3Rvci5zcmMiLCAiRW5kcG9pbnRBbm5JbnNwZWN0b3IiKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEJhc2VBbm5vdGF0dGlvbkZ1bmN0aW9uYWxpdHkoKQ0KLQl7DQotCQlBbm5vdGF0aW9uSW1wbDxJVHlwZT4gYW5uID0gbmV3IEFubm90YXRpb25JbXBsPElUeXBlPigiY29tLnNwYS50ZXN0Lk15QW5ub3RhdGlvbiIsIG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKSk7DQotCQlhc3NlcnRFcXVhbHMoYW5uLmdldEFubm90YXRpb25OYW1lKCksICJjb20uc3BhLnRlc3QuTXlBbm5vdGF0aW9uIik7DQotCQlhc3NlcnRFcXVhbHMoYW5uLmdldFNpbXBsZUFubm90YXRpb25OYW1lKCksICJNeUFubm90YXRpb24iKTsNCi0JCS8vYXNzZXJ0RXF1YWxzKGFubi5nZXRWYWx1ZVR5cGUoKSwgSVZhbHVlLkFOTk9UQVRJT05fVkFMVUUpOw0KLQkJDQotCQlhbm4gPSBuZXcgQW5ub3RhdGlvbkltcGw8SVR5cGU+KCJNeU5ld0Fubm90YXRpb24iLCBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCkpOw0KLQkJYXNzZXJ0RXF1YWxzKGFubi5nZXRBbm5vdGF0aW9uTmFtZSgpLCAiTXlOZXdBbm5vdGF0aW9uIik7DQotCQlhc3NlcnRFcXVhbHMoYW5uLmdldFNpbXBsZUFubm90YXRpb25OYW1lKCksICJNeU5ld0Fubm90YXRpb24iKTsNCi0JCS8vYXNzZXJ0RXF1YWxzKGFubi5nZXRWYWx1ZVR5cGUoKSwgSVZhbHVlLkFOTk9UQVRJT05fVkFMVUUpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJc2V0VXAoKTsNCi0JCQ0KLQkJSVZhbHVlIHF2ID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUXVhbGlmaWVkTmFtZVZhbHVlKCJmdWxsLnF1YWxpZmllZC5OYW1lIik7DQotDQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwdiA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCXB2LmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJwYXJhbSIsIHF2KSk7DQotCQkNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBhbm4gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJvcmcuZWNsaXBzZS50ZXN0Lk15QW5ub3RhdGlvbiIsIHB2LCBlbmRwb2ludCk7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoYW5uLCBlbmRwb2ludCk7DQotDQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElUeXBlPj4gYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9ucyk7DQotCQlhc3NlcnRUcnVlKGFubm90YXRpb25zLnNpemUoKSA9PSAxKTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiB0bXBBbm4gPSBhbm5vdGF0aW9ucy5pdGVyYXRvcigpLm5leHQoKTsNCi0JCQ0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnJlbW92ZSh0bXBBbm4pOw0KLQkJDQotCQlhbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCk7DQotCQlhc3NlcnRUcnVlKGFubm90YXRpb25zLnNpemUoKSA9PSAwKTsNCi0JCQ0KLQkJSU1ldGhvZFtdIG1ldGhvZHMgPSBlbmRwb2ludC5nZXRNZXRob2RzKCk7DQotCQlmb3IgKElNZXRob2QgbWV0aG9kIDogbWV0aG9kcykNCi0JCXsNCi0JCQlpZihtZXRob2QuZ2V0UmF3UGFyYW1ldGVyTmFtZXMoKSAhPSBudWxsICYmIG1ldGhvZC5nZXRSYXdQYXJhbWV0ZXJOYW1lcygpLmxlbmd0aCA+IDApDQotCQkJew0KLQkJCQlJQW5ub3RhdGlvbjxJTWV0aG9kPiBhbm5NID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigib3JnLmVjbGlwc2UudGVzdC5NeUFubm90YXRpb25NZXRob2QiLCBwdiwgbWV0aG9kKTsNCi0JCQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KGFubk0sIG1ldGhvZCk7DQotCQkJCWFzc2VydEVxdWFscygiZnVsbC5xdWFsaWZpZWQuTmFtZSIsIGFubk0uZ2V0UHJvcGVydHlWYWx1ZSgicGFyYW0iKSk7DQotCQkJCWFzc2VydE51bGwoYW5uTS5nZXRQcm9wZXJ0eVZhbHVlKCJwYXJhbU5vdEV4aXN0cyIpKTsNCi0JCQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJTWV0aG9kPj4gYW5ub3RhdGlvbnNNID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdE1ldGhvZChtZXRob2QpOw0KLQkJCQlJQW5ub3RhdGlvbjxJTWV0aG9kPiBhbm5vdGF0TSA9IGFubm90YXRpb25zTS5pdGVyYXRvcigpLm5leHQoKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJxdWFsaWZpZWQuTmFtZSIsIGFubm90YXRNLmdldFByb3BlcnR5VmFsdWUoInBhcmFtIikpOw0KLQkJCQkNCi0JCQkJSVZhbHVlIHN2ID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoIk5ldyBTdHJpbmcgVmFsdWUiKTsNCi0JCQkJYW5uTS5nZXRQYXJhbVZhbHVlUGFpcnMoKS5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgiTmV3UGFyYW0iLCBzdikpOw0KLQkJCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkudXBkYXRlKGFubk0pOw0KLQkJCQlhbm5vdGF0aW9uc00gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKG1ldGhvZCk7DQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbnNNLnNpemUoKSA9PSAxKTsNCi0JCQkJYW5ub3RhdE0gPSBhbm5vdGF0aW9uc00uaXRlcmF0b3IoKS5uZXh0KCk7DQotCQkJCWFzc2VydEVxdWFscygiTmV3IFN0cmluZyBWYWx1ZSIsIGFubm90YXRNLmdldFByb3BlcnR5VmFsdWUoIk5ld1BhcmFtIikpOw0KLQkJCQlhc3NlcnRFcXVhbHMoInF1YWxpZmllZC5OYW1lIiwgYW5ub3RhdE0uZ2V0UHJvcGVydHlWYWx1ZSgicGFyYW0iKSk7DQotCQkJCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmUoYW5ub3RhdE0pOw0KLQkJCQlhbm5vdGF0aW9uc00gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKG1ldGhvZCk7DQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbnNNLnNpemUoKSA9PSAwKTsNCi0NCi0JCQkJSVZhbHVlIHN2MyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKCJOZXcgU3RyaW5nIFZhbHVlMyIpOw0KLQkJCQlhbm5NLmdldFBhcmFtVmFsdWVQYWlycygpLmNsZWFyKCk7DQotCQkJCWFubk0uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoIk5ld1BhcmFtIiwgc3YzKSk7DQotCQkJCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS51cGRhdGUoYW5uTSk7DQotCQkJCWFubm90YXRpb25zTSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RNZXRob2QobWV0aG9kKTsNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uc00uc2l6ZSgpID09IDEpOw0KLQkJCQlhbm5vdGF0TSA9IGFubm90YXRpb25zTS5pdGVyYXRvcigpLm5leHQoKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJOZXcgU3RyaW5nIFZhbHVlMyIsIGFubm90YXRNLmdldFByb3BlcnR5VmFsdWUoIk5ld1BhcmFtIikpOw0KLQ0KLQkJCQkvLyBjbGVhciBhbm5vdGF0aW9uDQotCQkJCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmUoYW5uTSk7DQotDQotCQkJCWFubm90YXRpb25zTSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RNZXRob2QobWV0aG9kKTsNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uc00uc2l6ZSgpID09IDApOw0KLQkJCQkNCi0JCQkJZm9yKGludCBpID0gMDsgaSA8IG1ldGhvZC5nZXRSYXdQYXJhbWV0ZXJOYW1lcygpLmxlbmd0aDsgaSsrKQ0KLQkJCQl7DQotCQkJCQlJVHlwZVBhcmFtZXRlciBwYXJhbSA9IG1ldGhvZC5nZXRUeXBlUGFyYW1ldGVyKG1ldGhvZC5nZXRSYXdQYXJhbWV0ZXJOYW1lcygpW2ldKTsNCi0NCi0JCQkJCUlWYWx1ZSBzdlBhcmFtID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoIlN0cmluZyBWYWx1IFBhcmFtIik7DQotCQkJCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwdlBhcmFtID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJCQkJcHZQYXJhbS5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgiUGFyYW1BdHJpYnV0ZSIsIHN2UGFyYW0pKTsNCi0JCQkJCUlBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPiBhbm5QID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigiUGFyYW1Bbm5vdGF0aW9uIiwgcHZQYXJhbSwgcGFyYW0pOw0KLQkJCQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KGFublAsIHBhcmFtKTsNCi0JCQkJCQ0KLQkJCQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnJlbW92ZShhbm5QKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEFubm90YXR0aW9uVXBkYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlzZXRVcCgpOw0KLQkJDQotCQlJVmFsdWUgc3YgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgiU3RyaW5nVmFsdWUiKTsNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHNwdiA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCXNwdi5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgic3RyaW5nUGFyYW0iLCBzdikpOw0KLQkJSUFubm90YXRpb248SVR5cGU+IHR5cGVBbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigib3JnLmVjbGlwc2UudGVzdC5NeVR5cGVBbm5vdGF0aW9uIiwgc3B2LCBlbmRwb2ludCk7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQodHlwZUFubm90YXRpb24sIGVuZHBvaW50KTsNCi0NCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SVR5cGU+PiB0eXBlQW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJYXNzZXJ0Tm90TnVsbCh0eXBlQW5ub3RhdGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZSh0eXBlQW5ub3RhdGlvbnMuc2l6ZSgpID09IDEpOw0KLQkJSUFubm90YXRpb248SVR5cGU+IHRlbXBUeXBlQW5ub3RhdGlvbiA9IHR5cGVBbm5vdGF0aW9ucy5pdGVyYXRvcigpLm5leHQoKTsNCi0JCWFzc2VydEVxdWFscyh0ZW1wVHlwZUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgic3RyaW5nUGFyYW0iKSwgIlN0cmluZ1ZhbHVlIik7DQotCQkNCi0JCUlWYWx1ZSBuZXdTViA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKCJOZXdTdHJpbmdWYWx1ZSIpOw0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gbmV3U1BWID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJbmV3U1BWLmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJzdHJpbmdQYXJhbSIsIG5ld1NWKSk7DQotCQlBbm5vdGF0aW9uSW1wbDxJVHlwZT4gbmV3VHlwZUFubm90YXRpb24gPSBuZXcgQW5ub3RhdGlvbkltcGw8SVR5cGU+KCJvcmcuZWNsaXBzZS50ZXN0Lk15VHlwZUFubm90YXRpb24iLCBuZXdTUFYpOw0KLQkJbmV3VHlwZUFubm90YXRpb24uc2V0QXBwbGllZEVsZW1lbnRXaXRob3V0U2F2ZShlbmRwb2ludCk7DQotCQkNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS51cGRhdGUobmV3VHlwZUFubm90YXRpb24pOw0KLQkJDQotCQl0eXBlQW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJYXNzZXJ0Tm90TnVsbCh0eXBlQW5ub3RhdGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZSh0eXBlQW5ub3RhdGlvbnMuc2l6ZSgpID09IDEpOw0KLQkJdGVtcFR5cGVBbm5vdGF0aW9uID0gdHlwZUFubm90YXRpb25zLml0ZXJhdG9yKCkubmV4dCgpOw0KLQkJYXNzZXJ0RXF1YWxzKHRlbXBUeXBlQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJzdHJpbmdQYXJhbSIpLCAiTmV3U3RyaW5nVmFsdWUiKTsNCi0NCi0JCW5ld1NWID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoIk5ld2VzdFN0cmluZ1ZhbHVlIik7DQotCQluZXdTUFYgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQluZXdTUFYuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoIm5ld2VzdFN0cmluZ1BhcmFtIiwgbmV3U1YpKTsNCi0JCW5ld1R5cGVBbm5vdGF0aW9uID0gbmV3IEFubm90YXRpb25JbXBsPElUeXBlPigib3JnLmVjbGlwc2UudGVzdC5NeVR5cGVBbm5vdGF0aW9uIiwgbmV3U1BWKTsNCi0JCW5ld1R5cGVBbm5vdGF0aW9uLnNldEFwcGxpZWRFbGVtZW50V2l0aG91dFNhdmUoZW5kcG9pbnQpOw0KLQkJDQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkudXBkYXRlKG5ld1R5cGVBbm5vdGF0aW9uKTsNCi0NCi0JCXR5cGVBbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCk7DQotCQlhc3NlcnROb3ROdWxsKHR5cGVBbm5vdGF0aW9ucyk7DQotCQlhc3NlcnRUcnVlKHR5cGVBbm5vdGF0aW9ucy5zaXplKCkgPT0gMSk7DQotCQl0ZW1wVHlwZUFubm90YXRpb24gPSB0eXBlQW5ub3RhdGlvbnMuaXRlcmF0b3IoKS5uZXh0KCk7DQotCQlhc3NlcnROdWxsKHRlbXBUeXBlQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJzdHJpbmdQYXJhbSIpKTsNCi0JCWFzc2VydEVxdWFscyh0ZW1wVHlwZUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgibmV3ZXN0U3RyaW5nUGFyYW0iKSwgIk5ld2VzdFN0cmluZ1ZhbHVlIik7DQotDQotCQlJTWV0aG9kIGZpcnN0TWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kcygpWzBdOw0KLQ0KLQkJSVZhbHVlIGl2ID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlSW50ZWdlclZhbHVlKCIxMCIpOw0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gaXB2ID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJaXB2LmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJpbnRlZ2VyUGFyYW0iLCBpdikpOw0KLQkJSUFubm90YXRpb248SU1ldGhvZD4gbWV0aG9kQW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIm9yZy5lY2xpcHNlLnRlc3QuTXlNZXRob2RBbm5vdGF0aW9uIiwgaXB2LCBmaXJzdE1ldGhvZCk7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQobWV0aG9kQW5ub3RhdGlvbiwgZmlyc3RNZXRob2QpOw0KLQ0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJTWV0aG9kPj4gbWV0aG9kQW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKGZpcnN0TWV0aG9kKTsNCi0JCWFzc2VydE5vdE51bGwobWV0aG9kQW5ub3RhdGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZShtZXRob2RBbm5vdGF0aW9ucy5zaXplKCkgPT0gMSk7DQotCQlJQW5ub3RhdGlvbjxJTWV0aG9kPiB0ZW1wTWV0aG9kQW5ub3RhdGlvbiA9IG1ldGhvZEFubm90YXRpb25zLml0ZXJhdG9yKCkubmV4dCgpOw0KLQkJYXNzZXJ0RXF1YWxzKHRlbXBNZXRob2RBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImludGVnZXJQYXJhbSIpLCAiMTAiKTsNCi0JCQ0KLQkJSVZhbHVlIG5ld0lWID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlSW50ZWdlclZhbHVlKCIxMSIpOw0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gbmV3SVBWID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJbmV3SVBWLmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJpbnRlZ2VyUGFyYW0iLCBuZXdJVikpOw0KLQkJQW5ub3RhdGlvbkltcGw8SU1ldGhvZD4gbmV3TWV0aG9kQW5ub3RhdGlvbiA9IG5ldyBBbm5vdGF0aW9uSW1wbDxJTWV0aG9kPigib3JnLmVjbGlwc2UudGVzdC5NeU1ldGhvZEFubm90YXRpb24iLCBuZXdJUFYpOw0KLQkJbmV3TWV0aG9kQW5ub3RhdGlvbi5zZXRBcHBsaWVkRWxlbWVudFdpdGhvdXRTYXZlKGZpcnN0TWV0aG9kKTsNCi0JCQ0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnVwZGF0ZShuZXdNZXRob2RBbm5vdGF0aW9uKTsNCi0JCQ0KLQkJbWV0aG9kQW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKGZpcnN0TWV0aG9kKTsNCi0JCWFzc2VydE5vdE51bGwobWV0aG9kQW5ub3RhdGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZShtZXRob2RBbm5vdGF0aW9ucy5zaXplKCkgPT0gMSk7DQotCQl0ZW1wTWV0aG9kQW5ub3RhdGlvbiA9IG1ldGhvZEFubm90YXRpb25zLml0ZXJhdG9yKCkubmV4dCgpOw0KLQkJYXNzZXJ0RXF1YWxzKHRlbXBNZXRob2RBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImludGVnZXJQYXJhbSIpLCAiMTEiKTsNCi0NCi0JCW5ld0lWID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlSW50ZWdlclZhbHVlKCIxMDAiKTsNCi0JCW5ld0lQViA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCW5ld0lQVi5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgibmV3ZXN0SW50ZWdlclBhcmFtIiwgbmV3SVYpKTsNCi0JCW5ld01ldGhvZEFubm90YXRpb24gPSBuZXcgQW5ub3RhdGlvbkltcGw8SU1ldGhvZD4oIm9yZy5lY2xpcHNlLnRlc3QuTXlNZXRob2RBbm5vdGF0aW9uIiwgbmV3SVBWKTsNCi0JCW5ld01ldGhvZEFubm90YXRpb24uc2V0QXBwbGllZEVsZW1lbnRXaXRob3V0U2F2ZShmaXJzdE1ldGhvZCk7DQotCQkNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS51cGRhdGUobmV3TWV0aG9kQW5ub3RhdGlvbik7DQotDQotCQltZXRob2RBbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RNZXRob2QoZmlyc3RNZXRob2QpOw0KLQkJYXNzZXJ0Tm90TnVsbChtZXRob2RBbm5vdGF0aW9ucyk7DQotCQlhc3NlcnRUcnVlKG1ldGhvZEFubm90YXRpb25zLnNpemUoKSA9PSAxKTsNCi0JCXRlbXBNZXRob2RBbm5vdGF0aW9uID0gbWV0aG9kQW5ub3RhdGlvbnMuaXRlcmF0b3IoKS5uZXh0KCk7DQotCQlhc3NlcnROdWxsKHRlbXBNZXRob2RBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImludGVnZXJQYXJhbSIpKTsNCi0JCWFzc2VydEVxdWFscyh0ZW1wTWV0aG9kQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJuZXdlc3RJbnRlZ2VyUGFyYW0iKSwgIjEwMCIpOw0KLQ0KLQkJSVR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IGZpcnN0TWV0aG9kLmdldFR5cGVQYXJhbWV0ZXIoImFubm90YXRlZFBhcmFtIik7DQotDQotCQlJVmFsdWUgYnYgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVCb29sZWFuVmFsdWUodHJ1ZSk7DQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBicHYgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQlicHYuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoImJvb2xlYW5QYXJhbSIsIGJ2KSk7DQotCQlJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4gcGFyYW1ldGVyQW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIm9yZy5lY2xpcHNlLnRlc3QuTXlQYXJhbWV0ZXJBbm5vdGF0aW9uIiwgYnB2LCB0eXBlUGFyYW1ldGVyKTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChwYXJhbWV0ZXJBbm5vdGF0aW9uLCB0eXBlUGFyYW1ldGVyKTsNCi0NCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+PiBwYXJhbWV0ZXJBbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RQYXJhbSh0eXBlUGFyYW1ldGVyKTsNCi0JCWFzc2VydE5vdE51bGwocGFyYW1ldGVyQW5ub3RhdGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZShwYXJhbWV0ZXJBbm5vdGF0aW9ucy5zaXplKCkgPT0gMSk7DQotCQlJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4gdGVtcFBhcmFtZXRlckFubm90YXRpb24gPSBwYXJhbWV0ZXJBbm5vdGF0aW9ucy5pdGVyYXRvcigpLm5leHQoKTsNCi0JCWFzc2VydEVxdWFscyh0ZW1wUGFyYW1ldGVyQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJib29sZWFuUGFyYW0iKSwgInRydWUiKTsNCi0JCQ0KLQkJSVZhbHVlIG5ld0JWID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQm9vbGVhblZhbHVlKGZhbHNlKTsNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IG5ld0JQViA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCW5ld0JQVi5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgiYm9vbGVhblBhcmFtIiwgbmV3QlYpKTsNCi0JCUFubm90YXRpb25JbXBsPElUeXBlUGFyYW1ldGVyPiBuZXdQYXJhbWV0ZXJBbm5vdGF0aW9uID0gbmV3IEFubm90YXRpb25JbXBsPElUeXBlUGFyYW1ldGVyPigib3JnLmVjbGlwc2UudGVzdC5NeVBhcmFtZXRlckFubm90YXRpb24iLCBuZXdCUFYpOw0KLQkJbmV3UGFyYW1ldGVyQW5ub3RhdGlvbi5zZXRBcHBsaWVkRWxlbWVudFdpdGhvdXRTYXZlKHR5cGVQYXJhbWV0ZXIpOw0KLQkJDQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkudXBkYXRlKG5ld1BhcmFtZXRlckFubm90YXRpb24pOw0KLQkJDQotCQlwYXJhbWV0ZXJBbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RQYXJhbSh0eXBlUGFyYW1ldGVyKTsNCi0JCWFzc2VydE5vdE51bGwocGFyYW1ldGVyQW5ub3RhdGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZShwYXJhbWV0ZXJBbm5vdGF0aW9ucy5zaXplKCkgPT0gMSk7DQotCQl0ZW1wUGFyYW1ldGVyQW5ub3RhdGlvbiA9IHBhcmFtZXRlckFubm90YXRpb25zLml0ZXJhdG9yKCkubmV4dCgpOw0KLQkJYXNzZXJ0RXF1YWxzKHRlbXBQYXJhbWV0ZXJBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImJvb2xlYW5QYXJhbSIpLCAiZmFsc2UiKTsNCi0NCi0JCW5ld0JWID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQm9vbGVhblZhbHVlKHRydWUpOw0KLQkJbmV3QlBWID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJbmV3QlBWLmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJuZXdlc3RCb29sZWFuUGFyYW0iLCBuZXdCVikpOw0KLQkJbmV3UGFyYW1ldGVyQW5ub3RhdGlvbiA9IG5ldyBBbm5vdGF0aW9uSW1wbDxJVHlwZVBhcmFtZXRlcj4oIm9yZy5lY2xpcHNlLnRlc3QuTXlQYXJhbWV0ZXJBbm5vdGF0aW9uIiwgbmV3QlBWKTsNCi0JCW5ld1BhcmFtZXRlckFubm90YXRpb24uc2V0QXBwbGllZEVsZW1lbnRXaXRob3V0U2F2ZSh0eXBlUGFyYW1ldGVyKTsNCi0JCQ0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnVwZGF0ZShuZXdQYXJhbWV0ZXJBbm5vdGF0aW9uKTsNCi0NCi0JCXBhcmFtZXRlckFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFBhcmFtKHR5cGVQYXJhbWV0ZXIpOw0KLQkJYXNzZXJ0Tm90TnVsbChwYXJhbWV0ZXJBbm5vdGF0aW9ucyk7DQotCQlhc3NlcnRUcnVlKHBhcmFtZXRlckFubm90YXRpb25zLnNpemUoKSA9PSAxKTsNCi0JCXRlbXBQYXJhbWV0ZXJBbm5vdGF0aW9uID0gcGFyYW1ldGVyQW5ub3RhdGlvbnMuaXRlcmF0b3IoKS5uZXh0KCk7DQotCQlhc3NlcnROdWxsKHRlbXBQYXJhbWV0ZXJBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImJvb2xlYW5QYXJhbSIpKTsNCi0JCWFzc2VydEVxdWFscyh0ZW1wUGFyYW1ldGVyQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJuZXdlc3RCb29sZWFuUGFyYW0iKSwgInRydWUiKTsNCi0JCQ0KLQkJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RTZXRBcHBsaWVkRWxlbWVudFdpdGhvdXRTYXZlKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlzZXRVcCgpOw0KLQkJSVZhbHVlIHF2ID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUXVhbGlmaWVkTmFtZVZhbHVlKCJmdWxsLnF1YWxpZmllZC5OYW1lIik7DQotDQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwdiA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCXB2LmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJwYXJhbSIsIHF2KSk7DQotCQkNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBhbm4gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJvcmcuZWNsaXBzZS50ZXN0Lk15QW5ub3RhdGlvbiIsIHB2LCBlbmRwb2ludCk7DQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoYW5uLCBudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiB3YXMgbm90IHRocm93bi4iKTsNCi0JCX0NCi0JCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCWFzc2VydFRydWUodHJ1ZSk7DQotCQl9DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RNdWx0eUFkZEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXNldFVwV2l0b3V0UmVtb3ZlKCk7DQotCQkNCi0JCUlXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKQ0KLQkJew0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCQkJew0KLQkJCQl0cnkNCi0JCQkJew0KLQkJCQkJU2V0PFN0cmluZz4gYW5ub1NldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsNCi0JCQkJCWFubm9TZXQuYWRkKCJTdGF0ZWxlc3MiKTsNCi0JCQkJCQ0KLQkJCQkJQW5ub3RhdGlvbkZhY3RvcnkucmVtb3ZlQW5ub3RhdGlvbnMoZW5kcG9pbnQsIGFubm9TZXQpOw0KLQkJCQkJDQotCQkJCQlJVmFsdWUgcXYgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoImZ1bGwucXVhbGlmaWVkLk5hbWUiKTsNCi0NCi0JCQkJCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHB2ID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJCQkJcHYuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInBhcmFtIiwgcXYpKTsNCi0JCQkJCQ0KLQkJCQkJSUFubm90YXRpb248SVR5cGU+IGFubiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIm9yZy5lY2xpcHNlLnRlc3QuTXlBbm5vdGF0aW9uIiwgcHYsIGVuZHBvaW50KTsNCi0JCQkJCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChhbm4sIGVuZHBvaW50KTsNCi0NCi0JCQkJCUlWYWx1ZSBzdiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKCJTdHJpbmdWYWx1ZSIpOw0KLQ0KLQkJCQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gc3B2ID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJCQkJc3B2LmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJzdHJpbmdQYXJhbSIsIHN2KSk7DQotCQkJCQkNCi0JCQkJCUlBbm5vdGF0aW9uPElUeXBlPiBzQW5uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigib3JnLmVjbGlwc2UudGVzdC5NeVN0cmluZ0Fubm90YXRpb24iLCBzcHYsIGVuZHBvaW50KTsNCi0JCQkJCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChzQW5uLCBlbmRwb2ludCk7DQotCQkJCQkNCi0JCQkJCQ0KLQkJCQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZT4+IGFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCQkJCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbnMpOw0KLQkJCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5zaXplKCkgPT0gMyk7DQotCQkJCQlJQW5ub3RhdGlvbjxJVHlwZT4gdG1wQW5uID0gYW5ub3RhdGlvbnMuaXRlcmF0b3IoKS5uZXh0KCk7DQotCQkJCQkNCi0JCQkJCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmUodG1wQW5uKTsNCi0JCQkJCQ0KLQkJCQkJYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5zaXplKCkgPT0gMik7DQotCQkJCQkNCi0JCQkJCUlNZXRob2RbXSBtZXRob2RzID0gZW5kcG9pbnQuZ2V0TWV0aG9kcygpOw0KLQkJCQkJZm9yIChJTWV0aG9kIG1ldGhvZCA6IG1ldGhvZHMpDQotCQkJCQl7DQotCQkJCQkJSVZhbHVlIHNtdiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKCJTdHJpbmdWYWx1ZSIpOw0KLQkJCQkJCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHNtcHYgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQkJCQkJc21wdi5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgic3RyaW5nUGFyYW0iLCBzbXYpKTsNCi0JCQkJCQkNCi0JCQkJCQlJQW5ub3RhdGlvbjxJTWV0aG9kPiBzbUFubiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIm9yZy5lY2xpcHNlLnRlc3QuTXlBbm5vdGF0aW9uTWV0aG9kIiwgc21wdiwgbWV0aG9kKTsNCi0JCQkJCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoc21Bbm4sIG1ldGhvZCk7DQotCQkJCQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJTWV0aG9kPj4gYW5ub3RhdGlvbnNNID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdE1ldGhvZChtZXRob2QpOw0KLQkJCQkJCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbnNNKTsNCi0JCQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb25zTS5zaXplKCkgPT0gMik7DQotDQotCQkJCQkJYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJCQkJCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbnMpOw0KLQkJCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuc2l6ZSgpID09IDIpOw0KLQ0KLQkJCQkJfQ0KLQkNCi0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpDQotCQkJCXsNCi0JCQkJCWZhaWwoZS5nZXRNZXNzYWdlKCkpOw0KLQkJCQl9DQotCQkJfQ0KLQkJfTsNCi0JCQ0KLQkJZ2V0VGVzdFByb2plY3QoKS5nZXRTb3VyY2VGb2xkZXIoKS5nZXRSZXNvdXJjZSgpLmdldFdvcmtzcGFjZSgpLnJ1bihydW5uYWJsZSwgbnVsbCk7DQotDQotCQkNCi0JCQ0KLQkJDQotCX0NCi0JCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkNCi0Jew0KLQkJSVZhbHVlIHF2ID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUXVhbGlmaWVkTmFtZVZhbHVlKCJmdWxsLnF1YWxpZmllZC5OYW1lIik7DQotDQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwdiA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCXB2LmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJwYXJhbSIsIHF2KSk7DQotCQkNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBhbm4xID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigib3JnLmVjbGlwc2UudGVzdC5NeUFubm90YXRpb24xIiwgcHYsIGVuZHBvaW50KTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBhbm4yID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigib3JnLmVjbGlwc2UudGVzdC5NeUFubm90YXRpb24yIiwgcHYsIGVuZHBvaW50KTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBhbm4zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigib3JnLmVjbGlwc2UudGVzdC5NeUFubm90YXRpb24xIiwgcHYsIGVuZHBvaW50KTsNCi0JCQ0KLQkJYXNzZXJ0VHJ1ZShhbm4xLmVxdWFscyhhbm4xKSk7DQotCQlhc3NlcnRGYWxzZShhbm4xLmVxdWFscyhudWxsKSk7DQotCQlhc3NlcnRGYWxzZShhbm4xLmVxdWFscyhxdikpOw0KLQkJYXNzZXJ0RmFsc2UoYW5uMS5lcXVhbHMoYW5uMikpOw0KLQkJYXNzZXJ0VHJ1ZShhbm4xLmVxdWFscyhhbm4zKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlzZXRVcCgpOw0KLQkJDQotCQlJVmFsdWUgcXYgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoImZ1bGwucXVhbGlmaWVkLk5hbWUiKTsNCi0NCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHB2ID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJcHYuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInBhcmFtIiwgcXYpKTsNCi0JCQ0KLQkJSUFubm90YXRpb248SUZpZWxkPiBhbm4gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJvcmcuZWNsaXBzZS50ZXN0Lk15QW5ub3RhdGlvbiIsIHB2LCBlbmRwb2ludC5nZXRGaWVsZCgiZmllbGQxIikpOw0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KGFubiwgZW5kcG9pbnQuZ2V0RmllbGQoImZpZWxkMSIpKTsNCi0JCWFzc2VydEVxdWFscyhhbm4uZ2V0QXBwbGllZEVsZW1lbnQoKSwgZW5kcG9pbnQuZ2V0RmllbGQoImZpZWxkMSIpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdExvY2F0b3IoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXNldFVwV2l0b3V0UmVtb3ZlMigpOw0KLQkJDQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gaW5zcGVjdGVkVHlwZUFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgib3JnLmVjbGlwc2UuZGVtby5NeUFubm90YXRpb24iKTsNCi0JCWFzc2VydE5vdE51bGwoaW5zcGVjdGVkVHlwZUFubm90YXRpb24pOw0KLQkJSUxvY2F0b3IgbG9jYXRvciA9IGluc3BlY3RlZFR5cGVBbm5vdGF0aW9uLmdldExvY2F0b3IoKTsNCi0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBhbm5vdGF0aW9uIHN0YXJ0IHBvc2l0aW9uIiwgMTkxLCBsb2NhdG9yLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbGVuZ3RoIiwgMzMsIGxvY2F0b3IuZ2V0TGVuZ3RoKCkpOw0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFybVZhbHVlcyA9IGluc3BlY3RlZFR5cGVBbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpOw0KLQkJZm9yIChJUGFyYW1WYWx1ZVBhaXIgcGFyYW1WYWx1ZVBhaXIgOiBwYXJtVmFsdWVzKQ0KLQkJew0KLQkJCWlmKHBhcmFtVmFsdWVQYWlyLmdldFBhcmFtKCkuZXF1YWxzKCJteVZhbHVlIikpDQotCQkJew0KLQkJCQlsb2NhdG9yID0gcGFyYW1WYWx1ZVBhaXIuZ2V0TG9jYXRvcigpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgc3RhcnQgcG9zaXRpb24iLCAyMDUsIGxvY2F0b3IuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGFubm90YXRpb24gcGFyYW1ldGVyIGxlbmd0aCIsIDE4LCBsb2NhdG9yLmdldExlbmd0aCgpKTsNCi0JCQl9DQotCQl9DQotDQotCQlpbnNwZWN0ZWRUeXBlQW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCJqYXZheC5qd3MuV2ViU2VydmljZSIpOw0KLQkJYXNzZXJ0Tm90TnVsbChpbnNwZWN0ZWRUeXBlQW5ub3RhdGlvbik7DQotCQlsb2NhdG9yID0gaW5zcGVjdGVkVHlwZUFubm90YXRpb24uZ2V0TG9jYXRvcigpOw0KLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIEBXZWJTZXJ2aWNlIGFubm90YXRpb24gc3RhcnQgcG9zaXRpb24iLCAyMjYsIGxvY2F0b3IuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBAV2ViU2VydmljZSBhbm5vdGF0aW9uIGxlbmd0aCIsIDEzNCwgbG9jYXRvci5nZXRMZW5ndGgoKSk7DQotCQlwYXJtVmFsdWVzID0gaW5zcGVjdGVkVHlwZUFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCk7DQotCQlmb3IgKElQYXJhbVZhbHVlUGFpciBwYXJhbVZhbHVlUGFpciA6IHBhcm1WYWx1ZXMpDQotCQl7DQotCQkJaWYocGFyYW1WYWx1ZVBhaXIuZ2V0UGFyYW0oKS5lcXVhbHMoInNlcnZpY2VOYW1lIikpDQotCQkJew0KLQkJCQlsb2NhdG9yID0gcGFyYW1WYWx1ZVBhaXIuZ2V0TG9jYXRvcigpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgc2VydmljZU5hbWUgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgc3RhcnQgcG9zaXRpb24iLCAyMzgsIGxvY2F0b3IuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHNlcnZpY2VOYW1lIGFubm90YXRpb24gcGFyYW1ldGVyIGxlbmd0aCIsIDMxLCBsb2NhdG9yLmdldExlbmd0aCgpKTsNCi0JCQl9DQotDQotCQkJaWYocGFyYW1WYWx1ZVBhaXIuZ2V0UGFyYW0oKS5lcXVhbHMoIm5hbWUiKSkNCi0JCQl7DQotCQkJCWxvY2F0b3IgPSBwYXJhbVZhbHVlUGFpci5nZXRMb2NhdG9yKCk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBzZXJ2aWNlTmFtZSBhbm5vdGF0aW9uIHBhcmFtZXRlciBzdGFydCBwb3NpdGlvbiIsIDI3MSwgbG9jYXRvci5nZXRTdGFydFBvc2l0aW9uKCkpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgc2VydmljZU5hbWUgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgbGVuZ3RoIiwgMTcsIGxvY2F0b3IuZ2V0TGVuZ3RoKCkpOw0KLQkJCX0NCi0NCi0JCQlpZihwYXJhbVZhbHVlUGFpci5nZXRQYXJhbSgpLmVxdWFscygidGFyZ2V0TmFtZXNwYWNlIikpDQotCQkJew0KLQkJCQlsb2NhdG9yID0gcGFyYW1WYWx1ZVBhaXIuZ2V0TG9jYXRvcigpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgdGFyZ2V0TmFtZXNwYWNlIGFubm90YXRpb24gcGFyYW1ldGVyIHN0YXJ0IHBvc2l0aW9uIiwgMjkwLCBsb2NhdG9yLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCB0YXJnZXROYW1lc3BhY2UgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgbGVuZ3RoIiwgNDIsIGxvY2F0b3IuZ2V0TGVuZ3RoKCkpOw0KLQkJCX0NCi0NCi0JCQlpZihwYXJhbVZhbHVlUGFpci5nZXRQYXJhbSgpLmVxdWFscygicG9ydE5hbWUiKSkNCi0JCQl7DQotCQkJCWxvY2F0b3IgPSBwYXJhbVZhbHVlUGFpci5nZXRMb2NhdG9yKCk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBwb3J0TmFtZSBhbm5vdGF0aW9uIHBhcmFtZXRlciBzdGFydCBwb3NpdGlvbiIsIDMzNCwgbG9jYXRvci5nZXRTdGFydFBvc2l0aW9uKCkpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgcG9ydE5hbWUgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgbGVuZ3RoIiwgMjUsIGxvY2F0b3IuZ2V0TGVuZ3RoKCkpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCUlGaWVsZCBmaWVsZCA9IGVuZHBvaW50LmdldEZpZWxkKCJmaWVsZDEiKTsNCi0JCUlBbm5vdGF0aW9uPElGaWVsZD4gaW5zcGVjdGVkRmllbGRBbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdEZpZWxkKGZpZWxkLCAib3JnLmVjbGlwc2UuZGVtby5NeUZpZWxkQW5ub3RhdGlvbiIpOw0KLQkJbG9jYXRvciA9IGluc3BlY3RlZEZpZWxkQW5ub3RhdGlvbi5nZXRMb2NhdG9yKCk7DQotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgTXlGaWVsZEFubm90YXRpb24gYW5ub3RhdGlvbiBwYXJhbWV0ZXIgc3RhcnQgcG9zaXRpb24iLCA0MDEsIGxvY2F0b3IuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBNeUZpZWxkQW5ub3RhdGlvbiBhbm5vdGF0aW9uIHBhcmFtZXRlciBsZW5ndGgiLCAzMywgbG9jYXRvci5nZXRMZW5ndGgoKSk7DQotCQlwYXJtVmFsdWVzID0gaW5zcGVjdGVkRmllbGRBbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpOw0KLQkJZm9yIChJUGFyYW1WYWx1ZVBhaXIgcGFyYW1WYWx1ZVBhaXIgOiBwYXJtVmFsdWVzKQ0KLQkJew0KLQkJCWlmKHBhcmFtVmFsdWVQYWlyLmdldFBhcmFtKCkuZXF1YWxzKCJuYW1lIikpDQotCQkJew0KLQkJCQlsb2NhdG9yID0gcGFyYW1WYWx1ZVBhaXIuZ2V0TG9jYXRvcigpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbmFtZSBhbm5vdGF0aW9uIHBhcmFtZXRlciBzdGFydCBwb3NpdGlvbiIsIDQyMCwgbG9jYXRvci5nZXRTdGFydFBvc2l0aW9uKCkpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbmFtZSBhbm5vdGF0aW9uIHBhcmFtZXRlciBsZW5ndGgiLCAxMywgbG9jYXRvci5nZXRMZW5ndGgoKSk7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJaW5zcGVjdGVkRmllbGRBbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdEZpZWxkKGZpZWxkLCAiamF2YXguandzLldlYkZpZWxkIik7DQotCQlsb2NhdG9yID0gaW5zcGVjdGVkRmllbGRBbm5vdGF0aW9uLmdldExvY2F0b3IoKTsNCi0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBXZWJGaWVsZCBhbm5vdGF0aW9uIHBhcmFtZXRlciBzdGFydCBwb3NpdGlvbiIsIDQzNywgbG9jYXRvci5nZXRTdGFydFBvc2l0aW9uKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIFdlYkZpZWxkIGFubm90YXRpb24gcGFyYW1ldGVyIGxlbmd0aCIsIDI1LCBsb2NhdG9yLmdldExlbmd0aCgpKTsNCi0JCXBhcm1WYWx1ZXMgPSBpbnNwZWN0ZWRGaWVsZEFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCk7DQotCQlmb3IgKElQYXJhbVZhbHVlUGFpciBwYXJhbVZhbHVlUGFpciA6IHBhcm1WYWx1ZXMpDQotCQl7DQotCQkJaWYocGFyYW1WYWx1ZVBhaXIuZ2V0UGFyYW0oKS5lcXVhbHMoIm5hbWUiKSkNCi0JCQl7DQotCQkJCWxvY2F0b3IgPSBwYXJhbVZhbHVlUGFpci5nZXRMb2NhdG9yKCk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBuYW1lIGFubm90YXRpb24gcGFyYW1ldGVyIHN0YXJ0IHBvc2l0aW9uIiwgNDQ3LCBsb2NhdG9yLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBuYW1lIGFubm90YXRpb24gcGFyYW1ldGVyIGxlbmd0aCIsIDE0LCBsb2NhdG9yLmdldExlbmd0aCgpKTsNCi0JCQl9DQotCQl9DQotDQotCQlJTWV0aG9kIG1ldGhvZCA9IGVuZHBvaW50LmdldE1ldGhvZHMoKVswXTsNCi0JCUlBbm5vdGF0aW9uPElNZXRob2Q+IGluc3BlY3RlZE1ldGhvZEFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKG1ldGhvZCwgIm9yZy5lY2xpcHNlLmRlbW8uTXlNZXRob2RBbm5vdGF0aW9uIik7DQotCQlsb2NhdG9yID0gaW5zcGVjdGVkTWV0aG9kQW5ub3RhdGlvbi5nZXRMb2NhdG9yKCk7DQotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgTXlNZXRob2RBbm5vdGF0aW9uIGFubm90YXRpb24gcGFyYW1ldGVyIHN0YXJ0IHBvc2l0aW9uIiwgNDkyLCBsb2NhdG9yLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgTXlNZXRob2RBbm5vdGF0aW9uIGFubm90YXRpb24gcGFyYW1ldGVyIGxlbmd0aCIsIDQzLCBsb2NhdG9yLmdldExlbmd0aCgpKTsNCi0JCXBhcm1WYWx1ZXMgPSBpbnNwZWN0ZWRNZXRob2RBbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpOw0KLQkJZm9yIChJUGFyYW1WYWx1ZVBhaXIgcGFyYW1WYWx1ZVBhaXIgOiBwYXJtVmFsdWVzKQ0KLQkJew0KLQkJCWlmKHBhcmFtVmFsdWVQYWlyLmdldFBhcmFtKCkuZXF1YWxzKCJuYW1lIikpDQotCQkJew0KLQkJCQlsb2NhdG9yID0gcGFyYW1WYWx1ZVBhaXIuZ2V0TG9jYXRvcigpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbmFtZSBhbm5vdGF0aW9uIHBhcmFtZXRlciBzdGFydCBwb3NpdGlvbiIsIDUxMiwgbG9jYXRvci5nZXRTdGFydFBvc2l0aW9uKCkpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbmFtZSBhbm5vdGF0aW9uIHBhcmFtZXRlciBsZW5ndGgiLCAyMiwgbG9jYXRvci5nZXRMZW5ndGgoKSk7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJaW5zcGVjdGVkTWV0aG9kQW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RNZXRob2QobWV0aG9kLCAiamF2YXguandzLldlYk1ldGhvZCIpOw0KLQkJbG9jYXRvciA9IGluc3BlY3RlZE1ldGhvZEFubm90YXRpb24uZ2V0TG9jYXRvcigpOw0KLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIFdlYk1ldGhvZCBhbm5vdGF0aW9uIHBhcmFtZXRlciBzdGFydCBwb3NpdGlvbiIsIDUzOCwgbG9jYXRvci5nZXRTdGFydFBvc2l0aW9uKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIFdlYk1ldGhvZCBhbm5vdGF0aW9uIHBhcmFtZXRlciBsZW5ndGgiLCA0NiwgbG9jYXRvci5nZXRMZW5ndGgoKSk7DQotCQlwYXJtVmFsdWVzID0gaW5zcGVjdGVkTWV0aG9kQW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKTsNCi0JCWZvciAoSVBhcmFtVmFsdWVQYWlyIHBhcmFtVmFsdWVQYWlyIDogcGFybVZhbHVlcykNCi0JCXsNCi0JCQlpZihwYXJhbVZhbHVlUGFpci5nZXRQYXJhbSgpLmVxdWFscygiZXhjbHVkZSIpKQ0KLQkJCXsNCi0JCQkJbG9jYXRvciA9IHBhcmFtVmFsdWVQYWlyLmdldExvY2F0b3IoKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGV4Y2x1ZGUgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgc3RhcnQgcG9zaXRpb24iLCA1NDksIGxvY2F0b3IuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGV4Y2x1ZGUgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgbGVuZ3RoIiwgMTMsIGxvY2F0b3IuZ2V0TGVuZ3RoKCkpOw0KLQkJCX0NCi0NCi0JCQlpZihwYXJhbVZhbHVlUGFpci5nZXRQYXJhbSgpLmVxdWFscygib3BlcmF0aW9uTmFtZSIpKQ0KLQkJCXsNCi0JCQkJbG9jYXRvciA9IHBhcmFtVmFsdWVQYWlyLmdldExvY2F0b3IoKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG9wZXJhdGlvbk5hbWUgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgc3RhcnQgcG9zaXRpb24iLCA1NjMsIGxvY2F0b3IuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG9wZXJhdGlvbk5hbWUgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgbGVuZ3RoIiwgMjAsIGxvY2F0b3IuZ2V0TGVuZ3RoKCkpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCUlUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgPSBtZXRob2QuZ2V0VHlwZVBhcmFtZXRlcigiYW5ub3RhdGVkUGFyYW0iKTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPiBpbnNwZWN0ZWRQYXJhbUFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0UGFyYW0odHlwZVBhcmFtZXRlciwgIm9yZy5lY2xpcHNlLmRlbW8uTXlQYXJhbUFubm90YXRpb24iKTsNCi0JCWxvY2F0b3IgPSBpbnNwZWN0ZWRQYXJhbUFubm90YXRpb24uZ2V0TG9jYXRvcigpOw0KLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIE15UGFyYW1Bbm5vdGF0aW9uIGFubm90YXRpb24gcGFyYW1ldGVyIHN0YXJ0IHBvc2l0aW9uIiwgNjQ5LCBsb2NhdG9yLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgTXlQYXJhbUFubm90YXRpb24gYW5ub3RhdGlvbiBwYXJhbWV0ZXIgbGVuZ3RoIiwgNDMsIGxvY2F0b3IuZ2V0TGVuZ3RoKCkpOw0KLQkJcGFybVZhbHVlcyA9IGluc3BlY3RlZFBhcmFtQW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKTsNCi0JCWZvciAoSVBhcmFtVmFsdWVQYWlyIHBhcmFtVmFsdWVQYWlyIDogcGFybVZhbHVlcykNCi0JCXsNCi0JCQlpZihwYXJhbVZhbHVlUGFpci5nZXRQYXJhbSgpLmVxdWFscygibmFtZSIpKQ0KLQkJCXsNCi0JCQkJbG9jYXRvciA9IHBhcmFtVmFsdWVQYWlyLmdldExvY2F0b3IoKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG5hbWUgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgc3RhcnQgcG9zaXRpb24iLCA2NjgsIGxvY2F0b3IuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG5hbWUgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgbGVuZ3RoIiwgMjMsIGxvY2F0b3IuZ2V0TGVuZ3RoKCkpOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJaW5zcGVjdGVkUGFyYW1Bbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFBhcmFtKHR5cGVQYXJhbWV0ZXIsICJqYXZheC5qd3MuV2ViUGFyYW0iKTsNCi0JCWxvY2F0b3IgPSBpbnNwZWN0ZWRQYXJhbUFubm90YXRpb24uZ2V0TG9jYXRvcigpOw0KLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIFdlYlBhcmFtIGFubm90YXRpb24gcGFyYW1ldGVyIHN0YXJ0IHBvc2l0aW9uIiwgNjE2LCBsb2NhdG9yLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgV2ViUGFyYW0gYW5ub3RhdGlvbiBwYXJhbWV0ZXIgbGVuZ3RoIiwgMzIsIGxvY2F0b3IuZ2V0TGVuZ3RoKCkpOw0KLQkJcGFybVZhbHVlcyA9IGluc3BlY3RlZFBhcmFtQW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKTsNCi0JCWZvciAoSVBhcmFtVmFsdWVQYWlyIHBhcmFtVmFsdWVQYWlyIDogcGFybVZhbHVlcykNCi0JCXsNCi0JCQlpZihwYXJhbVZhbHVlUGFpci5nZXRQYXJhbSgpLmVxdWFscygibmFtZSIpKQ0KLQkJCXsNCi0JCQkJbG9jYXRvciA9IHBhcmFtVmFsdWVQYWlyLmdldExvY2F0b3IoKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG5hbWUgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgc3RhcnQgcG9zaXRpb24iLCA2MjYsIGxvY2F0b3IuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG5hbWUgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgbGVuZ3RoIiwgMjEsIGxvY2F0b3IuZ2V0TGVuZ3RoKCkpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uc1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0Fubm90YXRpb25zVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMTQzM2E3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0Fubm90YXRpb25zVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LkNsYXNzTG9hZGluZ1Rlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uV3JpdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JVmFsdWU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLkFubm90YXRpb25JbnNwZWN0b3JJbXBsOw0KLQ0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uc1Rlc3QgZXh0ZW5kcyBDbGFzc0xvYWRpbmdUZXN0DQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1JDID0gInNyYyI7DQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQ0sgPSAib3JnLmVjbGlwc2UuZGVtbyI7DQotDQotCXByaXZhdGUgSVR5cGUgZW5kcG9pbnQ7DQotDQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCWNyZWF0ZUphdmFQcm9qZWN0KFNSQywgUENLKTsNCi0JCWVuZHBvaW50ID0gY3JlYXRlQ2xhc3MoIkVuZHBvaW50LnNyYyIsICJFbmRwb2ludCIpOw0KLQkJQW5ub3RhdGlvbkZhY3RvcnkucmVtb3ZlQW5ub3RhdGlvbnNGcm9tSmF2YUVsZW1lbnQoZW5kcG9pbnQpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDb21wbGV4QW5ub3RhdGlvblFOVmFsdWUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCUlWYWx1ZSBxdiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZSgiZnVsbC5xdWFsaWZpZWQuTmFtZSIpOw0KLQ0KLQkJSVBhcmFtVmFsdWVQYWlyIHB2ID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgicGFyYW0iLCBxdik7DQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlcyA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCXBhcmFtVmFsdWVzLmFkZChwdik7DQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gYW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oImphdmF4Lmp3cy5XZWJTZXJ2aWNlIiwgcGFyYW1WYWx1ZXMsIGVuZHBvaW50KTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChhbm5vdGF0aW9uLCBlbmRwb2ludCk7DQotDQotCQlhc3NlcnRUcnVlKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCkuc2l6ZSgpID4gMCk7DQotCX0NCi0NCi0vLwlwdWJsaWMgdm9pZCB0ZXN0QWRkU2luZ2xlRWxlbWVudEFubm90YXRpb25BcnJheVZhbHVlcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0vLwl7DQotLy8JCUlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTaW5nbGVFbGVtZW50QW5ub3RhdGlvbigiamF2YXguandzLldlYlNlcnZpY2UiLCBuZXcgU3RyaW5nW10geyAidmFsMSIsICJ2YWwyIiB9KTsNCi0vLwkJYW5ub3RhdGlvbi5hZGRUb0NsYXNzKGVuZHBvaW50KTsNCi0vLw0KLS8vCQlhc3NlcnRUcnVlKEFubm90YXRpb25GYWN0b3J5LmdldEFubm90YXRpb25zRnJvbUNsYXNzKGVuZHBvaW50KS5sZW5ndGggPiAwKTsNCi0vLwl9DQotLy8NCi0vLwlwdWJsaWMgdm9pZCB0ZXN0QWRkU2ltcGxlQW5ub3RhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0vLwl7DQotLy8JCUlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTaW1wbGVBbm5vdGF0aW9uKCJqYXZheC5qd3MuV2ViU2VydmljZSIpOw0KLS8vCQlhbm5vdGF0aW9uLmFkZFRvQ2xhc3MoZW5kcG9pbnQpOw0KLS8vDQotLy8JCWFzc2VydFRydWUoQW5ub3RhdGlvbkZhY3RvcnkuZ2V0QW5ub3RhdGlvbnNGcm9tQ2xhc3MoZW5kcG9pbnQpLmxlbmd0aCA+IDApOw0KLS8vCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgY29tcGxleCBhbm5vdGF0aW9uIGFuZCBhZGRzIGl0IHRvIGNsYXNzLiBUaGUgYW5ub3RhdGlvbiBoYXMgdGhlIGZvcm06DQotCSAqIA0KLQkgKiA8cHJlPg0KLQkgKiAJIEBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPSZxdW90O3NlcnZpY2VOYW1lJnF1b3Q7LA0KLQkgKiAJIG5hbWU9JnF1b3Q7cG9ydFR5cGVOYW1lJnF1b3Q7LA0KLQkgKiAJIHRhcmdldE5hbWVzcGFjZT0mcXVvdDtodHRwOi8vZGVtby5zYXAuY29tLyZxdW90OywNCi0JICogCSB3c2RsTG9jYXRpb249JnF1b3Q7aHR0cDovL3dzZGwvdXJsLyZxdW90OywNCi0JICogCSBwb3J0TmFtZT0mcXVvdDtwb3J0TmFtZSZxdW90OywNCi0JICogCSBlbmRwb2ludEludGVyZmFjZT0mcXVvdDtvcmcuZWNsaXBzZS5kZW1vLklTZWkmcXVvdDspDQotCSAqIDwvcHJlPg0KLQkgKiANCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICogQHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29tcGxleENsYXNzQW5ub3RhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZXMgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotDQotCQlhZGRTdHJpbmdQcm9wZXJ0eShwYXJhbVZhbHVlcywgInNlcnZpY2VOYW1lIiwgInNlcnZpY2VOYW1lIik7DQotCQlhZGRTdHJpbmdQcm9wZXJ0eShwYXJhbVZhbHVlcywgIm5hbWUiLCAicG9ydFR5cGVOYW1lIik7DQotCQlhZGRTdHJpbmdQcm9wZXJ0eShwYXJhbVZhbHVlcywgInRhcmdldE5hbWVzcGFjZSIsICJodHRwOi8vZGVtby5zYXAuY29tLyIpOw0KLQkJYWRkU3RyaW5nUHJvcGVydHkocGFyYW1WYWx1ZXMsICJ3c2RsTG9jYXRpb24iLCAiaHR0cDovL3dzZGwvdXJsLyIpOw0KLQkJYWRkU3RyaW5nUHJvcGVydHkocGFyYW1WYWx1ZXMsICJwb3J0TmFtZSIsICJwb3J0TmFtZSIpOw0KLQkJYWRkU3RyaW5nUHJvcGVydHkocGFyYW1WYWx1ZXMsICJlbmRwb2ludEludGVyZmFjZSIsICJvcmcuZWNsaXBzZS5kZW1vLklTZWkiKTsNCi0NCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigiamF2YXguandzLldlYlNlcnZpY2UiLCBwYXJhbVZhbHVlcywgZW5kcG9pbnQpOw0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KGFubm90YXRpb24sIGVuZHBvaW50KTsNCi0NCi0JCUFubm90YXRpb25JbnNwZWN0b3JJbXBsIGFubm90YXRpb25JbnNwZWN0b3IgPSBuZXcgQW5ub3RhdGlvbkluc3BlY3RvckltcGwoZW5kcG9pbnQpOw0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZT4+IHR5cGVBbm5vdGF0aW9ucyA9IGFubm90YXRpb25JbnNwZWN0b3IuaW5zcGVjdFR5cGUoKTsNCi0NCi0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7DQotCQlmb3IgKElBbm5vdGF0aW9uPElUeXBlPiB0eXBlQW5ub3RhdGlvbiA6IHR5cGVBbm5vdGF0aW9ucykNCi0JCXsNCi0JCQlpZih0eXBlQW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscygiamF2YXguandzLldlYlNlcnZpY2UiKSB8fCB0eXBlQW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscygiV2ViU2VydmljZSIpKQ0KLQkJCXsNCi0JCQkJaWYodHlwZUFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpICE9IDYpDQotCQkJCXsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWlmKCF0eXBlQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJzZXJ2aWNlTmFtZSIpLmVxdWFscygic2VydmljZU5hbWUiKSkNCi0JCQkJew0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJaWYoIXR5cGVBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoIm5hbWUiKS5lcXVhbHMoInBvcnRUeXBlTmFtZSIpKQ0KLQkJCQl7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQlpZighdHlwZUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgidGFyZ2V0TmFtZXNwYWNlIikuZXF1YWxzKCJodHRwOi8vZGVtby5zYXAuY29tLyIpKQ0KLQkJCQl7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQlpZighdHlwZUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgid3NkbExvY2F0aW9uIikuZXF1YWxzKCJodHRwOi8vd3NkbC91cmwvIikpDQotCQkJCXsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWlmKCF0eXBlQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJwb3J0TmFtZSIpLmVxdWFscygicG9ydE5hbWUiKSkNCi0JCQkJew0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJaWYoIXR5cGVBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImVuZHBvaW50SW50ZXJmYWNlIikuZXF1YWxzKCJvcmcuZWNsaXBzZS5kZW1vLklTZWkiKSkNCi0JCQkJew0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQ0KLQkJCQlyZXN1bHQgPSB0cnVlOw0KLQkJCX0NCi0JCX0NCi0NCi0JCWFzc2VydFRydWUoIkNsYXNzIGlzIG5vdCBhbm5vdGF0ZWQgY29ycmVjdGx5IiwgcmVzdWx0KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBjb21wbGV4IGFubm90YXRpb24gYW5kIGFkZHMgaXQgdG8gbWV0aG9kIGRlY2xhcmF0aW9uLiBBbm5vdGF0aW9uIGhhcyB0aGUgZm9ybToNCi0JICogDQotCSAqIDxwcmU+DQotCSAqICBcQFdlYk1ldGhvZChleGNsdWRlPWZhbHNlLG9wZXJhdGlvbk5hbWU9JnF1b3Q7YW5ub3RhdGVkTWV0aG9kJnF1b3Q7LGFjdGlvbj0mcXVvdDtnbyZxdW90OykJDQotCSAqIDwvcHJlPg0KLQkgKiANCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICogQHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29tcGxleE1ldGhvZEFubm90YXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtVmFsdWVzID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQ0KLQkJSVZhbHVlIGVtVmFsdWUgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVCb29sZWFuVmFsdWUoZmFsc2UpOw0KLQkJcGFyYW1WYWx1ZXMuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoImV4Y2x1ZGUiLCBlbVZhbHVlKSk7DQotDQotCQlhZGRTdHJpbmdQcm9wZXJ0eShwYXJhbVZhbHVlcywgIm9wZXJhdGlvbk5hbWUiLCAiYW5ub3RhdGVkTWV0aG9kIik7DQotCQlhZGRTdHJpbmdQcm9wZXJ0eShwYXJhbVZhbHVlcywgImFjdGlvbiIsICJnbyIpOw0KLQ0KLQkJSU1ldGhvZCBtZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2QoImFubm90YXRlZE1ldGhvZCIsIG5ldyBTdHJpbmdbXSB7ICJRU3RyaW5nOyIgfSk7DQotCQkJCQ0KLQkJSUFubm90YXRpb248SU1ldGhvZD4gYW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oImphdmF4Lmp3cy5XZWJNZXRob2QiLCBwYXJhbVZhbHVlcywgbWV0aG9kKTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChhbm5vdGF0aW9uLCBtZXRob2QpOw0KLQ0KLQkJQW5ub3RhdGlvbkluc3BlY3RvckltcGwgYW5ub3RhdGlvbkluc3BlY3RvciA9IG5ldyBBbm5vdGF0aW9uSW5zcGVjdG9ySW1wbChlbmRwb2ludCk7DQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElNZXRob2Q+PiBtZXRob2RBbm5vdGF0aW9ucyA9IGFubm90YXRpb25JbnNwZWN0b3IuaW5zcGVjdE1ldGhvZChtZXRob2QpOw0KLQkJIAkJDQotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOw0KLQkJZm9yIChJQW5ub3RhdGlvbjxJTWV0aG9kPiBtZXRob2RBbm5vdGF0aW9uIDogbWV0aG9kQW5ub3RhdGlvbnMpDQotCQl7DQotCQkJaWYobWV0aG9kQW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscygiamF2YXguandzLldlYk1ldGhvZCIpIHx8IG1ldGhvZEFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoIldlYk1ldGhvZCIpKQ0KLQkJCXsNCi0JCQkJaWYobWV0aG9kQW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkgIT0gMykNCi0JCQkJew0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJaWYoIW1ldGhvZEFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiZXhjbHVkZSIpLmVxdWFscygiZmFsc2UiKSkNCi0JCQkJew0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJaWYoIW1ldGhvZEFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgib3BlcmF0aW9uTmFtZSIpLmVxdWFscygiYW5ub3RhdGVkTWV0aG9kIikpDQotCQkJCXsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWlmKCFtZXRob2RBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImFjdGlvbiIpLmVxdWFscygiZ28iKSkNCi0JCQkJew0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQ0KLQkJCQlyZXN1bHQgPSB0cnVlOw0KLQkJCX0NCi0JCX0NCi0NCi0JCWFzc2VydFRydWUoIk1ldGhvZCBpcyBub3QgYW5ub3RhdGVkIGNvcnJlY3RseSIsIHJlc3VsdCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgY29tcGxleCBhbm5vdGF0aW9uIGFuZCBhZGRzIGl0IHRvIGEgbWV0aG9kIHBhcmFtZXRlci4gVGhlIGFubm90YXRpb24gaGFzIHRoZSBmb3JtOg0KLQkgKiANCi0JICogPHByZT4NCi0JICogIFxAV2ViUGFyYW0ob3BlcmF0aW9uTmFtZT0mcXVvdDthbm5vdGF0ZWRQYXJhbSZxdW90OywgdGFyZ2V0TmFtZXNwYWNlPSZxdW90O2h0dHA6Ly9kZW1vLnNhcC5jb20vcGFyYW1zLyZxdW90OywgcGFydE5hbWU9JnF1b3Q7cGFydE5hbWUmcXVvdDspDQotCSAqIDwvcHJlPg0KLQkgKiANCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICogQHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29tcGxleFBhcmFtQW5ub3RhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJSU1ldGhvZCBtZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2QoImFubm90YXRlZE1ldGhvZCIsIG5ldyBTdHJpbmdbXSB7ICJRU3RyaW5nOyIgfSk7DQotCQlJVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyID0gbWV0aG9kLmdldFR5cGVQYXJhbWV0ZXIoImFubm90YXRlZFBhcmFtIik7DQotDQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlcyA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0NCi0JCWFkZFN0cmluZ1Byb3BlcnR5KHBhcmFtVmFsdWVzLCAiYW5ub3RhdGVkUGFyYW0iLCAicGFyYW0iKTsNCi0JCWFkZFN0cmluZ1Byb3BlcnR5KHBhcmFtVmFsdWVzLCAidGFyZ2V0TmFtZXNwYWNlIiwgImh0dHA6Ly9kZW1vLnNhcC5jb20vcGFyYW1zLyIpOw0KLQkJYWRkU3RyaW5nUHJvcGVydHkocGFyYW1WYWx1ZXMsICJwYXJ0TmFtZSIsICJwYXJ0TmFtZSIpOw0KLQ0KLQkJSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IGFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJqYXZheC5qd3MuV2ViUGFyYW0iLCBwYXJhbVZhbHVlcywgdHlwZVBhcmFtZXRlcik7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoYW5ub3RhdGlvbiwgdHlwZVBhcmFtZXRlcik7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGFkZFN0cmluZ1Byb3BlcnR5KFNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtVmFsdWVzLCBTdHJpbmcgcHJvcGVydHksIFN0cmluZyB2YWx1ZSkNCi0Jew0KLQkJSVZhbHVlIHBWYWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKHZhbHVlKTsNCi0JCUlQYXJhbVZhbHVlUGFpciBwYWlyID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZShwcm9wZXJ0eSwgcFZhbHVlKTsNCi0JCXBhcmFtVmFsdWVzLmFkZChwYWlyKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9BcnJheVZhbHVlSW1wbFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0FycmF5VmFsdWVJbXBsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZjVlNGRmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0FycmF5VmFsdWVJbXBsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LkNsYXNzTG9hZGluZ1Rlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uV3JpdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JVmFsdWU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLkFycmF5VmFsdWVJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5TdHJpbmdWYWx1ZUltcGw7DQotDQotcHVibGljIGNsYXNzIEFycmF5VmFsdWVJbXBsVGVzdCBleHRlbmRzIENsYXNzTG9hZGluZ1Rlc3QNCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTUkMgPSAic3JjIjsNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBDSyA9ICJvcmcuZWNsaXBzZS5kZW1vIjsNCi0NCi0JcHJpdmF0ZSBJVHlwZSBlbmRwb2ludDsNCi0NCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJY3JlYXRlSmF2YVByb2plY3QoU1JDLCBQQ0spOw0KLQkJZW5kcG9pbnQgPSBjcmVhdGVDbGFzcygiRW5kcG9pbnQuc3JjIiwgIkVuZHBvaW50Iik7DQotCQlBbm5vdGF0aW9uRmFjdG9yeS5yZW1vdmVBbm5vdGF0aW9uc0Zyb21KYXZhRWxlbWVudChlbmRwb2ludCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkNCi0Jew0KLQkJU2V0PElWYWx1ZT4gdmFsdWVzMSA9IG5ldyBIYXNoU2V0PElWYWx1ZT4oKTsNCi0JCXZhbHVlczEuY2xlYXIoKTsNCi0JCXZhbHVlczEuYWRkKG5ldyBTdHJpbmdWYWx1ZUltcGwoInZhbDEiKSk7DQotCQlBcnJheVZhbHVlSW1wbCBhdjEgPSBuZXcgQXJyYXlWYWx1ZUltcGwodmFsdWVzMSk7DQotCQkNCi0JCVNldDxJVmFsdWU+IHZhbHVlczIgPSBuZXcgSGFzaFNldDxJVmFsdWU+KCk7DQotCQl2YWx1ZXMyLmNsZWFyKCk7DQotCQl2YWx1ZXMyLmFkZChuZXcgU3RyaW5nVmFsdWVJbXBsKCJ2YWwyIikpOw0KLQkJQXJyYXlWYWx1ZUltcGwgYXYyID0gbmV3IEFycmF5VmFsdWVJbXBsKHZhbHVlczIpOw0KLQ0KLQkJYXNzZXJ0VHJ1ZShhdjEuaGFzaENvZGUoKSAhPSBhdjIuaGFzaENvZGUoKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEFycmF5VmFsdWVJbXBsKCkNCi0Jew0KLQkJdHJ5DQotCQl7DQotCQkJbmV3IEFycmF5VmFsdWVJbXBsKG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzT2JqZWN0KCkNCi0Jew0KLQkJU2V0PElWYWx1ZT4gdmFsdWVzMSA9IG5ldyBIYXNoU2V0PElWYWx1ZT4oKTsNCi0JCXZhbHVlczEuY2xlYXIoKTsNCi0JCXZhbHVlczEuYWRkKG5ldyBTdHJpbmdWYWx1ZUltcGwoInZhbDEiKSk7DQotCQlBcnJheVZhbHVlSW1wbCBhdjEgPSBuZXcgQXJyYXlWYWx1ZUltcGwodmFsdWVzMSk7DQotDQotCQlTZXQ8SVZhbHVlPiB2YWx1ZXMyID0gbmV3IEhhc2hTZXQ8SVZhbHVlPigpOw0KLQkJdmFsdWVzMi5jbGVhcigpOw0KLQkJdmFsdWVzMi5hZGQobmV3IFN0cmluZ1ZhbHVlSW1wbCgidmFsMiIpKTsNCi0JCUFycmF5VmFsdWVJbXBsIGF2MiA9IG5ldyBBcnJheVZhbHVlSW1wbCh2YWx1ZXMyKTsNCi0NCi0JCVNldDxJVmFsdWU+IHZhbHVlczMgPSBuZXcgSGFzaFNldDxJVmFsdWU+KCk7DQotCQl2YWx1ZXMzLmNsZWFyKCk7DQotCQl2YWx1ZXMzLmFkZChuZXcgU3RyaW5nVmFsdWVJbXBsKCJ2YWwxIikpOw0KLQkJQXJyYXlWYWx1ZUltcGwgYXYzID0gbmV3IEFycmF5VmFsdWVJbXBsKHZhbHVlczMpOw0KLQ0KLQkJYXNzZXJ0RmFsc2UoYXYxLmVxdWFscyhudWxsKSk7DQotCQlhc3NlcnRGYWxzZShhdjEuZXF1YWxzKDEyMykpOw0KLQkJYXNzZXJ0RmFsc2UoYXYxLmVxdWFscyhhdjIpKTsNCi0NCi0JCWFzc2VydFRydWUoYXYxLmVxdWFscyhhdjMpKTsNCi0JCWFzc2VydFRydWUoYXYxLmVxdWFscyhhdjEpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEFycmF5cygpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJc2V0VXAoKTsNCi0JCQ0KLQkJU2V0PElWYWx1ZT4gdmFsdWVzID0gbmV3IEhhc2hTZXQ8SVZhbHVlPigpOw0KLQkJdmFsdWVzLmNsZWFyKCk7DQotCQl2YWx1ZXMuYWRkKG5ldyBTdHJpbmdWYWx1ZUltcGwoInZhbDEiKSk7DQotCQl2YWx1ZXMuYWRkKG5ldyBTdHJpbmdWYWx1ZUltcGwoInZhbDIiKSk7DQotCQlBcnJheVZhbHVlSW1wbCBhdiA9IG5ldyBBcnJheVZhbHVlSW1wbCh2YWx1ZXMpOw0KLQkJCQkNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHB2ID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJcHYuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInBhcmFtIiwgYXYpKTsNCi0JCQ0KLQkJSUFubm90YXRpb248SVR5cGU+IGFubiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIm9yZy5lY2xpcHNlLnRlc3QuTXlBbm5vdGF0aW9uIiwgcHYsIGVuZHBvaW50KTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChhbm4sIGVuZHBvaW50KTsNCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SVR5cGU+PiBhbm5vdGF0dGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKGFubm90YXR0aW9ucyk7DQotCQlhc3NlcnRUcnVlKGFubm90YXR0aW9ucy5zaXplKCkgPT0gMSk7DQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gcmVhZEFubm90YXRpb24gPSBhbm5vdGF0dGlvbnMuaXRlcmF0b3IoKS5uZXh0KCk7DQotCQlyZWFkQW5ub3RhdGlvbi5lcXVhbHMoYW5uKTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmUoYW5uKTsNCi0JCWFubm90YXR0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwoYW5ub3RhdHRpb25zKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdHRpb25zLnNpemUoKSA9PSAwKTsNCi0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Cb29sZWFuVmFsdWVJbXBsVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQm9vbGVhblZhbHVlSW1wbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmRhZDhlYTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQm9vbGVhblZhbHVlSW1wbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LkNsYXNzTG9hZGluZ1Rlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uV3JpdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLkFycmF5VmFsdWVJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5Cb29sZWFuVmFsdWVJbXBsOw0KLQ0KLXB1YmxpYyBjbGFzcyBCb29sZWFuVmFsdWVJbXBsVGVzdCBleHRlbmRzIENsYXNzTG9hZGluZ1Rlc3QNCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTUkMgPSAic3JjIjsNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBDSyA9ICJvcmcuZWNsaXBzZS5kZW1vIjsNCi0NCi0JcHJpdmF0ZSBJVHlwZSBlbmRwb2ludDsNCi0NCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJY3JlYXRlSmF2YVByb2plY3QoU1JDLCBQQ0spOw0KLQkJZW5kcG9pbnQgPSBjcmVhdGVDbGFzcygiRW5kcG9pbnQuc3JjIiwgIkVuZHBvaW50Iik7DQotCQlBbm5vdGF0aW9uRmFjdG9yeS5yZW1vdmVBbm5vdGF0aW9uc0Zyb21KYXZhRWxlbWVudChlbmRwb2ludCk7DQotCX0NCi0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEJvb2xlYW5WYWx1ZUltcGwoKQ0KLQl7DQotCQl0cnkNCi0JCXsNCi0JCQluZXcgQXJyYXlWYWx1ZUltcGwobnVsbCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlhc3NlcnRUcnVlKHRydWUpOw0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RCb29sZWFucygpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJc2V0VXAoKTsNCi0JCQ0KLQkJQm9vbGVhblZhbHVlSW1wbCBidiA9IG5ldyBCb29sZWFuVmFsdWVJbXBsKHRydWUpOw0KLQkJCQkNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHB2ID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJcHYuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInBhcmFtIiwgYnYpKTsNCi0JCQ0KLQkJSUFubm90YXRpb248SVR5cGU+IGFubiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIm9yZy5lY2xpcHNlLnRlc3QuTXlBbm5vdGF0aW9uIiwgcHYsIGVuZHBvaW50KTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChhbm4sIGVuZHBvaW50KTsNCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SVR5cGU+PiBhbm5vdGF0dGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKGFubm90YXR0aW9ucyk7DQotCQlhc3NlcnRUcnVlKGFubm90YXR0aW9ucy5zaXplKCkgPT0gMSk7DQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gcmVhZEFubm90YXRpb24gPSBhbm5vdGF0dGlvbnMuaXRlcmF0b3IoKS5uZXh0KCk7DQotCQlyZWFkQW5ub3RhdGlvbi5lcXVhbHMoYW5uKTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmUoYW5uKTsNCi0JCWFubm90YXR0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwoYW5ub3RhdHRpb25zKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdHRpb25zLnNpemUoKSA9PSAwKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEVxdWFsc09iamVjdCgpDQotCXsNCi0JCUJvb2xlYW5WYWx1ZUltcGwgYnYxID0gbmV3IEJvb2xlYW5WYWx1ZUltcGwodHJ1ZSk7DQotCQlCb29sZWFuVmFsdWVJbXBsIGJ2MiA9IG5ldyBCb29sZWFuVmFsdWVJbXBsKGZhbHNlKTsNCi0JCUJvb2xlYW5WYWx1ZUltcGwgYnYzID0gbmV3IEJvb2xlYW5WYWx1ZUltcGwodHJ1ZSk7DQotDQotCQlhc3NlcnRGYWxzZShidjEuZXF1YWxzKG51bGwpKTsNCi0JCWFzc2VydEZhbHNlKGJ2MS5lcXVhbHMoMTIzKSk7DQotCQlhc3NlcnRGYWxzZShidjEuZXF1YWxzKGJ2MikpOw0KLQ0KLQkJYXNzZXJ0VHJ1ZShidjEuZXF1YWxzKGJ2MykpOw0KLQkJYXNzZXJ0VHJ1ZShidjEuZXF1YWxzKGJ2MSkpOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0NsYXNzVmFsdWVJbXBsVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQ2xhc3NWYWx1ZUltcGxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI0MDBhMjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQ2xhc3NWYWx1ZUltcGxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5DbGFzc0xvYWRpbmdUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbldyaXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5DbGFzc1ZhbHVlSW1wbDsNCi0NCi1wdWJsaWMgY2xhc3MgQ2xhc3NWYWx1ZUltcGxUZXN0IGV4dGVuZHMgQ2xhc3NMb2FkaW5nVGVzdA0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNSQyA9ICJzcmMiOw0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUENLID0gIm9yZy5lY2xpcHNlLmRlbW8iOw0KLQ0KLQlwcml2YXRlIElUeXBlIGVuZHBvaW50Ow0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQljcmVhdGVKYXZhUHJvamVjdChTUkMsIFBDSyk7DQotCQllbmRwb2ludCA9IGNyZWF0ZUNsYXNzKCJFbmRwb2ludC5zcmMiLCAiRW5kcG9pbnQiKTsNCi0JCUFubm90YXRpb25GYWN0b3J5LnJlbW92ZUFubm90YXRpb25zRnJvbUphdmFFbGVtZW50KGVuZHBvaW50KTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SW50ZWdlcnMoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXNldFVwKCk7DQotCQkNCi0JCUNsYXNzVmFsdWVJbXBsIGN2ID0gbmV3IENsYXNzVmFsdWVJbXBsKGVuZHBvaW50LmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsNCi0JCQkJDQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwdiA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCXB2LmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJwYXJhbSIsIGN2KSk7DQotCQkNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBhbm4gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJvcmcuZWNsaXBzZS50ZXN0Lk15QW5ub3RhdGlvbiIsIHB2LCBlbmRwb2ludCk7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoYW5uLCBlbmRwb2ludCk7DQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElUeXBlPj4gYW5ub3RhdHRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0dGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0dGlvbnMuc2l6ZSgpID09IDEpOw0KLQkJSUFubm90YXRpb248SVR5cGU+IHJlYWRBbm5vdGF0aW9uID0gYW5ub3RhdHRpb25zLml0ZXJhdG9yKCkubmV4dCgpOw0KLQkJcmVhZEFubm90YXRpb24uZXF1YWxzKGFubik7DQotCQlhc3NlcnRFcXVhbHMoYW5uLmdldFByb3BlcnR5VmFsdWUoInBhcmFtIikudG9TdHJpbmcoKSwgZW5kcG9pbnQuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOw0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnJlbW92ZShhbm4pOw0KLQkJYW5ub3RhdHRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0dGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0dGlvbnMuc2l6ZSgpID09IDApOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzT2JqZWN0KCkNCi0Jew0KLQkJQ2xhc3NWYWx1ZUltcGwgY3YxID0gbmV3IENsYXNzVmFsdWVJbXBsKGVuZHBvaW50LmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsNCi0JCUNsYXNzVmFsdWVJbXBsIGN2MiA9IG5ldyBDbGFzc1ZhbHVlSW1wbChudWxsKTsNCi0JCUNsYXNzVmFsdWVJbXBsIGN2MyA9IG5ldyBDbGFzc1ZhbHVlSW1wbChlbmRwb2ludC5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7DQotDQotCQlhc3NlcnRGYWxzZShjdjEuZXF1YWxzKG51bGwpKTsNCi0JCWFzc2VydEZhbHNlKGN2MS5lcXVhbHModHJ1ZSkpOw0KLQkJYXNzZXJ0RmFsc2UoY3YxLmVxdWFscyhjdjIpKTsNCi0NCi0JCWFzc2VydFRydWUoY3YxLmVxdWFscyhjdjMpKTsNCi0JCWFzc2VydFRydWUoY3YxLmVxdWFscyhjdjEpKTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Db21wbGV4QW5ub3RhdGlvbkltcGxUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Db21wbGV4QW5ub3RhdGlvbkltcGxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZmNTZkMmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQ29tcGxleEFubm90YXRpb25JbXBsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnM7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2tPYmplY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JVmFsdWU7DQotDQotcHVibGljIGNsYXNzIENvbXBsZXhBbm5vdGF0aW9uSW1wbFRlc3QgZXh0ZW5kcyBNb2NrT2JqZWN0VGVzdENhc2UNCi17CQ0KLQlwcml2YXRlIE1vY2s8SVR5cGU+IHR5cGVFbGVtZW50ID0gbW9jayhJVHlwZS5jbGFzcyk7DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGUoKQ0KLQl7DQotCQlJVmFsdWUgdmFsdWUgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgidmFsdWUiKTsNCi0JCUlQYXJhbVZhbHVlUGFpciBwdnAgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJwYXJhbSIsIHZhbHVlKTsNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtVmFsdWVzID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJcGFyYW1WYWx1ZXMuYWRkKHB2cCk7DQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gYW5ub3RhdGlvbjEgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJhbm5vdGF0aW9uTmFtZSIsIHBhcmFtVmFsdWVzLCB0eXBlRWxlbWVudC5wcm94eSgpKTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBhbm5vdGF0aW9uMiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oImFubm90YXRpb25OYW1lMiIsIHBhcmFtVmFsdWVzLCB0eXBlRWxlbWVudC5wcm94eSgpKTsNCi0NCi0JCWFzc2VydFRydWUoYW5ub3RhdGlvbjEuaGFzaENvZGUoKSAhPSBhbm5vdGF0aW9uMi5oYXNoQ29kZSgpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzT2JqZWN0KCkNCi0Jew0KLQkJSVZhbHVlIHZhbHVlID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoInZhbHVlIik7DQotCQlJUGFyYW1WYWx1ZVBhaXIgcHZwID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgicGFyYW0iLCB2YWx1ZSk7DQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlcyA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCXBhcmFtVmFsdWVzLmFkZChwdnApOw0KLQkJSUFubm90YXRpb248SVR5cGU+IGFubm90YXRpb24xID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigiYW5ub3RhdGlvbk5hbWUiLCBwYXJhbVZhbHVlcywgdHlwZUVsZW1lbnQucHJveHkoKSk7DQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gYW5ub3RhdGlvbjIgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJhbm5vdGF0aW9uTmFtZTIiLCBwYXJhbVZhbHVlcywgdHlwZUVsZW1lbnQucHJveHkoKSk7DQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gYW5ub3RhdGlvbjMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJhbm5vdGF0aW9uTmFtZSIsIHBhcmFtVmFsdWVzLCB0eXBlRWxlbWVudC5wcm94eSgpKTsNCi0NCi0JCWFzc2VydEZhbHNlKGFubm90YXRpb24xLmVxdWFscyhhbm5vdGF0aW9uMikpOw0KLQkJYXNzZXJ0RmFsc2UoYW5ub3RhdGlvbjEuZXF1YWxzKG51bGwpKTsNCi0JCWFzc2VydEZhbHNlKGFubm90YXRpb24xLmVxdWFscygxMjMpKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdGlvbjEuZXF1YWxzKGFubm90YXRpb24zKSk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvRW5kcG9pbnQuc3JjIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvRW5kcG9pbnQuc3JjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYjY5OWI3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0VuZHBvaW50LnNyYworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1AV2ViU2VydmljZShzZXJ2aWNlTmFtZT0iV1NJbXBsQmVhblNlcnZpY2UiLCBuYW1lPSJXU0ltcGxCZWFuIiwgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZGVtby9lY2xpcHNlL29yZy8iLCBwb3J0TmFtZT0iV1NJbXBsQmVhblBvcnQiKQ0KLUBTdGF0ZWxlc3MNCi1wdWJsaWMgY2xhc3MgRW5kcG9pbnQNCi17DQotCUBNeUFubm90YXRpb24obmFtZT0iZmllbGQxIikNCi0JcHVibGljIFN0cmluZyBmaWVsZDE7DQotCQ0KLQlAV2ViTWV0aG9kKGV4Y2x1ZGU9ZmFsc2Usb3BlcmF0aW9uTmFtZT0idGVzdCIpDQotCXB1YmxpYyB2b2lkIGFubm90YXRlZE1ldGhvZCggQFdlYlBhcmFtKG5hbWU9ImFubm90YXRlZFBhcmFtIikgU3RyaW5nIGFubm90YXRlZFBhcmFtKSANCi0Jew0KLQl9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0VuZHBvaW50QW5uSW5zcGVjdG9yLnNyYyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0VuZHBvaW50QW5uSW5zcGVjdG9yLnNyYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDI1MGQ1Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9FbmRwb2ludEFubkluc3BlY3Rvci5zcmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViRmllbGQ7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsNCi0NCi1ATXlBbm5vdGF0aW9uKG15VmFsdWU9Ik15U3RyaW5nIikNCi1AV2ViU2VydmljZShzZXJ2aWNlTmFtZT0iV1NJbXBsQmVhblNlcnZpY2UiLCBuYW1lPSJXU0ltcGxCZWFuIiwgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZGVtby9lY2xpcHNlL29yZy8iLCBwb3J0TmFtZT0iV1NJbXBsQmVhblBvcnQiKQ0KLUBTdGF0ZWxlc3MNCi1wdWJsaWMgY2xhc3MgRW5kcG9pbnQNCi17DQotCUBNeUZpZWxkQW5ub3RhdGlvbihuYW1lPSJmaWVsZDEiKQ0KLQlAV2ViRmllbGQobmFtZT0iTXlGaWVsZCIpDQotCXB1YmxpYyBTdHJpbmcgZmllbGQxOw0KLQkNCi0JQE15TWV0aG9kQW5ub3RhdGlvbihuYW1lPSJhbm5vdGF0ZWRNZXRob2QiKQ0KLQlAV2ViTWV0aG9kKGV4Y2x1ZGU9ZmFsc2Usb3BlcmF0aW9uTmFtZT0idGVzdCIpDQotCXB1YmxpYyB2b2lkIGFubm90YXRlZE1ldGhvZCggQFdlYlBhcmFtKG5hbWU9ImFubm90YXRlZFBhcmFtIikgQE15UGFyYW1Bbm5vdGF0aW9uKG5hbWU9ImFubm90YXRlZE15UGFyYW0iKSBTdHJpbmcgYW5ub3RhdGVkUGFyYW0pIA0KLQl7DQotCX0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvSW50ZWdlclZhbHVlSW1wbFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0ludGVnZXJWYWx1ZUltcGxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ4ZDhjYzYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvSW50ZWdlclZhbHVlSW1wbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LkNsYXNzTG9hZGluZ1Rlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uV3JpdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLkludGVnZXJWYWx1ZUltcGw7DQotDQotcHVibGljIGNsYXNzIEludGVnZXJWYWx1ZUltcGxUZXN0IGV4dGVuZHMgQ2xhc3NMb2FkaW5nVGVzdA0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNSQyA9ICJzcmMiOw0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUENLID0gIm9yZy5lY2xpcHNlLmRlbW8iOw0KLQ0KLQlwcml2YXRlIElUeXBlIGVuZHBvaW50Ow0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQljcmVhdGVKYXZhUHJvamVjdChTUkMsIFBDSyk7DQotCQllbmRwb2ludCA9IGNyZWF0ZUNsYXNzKCJFbmRwb2ludC5zcmMiLCAiRW5kcG9pbnQiKTsNCi0JCUFubm90YXRpb25GYWN0b3J5LnJlbW92ZUFubm90YXRpb25zRnJvbUphdmFFbGVtZW50KGVuZHBvaW50KTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SW50ZWdlcnMoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXNldFVwKCk7DQotCQkNCi0JCUludGVnZXJWYWx1ZUltcGwgaXYgPSBuZXcgSW50ZWdlclZhbHVlSW1wbCgiMTAiKTsNCi0JCQkJDQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwdiA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCXB2LmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJwYXJhbSIsIGl2KSk7DQotCQkNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBhbm4gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJvcmcuZWNsaXBzZS50ZXN0Lk15QW5ub3RhdGlvbiIsIHB2LCBlbmRwb2ludCk7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoYW5uLCBlbmRwb2ludCk7DQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElUeXBlPj4gYW5ub3RhdHRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0dGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0dGlvbnMuc2l6ZSgpID09IDEpOw0KLQkJSUFubm90YXRpb248SVR5cGU+IHJlYWRBbm5vdGF0aW9uID0gYW5ub3RhdHRpb25zLml0ZXJhdG9yKCkubmV4dCgpOw0KLQkJcmVhZEFubm90YXRpb24uZXF1YWxzKGFubik7DQotCQlhc3NlcnRFcXVhbHMoYW5uLmdldFByb3BlcnR5VmFsdWUoInBhcmFtIikudG9TdHJpbmcoKSwgIjEwIik7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkucmVtb3ZlKGFubik7DQotCQlhbm5vdGF0dGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKGFubm90YXR0aW9ucyk7DQotCQlhc3NlcnRUcnVlKGFubm90YXR0aW9ucy5zaXplKCkgPT0gMCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHNPYmplY3QoKQ0KLQl7DQotCQlJbnRlZ2VyVmFsdWVJbXBsIGl2MSA9IG5ldyBJbnRlZ2VyVmFsdWVJbXBsKCIxMCIpOw0KLQkJSW50ZWdlclZhbHVlSW1wbCBpdjIgPSBuZXcgSW50ZWdlclZhbHVlSW1wbCgiMTEiKTsNCi0JCUludGVnZXJWYWx1ZUltcGwgaXYzID0gbmV3IEludGVnZXJWYWx1ZUltcGwoIjEwIik7DQotDQotCQlhc3NlcnRGYWxzZShpdjEuZXF1YWxzKG51bGwpKTsNCi0JCWFzc2VydEZhbHNlKGl2MS5lcXVhbHModHJ1ZSkpOw0KLQkJYXNzZXJ0RmFsc2UoaXYxLmVxdWFscyhpdjIpKTsNCi0NCi0JCWFzc2VydFRydWUoaXYxLmVxdWFscyhpdjMpKTsNCi0JCWFzc2VydFRydWUoaXYxLmVxdWFscyhpdjEpKTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9QYXJhbVZhbHVlUGFpckltcGxUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9QYXJhbVZhbHVlUGFpckltcGxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMyZWI2MjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvUGFyYW1WYWx1ZVBhaXJJbXBsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnM7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklWYWx1ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuUGFyYW1WYWx1ZVBhaXJJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5TdHJpbmdWYWx1ZUltcGw7DQotDQotcHVibGljIGNsYXNzIFBhcmFtVmFsdWVQYWlySW1wbFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQ0KLXsNCi0NCi0JcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkNCi0Jew0KLQkJSVZhbHVlIHZhbHVlID0gbmV3IFN0cmluZ1ZhbHVlSW1wbCgidmFsdWUiKTsNCi0JCVBhcmFtVmFsdWVQYWlySW1wbCBwdnAgPSBuZXcgUGFyYW1WYWx1ZVBhaXJJbXBsKCJwYXJhbSIsIHZhbHVlKTsNCi0NCi0JCUlWYWx1ZSB2YWx1ZTEgPSBuZXcgU3RyaW5nVmFsdWVJbXBsKCJ2YWx1ZTEiKTsNCi0JCVBhcmFtVmFsdWVQYWlySW1wbCBwdnAxID0gbmV3IFBhcmFtVmFsdWVQYWlySW1wbCgicGFyYW0xIiwgdmFsdWUxKTsNCi0NCi0JCWFzc2VydEZhbHNlKHB2cC5oYXNoQ29kZSgpID09IHB2cDEuaGFzaENvZGUoKSk7DQotCQlhc3NlcnRGYWxzZShwdnAuZXF1YWxzKG51bGwpKTsNCi0JCWFzc2VydEZhbHNlKHB2cC5lcXVhbHMoMTIzKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEVxdWFsc09iamVjdCgpDQotCXsNCi0JCUlWYWx1ZSB2YWx1ZSA9IG5ldyBTdHJpbmdWYWx1ZUltcGwoInZhbHVlIik7DQotCQlQYXJhbVZhbHVlUGFpckltcGwgcHZwID0gbmV3IFBhcmFtVmFsdWVQYWlySW1wbCgicGFyYW0iLCB2YWx1ZSk7DQotDQotCQlJVmFsdWUgdmFsdWUxID0gbmV3IFN0cmluZ1ZhbHVlSW1wbCgidmFsdWUiKTsNCi0JCVBhcmFtVmFsdWVQYWlySW1wbCBwdnAxID0gbmV3IFBhcmFtVmFsdWVQYWlySW1wbCgicGFyYW0iLCB2YWx1ZTEpOw0KLQ0KLQkJSVZhbHVlIHZhbHVlMiA9IG5ldyBTdHJpbmdWYWx1ZUltcGwoInZhbHVlMiIpOw0KLQkJUGFyYW1WYWx1ZVBhaXJJbXBsIHB2cDIgPSBuZXcgUGFyYW1WYWx1ZVBhaXJJbXBsKCJwYXJhbTIiLCB2YWx1ZTIpOw0KLQ0KLQkJYXNzZXJ0VHJ1ZShwdnAuZXF1YWxzKHB2cDEpKTsNCi0JCWFzc2VydEZhbHNlKHB2cC5lcXVhbHMocHZwMikpOw0KLQkJYXNzZXJ0VHJ1ZShwdnAuZXF1YWxzKHB2cCkpOw0KLQ0KLQkJYXNzZXJ0RmFsc2UocHZwLmVxdWFscyhudWxsKSk7DQotCQlhc3NlcnRGYWxzZShwdnAuZXF1YWxzKDEyMykpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL1F1YWxpZmllZE5hbWVWYWx1ZUltcGxUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9RdWFsaWZpZWROYW1lVmFsdWVJbXBsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NzYxMTlkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL1F1YWxpZmllZE5hbWVWYWx1ZUltcGxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JVmFsdWU7DQotDQotcHVibGljIGNsYXNzIFF1YWxpZmllZE5hbWVWYWx1ZUltcGxUZXN0IGV4dGVuZHMgVGVzdENhc2UNCi17DQotDQotCXB1YmxpYyB2b2lkIHRlc3RIYXNoQ29kZSgpDQotCXsNCi0JCUlWYWx1ZSBxdjEgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoImZ1bGwucXVhbGlmaWVkLk5hbWUxIik7DQotCQlJVmFsdWUgcXYyID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUXVhbGlmaWVkTmFtZVZhbHVlKCJmdWxsLnF1YWxpZmllZC5OYW1lIik7DQotDQotCQlhc3NlcnRGYWxzZShxdjEuaGFzaENvZGUoKSA9PSBxdjIuaGFzaENvZGUoKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEVxdWFsc09iamVjdCgpDQotCXsNCi0JCUlWYWx1ZSBxdiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZSgiZnVsbC5xdWFsaWZpZWQuTmFtZSIpOw0KLQkJSVZhbHVlIHF2MSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZSgiZnVsbC5xdWFsaWZpZWQuTmFtZTEiKTsNCi0JCUlWYWx1ZSBxdjIgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoImZ1bGwucXVhbGlmaWVkLk5hbWUiKTsNCi0NCi0JCWFzc2VydEZhbHNlKHF2LmVxdWFscyhxdjEpKTsNCi0JCWFzc2VydFRydWUocXYuZXF1YWxzKHF2MikpOw0KLQkJYXNzZXJ0VHJ1ZShxdi5lcXVhbHMocXYpKTsNCi0JCWFzc2VydEZhbHNlKHF2LmVxdWFscyhudWxsKSk7DQotCQlhc3NlcnRGYWxzZShxdi5lcXVhbHMoMTIzKSk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvU3RyaW5nVmFsdWVJbXBsVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvU3RyaW5nVmFsdWVJbXBsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZDE5YjAzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL1N0cmluZ1ZhbHVlSW1wbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LkNsYXNzTG9hZGluZ1Rlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uV3JpdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLlN0cmluZ1ZhbHVlSW1wbDsNCi0NCi1wdWJsaWMgY2xhc3MgU3RyaW5nVmFsdWVJbXBsVGVzdCBleHRlbmRzIENsYXNzTG9hZGluZ1Rlc3QNCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTUkMgPSAic3JjIjsNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBDSyA9ICJvcmcuZWNsaXBzZS5kZW1vIjsNCi0NCi0JcHJpdmF0ZSBJVHlwZSBlbmRwb2ludDsNCi0NCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJY3JlYXRlSmF2YVByb2plY3QoU1JDLCBQQ0spOw0KLQkJZW5kcG9pbnQgPSBjcmVhdGVDbGFzcygiRW5kcG9pbnQuc3JjIiwgIkVuZHBvaW50Iik7DQotCQlBbm5vdGF0aW9uRmFjdG9yeS5yZW1vdmVBbm5vdGF0aW9uc0Zyb21KYXZhRWxlbWVudChlbmRwb2ludCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEludGVnZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlzZXRVcCgpOw0KLQkJDQotCQlTdHJpbmdWYWx1ZUltcGwgc3YgPSBuZXcgU3RyaW5nVmFsdWVJbXBsKCIxMCIpOw0KLQkJCQkNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHB2ID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJcHYuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInBhcmFtIiwgc3YpKTsNCi0JCQ0KLQkJSUFubm90YXRpb248SVR5cGU+IGFubiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIm9yZy5lY2xpcHNlLnRlc3QuTXlBbm5vdGF0aW9uIiwgcHYsIGVuZHBvaW50KTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChhbm4sIGVuZHBvaW50KTsNCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SVR5cGU+PiBhbm5vdGF0dGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKGFubm90YXR0aW9ucyk7DQotCQlhc3NlcnRUcnVlKGFubm90YXR0aW9ucy5zaXplKCkgPT0gMSk7DQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gcmVhZEFubm90YXRpb24gPSBhbm5vdGF0dGlvbnMuaXRlcmF0b3IoKS5uZXh0KCk7DQotCQlyZWFkQW5ub3RhdGlvbi5lcXVhbHMoYW5uKTsNCi0JCWFzc2VydEVxdWFscyhhbm4uZ2V0UHJvcGVydHlWYWx1ZSgicGFyYW0iKS50b1N0cmluZygpLCAiMTAiKTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmUoYW5uKTsNCi0JCWFubm90YXR0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwoYW5ub3RhdHRpb25zKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdHRpb25zLnNpemUoKSA9PSAwKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEVxdWFsc09iamVjdCgpDQotCXsNCi0JCVN0cmluZ1ZhbHVlSW1wbCBzdjEgPSBuZXcgU3RyaW5nVmFsdWVJbXBsKCIxMCIpOw0KLQkJU3RyaW5nVmFsdWVJbXBsIHN2MiA9IG5ldyBTdHJpbmdWYWx1ZUltcGwoIjExIik7DQotCQlTdHJpbmdWYWx1ZUltcGwgc3YzID0gbmV3IFN0cmluZ1ZhbHVlSW1wbCgiMTAiKTsNCi0NCi0JCWFzc2VydEZhbHNlKHN2MS5lcXVhbHMobnVsbCkpOw0KLQkJYXNzZXJ0RmFsc2Uoc3YxLmVxdWFscyh0cnVlKSk7DQotCQlhc3NlcnRGYWxzZShzdjEuZXF1YWxzKHN2MikpOw0KLQ0KLQkJYXNzZXJ0VHJ1ZShzdjEuZXF1YWxzKHN2MykpOw0KLQkJYXNzZXJ0VHJ1ZShzdjEuZXF1YWxzKHN2MSkpOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2NsYXp6L0FTVFV0aWxzVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvY2xhenovQVNUVXRpbHNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdjZDU4YzMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvY2xhenovQVNUVXRpbHNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuY2xheno7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQWJzdHJhY3RUeXBlRGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2REZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlRGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuZmlsZXMuVGVzdEZpbGVVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LlRlc3RQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuY2xhenouQVNUVXRpbHM7DQotDQotLyoqDQotICogVGVzdHMgZm9yIHtAbGluayBBU1RVdGlsc30gY2xhc3MuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBU1RVdGlsc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZQ0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBDSyA9ICJvcmcuZWNsaXBzZS50ZXN0IjsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNSQyA9IA0KLQkJCSJpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsiICsgIlxuIiArDQotCQkJInB1YmxpYyBjbGFzcyBUZXN0IHsiICsgIlxuIiArDQotCQkJIglwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgbmFtZSA9IFwiYXJlXCI7IiArICJcbiIgKw0KLQkJCSIgICBwdWJsaWMgVGVzdCgpIHt9IiArICJcbiIgKw0KLQkJCSIJcHVibGljIGludCBjcmVhdGVJbnQoKSB7cmV0dXJuIDA7fSIgKyAiXG4iICsNCi0JCQkifSI7CQ0KLQ0KLQlwcml2YXRlIFRlc3RQcm9qZWN0IHByb2plY3Q7DQotCQ0KLQlwdWJsaWMgdm9pZCBtYW51YWxTZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJcHJvamVjdCA9IG5ldyBUZXN0UHJvamVjdCgiSmF2YVByb2pfIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsNCi0JCXByb2plY3QuY3JlYXRlU291cmNlRm9sZGVyKCJzcmMiKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlpZiAocHJvamVjdCAhPSBudWxsKSB7DQotCQkJcHJvamVjdC5kaXNwb3NlKCk7DQotCQl9DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBU1RGaWxlTnBlKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQl0cnkgew0KLQkJCUFTVFV0aWxzLmdldEluc3RhbmNlKCkuY3JlYXRlQVNUKChGaWxlKW51bGwsIG51bGwpOw0KLQkJfSBjYXRjaChOdWxsUG9pbnRlckV4Y2VwdGlvbiBfKSB7fQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBU1RGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBGaWxlIHRlbXBKYXZhRmlsZSA9IGNyZWF0ZVRlbXBKYXZhRmlsZSgpOw0KLQkJQVNUTm9kZSBub2RlID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5jcmVhdGVBU1QodGVtcEphdmFGaWxlLCBudWxsKTsNCi0JCWFzc2VydE5vdE51bGwobm9kZSk7DQotCQlhc3NlcnRUcnVlKG5vZGUgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOwkNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQVNUSVR5cGVOcGUoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXRyeSB7DQotCQkJQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5jcmVhdGVDb21waWxhdGlvblVuaXQoKElDb21waWxhdGlvblVuaXQpbnVsbCwgbnVsbCk7DQotCQl9IGNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIF8pIHt9DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBU1RJVHlwZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJbWFudWFsU2V0VXAoKTsNCi0JCWZpbmFsIElUeXBlIHNvdXJjZVR5cGUgPSBwcm9qZWN0LmNyZWF0ZVR5cGUocHJvamVjdC5jcmVhdGVQYWNrYWdlKFBDSyksICJUZXN0LmphdmEiLCBTUkMpOw0KLQkJQVNUTm9kZSBub2RlID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5jcmVhdGVDb21waWxhdGlvblVuaXQoc291cmNlVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgbnVsbCk7DQotCQlhc3NlcnROb3ROdWxsKG5vZGUpOw0KLQkJYXNzZXJ0VHJ1ZShub2RlIGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsNCi0JfQkNCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUeXBlRGVjbGFyYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCW1hbnVhbFNldFVwKCk7DQotCQlmaW5hbCBJVHlwZSBzb3VyY2VUeXBlID0gcHJvamVjdC5jcmVhdGVUeXBlKHByb2plY3QuY3JlYXRlUGFja2FnZShQQ0spLCAiVGVzdC5qYXZhIiwgU1JDKTsNCi0JCUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5jcmVhdGVDb21waWxhdGlvblVuaXQoc291cmNlVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgbnVsbCk7DQotCQkNCi0JCUFic3RyYWN0VHlwZURlY2xhcmF0aW9uIGFic3RyYWN0VHlwZSA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKCJUZXN0IiwgdW5pdCk7DQotCQlhc3NlcnROb3ROdWxsKGFic3RyYWN0VHlwZSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUeXBlRGVjbGFyYXRpb25Gb3JJbm5lclR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCW1hbnVhbFNldFVwKCk7DQotCQlTdHJpbmcgc291cmNlID0gInB1YmxpYyBjbGFzcyBUZXN0IHsiICsNCi0JCQkicHVibGljIHN0YXRpYyBjbGFzcyBQYXJhbWV0ZXJzIHt9IiArDQotCQkifSI7CQkNCi0JCQ0KLQkJZmluYWwgSVR5cGUgc291cmNlVHlwZSA9IHByb2plY3QuY3JlYXRlVHlwZShwcm9qZWN0LmNyZWF0ZVBhY2thZ2UoUENLKSwgIlRlc3QuamF2YSIsIHNvdXJjZSk7DQotCQlDb21waWxhdGlvblVuaXQgdW5pdCA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuY3JlYXRlQ29tcGlsYXRpb25Vbml0KHNvdXJjZVR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksIG51bGwpOw0KLQkJDQotCQlBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiBhYnN0cmFjdFR5cGUgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldFR5cGVEZWNsYXJhdGlvbigiUGFyYW1ldGVycyIsIHVuaXQpOw0KLQkJYXNzZXJ0Tm90TnVsbChhYnN0cmFjdFR5cGUpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUeXBlU2lnbmF0dXJlRm9yU2ltcGxlVHlwZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgU3RyaW5nIHZhckFyZ1NpZ25hdHVyZSA9IGdldFR5cGVTaWduYXR1cmVGb3JQYXJhbWV0ZXIoIlN0cmluZyBwIik7DQotCQlhc3NlcnRGYWxzZSgiU2lnbmF0dXJlIHNob3VsZCBub3Qgc3RhcnQgd2l0aCAnWyciLCB2YXJBcmdTaWduYXR1cmUudG9DaGFyQXJyYXkoKVswXSA9PSBTaWduYXR1cmUuQ19BUlJBWSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEdldFR5cGVTaWduYXR1cmVGb3JBcnJheSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgU3RyaW5nIHZhckFyZ1NpZ25hdHVyZSA9IGdldFR5cGVTaWduYXR1cmVGb3JQYXJhbWV0ZXIoIlN0cmluZ1tdIHAiKTsNCi0JCWFzc2VydFRydWUoIlNpZ25hdHVyZSBzaG91bGQgc3RhcnQgd2l0aCAnWyciLCB2YXJBcmdTaWduYXR1cmUudG9DaGFyQXJyYXkoKVswXSA9PSBTaWduYXR1cmUuQ19BUlJBWSk7DQotCQlhc3NlcnRGYWxzZSgiU2lnbmF0dXJlIHNlY29uZCBjYWhhcmFjdGVyIG11c3Qgbm90IGJlICdbJyIsIHZhckFyZ1NpZ25hdHVyZS50b0NoYXJBcnJheSgpWzFdID09IFNpZ25hdHVyZS5DX0FSUkFZKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VHlwZVNpZ25hdHVyZUZvclZhckFyZygpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgU3RyaW5nIHZhckFyZ1NpZ25hdHVyZSA9IGdldFR5cGVTaWduYXR1cmVGb3JQYXJhbWV0ZXIoIlN0cmluZy4uLiBwIik7DQotCQlhc3NlcnRUcnVlKCJTaWduYXR1cmUgc2hvdWxkIHN0YXJ0IHdpdGggJ1snIiwgdmFyQXJnU2lnbmF0dXJlLnRvQ2hhckFycmF5KClbMF0gPT0gU2lnbmF0dXJlLkNfQVJSQVkpOw0KLQkJYXNzZXJ0RmFsc2UoIlNpZ25hdHVyZSBzZWNvbmQgY2FoYXJhY3RlciBtdXN0IG5vdCBiZSAnWyciLCB2YXJBcmdTaWduYXR1cmUudG9DaGFyQXJyYXkoKVsxXSA9PSBTaWduYXR1cmUuQ19BUlJBWSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEdldFR5cGVTaWduYXR1cmVGb3JNdWx0aURpbWVuc2lvbmFsVmFyQXJnKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBTdHJpbmcgdmFyQXJnU2lnbmF0dXJlID0gZ2V0VHlwZVNpZ25hdHVyZUZvclBhcmFtZXRlcigiU3RyaW5nW11bXS4uLiBwIik7DQotCQlhc3NlcnRUcnVlKCJTaWduYXR1cmUgc2hvdWxkIHN0YXJ0IHdpdGggJ1snIiwgdmFyQXJnU2lnbmF0dXJlLnRvQ2hhckFycmF5KClbMF0gPT0gU2lnbmF0dXJlLkNfQVJSQVkpOw0KLQkJYXNzZXJ0VHJ1ZSgiU2lnbmF0dXJlIHNlY29uZCBjYWhhcmFjdGVyIG11c3QgYmUgJ1snIiwgdmFyQXJnU2lnbmF0dXJlLnRvQ2hhckFycmF5KClbMV0gPT0gU2lnbmF0dXJlLkNfQVJSQVkpOw0KLQkJYXNzZXJ0VHJ1ZSgiU2lnbmF0dXJlIHRoaXJkIGNhaGFyYWN0ZXIgbXVzdCBiZSAnWyciLCB2YXJBcmdTaWduYXR1cmUudG9DaGFyQXJyYXkoKVsyXSA9PSBTaWduYXR1cmUuQ19BUlJBWSk7DQotCQlhc3NlcnRGYWxzZSgiU2lnbmF0dXJlIGZvdXJ0aCBjaGFyYWN0ZWQgbXVzdCBub3QgYmUgJ1snIiwgdmFyQXJnU2lnbmF0dXJlLnRvQ2hhckFycmF5KClbM10gPT0gU2lnbmF0dXJlLkNfQVJSQVkpOw0KLQl9DQotDQotCXByaXZhdGUgU3RyaW5nIGdldFR5cGVTaWduYXR1cmVGb3JQYXJhbWV0ZXIoZmluYWwgU3RyaW5nIHBhcmFtRGVmaW5pdGlvbikgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBBU1RVdGlscyBhc3RVdGlscyA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCk7DQotDQotCQltYW51YWxTZXRVcCgpOw0KLQkJU3RyaW5nIHNvdXJjZSA9ICJwdWJsaWMgY2xhc3MgVGVzdCB7IHB1YmxpYyB2b2lkIHZhckFyZ01ldGhvZCgiICsgcGFyYW1EZWZpbml0aW9uICsgIil7fSB9IjsNCi0NCi0JCWZpbmFsIElUeXBlIHNvdXJjZVR5cGUgPSBwcm9qZWN0LmNyZWF0ZVR5cGUocHJvamVjdC5jcmVhdGVQYWNrYWdlKFBDSyksICJUZXN0LmphdmEiLCBzb3VyY2UpOw0KLQkJZmluYWwgSU1ldGhvZCB2YXJhcmdNZXRob2QgPSBzb3VyY2VUeXBlLmdldE1ldGhvZHMoKVswXTsNCi0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBtZXRob2QgbmFtZSIsICJ2YXJBcmdNZXRob2QiLCB2YXJhcmdNZXRob2QuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQlmaW5hbCBDb21waWxhdGlvblVuaXQgdW5pdCA9IGFzdFV0aWxzLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChzb3VyY2VUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCBudWxsKTsNCi0JCWZpbmFsIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2wgPSBhc3RVdGlscy5nZXRNZXRob2REZWNsYXJhdGlvbih2YXJhcmdNZXRob2QsIChUeXBlRGVjbGFyYXRpb24pIGFzdFV0aWxzLmdldFR5cGVEZWNsYXJhdGlvbigiVGVzdCIsIHVuaXQpKTsNCi0JCWFzc2VydEVxdWFscygiT25lIHBhcmFtZXRlciBleHBlY3RlZCIsIDEsIG1ldGhvZERlY2wucGFyYW1ldGVycygpLnNpemUoKSk7DQotDQotCQlyZXR1cm4gYXN0VXRpbHMuZ2V0VHlwZVNpZ25hdHVyZSgoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikgbWV0aG9kRGVjbC5wYXJhbWV0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOw0KLQl9CQ0KLQkNCi0JcHJpdmF0ZSBGaWxlIGNyZWF0ZVRlbXBKYXZhRmlsZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJRmlsZSBkaXIgPSBUZXN0RmlsZVV0aWxzLmNyZWF0ZVRlbXBEaXJlY3RvcnkoIiIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7DQotCQlGaWxlIHRlbXBDbGFzc0ZpbGUgPSBuZXcgRmlsZShkaXIsICJUZXN0LmphdmEiKTsNCi0JCUZpbGVXcml0ZXIgZncgPSBuZXcgRmlsZVdyaXRlcih0ZW1wQ2xhc3NGaWxlKTsNCi0JCWZ3LndyaXRlKCJwYWNrYWdlICIgKyBQQ0sgKyAiO1xuIiArIFNSQyk7DQotCQlmdy5jbG9zZSgpOw0KLQkJDQotCQlyZXR1cm4gdGVtcENsYXNzRmlsZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9tb2NrL0VuZHBvaW50Rm9ybWF0LnNyYyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL21vY2svRW5kcG9pbnRGb3JtYXQuc3JjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YmY2ZmI4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL21vY2svRW5kcG9pbnRGb3JtYXQuc3JjCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotcHVibGljIGNsYXNzIEVuZHBvaW50e3B1YmxpYyBFbmRwb2ludCgpe31wdWJsaWMgdm9pZCB1c2VWb2lkKCl7fXB1YmxpYyBTdHJpbmcgZWNob1N0cmluZyhTdHJpbmcgcyl7cmV0dXJuIHN9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5qbW9jay8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmptb2NrLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFlZTA1MGQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmptb2NrLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGV4cG9ydGVkPSJ0cnVlIiBraW5kPSJsaWIiIHBhdGg9ImxpYi9qbW9jay1jb3JlLTEuMi4wLmphciIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuam1vY2svLnByb2plY3QgYi90ZXN0cy9vcmcuam1vY2svLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYzZjZiNDcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmptb2NrLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuam1vY2s8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuam1vY2svLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvdGVzdHMvb3JnLmptb2NrLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzYxMTA3OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuam1vY2svLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jVHVlIEp1biAyMyAxODo0MTo1NSBFRVNUIDIwMDkNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5qbW9jay9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5qbW9jay9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzFlMzQ3OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuam1vY2svTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmp1bml0O3Zpc2liaWxpdHk6PXJlZXhwb3J0DQotRXhwb3J0LVBhY2thZ2U6IG9yZy5qbW9jaywNCi0gb3JnLmptb2NrLmJ1aWxkZXIsDQotIG9yZy5qbW9jay5jb3JlLA0KLSBvcmcuam1vY2suY29yZS5jb25zdHJhaW50LA0KLSBvcmcuam1vY2suY29yZS5tYXRjaGVyLA0KLSBvcmcuam1vY2suY29yZS5zdHViLA0KLSBvcmcuam1vY2suZXhwZWN0YXRpb24sDQotIG9yZy5qbW9jay51dGlsDQotQnVuZGxlLVZlbmRvcjogb3JnLmptb2NrDQotQnVuZGxlLUNsYXNzUGF0aDogbGliL2ptb2NrLWNvcmUtMS4yLjAuamFyDQotQnVuZGxlLVZlcnNpb246IDEuMi4wDQotRWNsaXBzZS1CdWRkeVBvbGljeTogZ2xvYmFsDQotQnVuZGxlLU5hbWU6IEpNb2NrDQotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMg0KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5qbW9jaztzaW5nbGV0b246PXRydWUNCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUNCi0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuam1vY2svYWJvdXQuaHRtbCBiL3Rlc3RzL29yZy5qbW9jay9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmI3YWNlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5qbW9jay9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkF1Z3VzdCAyMCwgMjAwOTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5qbW9jay9idWlsZC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmptb2NrL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU5YzQ5NjUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmptb2NrL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGxpYi8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmptb2NrL2xpYi9qbW9jay1jb3JlLTEuMi4wLmphciBiL3Rlc3RzL29yZy5qbW9jay9saWIvam1vY2stY29yZS0xLjIuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI5ZDMxN2YuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmptb2NrL2xpYi9qbW9jay1jb3JlLTEuMi4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIK